二、SpringMVC之控制器的数据响应和页面跳转使用
一、SpringMVC的控制器方法的返回值
1、概述
SpringMVC的控制器方法提供了有三种返回值类型
- String :该返回值可以借助配置的视图解析器完成成页面跳转,数据响应需要借助形参的model或者request完成
- void:没有返回值,所以需要程序员自己使用servletAPI完成数据响应和页面跳转
- ModelAndVIew:该返回值可以完成数据响应和页面跳转。
逻辑视图:控制器方法默认返回值路径,需要通过视图解析器解析获取真实视图;
真实视图:视图页面所在的真实路径。
视图解析器的配置:用来解析控制器返回的逻辑视图,定位到真实视图。
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--
prefix:前缀
suffix:后缀
视图解析器,通过在控制器返回的逻辑视图添加前缀和后缀来定位到真实视图
-->
<property name="prefix" value="/WEB-INF/jsps/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
2.String返回值的控制器方法(常用)
i:响应数据:
1).可以通过request对象响应数据
2).可以通过Model对象响应数据(DispatcherServlet内部会解析Model对象中的数据,
并封装到本次请求的request对象中,请求转发时就可以将数据携带到对应视图)
ii:页面跳转:只需要在返回值中明确指定页面跳转方式
1)redirect:页面的完整路径
2)forward:页面的完整路径
3)默认跳转方式为请求转发,可以直接写页面的逻辑视图,DispatcherServlet(springMVC核心控制器)
内部通过配置好的视图解析器获取真实视图,完成跳转。
控制器方法
@RequestMapping("/find")
public String testfind(String username, HttpServletRequest request, HttpServletResponse response, Model model) {
User user = findUser(username);
/**
* 1.1通过request对象完成数据封装,request对象需要写到方法形参上,由核心控制器为我们传入
* request.getSession().setAttribute("user", user);
* 1.2通过Model对象完成数据封装,Model对象需要写到方法形参上,由核心控制器为我们传入
* model.addAttribute("user", user);
*/
request.getSession().setAttribute("user", user);
// model.addAttribute("user", user);
/**
* 2.1重定向方式跳转页面
* return "redirect:login.jsp";
* 2.2请求转发方式跳转页面
* return "forward:/WEB-INF/jsps/success.jsp";
* 2.3默认方式跳转页面
* return "success.jsp";
*/
return "success.jsp";
}
3.ModelAndVIew返回值的控制器方法(常用)
ModelAndVIew提供了两个方法分别来封装跳转方式和数据响应
setViewName:用来封装跳转路径,可以指定跳转方式,也可以使用默认的请求转发,路径的写法和String类型相似
addObject: 用来封装数据响应(key-value形式)
/**
* ModelAndView:
* 1页面跳转
* setViewName方法 :设定跳转视图
* 1.1. 默认为请求转发,可以直接写逻辑视图
* 1.2指定页面跳转方式
* 1)重定向 redirect:/redirect.jsp
* 2)请求转发 forworad:/WEB-INF/jsps/success.jsp
* 注意:指定条转发方式后必须写真实视图(即视图所在的全路径)
* 默认方式可以写逻辑视图
* 2数据封装
* 2.1一般通过:
* addObject方法 : 用来响应数据的(key—value)
* 内部处理:也是将对象中的数据,存入到request域中
* 2.2也可以直接存入request对象中,但这样就失去ModelAndView返回值的意义,
* 形参还是需要传入request对象
*
*
*
*/
@RequestMapping("/get")
public ModelAndView testget(String username, HttpServletRequest request, HttpServletResponse response,
Model model) throws MyException {
System.out.println(username);
ModelAndView mv = new ModelAndView();
User user = findUser(username);
mv.addObject("user",user);
mv.setViewName("redirect:/login.jsp");
return mv;
}
3.void返回值的控制器方法(不建议使用)
主要通过servlet的API完成数据响应和页面跳转,servlet相关对象需要写到控制器方法的形参上来获取
/**
*控制器方法:返回值 void
*主要通过servlet的API完成数据响应和页面跳转
*请求转发
*/
@RequestMapping(value="/testResponse")
public void testResponse(HttpServletRequest request,HttpServletResponse response) throws ServletException, Exception {
User user = new User();
user.setUsername("李四");
request.setAttribute("user", user);
//页面跳转
//请求转发
request.getRequestDispatcher("/WEB-INF/jsps/success.jsp").forward(request, response);
}
/**
* 重定向
*/
@RequestMapping(value="/testRedirect")
public void testRedirect(HttpServletRequest request,HttpServletResponse response) throws ServletException, Exception {
/**
* 相对路径
*/
response.sendRedirect("../redirect.jsp");
}
4.ajax请求的控制器方法
由于ajax请求不存在页面跳转,这里只涉及数据封装和数据响应
1)参数封装:
i.当通过发送请求为普通参数时,可以直接通过形参接受
ii.当请求参数声明为json字符串时,可以通过@RequestBody注解,将json字符串解析为形参对象
2)数据响应:数据响应可以直接通过控制器方法的返回值完成,对于对象类型返回值,可以通过注解@ResponseBody注解完成json字符串转换。
普通参数控制器方法
@RequestMapping("/find")
/**
* 1)数据封装:
* ajax发送请求,携带的为普通参数时,
* 可以通过控制器方法的形参直接接受,或者通过相应对象接受并封装
* 如本例中的User
* 2)数据响应:
* 数据响应可以直接作为方法的返回值进行返回,
* 如果是对象,可以通过@ResponseBody转换为json字符串返回
* @ResponseBody:将控制器方法的返回值,转换成json字符串返回给ajax请求
*
*/
public @ResponseBody User testAjax(User user) {
System.out.println(user);
User DBUser = findUser(user.getUsername());
return DBUser;
}
普通参数jsp页面
<body>
<h1>ajax请求</h1>
<input type="button" value="post提交" onclick="func()">
<!--数据展示的div-->
<div id="show"></div>
<br>
<script type="text/javascript">
function func() {
var URL = "${pageContext.request.contextPath }/find";
var params = {
"username" : "cgx",
"age" : "40"
};
//ajax发送带参数的请求
$.post(URL, params, function(data) {
//响应数据展示
$("#show").html(data.username + "--" + data.birthday + "---"+ data.age);
}, "json");
}
</script>
</body>
请求为json字符串的控制器方法
/**
* 1)数据封装:
* 请求参数为json字符串,可以通过在形参上添加@RequestBody注解,
* 完成对json字符串的解析和封装
* 如本例中的User
* @RequestBody:将请求参数的json字符串解析为对象,并封装到形参中
* 2)数据响应:
* 数据响应可以直接作为方法的返回值进行返回,
* 如果是对象,可以通过@ResponseBody转换为json字符串返回
* @ResponseBody:将控制器方法的返回值,转换成json字符串返回给ajax请求
*
*/
@RequestMapping("/findUser")
public @ResponseBody User findUser(@RequestBody User user) {
System.out.println("-->ajax请求的参数 user = " + user);
User DBUser = findUser(user.getUsername());
return DBUser;
}
请求为json字符串的jsp页面
<body>
<input type="button" value="提交" onclick="getUser()" />
<br /> 无刷新请求后的数据
<!--响应展示的div-->
<div id="result"></div>
<script type="text/javascript">
function getUser() {
var URL = "${pageContext.request.contextPath }/findUser";
//ajax发送,请求参数为json字符串
$.ajax({
type : "POST",
url : URL,
data : '{"username":"cgx","age":"40"}',
dataType : 'json',
contentType : 'application/json;charset=utf-8', //请求头信息(json字符串)
success : function(data) {
$("#result").html(data.username + "--" + data.birthday + "---"+ data.age);
}
})
}
</script>
</body>