前台jsp页面和后台传值的几种方式:

                       不用SpringMVC自带的标签

前台---->后台,通过表单传递数据():

1.jsp页面代码如下,  modelattribute 有没有都行

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!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=utf-8">
<title>Insert title here</title>
</head>
<body> <form method="post" enctype="multipart/form-data">
Username:<input type="text" name="username"/> <sf:errors path="username">
Password:<input type="password" name="password"/> <sf:errors path="password">
Nickname:<input type="text" name="nickname"/></br>
Email<input type="text" name="email"/> </form>
</body>
</html>

2.写Action,如下两种方式都可以:

  第一种,表单的name属性值必须和接受的参数同名。否则,接收到的参数为null,但不报错

  第二种,表单的name属性值必须和接收对象的属性同名。否则,接收到的参数为null,但不报错

@RequestMapping(value="/add",method=RequestMethod.POST)
public String userAdd(String username,String password,String nickname,String email){
User user = new User(username,password,nickname,email);
System.out.println(user.toString());
users.put(user.getNickname(), user);
//客户端跳转
return "redirect:/user/users";
}
@RequestMapping(value="/add",method=RequestMethod.POST)
public String userAdd(User user) {
System.out.println(user.toString());
users.put(user.getNickname(), user);
//客户端跳转
return "redirect:/user/users";
}

注意1:即使我们的Action使用第二种方式(选用User类对象作为参数),前台界面也不能写成user.username ,后台这样会接收失败,得到的值是null。这一点如果没记错的话,应该和Struts2是不一样的

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!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=utf-8">
<title>Insert title here</title>
</head>
<body> <form method="post" enctype="multipart/form-data">
Username:<input type="text" name="user.username"/>
Password:<input type="password" name="user.password"/>
Nickname:<input type="text" name="user.nickname"/>
Email<input type="text" name="user.email"/>
<input type="submit" value="添加用户" /> </form>
</body>
</html>

注意2:我们的Action使用第二种方式(选用User类对象作为参数),我们可以在服务端使用@Validated注解来进行服务端验证。但是由于我们前台jsp页面没有使用SpringMVC自带的标签库,前台jsp页面无法显示错误信息,也就是<sf:errors path="username"></sf:errors> 不起作用(不报错)。

  ----如果只把<form></form>标签缓存<sf:form></sf:form>,并且添加modelAttribute="user"属性,不该其他内容,<sf:error>会起作用。但是我们不会这样做,没有任何意义,要用就统一用SpringMVC自带的标签库,要么就全部用,混着用容易出错。

后台---->前台  model.addAttribute("users",users):

后台Action代码

@RequestMapping(value={"/users","/",""},method=RequestMethod.GET)
public String userList(Model model){
//model.addAllAttributes(user);//key是map(类型名首字母小写)
model.addAttribute("users",users);
return "user/list";
}
@RequestMapping(value="/add",method=RequestMethod.GET)
public String userAdd(){
model.addAttribute("user", new User("newUser","newUserPwd","newUserNickname","newUser@126.com"));
return "user/add";
}

前台jap页面取值:使用jstl:<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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=utf-8">
<title>用户列表</title>
</head>
<body>
<a href="add" >添加</a>
<br/>
<c:forEach items="${users }" var="userMap">
${userMap.key }
<!-- 这里使用jstl取值,如果我们把User对象的字段,所对应的getter和setter方法去掉,页面会报错 -->
-----><a href="${userMap.value.username }">${userMap.value.username } </a>
----->${userMap.value.password }
----->${userMap.value.nickname }
----->${userMap.value.email }
-----><a href="${userMap.value.nickname }/update">修改用户</a>
-----><a href="${userMap.value.nickname }/delete">删除用户</a>
</br>
</c:forEach>
</body>
</html>

                        使用SpringMVC自带的标签

前台---->后台,通过表单传递数据():

前台jsp页面代码如下。

  1.需要添加一个taglib <%@taglib prefix="sf"  uri="http://www.springframework.org/tags/form"%>

  2.由于使用了SpringMVC自带的标签<sf:input path="username"/>,<sf:password path="password"/>,带有必须的path属性,所以必须要加上

  modelAttribute="user",否则会报错

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!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=utf-8">
<title>Insert title here</title>
</head>
<body> <sf:form method="post" modelAttribute="user" enctype="multipart/form-data">
Username:<sf:input path="username"/> <sf:errors path="username"></sf:errors></br>
Password:<sf:password path="password"/> <sf:errors path="password"></sf:errors></br>
Nickname:<sf:input path="nickname"/></br>
Email:<sf:input path="email"/> <input type="submit" value="添加用户" /> </sf:form>
</body>
</html>

2.写Action,如下两种方式都可以:

  第一种,表单的path属性值必须和接受的参数同名。

  第二种,表单的path属性值必须和接收对象的属性同名,并且modelAttribute="user"的属性值,必须为Action参数的类型名小写,即User变user。

public String userAdd(String username,String password,String nickname,String email) {
User user = new User(username,password,nickname,email);
System.out.println(user.toString()); users.put(usera.getNickname(), user);
//客户端跳转
return "redirect:/user/users";
}
public String userAdd(User user) {
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)
public String userAdd(@Validated User user,BindingResult br,MultipartFile attach,HttpServletRequest re) throws IOException{//一定要紧跟validate写,验证结果类,中间如果有其他参数,就会报错
System.out.println(user.toString());
     //如果有错误,返回添加用户信息的页面。这里不用Model model和model.addAttribute()为什么不报错呢
if(br.hasErrors()){
return "user/add";
} users.put(user.getNickname(), user);
//客户端跳转
return "redirect:/user/users";
}

后台---->前台,传递数据:

后台Action,使用model.addAttribute():

注意:这里有一点需要强调一下,如果我们不适用SpringMVC自带的标签,那么如果我们不想往前台jsp页面传数据,那么我们可以不用添加Action的参数Model model 和 model.addAttribute()。但是如果使用SpringMVC自带的标签,我们必须要向前台页面传送数据,即使传一个空值,也要传,否则报错。

@RequestMapping(value="/add",method=RequestMethod.GET)
public String userAdd(Model model){
//public String userAdd(@ModelAttribute("user")User user){
//model.addAttribute(new User());
model.addAttribute("user", new User("newUser","newUserPwd","newUserNickname","newUser@126.com"));
return "user/add";
}

前台jsp页面取值方式

1.这里我们也可以使用jstl表达式,来获取传到前台jsp页面的值,和不适用SpringMVC自带标签是一样的,就不详述了。

2.但是,我们也可以不使用jstl这种方式来获取值。由于前台jsp页面中,是有SpringMVC自带标签的,<sf:input path="username"/>,<sf:password path="password"/>,这里就会直接把值赋给这个标签。

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!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=utf-8">
<title>Insert title here</title>
</head>
<body>
<!-- 使用jstl取值 -->
${user.username }
<sf:form method="post" modelAttribute="user" enctype="multipart/form-data"> <!-- 也可以直接把值,自动放到标签里面显示,不需要人工操作 -->
Username:<sf:input path="username"/> <sf:errors path="username"></sf:errors></br>
Password:<sf:password path="password"/> <sf:errors path="password"></sf:errors></br>
Nickname:<sf:input path="nickname"/></br>
Email<sf:input path="email"/> <input type="submit" value="添加用户" /> </sf:form>
</body>
</html>

注意:很重要的一点,如果前台使用了SpringMVC自带的标签,我们用GET请求“添加页面”的时候,即使我们后端没有要传给前台jsp页面数据,我们的Action也必须要有Model model参数,并且函数体中,也必须要添加一个空,model.addAttribute(new User());,否则会报错。也就是说,如果选择了SpringMVC自带的标签:

1.负责GET请求的Action必须 要有Model model参数,并且函数体中,也必须要添加一个空,model.addAttribute(new User());

2.前台jsp页面 <sf:form>表单 一定要有modelAttribute="user"

3.如果在POST请求中,用了@validated,如果页面出错,我们还是会返回“添加页面”,但是奇怪的是为什么此时我不加Model model参数,和model.addAttribute(new User());是不会报错的呢?个人认为,系统为自动给你加的。当然如果报错了之后,你想自己传一些特殊的值给前台jsp页面,那么就需要用到。

。java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'command' available as request attribute  ,

如果我们要使用@Validate进行验证,并且需要在前台通过<sf:error></sf:error>来显示错误信息,那么我们一定要用<sf:form></sf:form>,并且设置modelAttribute="user",它的属性值,必须为小写的类型名 ,表单中的其他标签是否使用<sf:>都可以。

 

此时前台接收的方式

  1.可以使用el表达式,${userMap.value.username }

  2.如果我们想让传过来的值直接放到某个控件上(不使用js),我们可以使用SpringMVC自己带的标签(需要设置taglib)

   比如下面的<sf:input path="username"/>,path属性是必须要设置的。modelAttribute="user"也是必须要设置的。而且如果使用了这种方式,那么后台

  代码必须要有Model model,并且model需要add一个东西

  我们这样理解这个东西,由于<sf:input path="">的path属性是必须的,所以这个属性对应着对象的某一个字段,而对象是什么呢,就需要modelAttribute="user",来确定。这也就说明,只要使用<sf:>,就必须要有modelAttribute=""的原因了。而且后台一定要传东西过来,如果没有

model.addAttribute(),那么<sf:>标签就获取不到对应的值,就会报错

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!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=utf-8">
<title>Insert title here</title>
</head>
<body> <sf:form method="post" modelAttribute="user" enctype="multipart/form-data">
Username:<sf:input path="username"/> <sf:errors path="username"></sf:errors></br>
Password:<sf:password path="password"/> <sf:errors path="password"></sf:errors></br>
Nickname:<sf:input path="nickname"/></br>
Email<input type="text" name="email"/> <input type="submit" value="添加用户" /> </sf:form>
</body>
</html>

SpringMVC:前台jsp页面和后台传值的更多相关文章

  1. jsp页面向后台传值出现乱码的问题

    1.采用decode()方法 页面: Url: '<%=path%>/sfyh/infodata.jsp?type='+encodeURI(ss) , 后台: String result  ...

  2. 【数据库_Mysql】JAVA-数据库Date格式在前台JSP页面的获取

    问题: 数据库保存的为date格式的日期 在前台JSP页面显示的为一串数字1487897     解决办法: 数据库表中字段对应的实体对象属性的get方法上添加一行代码 页面即可正常显示      

  3. java分页的实现(后台工具类和前台jsp页面)

    1.首先,新建一个类Page.java public class Page implements Serializable { private static final long serialVers ...

  4. springMVC之一(页面<--->控制器 互相传值,转发和重定向)

    #页面--->控制器1.request:不建议使用2.使用属性传值(建议使用)@RequestParam("name") String username3.使用Bean对象传 ...

  5. jsp页面间的传值

    很多的时候我们只是把我们需要的数据,查询出来,然后用request.setAttribute("" ,"" )方法保存这个数据集合.再在我们能跳转到的下一个js ...

  6. 从jsp页面到servlet传值的不同方式

    1.利用超链接<a></a>来传递参数 例如: <td><a href="/month811/Servlet?id=${student.id}&am ...

  7. JSP页面间的传值方法总结

    JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧.试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式.下面来一起看看详细的介绍: 1. URL 链接后追加参数 ? 1 ...

  8. jsp页面获取后台传过来的list集合的长度

    在jsp页面导入函数标签库: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"% ...

  9. springMVC在JSP页面取map值

    在springmMVC中.jsp页面取得map值. 在controller层: Map<String, Object> map = new HashMap<String, Objec ...

随机推荐

  1. 【bzoj4668】冷战 并查集按秩合并+朴素LCA

    题目描述 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争 ...

  2. 【Luogu】P4462异或序列(莫队)

    题目链接 观察什么时候x到y之间那一段可以被统计 xorsum[x-1]^xorsum[y]=k xorsum[x-1]=xorsum[y]^k||xorsum[y]=xorsum[x-1]^k 莫队 ...

  3. bzoj 合集 1079 1791 1876 2208 2306

    1079 记忆化瞎搞吧,[a][b][c][d][e][l]表示当前有能涂1次的油漆a个,能涂2次的b个….前一个颜色为l,再搞下转移就行了. 1791 基环树上找直径 1876 高精度 2208 看 ...

  4. Twitter如何在数千台服务器上快速部署代码?

    答案是:用BT,也就是你我应该都很熟悉的BitTorrent. 对于网站经营者.创业者来说,扩展性的问题是在网站流量成长过程中势必会面对的问题,如何建立一个具有扩展性的架构(scalable arch ...

  5. (...)ES6三点扩展运算符

    扩展运算符将一个数组转为用逗号分隔的参数序列 console.log(...[a, b, c]) // a b c 用于: 1 将一个数组,变为参数序列 let add = (x, y) => ...

  6. Nature Reserve

    Nature Reserve time limit per test:2 seconds memory limit per test:256 megabytes input:standard inpu ...

  7. 洛谷P1135 奇怪的电梯

    题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼 (1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮: ...

  8. ckeditor编辑的使用方法

    一.下载安装Ckeditor,并将其整合到项目中 1.什么是CKeditor?为什么要使用它? 我们在做门户网站或者公文系统时,客户经常要求在录入时能够更改字体样式.大小.颜色并具备插入图片的功能.而 ...

  9. php--获取用户ip

    一般在做登录的时候有的会要求同一个帐号不能同时用不同的ip登录,这个时候我们需要获取到用户IP地址 获取ip地址的函数: function getIP() { if (getenv('HTTP_CLI ...

  10. NIO、AIO学习历程

    今天我们以一个常见的面试题作为开始:"谈谈你对IO与NIO的理解".要回答这个问题,我们首先我要了解几个概念: NIO 同步+非阻塞 IO(BIO) 同步+阻塞 AIO 异步+非阻 ...