SpringMvc
DispatcherServlet
- 原理图
常用注解
-
@RequestMapping
-
修饰范围
- 修饰类
- 修饰方法
-
参数
-
value
-
指定url, 如果只设定这一个参数, value= 可以不写.url可以用{xxx}占位符, url支持Ant风格
-
-
demo
-
@RequestMapping(value = "/info/{id}", method = RequestMethod.GET) CpRiskBVO info(@PathVariable("id") String id);
-
-
-
params
-
请求参数
-
支持简单表达式
-
demo
-
@Controller @RequestMapping(path = "/user") public class UserController { // 该方法将接收 /user/login 发来的请求,且请求参数必须为 username=abc&password=123456 @RequestMapping(path = "/login", params={"username=abc","password=123456"}) public String login() { return "success"; } }
-
-
-
method
- 请求的REST方式
- get
- 获取数据
- post
- 添加数据
- put
- 修改数据
- delete
- 删除数据
- get
- HiddenHttpMethodFilter
- 很多情况前端只支持get和post请求, 如表单只支持get和post请求, 那么如果要发送put和delete请求就要用到HiddenHttpMethodFilter
- 请求的REST方式
-
handers
- 请求头参数设置
- 支持简单表达式
-
consumes
- 指定请求的内容类型(Content-type)
-
produces
- 指定返回的内容类型
- 仅当request请求头中的(Accept)类型中包含该指定类型才返回
-
-
修饰方法形参的注解
-
@PathVariable
- 修饰方法参数和@RequestMapping的占位url合用
- 修饰方法参数和@RequestMapping的占位url合用
-
@RequestParam
-
demo
-
@PostMapping(value = "/account/decrease") CommonResult decrease(@RequestParam("userId") Long userId, @RequestParam("money") BigDecimal money); @GetMapping("/testHotKey") public String testHotKey(@RequestParam(value = "p1",required = false) String p1, @RequestParam(value = "p2",required = false) String p2)
-
-
-
@RequestBody
-
demo
-
@PostMapping(value = "/payment/create") public CommonResult create(@RequestBody Payment payment)
-
-
-
@CookieValue
-
@RequestHeader
-
demo
-
@GetMapping("/q") public PageInfo<Share> q( @RequestParam(required = false) String title, @RequestParam(required = false, defaultValue = "1") Integer pageNo, @RequestParam(required = false, defaultValue = "10") Integer pageSize, @RequestHeader(value = "X-Token", required = false) String token)
-
-
-
@ModelAttribute(“xxx”)
- 获取已经在ModelAndView中的对象(如用@ModelAttribute修饰过的方法)
-
POJO(非注解)
- SpringMVC会按请求参数名和形参POJO属性名进行自动匹配(支持级联属性)
- demo
-
-
修饰在方法上的注解
-
@RequestMapping
-
@ResponseBody
-
可以将整个返回结果以某种格式返回,如json或xml格式, 方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中
-
demo
-
//注意这里不是返回到index页面, 而是把index这个字符串传到返回结果集中. @RequestMapping("/{myname}/pathVariable2.do") @ResponseBody public String pathVariable2(@PathVariable(value = "myname") String name){ System.out.println("myname = "+name); return "index"; }
-
-
-
@ModelAttribute
- 修饰的方法会在执行请求方法之前执行,并将该方法的返回值放到ModelAndView中,也可修饰入参
- 默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。配合@ModelAttribute(“user”)使用的时候,会将对应的名称的model值存到session中,
-
对于不是映射到视图的处理方法, 一般都是用HttpEntity<>或者ResponseEntity
或者是ModelAndView配合视图解析, 如ModelAndView json = new ModelAndView(new MappingJackson2JsonView()),然后把要返回的数据放到json , 然后return json
-
ResponseEntity是ResponseBody+HttpHeader+HttpStatus
ResponseEntity是HttpEntity的子类, 他可以设置和读取响应体,响应状态码和响应头.
HttpEntity不能设置响应头, 其他的都没差
他们都可以作为方法的返回类型, HttpEntity还可以是方法的形参类型
-
demo
-
@GetMapping("/customHeader") ResponseEntity<String> customHeader() { return ResponseEntity.ok() .header("Custom-Header", "foo") .body("Custom header set"); }
-
-
-
修饰类的注解
-
@RequestMapping
-
@SessionAttribute
-
demo
-
@Controller @RequestMapping("/test") @SessionAttributes(value = {"user","test1"}) public class LoginController{ @ModelAttribute("user") public UserEntity getUser(){ UserEntity userEntityr = new UserEntity(); userEntityr.setUsername("asdf"); return userEntityr; } @RequestMapping("/modelTest.do") public String getUsers(@ModelAttribute("user") UserEntity user ,HttpSession session){ System.out.println(user.getUsername()); System.out.println(session.getAttribute("user")); return "/index"; } }
-
-
-
@RestController
- @ResponseBody+@Controller的组合体, 返回return里面的内容
-
-
容易混淆的注解
- @RequestMapping中的parames
- 请求url或body中是否有对应parames, 主要作用是筛选url
- @Pathvariable
- url占位符入参
- @RequestParam
- 请求参数(基本数据类型等)入参
- @RequestBody
- 请求参数(json,xml等)到指定类型(与json,xml数据结构对应的类)入参
- @RequestMapping中的parames
-
以实例化的入参
- Servlet api
- HttpServletRequest
- HttpServletResponse
- HttpSession
- IO
ModelAndView
-
既包含视图信息(所要被映射的视图名), 又包含视图所需的模型数据(contrl处理结果返回的数据)
Map数据结构
无论contrl方法返回什么, SpringMVC都会封装成ModelAndView, 最后通过视图解析器去解析ModelAndView.
默认情况下Spring MVC将模型中的数据存储到request域中
-
- viewResolver视图解析器
- viewResolver视图解析器
请求转发和重定向
- 转发
- 返回的字符串带forward:
- 重定向
- 返回的字符串带redirect:
数据绑定和数据转换
-
原理
-
-
springMVC内置的转换器
-
自定义转换器
-
demo
-
public class Employee { private Integer id; private String name; private String email; private Integer gender; private Department department; private Date birth; private double salary; ...... } public class Department { private Integer id; private String departmentName; ........... } package com.seven.converts; import com.seven.domain.Department; import com.seven.domain.Employee; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; /** * Created by hu on 2016/4/3. */ @Component //该类的主要目的是将字符串转换为一个Employee对象 public class EmployeeConverts implements Converter<String,Employee> { @Override /* * source就是前台web页面传递过来的字符串 * 如:gg-gg@qq.com-0-105 姓名-邮件-性别-部门ID * */ public Employee convert(String source) { if(source!=null){ String[] vals=source.split("-"); //获得雇员的姓名 String name=vals[0]; //获得雇员的邮件 String email=vals[1]; //获得雇员的性别 Integer gender=Integer.parseInt(vals[2]); //获得雇员的部门 Department department=new Department(); department.setId(Integer.parseInt(vals[3])); Employee employee=new Employee(null,department,gender,email,name); return employee; } //如果字符串为空,就不生成雇员对象 return null; } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置自动扫描的包--> <context:component-scan base-package="com.seven"></context:component-scan> <!--配置视图解析器,将视图逻辑名解析为/WEB-INF/pages/<viewName>.jsp--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!--将自定义的转换器加入到框架中--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.seven.converts.EmployeeConverts"/> </set> </property> </bean> <mvc:annotation-driven/> <mvc:default-servlet-handler/> </beans>
-
-
-
拦截器
-
请求进行拦截处理
-
- 实现HandlerInterceptor接口
-
preHandle():这个方法在业务处理器处理请求之前被调用,在该
方法中对用户请求 request 进行处理。如果程序员决定该拦截器对
请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去
进行处理,则返回true;如果程序员决定不需要再调用其他的组件
去处理请求,则返回false。
-
postHandle():这个方法在业务处理器处理完请求后,但
是DispatcherServlet 向客户端返回响应前被调用,在该方法中对
用户请求request进行处理。
-
afterCompletion():这个方法在 DispatcherServlet 完全处理完请
求后被调用,可以在该方法中进行一些资源清理的操作
-
-
- 实现WebMvcConfigurer接口, 把拦截器添加进来, 并且配置path
-
参考 (3条消息) SpringBoot之HandlerInterceptor拦截器的使用 ——(一)_zhibo_lv的博客-CSDN博客_handlerinterceptor
-
文件上传和下载
校验(JSR 303)
Servlet
加载顺序
- ServletContext -> context-param -> listener -> filter -> servlet ->Spring
web.xml
- 作用
- 配置启动页
- 配置监听器Listener
- 配置过滤器Filter
- 配置Servlet和JSP
- 配置全局资源
重要对象
- ServletContext
- HttpServletRequest
- getParameter()
- 获取改请求的属性( 只能是字符串值)
- getAttribute() / setAttribute()
- 获取/设置改作用域对象的属性(可以是字符串和Object)
- getParameter()
- HttpServletResponse
- HttpSession
- ServletConfig
作用域对象
- 对象放入ServletContext
- 对象放入HttpServletRequest
- 对象放入HttpSession
Filter
-
原理
-
因为Filter的优先级大于Servlet,所以就可以在请求(request)到达Servlet之前做一些事情, 因为Filter是链式处理(调用FilterChain.doFilter()), 所以还可以在Servlet放回response之后进行二次处理。
实现该方法就可实现对用户请求进行预处理,也可实现对服务器响应进行后处理——它们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。
关于Filter的链, 因为Filter的优先级大于Servlet, 所以在一个URL同时满足Filter和Servlet的时候, 会先经过Filter,Filter之间的优先级和配置文件的FilterMapper循序一致,显示调用FilterChain.doFilter()就是执行下一条链,等所有满足的Filter链都处理完了, 调用FilterChnail.doFilter()就调用了Servlet。
除了根据符合条件(URL)配置文件的FilterMapper的顺序确定Filter的链之外, 还可以在Filter的doFilter方法里面显示的在当前链节点中添加链节点(request请求转发)
-
Listener
- 原理
- application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件
请求转发和重定向
- 重定向
- 新的请求
- 重定向发生在客户端,多以可以重定向到任意路径
- 请求参数只能是字符串
- 转发
- 同一个请求
- 可以转发原来的request字符串(请求参数的字符串值)或Object对象(放在作用域的对象)
其他
- 单例,为每一用户请求开辟一个线程。高并发注意共享资源安全问题
- get / post解决中文乱码问题
cookie和session和token
- Cookie
- 只能存储字符串
- 设置domain属性来实现跨域名
- 在客户端
- Session
- 可以存储任何类型的数据
- 不可夸域名
- 在服务器
- 每个用户都会产生一个Session,如果是并发访问的用户非常多,是不能使用Session的,Session会消耗大量的内存
- 存储任何类型的数据
- token
Servlet3.0
- 对异步支持
- AsynContext
- HttpServletRequest支持文件上传
- request.getPart(“XXX”)
- 编码的方式生成Servlet,Filter, Listener和配置参数, 这样就可以在运行的时候动态的生成了。
- 非阻塞IO
JSP(特殊的Servlet)
Tomcat
Connector 运行模式
- bio:传统的Java I/O操作,同步且阻塞IO。(默认)
- nio:JDK1.4开始支持,同步阻塞或同步非阻塞IO。
- aio(nio.2):JDK7开始支持,异步非阻塞IO。
- apr
优化
- JVM优化, 因为Tomcat是存Java语言实现的
- 参数设置
- 垃圾回收机制设置
- 自身参数设置
- gzip压缩
- 服务器对响应内容进行压缩, 浏览器解压(节省流量)
- 线程数配置(每个servlet都启用了一个线程)
- gzip压缩
- 监控工具
- JVM监控工具
- jconsole
- jvisualvm
- JVM监控工具