在 MVC 中,数据如何从 JSP 传递到控制器?
In MVC how is the data passed from JSP to Controller?
我在此处关注 Spring MVC 教程:http://www.tutorialspoint.com/spring/spring_mvc_form_handling_example.htm
我不明白数据是如何从 JSP 传递到控制器的逻辑。
我想我明白数据是如何从 Controller 传递到 JSP,但是在用户编辑了 JSP 上的表单后,数据是如何传递到 Controller 的?
在控制器中:
public String addStudent(@ModelAttribute("SpringWeb")Student学生,ModelMap模型)
- 问题:
控制器如何从 jsp 学生 class 实例学生的表格中知道姓名、年龄和 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());
...
listOfStudents.size()
returns 0.
- 问题:我在这里遗漏了什么,为什么我无法从 jsp 上的表格中获取列表?
一般'work'在controller中完成,结果传递给JSP只是为了显示。 JSP 通过 HTTP 呈现给用户的浏览器,然后用户修改页面并回发给控制器。
如果您在 JSP 中执行 'work' 需要在将页面发送给用户之前传回控制器,那么您应该考虑找到一种在控制器中完成所有这些操作的方法。
话虽如此。您传递给 JSP 的模型不必包含简单对象。您可以向 JSP 传递一个对象,该对象具有执行处理的方法。然后在 JSP 中,您只需调用该对象的方法之一。
question: How the controller knows that from the form on the jsp
Student class instance student with name, age and id are passed?
当您提交表单时,您正在向给定的 URL 发出 HTTP(通常为 POST)请求。此 POST 请求将包含中的值
表单作为请求参数。如果您没有使用任何 Web 框架(例如 Spring MVC),那么您通常会直接使用 Servlet API
提取和使用这些值,尤其是 HttpServletRequest
对象。
http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
您可以通过添加以下内容来尝试这是您的应用程序(Spring MVC 框架将自动传递请求)。
public String addStudent(@ModelAttribute Student student, HttpServletRequest request){
for(String key : request.getParameterMap().keySet()){
System.out.println(key + "=" + request.getParameterMap().get(key);
}
}
现在,无论您使用的框架底层机制没有改变,参数仍然作为简单字符串在 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){
}
@ModelAttribute
告诉框架您希望将提交的参数绑定到 Student 实例。提交时,框架将创建一个新的 Student
实例,并通过反射,(http://docs.oracle.com/javase/tutorial/reflect/) 将各种字段设置为相应的 HTTP 参数。
至于你问题的第二部分,有许多关于如何绑定到集合的示例。见下面的例子:
http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/
控制器和 jsp 由 @ModelAttribute link 整合在一起。
例如,如果我想添加一个新学生,我会首先 link 相应的 jsp 页面与学生数据库。喜欢
//setup add new student form
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String setStudentForm(@ModelAttribute("newStudent") Student newStudent){
return "addstudent";
}
这将设置我的 jsp 页面。在 jsp 页面中,我已经声明了像名字、姓氏这样的列,这些列 link 与我的学生模型一起编辑。
<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>
像这样我创建了 ling。现在,当我按下提交按钮时,是否会发出 post 请求,因此将执行控制器中的以下方法。
@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
@RequestMapping url 相同,但方法已从 GET 更改为 POST,因为提交按钮有 POST 提交。
(@ModelAttribute("newStudent") Student newStudent)
associates our view, Model and controller alltogether.
我在此处关注 Spring MVC 教程:http://www.tutorialspoint.com/spring/spring_mvc_form_handling_example.htm 我不明白数据是如何从 JSP 传递到控制器的逻辑。
我想我明白数据是如何从 Controller 传递到 JSP,但是在用户编辑了 JSP 上的表单后,数据是如何传递到 Controller 的?
在控制器中: public String addStudent(@ModelAttribute("SpringWeb")Student学生,ModelMap模型)
- 问题: 控制器如何从 jsp 学生 class 实例学生的表格中知道姓名、年龄和 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());
...
listOfStudents.size()
returns 0.
- 问题:我在这里遗漏了什么,为什么我无法从 jsp 上的表格中获取列表?
一般'work'在controller中完成,结果传递给JSP只是为了显示。 JSP 通过 HTTP 呈现给用户的浏览器,然后用户修改页面并回发给控制器。 如果您在 JSP 中执行 'work' 需要在将页面发送给用户之前传回控制器,那么您应该考虑找到一种在控制器中完成所有这些操作的方法。
话虽如此。您传递给 JSP 的模型不必包含简单对象。您可以向 JSP 传递一个对象,该对象具有执行处理的方法。然后在 JSP 中,您只需调用该对象的方法之一。
question: How the controller knows that from the form on the jsp Student class instance student with name, age and id are passed?
当您提交表单时,您正在向给定的 URL 发出 HTTP(通常为 POST)请求。此 POST 请求将包含中的值
表单作为请求参数。如果您没有使用任何 Web 框架(例如 Spring MVC),那么您通常会直接使用 Servlet API
提取和使用这些值,尤其是 HttpServletRequest
对象。
http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
您可以通过添加以下内容来尝试这是您的应用程序(Spring MVC 框架将自动传递请求)。
public String addStudent(@ModelAttribute Student student, HttpServletRequest request){
for(String key : request.getParameterMap().keySet()){
System.out.println(key + "=" + request.getParameterMap().get(key);
}
}
现在,无论您使用的框架底层机制没有改变,参数仍然作为简单字符串在 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){
}
@ModelAttribute
告诉框架您希望将提交的参数绑定到 Student 实例。提交时,框架将创建一个新的 Student
实例,并通过反射,(http://docs.oracle.com/javase/tutorial/reflect/) 将各种字段设置为相应的 HTTP 参数。
至于你问题的第二部分,有许多关于如何绑定到集合的示例。见下面的例子:
http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/
控制器和 jsp 由 @ModelAttribute link 整合在一起。 例如,如果我想添加一个新学生,我会首先 link 相应的 jsp 页面与学生数据库。喜欢
//setup add new student form
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String setStudentForm(@ModelAttribute("newStudent") Student newStudent){
return "addstudent";
}
这将设置我的 jsp 页面。在 jsp 页面中,我已经声明了像名字、姓氏这样的列,这些列 link 与我的学生模型一起编辑。
<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>
像这样我创建了 ling。现在,当我按下提交按钮时,是否会发出 post 请求,因此将执行控制器中的以下方法。
@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
@RequestMapping url 相同,但方法已从 GET 更改为 POST,因为提交按钮有 POST 提交。
(@ModelAttribute("newStudent") Student newStudent)
associates our view, Model and controller alltogether.