2015-02-24 552 views
2

我在这里遵循Spring MVC教程:http://www.tutorialspoint.com/spring/spring_mvc_form_handling_example.htm 我没有弄清楚数据是如何从JSP传递到Controller的。在MVC中,数据如何从JSP传递到Controller?

我想我理解数据是如何从Controller传递到JSP的,但是在用户编辑了JSP上的表单后,数据如何传递给Controller?

在控制器: 公共字符串传递addStudent(@ModelAttribute( “SpringWeb”)学生的学生,ModelMap模型)

  1. 问题: 控制器如何知道从jsp的学生类实例学生的形式与名称,年龄和身份证通过?

我有这个例子工作。我已经改变了。例如,显示学生名单,但我无法从JSP获取列表到控制器:

@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()返回0

  • 问题:我在这里错过了什么,为什么我无法从jsp上的表单获取列表?
  • 回答

    3

    问题:控制器如何从jsp上的表单获知 有姓名,年龄和id的学生类实例学生是否通过?

    当您提交表单时,您将对给定的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告诉你要提交的参数绑定到一个学生实例的框架。在提交时,框架将创建一个新的学生 实例,并通过反思(http://docs.oracle.com/javase/tutorial/reflect/)将各个字段设置为相应的HTTP参数。

    至于你的问题的第二部分有很多如何绑定到集合的例子。参阅下面的例子:

    http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/

    +0

    好的,我想我现在明白了一点,但是我仍然遇到从jsp到控制器的绑定列表问题。我无法获得viruspatel链接上的示例。我坚持使用的是jsp:... ...这是什么varstatus在这里?从哪里获得价值?在我的设置中,如果我使用它,那么我会根据TLD获得“Attribute varstatus for tag forEach根据TLD”。 – user4552049 2015-02-26 19:48:44

    +0

    开始了一个新的问题,从jsp获取列表到控制器:http://stackoverflow.com/questions/28827820/in-mvc-passing-a-list-from-jsp-to-the-controller将在这里标记这一个如答复,谢谢。 – user4552049 2015-03-03 09:09:44

    0

    通常'工作'是在控制器中完成的,并且结果被传递给JSP以供显示。 JSP通过HTTP呈现给用户的浏览器,然后用户修改该页面并回传给控制器。 如果你在JSP中做'工作',需要在页面发送给用户之前传递回控制器,那么你应该考虑找到一种方法来处理控制器中的所有内容。

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

    0

    控制器和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页面中,我已经声明了像我的学生模型链接的名字,姓氏这样的colums。

    <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。现在,当我按提交按钮,如果将登陆一个发布请求,因此下面的方法在控制器将被执行。

    @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网址是相同的,但方法发生了变化,从GET到岗位作为提交按钮有POST提交。

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