Spring 在MVC中,数据是如何从JSP传递到控制器的?
下面是Spring MVC教程: 我没有得到数据如何从JSP传递到控制器的逻辑 我想我理解数据是如何从控制器传递到JSP的,但是在用户在JSP上编辑表单之后,数据是如何传递到控制器的呢 在控制器中: 公共字符串addStudent(@modeldattribute(“SpringWeb”)Student Student,ModelMap model)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
@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通过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.