SpringMVC:前台jsp页面和后台传值
本文内容纲要:
前台jsp页面和后台传值的几种方式:
不用SpringMVC自带的标签
前台---->后台,通过表单传递数据():
1.jsp页面代码如下,modelattribute有没有都行
<%@pagelanguage="java"contentType="text/html;charset=utf-8"
pageEncoding="utf-8"%>
<%@taglibprefix="sf"uri="http://www.springframework.org/tags/form"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
<title>Inserttitlehere</title>
</head>
<body>
<formmethod="post"enctype="multipart/form-data">
Username:<inputtype="text"name="username"/><sf:errorspath="username">
Password:<inputtype="password"name="password"/><sf:errorspath="password">
Nickname:<inputtype="text"name="nickname"/></br>
Email<inputtype="text"name="email"/>
</form>
</body>
</html>
2.写Action,如下两种方式都可以:
第一种,表单的name属性值必须和接受的参数同名。否则,接收到的参数为null,但不报错
第二种,表单的name属性值必须和接收对象的属性同名。否则,接收到的参数为null,但不报错
@RequestMapping(value="/add",method=RequestMethod.POST)
publicStringuserAdd(Stringusername,Stringpassword,Stringnickname,Stringemail){
Useruser=newUser(username,password,nickname,email);
System.out.println(user.toString());
users.put(user.getNickname(),user);
//客户端跳转
return"redirect:/user/users";
}
@RequestMapping(value="/add",method=RequestMethod.POST)
publicStringuserAdd(Useruser){
System.out.println(user.toString());
users.put(user.getNickname(),user);
//客户端跳转
return"redirect:/user/users";
}
注意1:即使我们的Action使用第二种方式(选用User类对象作为参数),前台界面也不能写成user.username,后台这样会接收失败,得到的值是null。这一点如果没记错的话,应该和Struts2是不一样的
<%@pagelanguage="java"contentType="text/html;charset=utf-8"
pageEncoding="utf-8"%>
<%@taglibprefix="sf"uri="http://www.springframework.org/tags/form"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
<title>Inserttitlehere</title>
</head>
<body>
<formmethod="post"enctype="multipart/form-data">
Username:<inputtype="text"name="user.username"/>
Password:<inputtype="password"name="user.password"/>
Nickname:<inputtype="text"name="user.nickname"/>
Email<inputtype="text"name="user.email"/>
<inputtype="submit"value="添加用户"/>
</form>
</body>
</html>
注意2:我们的Action使用第二种方式(选用User类对象作为参数),我们可以在服务端使用@Validated注解来进行服务端验证。但是由于我们前台jsp页面没有使用SpringMVC自带的标签库,前台jsp页面无法显示错误信息,也就是<sf:errorspath="username"></sf:errors>不起作用(不报错)。
----如果只把
标签缓存sf:form</sf:form>,并且添加modelAttribute="user"属性,不该其他内容,sf:error会起作用。但是我们不会这样做,没有任何意义,要用就统一用SpringMVC自带的标签库,要么就全部用,混着用容易出错。后台---->前台model.addAttribute("users",users):
后台Action代码
@RequestMapping(value={"/users","/",""},method=RequestMethod.GET)
publicStringuserList(Modelmodel){
//model.addAllAttributes(user);//key是map(类型名首字母小写)
model.addAttribute("users",users);
return"user/list";
}
@RequestMapping(value="/add",method=RequestMethod.GET)
publicStringuserAdd(){
model.addAttribute("user",newUser("newUser","newUserPwd","newUserNickname","newUser@126.com"));
return"user/add";
}
前台jap页面取值:使用jstl:<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<%@pagelanguage="java"contentType="text/html;charset=utf-8"
pageEncoding="utf-8"%>
<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
<title>用户列表</title>
</head>
<body>
<ahref="add">添加</a>
<br/>
<c:forEachitems="${users}"var="userMap">
${userMap.key}
<!--这里使用jstl取值,如果我们把User对象的字段,所对应的getter和setter方法去掉,页面会报错-->
-----><ahref="${userMap.value.username}">${userMap.value.username}</a>
----->${userMap.value.password}
----->${userMap.value.nickname}
----->${userMap.value.email}
-----><ahref="${userMap.value.nickname}/update">修改用户</a>
-----><ahref="${userMap.value.nickname}/delete">删除用户</a>
</br>
</c:forEach>
</body>
</html>
使用SpringMVC自带的标签
前台---->后台,通过表单传递数据():
前台jsp页面代码如下。
1.需要添加一个taglib<%@taglibprefix="sf"uri="http://www.springframework.org/tags/form"%>
2.由于使用了SpringMVC自带的标签<sf:inputpath="username"/>,<sf:passwordpath="password"/>,带有必须的path属性,所以必须要加上
modelAttribute="user",否则会报错
<%@pagelanguage="java"contentType="text/html;charset=utf-8"
pageEncoding="utf-8"%>
<%@taglibprefix="sf"uri="http://www.springframework.org/tags/form"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
<title>Inserttitlehere</title>
</head>
<body>
<sf:formmethod="post"modelAttribute="user"enctype="multipart/form-data">
Username:<sf:inputpath="username"/><sf:errorspath="username"></sf:errors></br>
Password:<sf:passwordpath="password"/><sf:errorspath="password"></sf:errors></br>
Nickname:<sf:inputpath="nickname"/></br>
Email:<sf:inputpath="email"/>
<inputtype="submit"value="添加用户"/>
</sf:form>
</body>
</html>
2.写Action,如下两种方式都可以:
第一种,表单的path属性值必须和接受的参数同名。
第二种,表单的path属性值必须和接收对象的属性同名,并且modelAttribute="user"的属性值,必须为Action参数的类型名小写,即User变user。
publicStringuserAdd(Stringusername,Stringpassword,Stringnickname,Stringemail){
Useruser=newUser(username,password,nickname,email);
System.out.println(user.toString());
users.put(usera.getNickname(),user);
//客户端跳转
return"redirect:/user/users";
}
publicStringuserAdd(Useruser){
System.out.println(user.toString());
users.put(user.getNickname(),user);
//客户端跳转
return"redirect:/user/users";
}
如果我们的Action使用第二种方式(选用User类对象作为参数),我们可以在服务端使用@Validated注解来进行服务端验证。那么前台jsp页面是能够通过sf:error来获取错误信息的。想下面的代码,如果我们填写的User信息有错误,那么我们就会返回到刚才填写信息的add页面,并且还会显示错误信息。
@RequestMapping(value="/add",method=RequestMethod.POST)
publicStringuserAdd(@ValidatedUseruser,BindingResultbr,MultipartFileattach,HttpServletRequestre)throwsIOException{//一定要紧跟validate写,验证结果类,中间如果有其他参数,就会报错
System.out.println(user.toString());
//如果有错误,返回添加用户信息的页面。这里不用Modelmodel和model.addAttribute()为什么不报错呢
if(br.hasErrors()){
return"user/add";
}
users.put(user.getNickname(),user);
//客户端跳转
return"redirect:/user/users";
}
后台---->前台,传递数据:
后台Action,使用model.addAttribute():
注意:这里有一点需要强调一下,如果我们不适用SpringMVC自带的标签,那么如果我们不想往前台jsp页面传数据,那么我们可以不用添加Action的参数Modelmodel和model.addAttribute()。但是如果使用SpringMVC自带的标签,我们必须要向前台页面传送数据,即使传一个空值,也要传,否则报错。
@RequestMapping(value="/add",method=RequestMethod.GET)
publicStringuserAdd(Modelmodel){
//publicStringuserAdd(@ModelAttribute("user")Useruser){
//model.addAttribute(newUser());
model.addAttribute("user",newUser("newUser","newUserPwd","newUserNickname","newUser@126.com"));
return"user/add";
}
前台jsp页面取值方式
1.这里我们也可以使用jstl表达式,来获取传到前台jsp页面的值,和不适用SpringMVC自带标签是一样的,就不详述了。
2.但是,我们也可以不使用jstl这种方式来获取值。由于前台jsp页面中,是有SpringMVC自带标签的,<sf:inputpath="username"/>,<sf:passwordpath="password"/>,这里就会直接把值赋给这个标签。
<%@pagelanguage="java"contentType="text/html;charset=utf-8"
pageEncoding="utf-8"%>
<%@taglibprefix="sf"uri="http://www.springframework.org/tags/form"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
<title>Inserttitlehere</title>
</head>
<body>
<!--使用jstl取值-->
${user.username}
<sf:formmethod="post"modelAttribute="user"enctype="multipart/form-data">
<!--也可以直接把值,自动放到标签里面显示,不需要人工操作-->
Username:<sf:inputpath="username"/><sf:errorspath="username"></sf:errors></br>
Password:<sf:passwordpath="password"/><sf:errorspath="password"></sf:errors></br>
Nickname:<sf:inputpath="nickname"/></br>
Email<sf:inputpath="email"/>
<inputtype="submit"value="添加用户"/>
</sf:form>
</body>
</html>
注意:很重要的一点,如果前台使用了SpringMVC自带的标签,我们用GET请求“添加页面”的时候,即使我们后端没有要传给前台jsp页面数据,我们的Action也必须要有Modelmodel参数,并且函数体中,也必须要添加一个空,model.addAttribute(newUser());,否则会报错。也就是说,如果选择了SpringMVC自带的标签:
1.负责GET请求的Action必须要有Modelmodel参数,并且函数体中,也必须要添加一个空,model.addAttribute(newUser());
2.前台jsp页面sf:form表单一定要有modelAttribute="user"
3.如果在POST请求中,用了@validated,如果页面出错,我们还是会返回“添加页面”,但是奇怪的是为什么此时我不加Modelmodel参数,和model.addAttribute(newUser());是不会报错的呢?个人认为,系统为自动给你加的。当然如果报错了之后,你想自己传一些特殊的值给前台jsp页面,那么就需要用到。
。java.lang.IllegalStateException:NeitherBindingResultnorplaintargetobjectforbeanname'command'availableasrequestattribute,
如果我们要使用@Validate进行验证,并且需要在前台通过sf:error</sf:error>来显示错误信息,那么我们一定要用sf:form</sf:form>,并且设置modelAttribute="user",它的属性值,必须为小写的类型名,表单中的其他标签是否使用sf:都可以。
此时前台接收的方式
1.可以使用el表达式,${userMap.value.username}
2.如果我们想让传过来的值直接放到某个控件上(不使用js),我们可以使用SpringMVC自己带的标签(需要设置taglib)
比如下面的<sf:inputpath="username"/>,path属性是必须要设置的。modelAttribute="user"也是必须要设置的。而且如果使用了这种方式,那么后台
代码必须要有Modelmodel,并且model需要add一个东西
我们这样理解这个东西,由于<sf:inputpath="">的path属性是必须的,所以这个属性对应着对象的某一个字段,而对象是什么呢,就需要modelAttribute="user",来确定。这也就说明,只要使用sf:,就必须要有modelAttribute=""的原因了。而且后台一定要传东西过来,如果没有
model.addAttribute(),那么sf:标签就获取不到对应的值,就会报错
<%@pagelanguage="java"contentType="text/html;charset=utf-8"
pageEncoding="utf-8"%>
<%@taglibprefix="sf"uri="http://www.springframework.org/tags/form"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
<title>Inserttitlehere</title>
</head>
<body>
<sf:formmethod="post"modelAttribute="user"enctype="multipart/form-data">
Username:<sf:inputpath="username"/><sf:errorspath="username"></sf:errors></br>
Password:<sf:passwordpath="password"/><sf:errorspath="password"></sf:errors></br>
Nickname:<sf:inputpath="nickname"/></br>
Email<inputtype="text"name="email"/>
<inputtype="submit"value="添加用户"/>
</sf:form>
</body>
</html>
本文内容总结:
原文链接:https://www.cnblogs.com/mrxiaohe/p/5893708.html