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 最佳实践
修改用户信息(就是经典的使用这种机制的应用),流程如下:
- 在修改前,在前置方法中从数据库查出这个用户
- 在修改方法(目标方法)中,可以使用前置方法从数据库查询的用户
- 如果表单中对用户的某个属性修改了,则以新的数据为准,如果没有修改,则以数据库的信息为准,比如,用户的某个属性不能修改,就保持原来的值。