web开发的几种常见的模式:
同步开发:每次请求客户端发起url,服务端解析并渲染页面(jsp),输出流把渲染的静态html返回客户端。
半分离的异步开发:
前端html代码与后端java代码仍然在一个项目中,一起部署到tomcat,用户先请求tomcat获取html页,客户端拿到html后,再发起ajax异步请求获取数据,客户端拿到数据后再通过前端技术来渲染动态html页(DOM操作)。
全分离异步开发(前后端分离):
用户先请求nginx获取html页,再发起针对tomcat服务器的异步请求,拿到数据,客户端动态渲染页面。
前端html代码独立项目,独立部署nginx静态服务器;
后端java代码独立项目,独立部署tomcat动态服务器(处理数据);
http协议:
请求头:content-type:application/x-www-form-urlencoded:前端数据格式key=value&key=value
content-type:application/json:前端数据格式:{key:value,key:value,key:value}
content-type:multipart-formdata:文件上传场景:字节流
http-method:请求方法:get、post、put、delete,options
use-agent:客户端信息(浏览器,移动端)
响应头:content-type:text/html
application/json
第二阶段的servlet中request.getParameter()不能获取json数据,只能获取key=value&key=value
request.getInputStream(),读取输入流中的数据为String,后端得到json字符串,再通过fastjson或gson组件把json字符串转对象。
springMVC的spring框架中的一个子框架,是web模块中的一个小组件。
对servlet进行封装,解决servlet开发中繁琐的代码。
一个servlet只能够处理一件事情;
繁琐的getParameter,繁琐的转型;
返回json数据麻烦。response.getWriter().print(JSON.toJsonString(Object obj));
在web.xml配置springmvc的前端控制器DispatcherServlet。
两个作用:tomcat启动时加载spring的xml文件初始化容器;
用户请求时,解析请求url,根据url去springmvc容器中找到对应的处理器对象。
写springmvc风格的控制层对象controller(处理器对象)
tomcat启动:DispatcherServlet加载springmvc.xml,初始化XmlWebApplicationContext容器对象;
解析@Controller注解的类里面的@RequestMapping注解,进行url映射(url字符串/hm–>HandlerMethod)
Map<String,HandlerMethod>.put("/hm",hellomvc).put(“login”,loginpage)
用户请求:
dispatcherServlet接收请求,解析url字符串(/hm或/login),RequestMappingHandlerMapping查找处理器方法,把找到的方法返回dispatcherServlet在dispatcherServlet中,调用RequestMappingHandlerAdapter对象执行处理器方法,获取前端参数,解析封装,调用处理器方法,调用service,调用doa,得到方法的返回值,把返回值返回给dispatcherServlet;在dispatcherServlet中,调用视图解析器InternalResourceViewResolver得到视图路径。后端进行页面渲染,返回给前端。接收key=value&key=value格式的参数,content-type:application/x-www-form-urlencoded
加形参,底层通过反射,获取处理器方法的形参数组,根据形参名去getParameter获取数据。
可以通过@DateTimeFormated指定日期格式
可以通过@RequestParam注解指定参数默认值,该注解只能用在简单类型上,获取key=value数据.
接收前端{key:value,key:value}json格式的参数,即请求头content-type:application/json
处理器方法的形参加注解@RequestBody注解
同步开发中:(服务器端渲染视图)request.setAttribute(key,value),在jsp页jstl+el。
springMVC中使用Model或者ModelAndView对象来把数据传输到视图层。
springMVC内部使用的jackson进行json处理。
在处理器方法上加@ResponseBody注解,springMVC对方法返回值走json转换器(MappingJackson2HttpMessageConverter)进行转json字符串处理器方法的返回值类型改为ResponseEntity对象. ResponseEntity.ok(数据)new ResponseEntity(数据,响应头,状态码)主要用在下载,刷新tokenget:tomcat8及以上版本不需要在server.xml中配置URIEncoding=UTF-8,useDefaultEncdoing=true。
post:加编码过滤器,CharacterEncodingFilter
如果前端表单参数属于多个实体对象.
参数以key=value&key=value传输,后端可以直接取数据参数以json传输,不能在通过@RequestBody直接注解两个对象,需要注解到map,再通过BeanUtils来分数据到对象。在处理器方法的形参上添加HttpServletRequest,HttpServletResponse,HttpSession。
如果需要获取ServletContext对象的话,通过request或session对象间接获取。
前端控制器(中央处理器):DispatcherServlet
处理器映射器:RequestMappingHandlerMapping:解析带有@Controller的类中的RequestMapping注解,进行url映射注册。当用户请求时,根据url得到对应的映射的处理器方法。
处理器适配器:RequestMappingHandlerAdapter:用来封装表单参数,执行处理器方法。
视图解析器:ViewResolver:设置视图的公共前缀和后缀,通过返回的ModelAndView对象得到完整的视图路径。
json转换器:Converter,MappingJackson2HttpMessageConverter,把对象转json字符串。
通过DateTimeFormat注解把获取的日期字符串指定日期格式,转成Date对象
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")//jackson在序列化对象的时候,把日期序列化这种格式字符串,timezone = "GMT+8" private Date rdate;总结:
做url映射: @RequestMapping注解,用来做url映射,把url映射一个处理器方法上。可以限定客户端提交请求的方法。
@GetMapping,@PostMapping,@PutMapping,@DeleteMapping
用于接收参数: @RequestParam,针对key=value格式的参数,注解到简单类型的形参上(String,Date,包装类,基本类型),可以设置默认值。
@RequestBody,针对{key:value}json格式的参数,注解到对象类型的形参上。也可以注解到Map上。
用于返回数据: @ResponseBody,表示处理器方法返回值不执行视图解析器,而是执行jackson消息转换器把返回值对象转 json字符串。
ResponseEntity:处理器方法的返回值类型,灵活的设置响应体,响应头,状态码.
ResponseEntity.ok(响应体数据)
new ResponseEntity(Obejct,HttpHeaders,HttpStatus)
其他:
ApplicationContext
WebApplicationContext
转发与重定向
restUrl