文章目录
常用注解
RequestParam:用于指定前端传参
RequestBody:用于获取整个请求体内容(key=value形式)get 请求方式不适用。
PathVaribale:用于获取占位符上的值
RequestHeader:用于获取请求头
CookieValue:用于获取cookie
ModelAttribute:该注解出现在方法上时,会在控制器的方法执行之前执行。出现在参数上可以获取指定的数据给参数赋值
SessionAttribute:用于指定session域中的内容,指定过后的参数可以通过model的addAttribute方法去赋值,没指定的赋值也取不出来。ModelMap用于取出session域中的值,SessionStatus用于去除session域中的值
REST 风格 URL
传统方式我们控制器中的方法映射过后通过不同的url地址来访问,使用rest编程风格之后,我们可以通过同样的地址进行访问,使用浏览器的不同请求方式来辨别不同的方法,如get和post,put等。如果同样得请求方式,还可以通过占位符来辨别不同得方法,
controller 方法返回值
常用为三种
字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
void
如果返回值为void则需要我们手动获取request和response对象,然后手动去重定向或者转发,否则会自动去找方法名对应的jsp文件。
@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request,HttpServletResponse response)
throws Exception {
}在 controller 方法形参上可以定义 request 和 response,使用 request 或 response 指定响应结果:
1、使用 request 转向页面,如下:
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,
response);
2、也可以通过 response 页面重定向:
response.sendRedirect("testRetrunString") 3、也可以通过 response 指定响应结果,例如响应 json 数据:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json 串");
ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
该对象中有两个方法:addObject和setViewName
控制器代码:addObject可以往request域中存值setViewName可以设定跳转的页面
/**
* 返回 ModeAndView
* @return
*/
@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
ModelAndView mv = new ModelAndView();
mv.addObject("username", "张三");
mv.setViewName("success");
return mv; }
响应的jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
执行成功!
${requestScope.username}
</body>
</html>
结果:
注意这里的页面跳转是转发
ResponseBody 响应 json 数据
解决DispatcherServlet过滤静态文件问题
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 -->
配置如下的目录结构,以后js文件就放js目录下,images放图片,css放格式
前端代码
需要注意的是我们如果使用的jsp文件就不可以写这种引用静态文件的地址
这样系统会报错
出现这种问题建议可以直接使用cdn的方式,使用网络上的jquery文件
<%--
Created by IntelliJ IDEA.
User: cc
Date: 2021/5/28
Time: 16:50
To change this template use File | Settings | File Templates.
--%>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<html>
<head>
<script src="js/jquery.min.js"> </script>
<script>
$(function () {
$("#btn").onclick(function () {
$.ajax({
url: "testJson",
contentType: "application/json;charset=UTF-8",
data: '{"username":"陈超","password":158212,address:上海}',
dataType: "json", type: "post",
success: function (data) {
alert(data);
alert(data.username);
}
})
})
})
</script>
<title>测试json异步请求</title>
</head>
<body>
<button id="btn">点击按钮发送异步请求</button>
</body>
</html>
还有一点需要注意
我当时user对象是这么写的,json是可以解析出来这些数据的,传过去就有值,没传过去就是默认值null
控制器代码
@RequestMapping("testJson")
public @ResponseBody User TestJson(@RequestBody User user){
System.out.println(user);
user.setBirthday(new Date());
user.setAddress("金华");
return user;
}