Spring 在MVC中,数据是如何从JSP传递到控制器的?

Spring 在MVC中,数据是如何从JSP传递到控制器的?,spring,jsp,model-view-controller,Spring,Jsp,Model View Controller,下面是Spring MVC教程: 我没有得到数据如何从JSP传递到控制器的逻辑 我想我理解数据是如何从控制器传递到JSP的,但是在用户在JSP上编辑表单之后,数据是如何传递到控制器的呢 在控制器中: 公共字符串addStudent(@modeldattribute(“SpringWeb”)Student Student,ModelMap model) 问题: 控制器如何从jsp学生类实例上的表单知道传递了名、年龄和id的学生 我有这个例子。我已经更改了示例以显示学生列表,但我无法从JSP获取到C

下面是Spring MVC教程: 我没有得到数据如何从JSP传递到控制器的逻辑

我想我理解数据是如何从控制器传递到JSP的,但是在用户在JSP上编辑表单之后,数据是如何传递到控制器的呢

在控制器中: 公共字符串addStudent(@modeldattribute(“SpringWeb”)Student Student,ModelMap model)

  • 问题: 控制器如何从jsp学生类实例上的表单知道传递了名、年龄和id的学生
  • 我有这个例子。我已经更改了示例以显示学生列表,但我无法从JSP获取到Controller的列表:

    @RequestMapping(value = "/student", method = RequestMethod.POST)
    public ModelAndView studentSave(@ModelAttribute("listOfStudents") ArrayList<Student> listOfStudents,ModelMap model)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
    
            StudentJDBCTemplate studentJDBCTemplate = (StudentJDBCTemplate) context.getBean("studentJDBCTemplate");
    
            System.out.println("Size of listOfStudents is = " + listOfStudents.size());
    ...
    
    @RequestMapping(value=“/student”,method=RequestMethod.POST)
    public model和view studentSave(@modeldattribute(“listOfStudents”)ArrayList listOfStudents,ModelMap model)
    {
    ApplicationContext上下文=新的ClassPathXmlApplicationContext(“Beans.xml”);
    StudentJDBCTemplate StudentJDBCTemplate=(StudentJDBCTemplate)context.getBean(“StudentJDBCTemplate”);
    System.out.println(“listOfStudents的大小是=“+listOfStudents.Size()”);
    ...
    
    listOfStudents.size()
    返回0

  • 问题:我在这里遗漏了什么,为什么我不能从jsp上的表单中获取列表

  • 通常,“工作”在控制器中完成,结果传递给JSP只是为了显示。JSP通过HTTP呈现给用户的浏览器,然后用户修改页面并发回控制器。 如果在页面发送给用户之前需要在JSP中执行“工作”,那么您应该考虑找到在控制器中执行所有操作的方法。

    话虽如此,您传递给JSP的模型不必包含简单的对象。您可以传递给JSP一个对象,该对象上有执行处理的方法。然后在JSP中,您只需调用该对象上的其中一个方法

    问题:控制器如何从jsp上的表单知道这一点 是否通过了名、年龄和id为的学生类实例学生

    提交表单时,您正在向给定URL发出HTTP(通常为POST)请求。此POST请求将包含中的值 如果您没有使用任何web框架(例如SpringMVC),那么您通常会直接使用ServletAPI 提取并使用这些值,特别是
    HttpServletRequest
    对象

    您可以通过添加以下内容来尝试这是您的应用程序(SpringMVC框架将自动传递请求)

    现在,不管您使用的框架是什么,底层机制都不会改变,参数仍然作为简单字符串在POST请求中发送。 不过,该框架本质上是在上面添加了一个抽象层,以防止您必须编写样板文件来提取和手动处理这些内容 参数。因此,不必执行以下操作:

    public String addStudent(HttpServletRequest request){
        Student student = new Student();
        student.setId(Integer.parseInt(request.getParameter("id"));
        student.setName(request.getParameter("name"));
        ....
    
    }
    
    你让框架来处理它

    public String addStudent(@ModelAttribute Student student){
    
    }
    
    @modeldattribute
    告诉框架您希望将提交的参数绑定到学生实例。提交时,框架将创建一个新学生 实例,并通过反射()将各个字段设置为相应的HTTP参数

    关于问题的第二部分,有许多关于如何绑定到集合的示例。请参见以下示例:


    控制器和jsp通过@ModelAttribute链接在一起。 例如,如果我想添加一个新学生,我会首先将相应的jsp页面链接到学生数据库

    //setup add new student form
    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String setStudentForm(@ModelAttribute("newStudent") Student newStudent){
        return "addstudent";
    }
    
    这将设置我的jsp页面。在jsp页面中,我已经声明了与我的学生模型链接的列,如firstname、lastname

    <form:form  modelAttribute="newStudent" class="form-horizontal">
        <form:input id="firstName" path="firstName" type="text"/>
        <form:input id="lastName" path="lastName" type="text"/>
        <input type="submit" id="btnAdd" value ="add"/>
    </form>
    
    @RequestMapping url相同,但方法已从GET as submit按钮have POST submission更改为POST

    (@ModelAttribute("newStudent") Student newStudent)
    associates our view, Model and controller alltogether.
    

    好的,我想我现在对它的理解稍微好一点了,但是我在从jsp到控制器的绑定列表方面仍然存在问题。我无法让viralpatel链接上的示例正常工作。我一直坚持的一点是jsp:……这里的varstatus是什么?这个从哪里获得值?在我的设置中,我得到了“Attribute varstatus invalid for tag forEach根据TLD”如果我这样使用它。开始了一个新问题,用于将列表从jsp获取到控制器:将在此处将此标记为已回答,谢谢。
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String processStudentForm(Model model, @ModelAttribute("newStudent") @Valid Student newStudent, BindingResult result ){      
    
        newStudent.setFirstName("gurpreet");
        if(result.hasErrors()){
            return "addstudent";
        }                   
        studentService.add(newStudent);
        model.addAttribute("message", "Added successfully");
        return "redirect:/students";
    }
    
    I can also make changes in the data like i did  newStudent.setFirstName("gurpreet"); before saving the object through studentService
    
    (@ModelAttribute("newStudent") Student newStudent)
    associates our view, Model and controller alltogether.