回顾
springmvc
控制器 - 前控制器, 自己写的控制器
模型 - Model.addAttribute(“名称”, 值);
视图 - jsp, jstl, el
- 添加依赖
- 编写springmvc的配置文件
<mvc:annotation-driven/> <!-- 启用springmvc的注解,并添加对这些注解进行解析的类 -->
<context:component-scan basePackage="包名.控制器类"/>
<!-- 视图解析器 -->
<mvc:view-resolvers>
<mvc:jsp prefix="前缀" suffix="后缀"/>
</mvc:view-resolvers>
<!-- 上传文件的解析器 -->
<bean id="multipartResolver" class="...CommonsMultipartResolver">
</bean>
<!-- 静态资源(html, 图片,js, css)的处理 -->
<mvc:default-servlet-handler/>
- 控制器
前控制器 web.xml, 作用1:统一入口,作用2:负责创建spring容器,并请求路径找到控制器来处理请求
<servlet>
<servlet-name>aa</servlet-name>
<servlet-class>DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring配置文件位置</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>aa</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
自己写的控制器
@Controller
public class 控制器类 {
@RequestMapping("请求路径(唯一)")
public String 控制器方法(@PathVariable("编号") int id, Model model) {
// 1. 接收参数
// a.方法参数名 与 请求参数名 相对应
// b.对象作为方法参数, 对象的属性与 请求参数 相对应
// c.把请求信息包含在路径当中 /deleteUser/编号
// 2. 处理模型数据
model.addAttribute("名", 值);
// 3. 返回一个视图名, 对jsp视图采用了请求转发来跳转
return "视图名";
}
}
- 细节
中文乱码 - 配置 CharacterEncodingFilter
使用servlet的对象 - HttpServletRequest, HttpServletResponse, HttpSession
异常处理 @ExceptionHandler @ControllerAdvice
文件上传
<form method="post" enctype="multipart/form-data">
<input type="file" name="file">
</form>
控制器方法,声明一个参数 MultipartFile file, transferTo(File file)
==============================================================================
1. spring 中的拦截器
请求到达控制器之前,先经过拦截器,才到达控制器
Filter 过滤器接口
HandlerInterceptor 拦截器接口
- 编写拦截器
@Component
public class Interceptor1 implements HandlerInterceptor {
// 在控制器方法执行前被调用, 返回 true 放行请求, 如果返回 false 拦截请求(不会前进了)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==========> 进入了 Interceptor1 preHandle");
return true;
}
// 在控制器方法执行后被调用
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("==========> 进入了 Interceptor1 postHandle");
}
// 在控制器和视图都完成后被调用
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("==========> 进入了 Interceptor1 afterCompletion");
}
}
- 配置拦截器
<!-- 某个拦截器 -->
<mvc:interceptor>
<!-- 拦截器要匹配的路径 -->
<mvc:mapping path="/hello" />
<!-- 要调用的拦截器 -->
<ref bean="interceptor1"/>
</mvc:interceptor>
2. 对 json 数据的支持
var xhr = new XMLHttpRequest(); 可以在页面不刷新的情况下与服务器进行交互
xhr.onload = function() {
var json = xhr.responseText;
JSON.parse(json); // 把json字符串转为 js 对象
};
xhr.open("get|post", url, true|false);
xhr.send();
2.1 @ResponseBody 注解
加在控制器方法上,将控制器方法的返回结果转换为json字符串,并写入响应
2.2 @RestController 注解
加在控制器类上,表示所有控制器方法都加了 @ResponseBody 注解
2.3 其他注解
@RequestMapping // 不区分 get,post
@GetMapping // 专门匹配 get 请求 等价于 @RequestMapping(method=RequestMethod.GET)
@PostMappping // 专门匹配 post 请求
@DeleteMapping // 专门匹配 delete 请求
@PutMapping // 专门匹配 put 请求
get 一般对应查询操作 select
post 一般对应新增操作 insert
delete 对应删除操作 delete
put 对应修改操作 update
2.4 @RequestBody
把请求中的json 字符串,转换为java 对象
服务器端代码:
@PostMapping("/json4")
// @RequestBody 作用是把请求体中的 json 字符串,转为 java 中的对象
public void json4(@RequestBody Student student) {
System.out.println(student);
System.out.println("ok");
}
客户端代码:
function sendStudent() {
var student = {"id": 2, "name":"李四"}; // {id: 2, name:"李四"}
var xhr = new XMLHttpRequest();
xhr.open("post", "/json4", true);
// 设置请求体的格式为 json 格式
xhr.setRequestHeader("content-type", "application/json");
// 将 js 对象 转为为 json 字符串, 并作为请求体, 发送给服务器
xhr.send( JSON.stringify(student) );
}
2.5 ajax 请求跨域(源)
两个应用程序,ip 地址不一样或是端口号不一样,就称之为跨域
localhost:8080 提供控制器,返回json数据, 通过 cors 的技术运行其他域的机器访问我的数据
@CrossOrigin(“允许访问我的数据的ip地址”)
@CrossOrigin("http://192.168.9.3") // 只允许9.3 访问
@CrossOrigin("http://192.168.9.3,http://192.168.9.4,http://192.168.9.5") //允许多个ip访问
@CrossOrigin("*") // 允许所有域访问
可以加在方法上,表示只有此方法允许跨域
还可以加在控制器类上,表示此控制器中的所有方法都允许跨域
localhost:9090 ajax 获取 localhost:8080 的json数据, 默认情况没有权限访问
3. 重定向请求
@RequestMapping("/test1")
public String test1() {
// 重定向到 /test2 控制器
return "redirect:/test2";
}
@RequestMapping("/test2")
public void test2() {
//...
}