【问题标题】:how to display information in jsp page from controller Spring MVC如何从控制器 Spring MVC 在 jsp 页面中显示信息
【发布时间】:2015-08-26 09:26:50
【问题描述】:

我需要用控制器在 jsp 中显示数据,我有 List 以及在 jsp 中打印的信息。

运行此代码时出现错误:

HTTP 状态 500 - 请求处理失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [entities.Pupil]:未找到默认构造函数;嵌套的 例外是 java.lang.NoSuchMethodException:entities.Pupil.()

控制器

 @Controller
   public class PupilController {
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public List add(@ModelAttribute Pupil pupil){
        System.out.println(pupil.toString());
        List<Pupil> pupilList = new ArrayList<Pupil>();
        pupilList.add(new Pupil(1, "Name", "Last", 13));
        pupilList.add(new Pupil(2, "Name", "Last", 55));
        pupilList.add(new Pupil(3, "Name", "Last", 41));
        return pupilList;
    }
   }

index.jsp

<body>
    <h2>Hello World!</h2>
    <a href="hello">click</a>
    <form action="/add" method="post">
        <p>1:</p><input type="text" name="one">
        <p>2:</p><input type="text" name="two">
        <p>3:</p><input type="text" name="three">
        <p>4:</p><input type="text" name="four">
        <input type="submit" value="button">
    </form>
</body>

add.jsp

<body>
  <h3>This is add.jsp</h3>
  <table>
      <thead>
        <tr>
            <td>ID</td>
            <td>NAME</td>
            <td>LAST</td>
            <td>YEAR</td>
        </tr>
      </thead>
      <tbody>
        <c:forEach  items="${pupilList}" var="tester">
            <tr>
                <td>${tester.id}</td>
                <td>${tester.name}</td>
                <td>${tester.last}</td>
                <td>${tester.year}</td>
            </tr>
        </c:forEach>
      </tbody>
  </table>
</body>

【问题讨论】:

  • Pupil 类中创建一个默认构造函数。
  • 哦,我在 Pupil 类中创建了默认构造函数,但是在 jsp 页面中不显示来自 pupilList 的数据,只显示 thead
  • 将控制器方法的返回类型从List更改为List&lt;Pupil&gt;
  • 已更改,但没有帮助
  • 你的jsp中是否包含&lt;c:forEach&gt;的标签库?标签库&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&gt;

标签: java jsp spring-mvc


【解决方案1】:

在您的代码中进行以下更改。

  1. 在您的学生班级中添加default constructor
  2. 在您的 jsp 文件中添加标签库。 &lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&gt;
  3. 包括JSTL 的 pom 条目。

    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    

【讨论】:

    【解决方案2】:

    试试这个

        @RequestMapping(value = "/add", method = RequestMethod.POST)
        public ModelAndView add(@ModelAttribute Pupil pupil){
            System.out.println(pupil.toString());
            List<Pupil> pupilList = new ArrayList<Pupil>();
            pupilList.add(new Pupil(1, "Name", "Last", 13));
            pupilList.add(new Pupil(2, "Name", "Last", 55));
            pupilList.add(new Pupil(3, "Name", "Last", 41));
            ModelAndView view = new ModelAndView();
            view.addObject(pupilList);
            return view;
        }
    

    或者

        @RequestMapping(value = "/add", method = RequestMethod.POST)
        public String add(@ModelAttribute Pupil pupil, ModelMap model){
            System.out.println(pupil.toString());
            List<Pupil> pupilList = new ArrayList<Pupil>();
            pupilList.add(new Pupil(1, "Name", "Last", 13));
            pupilList.add(new Pupil(2, "Name", "Last", 55));
            pupilList.add(new Pupil(3, "Name", "Last", 41));
            model.put("pupilList", pupilList);
            return "page-name";
        }
    

    【讨论】:

    • 如何获取jsp信息?如果在jsp中使用这个解决方案需要使用getAttribute?
    • @BohdanOlehovich,这两种方法都和你的一样。唯一的区别是,对于您的方法,您只能使用add.jsp,而在这些方法中,您可以指定不同的 jsp 名称。
    • 不,你不需要使用getAttributedocs.spring.io/spring-framework/docs/3.0.x/reference/…