SpringMVC 映射请求数据获取案例–模型数据
获取参数值
说明
- 开发中,如何获取到http://xxx/url?参数名=参数值&参数名=参数值
- 这个使用的非常广泛,我们看一个案例
应用实例
创建springmvc\src\com\web\requestparam\VoteHandler.java
@RequestMapping("/vote") @Controller public class VoteHandler { //获取到超链接传递的数据 /** * 解读@RequestParam(value="name", required=false) * 1.@RequestParam : 表示说明一个接受到的参数 * 2.value="name" : 接收的参数名是name,接收名必须和前端一致,否则为null * 3.required=false : 表示该参数可以有,也可以没有,如果required=true,表示必须传递该 参数. * 默认是required=true */ @RequestMapping(value = "/vote01") public String test01(@RequestParam(value = "name", required = false) String username) { System.out.println("得到的username= " + username); //返回到一个结果 return "success"; } }
创建springmvc\web\request_parameter.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>测试request parameter</title> </head> <body> <h2>获取到超链接参数值</h2> <hr/> <a href="vote/vote01?name=rsthht">获取超链接的参数</a> </body> </html>
页面完成测试。
获取http 请求消息头
应用实例
- 修改VoteHandler.java, 增加方法
@RequestMapping(value = "/vote02") public String test02(@RequestHeader("Accept-Encoding") String ae,@RequestHeader("Host") String host) { System.out.println("Accept-Encoding =" + ae); System.out.println("Host =" + host); //返回到一个结果 return "success"; }
- 修改request_parameter.jsp, 增加代码
<h1>获取到消息头</h1> <hr> <a href="vote/vote02">获取http 消息头信息</a>
获取javabean 形式的数据
开发中,如何获取到javaben 的数据,就是以前的entity/pojo 对象数据
应用实例
创建springmvc\src\com\web\requestparam\entity\Pet.java
public class Pet { private Integer id; private String name; }
创建springmvc\src\com\web\requestparam\entity\Master.java
public class Master { private Integer id; private String name; private Pet pet;//对象的属性是另外一个对象[涉及级联] public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Pet getPet() { return pet; } public void setPet(Pet pet) { this.pet = pet; } @Override public String toString() { return "Master{" + "id=" + id + ", name='" + name + '\'' + ", pet=" + pet + '}'; } }
修改VoteHandler.java, 增加方法
//获取到添加的主人信息 @RequestMapping(value = "/vote03") public String test03(Master master) { System.out.println("主人信息= " + master); //返回结果 return "success"; }
修改request_parameter.jsp, 增加演示代码
<h1>添加主人信息</h1> <!-- 1. 这是一个表单,表单的数据对应Master对象 2. 提交的数据参数名和对象的字段名一致 --> <form action="vote/vote03" method="post"> 主人号:<input type="text" name="id"><br> 主人名:<input type="text" name="name"><br> 宠物号:<input type="text" name="pet.id"><br> 宠物名:<input type="text" name="pet.name"><br> <input type="submit" value="添加主人和宠物"> </form>
完成测试。
使用注意事项
- 支持级联数据获取
- 表单的控件名称name 需要和javabean 对象字段对应, 否则就是null
获取servlet api
应用实例
- 开发中, 我们可能需要使用到原生的servlet api 。
- 使用servlet api , 需要引入tomcat/lib 下的servlet-api.jar。
修改VoteHandler.java, 增加方法。
@RequestMapping(value = "/vote04") public String test04(HttpServletRequest request,HttpServletResponse response) { System.out.println("name= " + request.getParameter("username")); System.out.println("pwd= " + request.getParameter("pwd")); //返回结果 return "success"; }
修改request_parameter.jsp
<hr> <h1>获取servlet api </h1> <form action="vote/vote04" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="text" name="pwd"><br> <input type="submit" value="添加主人和宠物"> </form>
完成测试
使用注意事项
除了HttpServletRequest, HttpServletResponse 还可以其它对象也可以这样的形式获取
HttpSession、java.security.Principal,InputStream,OutputStream,Reader,Writer
其中一些对象也可以通过HttpServletRequest / HttpServletResponse 对象获取,比如Session 对象,既可以通过参数传入,也以通过request.getSession() 获取,
效果一样,推荐使用参数形式传入,更加简单明了。
举例说明
@RequestMapping(value = "/vote04") public String test04(HttpServletRequest request,HttpServletResponse response, HttpSession hs) { System.out.println("name= " + request.getParameter("username")); System.out.println("pwd= " + request.getParameter("pwd")); //可以看到hs 和request.getSession() 是同一个对象 System.out.println("httpSession=" + httpSession); System.out.println("httpSession2=" + request.getSession()); //返回结果 return "success"; }
模型数据
模型数据处理-数据放入request
开发中, 控制器/处理器中获取的数据如何放入request 域,然后在前端(VUE/JSP/…)取出显示
方式1: 通过HttpServletRequest 放入request 域
创建springmvc\web\model_data.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>测试模型数据</title> </head> <body> <h1>添加主人信息</h1> <!-- 1. 这里的字段名称和对象的属性名保持一致,级联添加属性也是一样保持名字对应关系 2. 如果只是添加主人信息,则去掉宠物号和宠物名输入框即可,pet 为null--> <form action="vote/vote05" method="post"> 主人号:<input type="text" name="id"><br> 主人名:<input type="text" name="name"><br> 宠物号:<input type="text" name="pet.id"><br> 宠物名:<input type="text" name="pet.name"><br> <input type="submit" value="添加主人和宠物"> </form> </body> </html>
修改VoteHandler.java, 增加方法
/** * 1. 演示将提交的数据->springmvc封装到java对象->springmvc 会自动的将其放入到request域 * 2. 这样我们就可以在跳转到的页面取出数据. */ @RequestMapping(value = "/vote05") public String test05(Master master, HttpServletRequest request) { //1. springmvc会自动把获取的model模型,放入到request域中,名字就是master //2. 也可以手动将master放入到request request.setAttribute("address", "beijing"); //3. 如果我们希望修改master的属性值 master.setName("nono"); //4. 分析一下springmvc默认存放对象到request域中,属性名是 // request域 ("master", master) 属性名是类名/类型名 首字母小写 //返回到一个结果 return "vote_ok"; }
创建springmvc\web\WEB-INF\pages\vote_ok.jsp, 显示数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>vote_ok </title> </head> <body> <h1>获取的的数据显示页面</h1> <hr> 取出request 域的数据 <br> address: ${address }<br> 主人名字= ${requestScope.master.name } 主人信息= ${requestScope.master } 宠物名字= ${requestScope.master.pet.name } </body> </html>
完成测试
方式2: 通过请求的方法参数Map<String,Object> 放入request 域
修改model_data.jsp, 增加代码
<h1>添加主人信息[测试 Map ]</h1> <form action="vote/vote06" method="post"> 主人号:<input type="text" name="id"><br> 主人名:<input type="text" name="name"><br> 宠物号:<input type="text" name="pet.id"><br> 宠物名:<input type="text" name="pet.name"><br> <input type="submit" value="添加主人和宠物"> </form>
修改VoteHandler.java , 增加方法
//演示通过Map<String,Object> 设置数据到request域 @RequestMapping(value = "/vote06") public String test06(Master master, Map<String, Object> map) { System.out.println("------test06-----"); //1. 需求是通过map对象,添加属性到request中 //2. 原理分析:springmvc会遍历map,然后将map的k-v, 存放到request域 map.put("address", "beijing..."); //返回到一个结果 return "vote_ok"; }
完成测试
方式3: 通过返回ModelAndView 对象实现request 域数据
修改model_data.jsp, 增加代码
<h1>添加主人信息[测试ModelAndView]</h1> <form action="vote/vote07" method="post"> 主人号:<input type="text" name="id"><br> 主人名:<input type="text" name="name"><br> 宠物号:<input type="text" name="pet.id"><br> 宠物名:<input type="text" name="pet.name"><br> <input type="submit" value="添加主人和宠物"> </form>
修改VoteHandler.java , 增加方法
//将model 放入到ModelAndView 对象中,实现将数据放入到request 域中 @RequestMapping(value = "/vote07") public ModelAndView test07(Master master) { System.out.println("----test07----"); //创建一个ModelAndView 对象 ModelAndView modelAndView = new ModelAndView(); //下面这句话就等价于将master 对象放入到request 域中,属性名“master” modelAndView.addObject("master", master); modelAndView.addObject("address", "shanghai"); //可以把从数据库得到的数据->对象-》放入modelAndView[Service-dao-db] //这里指定跳转的视图名称 modelAndView.setViewName("vote_ok"); //返回结果 return modelAndView; }
完成测试
注意事项
从本质看,请求响应的方法return “xx”, 是返回了一个字符串,其实本质是返回了一个ModelAndView 对象,只是默认被封装起来的。
ModelAndView 即可以包含model 数据,也可以包含视图信息。
ModelAndView 对象的addObject 方法可以添加key-val 数据,默认在request 域中。
ModelAndView 对象setView 方法可以指定视图名称。
模型数据处理-数据放入session
开发中, 控制器/处理器中获取的数据如何放入session 域,然后在前端(VUE/JSP/…)取出显示
应用实例
修改model_data.jsp, 增加代码
<br/><hr/> <h1>添加主人信息[测试session]</h1> <form action="vote/vote08" method="post"> 主人号:<input type="text" name="id"><br> 主人名:<input type="text" name="name"><br> 宠物号:<input type="text" name="pet.id"><br> 宠物名:<input type="text" name="pet.name"><br> <input type="submit" value="添加主人和宠物"> </form>
修改VoteHandler.java, 增加方法
//将model(master 对象) 放入到session 域中 @RequestMapping(value = "/vote08") public String test08(Map<String, Object> map, Master master,HttpSession session) { System.out.println("======test08()======"); map.put("address", "guangzhou"); //在session 域也放入master 对象 session.setAttribute("master2", master); return "vote_ok"; }
修改vote_ok.jsp , 增加代码
<hr> 取出session 域的数据<br> 主人名字= ${sessionScope.master2.name } 主人信息= ${sessionScope.master2 }
完成测试
@ModelAttribute 实现prepare 方法
应用实例
开发中,有时需要使用某个前置方法(比如prepareXxx(), 方法名由程序员定)给目标方法准备一个模型对象。@ModelAttribute 注解可以实现这样的需求。
修改VoteHandler.java, 增加方法并测试
/** * 1. 当在某个方法上,增加了@ModelAttribute 注解 * 2. 那么在调用该Handler 的任何一个方法时,都会先调用这个方法 */ @ModelAttribute public void prepareModel(){ System.out.println("prepareModel()-----完成准备工作-----"); }
@ModelAttribute 最佳实践
修改用户信息(就是经典的使用这种机制的应用),流程如下:
- 在修改前,在前置方法中从数据库查出这个用户
- 在修改方法(目标方法)中,可以使用前置方法从数据库查询的用户
- 如果表单中对用户的某个属性修改了,则以新的数据为准,如果没有修改,则以数据库的信息为准,比如,用户的某个属性不能修改,就保持原来的值。