1. 字符串
如果配置通过视图解析器,则返回的字符串会变成视图解析器的URL,不通过视图解析器则直接在浏览器中显示返回的字符串。
如需要返回参数,可以在方法的参数中加入Model ,然后将参数存入Model中。
2. void
- 默认会转发到当前Mapping通过视图解析器的地址。
- 实际中可以通过原生的API HttpServletRequest来实现转发:request.getRequestDispatcher(“URL”);
- 还可以用HttpServletResponse来实现重定向:response.sendRedirect(request.getContextPath"URL");
注:重定向不能直接访问WEB-INF下的目录。
3. ModelAndView
与返回字符串类似,不过将Model和返回字符串合并为一个对象。返回 ModelAndView 类型时,浏览器跳转只能是请求转发。
注:不利于前后端分离
@RequestMapping(value = "/test")
public ModelAndView json() {
//创建mv对象
ModelAndView mv = new ModelAndView();
User user = new User("冰冰", 22);
//往mv中存入对象,会将对象存到request对象中
mv.addObject("user", user);
//返回跳转地址
mv.setViewName("hello");
return mv;
}
4. 转发和重定向
forward 转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。
@RequestMapping("/testForward")
public String testForward() {
System.out.println("AccountController 的 testForward 方法执了。。。。");
return "forward:/WEB-INF/pages/success.jsp";
}
需要注意的是,如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
Redirect 重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("AccountController 的 testRedirect 方法执行了。。。。");
return "redirect:testReturnModelAndView";
}
它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
注:重定向默认应该写项目地址,这里框架自动加上了,不需要再写。
5. ResponseBody 响应 json 数据
- DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置
mvc:resources标签配置不过滤
location元素表示webapp目录下的包下的所有文件
mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b
<!-- 设置静态资源不过滤 -->
<mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
<mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
<mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
- 使用@RequestBody获取请求体数据
$(function(){
// 绑定点击事件
$("#btn").click(function(){
$.ajax({
url:"user/testJson",
contentType:"application/json;charset=UTF-8",
data:'{"addressName":"aa","addressNum":100}',
dataType:"json",
type:"post",
success:function(data){
alert(data);
alert(data.addressName);
}
});
});
});
@RequestMapping("/testJson")
public void testJson(@RequestBody String body) {
System.out.println(body);
}
. json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
@RequestMapping("/testJson")
public @ResponseBody Address testJson(@RequestBody Address address) {
System.out.println(address);
address.setAddressName("上海");
return address;
}