当前位置: 首页 > 知识库问答 >
问题:

Spring框架JSP表单处理:@ModelAttribute

班高明
2023-03-14

我最近开始在Spring框架中使用JSP,并尝试实现一个表单处理页面。

我创建了一个接受用户输入的基本表单页面,在他们点击submit之后,他们会收到一个确认页面,其中包含他们输入的内容。

以下是我在控制器类中拥有的两个映射方法

import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.redcup.model.Person;
import com.redcup.model.User;
import com.redcup.test.ServletTestBean;

import javax.annotation.PostConstruct;

@Controller
public class RedCupController {

    private final Logger logger = LoggerFactory.getLogger(RedCupController.class);

    @PostConstruct
    public void intializeComplete() { 
        logger.info("Controller initialized");
    }

    @RequestMapping(method=RequestMethod.GET, value="/health")
    @ResponseBody
    public String getHealth()
    {
        logger.info("GET /health invoked.");

        return "hello world!";
    }

    @RequestMapping(method=RequestMethod.GET, value="/welcome")
    public String getWelcome(Model model) { 
        User user = new User();
        model.addAttribute("userform", user);
        return "welcome"; 
    }

    @RequestMapping(method=RequestMethod.POST, value="/confirmation")
    public String getConfirmation(@ModelAttribute("userform") User user, @ModelAttribute("pew") User user2, 
                                @ModelAttribute("whomp")Person person, Model model) {

        user = getUserForm();
        user2 = getUserForm2();

        System.out.println("hello: " + user);
        System.out.println("goodbye: " + user2);

        System.out.println("user: " + user.getFirstName());
        System.out.println("user: " + user.getLastName());
        System.out.println("user: " + user.getEmail());
        System.out.println("user: " + user.getAge());

        System.out.println("user2: " + user2.getFirstName());
        System.out.println("user2: " + user2.getLastName());
        System.out.println("user2: " + user2.getEmail());
        System.out.println("user2: " + user2.getAge());

        System.out.println("person: " + person.getName());
        System.out.println("person: " + person.getNum2());

        model.addAttribute("user", user);
        model.addAttribute("user2", user2);
        model.addAttribute("person", person);

        return "confirmation";
    }

    @ModelAttribute("userform")
    public User getUserForm() {
        return new User();
    }

    @ModelAttribute("userform2") 
    public User getUserForm2() { 
        return new User();
    }
}

模型的User类:

公共类用户{

private String firstName;
private String lastName;
private String email;
private int age; 

public User() { 
    firstName = "John";
    lastName =  "Smith";
    email = "default email";
    age = 1; 
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getFirstName () { 
    return firstName;
}

public void setLastName(String lastName) { 
    this.lastName = lastName;
}

public String getLastName() { 
    return lastName;
}

public void setEmail(String email) { 
    this.email = email;
}

public String getEmail() { 
    return email;
}

public void setAge (int age) {
    this.age = age;
}

public int getAge() { 
    return age;
}

}

下面是表格输入页面欢迎您。jsp:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <div align="center">

        <form:form action="confirmation" method="post" commandName="userform">
            <form:input path="firstName"/>
            <form:input path="lastName"/>
            <form:input path="email"/>
            <form:input path="age"/>
            <input type="submit" value="Press this to submit"/>
        </form:form>
    </div>
</body>
</html>

在我的控制器处理程序:getConfirmation中,我有两个用户参数(User和user2)。我感到困惑的是,当我在“欢迎”中单击“提交”时。jsp、user和user2使用欢迎中模型中相同的精确值填充。jsp。我不确定为什么会发生这种情况,因为我认为@modeldattribute只会将相应的model属性分配给指定的参数(即,用户将在commandName userform下接收模型)。

但对我来说,@modeldattribute注释似乎没有任何作用。当@modeldattributes具有不同的键(即userform与userform2)时,user和user2参数将使用相同的字段值(我在表单中输入的值)填充,并且当我甚至删除@modeldattribute注释时,user和user2仍将使用相同的字段值填充。

有人能解释一下为什么会发生这种情况,以及@Model属性注释到底是做什么的吗?

提前谢谢!

编辑

我根据Alan的Hay的建议创建了一个UserWrapper类:

公共类用户包装器{

    private User user1;
    private User user2; 

    public User getUser1() { 
        return user1;
    }

    public User getUser2() { 
        return user2; 
    }

    public void setUser1(User user) { 
        user1 = user;
    }

    public void setUser2(User user) { 
        user2 = user;
    }

    public void setUser1FirstName(String firstName) {
        user1.setFirstName(firstName);
    }

    public String getUser1FirstName() { 
        return user1.getFirstName();
    }

    public void setUser2FirstName(String firstName) {
        user2.setFirstName(firstName);
    }

    public String getUser2FirstName() { 
        return user2.getFirstName();
    }
}

更新了我的欢迎。jsp,格式如下:

    <form:form action="confirmation" method="post" commandName="userform">
        <form:input path="user1.firstName"/>
        <form:input path="user1.lastName"/>
        <form:input path="user1.email"/>
        <form:input path="user1.age"/>
        <input type="submit" value="Press this to submit"/>
    </form:form>

共有1个答案

林鹭洋
2023-03-14

这将是预期的行为。

这里需要注意的重要一点是,如果您查看编辑页面生成的HTML,您将看到它包含如下输入:

<input name="firstName"  type="text" value="user">
<input name="lastName"  type="text" value="7702">

即。没有任何东西可以明确地将它与模型对象的任何特定实例联系起来。现在,在表单提交时,Spring处理程序将查看您在处理程序方法中指定为模型属性的内容,并尝试将提交的参数绑定到这些模型对象中的匹配字段,而不考虑限定符—这就是您看到的。

要获得您期望的行为,您需要包装两个模型属性,如下所示:

创建包装器作为表单支持对象:

public class UserWrapper(){

    private User user1;
    private User user2;

    public User getUser1(){
        return user1;
    }

    public User getUser2(){
        return user2;
    }
}

专门将表单字段绑定到User1

<form:form action="confirmation" method="post" commandName="userWrapper">
    <form:input path="user1.firstName"/>
    <form:input path="user1.lastName"/>
    <form:input path="user1.email"/>
    <form:input path="user1.age"/>
    <input type="submit" value="Press this to submit"/>
</form:form>

更新处理程序:

@RequestMapping(method=RequestMethod.POST, value="/confirmation")
public String getConfirmation(@ModelAttribute UserWrapper wrapper) {

    System.out.println("user: " + wrapper.getUser1().getFirstName());
    System.out.println("user: " + wrapper.getUser2().getFirstName());

    return "confirmation";
}
 类似资料:
  • 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。 GET 方法 GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示: http://www.runoob.com/hello?key1=value1&key2=value2 GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用

  • 本文向大家介绍Spring batch批处理框架,包括了Spring batch批处理框架的使用技巧和注意事项,需要的朋友参考一下 spring batch框架的简介 批处理任务是大多数IT项目的一个重要组成部分,批处理在业务系统中负责处理海量的数据,无须人工干预就能够自动高效的进行复杂的数据分析和处理。批处理会定期读入批量数据,经过相应的业务处理进行归档的业务操作,批处理的特征是自动执行,处理的

  • 反正可以禁用SQL,我只是想测试我的读写器和处理器工作正常。

  • 首先:我是spring的初学者,这是我第一次尝试用spring MVC实现一个web应用程序。以下是我所做的: 实体: 控制器: JSP: 但是当我试图保存JSP的输入时,我总是得到这样的结果: 字段“country”上对象“coin”中的字段错误:拒绝值[1];代码[TypeMismatch.Coin.Country,TypeMismatch.Country,TypeMismatch.Count

  • 本文向大家介绍Spring Batch批处理框架使用解析,包括了Spring Batch批处理框架使用解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring Batch批处理框架使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用Spring Batch做为批处理框架,可以完成常规的数据量不是特别大的离线计算。 现在

  • 问题内容: 我们在Spring 3.0.5上运行Tomcat 6.0,由于某种原因,我们无法通过jsps来评估$ {blah}。这是一个Maven项目,有很多单独的模块,如果需要的话,Eclipse Helios。 这是我的web.xml的片段 这不是(<%@ page isELIgnored =“ false”%>),因为当我将其放入jsp时,页面仅显示为文本,这意味着 $ {2 + 2}未评估