【问题标题】:Not able to iterate list of object in jstl jsp无法在 jstl jsp 中迭代对象列表
【发布时间】:2018-12-19 23:31:33
【问题描述】:

我正在使用 spring boot 和 jsp 创建 Web 应用程序。 JSP 页面仅显示我在公司对象中设置的数据。 我正在尝试从 c:foreach 中的 java 对象中获取值,但每次点击 localhost 打开用户页面时都会出现异常。

javax.el.PropertyNotFoundException:在类型 [java.lang.String] 上找不到属性 [文本]

控制器类

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.model.ListModel;
import com.model.User;

@Controller
public class UserController {

     @RequestMapping(value = "/user", method = RequestMethod.GET)
     public ModelAndView user() {
        User user = new User();
        List<ListModel> modelList = new ArrayList<>();
        ListModel ls = new ListModel();
        ls.setText("s1");
        ls.setSelcted(true);
        modelList.add(ls);
        ls = new ListModel();
        ls.setText("s2");
        ls.setSelcted(true);
        modelList.add(ls);
        user.setFavoriteFrameworks(modelList);
        ModelAndView modelAndView = new ModelAndView("user", "command", user);
        return modelAndView;
    }

@RequestMapping(value = "/users", method = RequestMethod.POST)
public String addUser(@ModelAttribute("favoriteFrameworks") User 
user,BindingResult bindingResul, ModelMap model) {
    model.addAttribute("username", user.getUsername());
    model.addAttribute("password", user.getPassword());
    model.addAttribute("address", user.getAddress());
    model.addAttribute("receivePaper", user.isReceivePaper());
    List<ListModel> modelList = user.getFavoriteFrameworks();
    for(ListModel ll : modelList){
        System.out.println(ll.getText());
    }
    model.addAttribute("favoriteFrameworks", 
user.getFavoriteFrameworks());
    return "users";
}

    @ModelAttribute("webFrameworkList")
    public List<ListModel> getWebFrameworkList() {
        return getModel();
    }

    private List<ListModel> getModel() {

        List<ListModel> modelList = new ArrayList<>();
        ListModel ls = new ListModel();
        ls.setText("s1");
        ls.setSelcted(true);
        modelList.add(ls);
        ls = new ListModel();
        ls.setText("s2");
        ls.setSelcted(true);
        modelList.add(ls);
        ls = new ListModel();
        ls.setText("s3");
        ls.setSelcted(true);
        modelList.add(ls);
        ls = new ListModel();
        ls.setText("s4");
        ls.setSelcted(true);
        modelList.add(ls);
        return modelList;
    }
} 

JSP 页面视图

<%@taglib uri = "http://www.springframework.org/tags/form" prefix = "form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
  <title>Spring MVC Form Handling</title>
</head>
<body>

  <h2>User Information</h2>
  <form:form method = "POST" action = "/users">
     <table>
        <tr>
           <td><form:label path = "username">User Name</form:label></td>
           <td><form:input path = "username" /></td>
        </tr>
        <tr>
           <td><form:label path = "password">Age</form:label></td>
           <td><form:input path = "password" /></td>
        </tr>  
        <tr>
           <td><form:label path = "address">Address</form:label></td>
           <td><form:textarea path = "address" rows = "5" cols = "30" /></td>
        </tr>  
        <tr>
           <td><form:label path = "receivePaper">Subscribe Newsletter</form:label></td>
           <td><form:checkbox path = "receivePaper" /></td>
        </tr> 
        <tr>
           <td><form:label path = "favoriteFrameworks">Favorite Web Frameworks</form:label></td>
          <!--  <td><form:checkboxes items = "${webFrameworkList}" path = "favoriteFrameworks" /></td>  -->

                <c:forEach items="${webFrameworkList} " var="department">
                            <tr><td>${department.text}</td></tr> 
                        <!--    <tr><td><form:checkbox
                                    path="favoriteFrameworks" value='${department.text}' checked='${department.selcted}' />${department.text}</td></tr>  -->

                </c:forEach>

        </tr> 
        <tr>
           <td colspan = "2">
              <input type = "submit" value = "Submit"/>
           </td>
        </tr>
     </table>  
  </form:form>
 </body>
</html>

为什么会出现这个错误?

【问题讨论】:

    标签: java jsp jstl


    【解决方案1】:

    您似乎错误地设置了要迭代的webFrameworkList 属性。异常告诉您它在 jsp 中定义的 department var 上找不到 getText() 方法(根据异常消息,它是 String 而不是您的 ListModel)。

    考虑消除带注释的@ModelAttribute 方法,而是在ModelAndView user() 方法中设置模型属性。

    ...
    
    ModelAndView modelAndView = new ModelAndView("user", "command", user);
    modelAndView.addObject("webFrameworkList", getModel());
    
    return modelAndView;
    

    编辑

    关于表单提交的评论,post handler方法addUser指定

    @ModelAttribute("favoriteFrameworks") User
    

    但表单没有定义modelAttribute

    所以这里有两个问题。

    1. favoriteFrameworksList,而不是 User
    2. 表单并没有指定它

    将 post 处理程序的签名更改为

    public String addUser(@ModelAttribute("user") User user,BindingResult bindingResul, ModelMap model)
    

    然后将form开始标签改为

    <form:form method = "POST" action = "/users" model attribute="user">
    

    【讨论】:

    • OI 做到了,现在发生的下一个问题是它没有在帖子上发送复选框选定的值,这是 null List modelList = user.getFavoriteFrameworks();
    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 2012-09-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多