我最近开始在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>
这将是预期的行为。
这里需要注意的重要一点是,如果您查看编辑页面生成的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方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用
反正可以禁用SQL,我只是想测试我的读写器和处理器工作正常。
本文向大家介绍Spring batch批处理框架,包括了Spring batch批处理框架的使用技巧和注意事项,需要的朋友参考一下 spring batch框架的简介 批处理任务是大多数IT项目的一个重要组成部分,批处理在业务系统中负责处理海量的数据,无须人工干预就能够自动高效的进行复杂的数据分析和处理。批处理会定期读入批量数据,经过相应的业务处理进行归档的业务操作,批处理的特征是自动执行,处理的
首先:我是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}未评估