SpringMVC(Servlet封装)01
1、执行流程
1、进行表现层开发
2、XML流程
(1)导入依赖
(2)写spring-ioc.xml、spring-mvc.xml配置
ioc的
mvc的
注意:是这个命名空间
(3)配置web.xml文件
Archetype Created Web Application
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
dispatcherServlet
/
(4)创建controller类
package com.qf.webmvc.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 排查 ** 用户功能(一个类相当于一个模块) * 1. 登录 * 2. 修改密码 * 3. 注册 */ @RestController @RequestMapping("/user") public class UserController { @PostMapping("/login") public String login(String username, String password) { System.out.println(username); System.out.println(password); return "登录接口"; } @GetMapping("/test") public String test() { System.out.println("测试代码"); return "hello"; } }
3、注解流程
(1)导入依赖
(2)初始化SpringMvc环境,设置springMvc加载对应的bean
package com.qf.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
/**
* 创建springMvc的配置文件,加载controller对应的bean
*/
@Configuration
@ComponentScan("com.qf.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
//todo 还有spring的
(3)初始化serlvet容器,加载springMVc环境,并设置springMvc技术处理的请求
package com.qf.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
/**
* 定义一个servlet容器启动的配置类,在里面加载spring的配置
*/
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return (WebApplicationContext) ctx;
}
//设置哪些请求归属springMvc处理
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring容器配置
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return (WebApplicationContext) ctx;
}
}
优化
package com.qf.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
/**
* 定义一个servlet容器启动的配置类,在里面加载spring的配置
*/
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
(4)创建controller类(相当于servlet)
/**
* 使用@Controller定义Bean
*/
@Controller
public class UserController {
//设置当前操作的访问路径
@RequestMapping("/save")
//设置当前操作的返回值类型
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'springmvc'}";
}
}
4、classpath和classpath*区别
主要区别在于搜索范围。classpath只搜索指定的目录和JAR文件,而classpath*会搜索整个类路径,包括子目录和JAR文件。
5、从上往下依次是,请求行,请求头,请求体
6、 (spirng-mvc里面)
springmvc对内置注解的支持,比如json数据
7、spring-mvc和spring-ioc是不同的容器,
mvc是web容器,比ioc高一级
7、现在一个controller类就是一个模块(比如用户模块),然后类里面一个方法对应一个功能
8、配置了内置的diapatchServlet之后,tomcat会帮我们创建这个servlet,然后去加载spring mvc.xml那些配置文件
8、@Controller注解 类注解
设定核心控制器bean
9、@RequestMapping 类、方法注解
设置当前控制器方法请求路径
10、@ResponseBody 方法注解,返回json数据
11、@RestController(默认全部返回json数据)
= Controller+ResponseBody、@Controller 默认表示前后端不分离
结合了@Controller和@ResponseBody两个注解的功能,使得该类能够处理HTTP请求并返回JSON格式的响应
RestController返回的是JSON数据。RestController注解是Spring4之后新加的注解,它的作用是返回json格式的数据。这个注解实际上是@Controller和@ResponseBody两者的结合,使用这个注解后该controller的所有方法都会返回json格式的数据。因为@ResponseBody的作用就是把返回的对象转换为json格式,并把json数据写入response的body中,前台收到response时就可以获取其body中的json数据了。
7、总结(注解)
8、创建springMvc的配置文件,加载controller对应的bean(注解)
package com.qf.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 创建springMvc的配置文件,加载controller对应的bean
*/
@Configuration
@ComponentScan("com.qf.controller")
public class SpringMvcConfig {
}
9、定义一个servlet容器启动的配置类,在里面加载spring的配置(注解)
package com.qf.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
/**
* 定义一个servlet容器启动的配置类,在里面加载spring的配置
*/
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return (WebApplicationContext) ctx;
}
//设置哪些请求归属springMvc处理
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring容器配置
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
10、服务器启动执行流程
11、requestMapping里面的method方法指定接收请求的方式
12、Qo包里面的UserQo那种就是专门给controller那边写传递参数的
13、String.format()按照指定的格式生成字符串
14、不用去new对象,拿来直接用,类似于方法调用
15、传递的参数里面一般不传递那些Map、List(可以封装成对象)
16、RequestMapping请求处理的细分,分别处理不同的请求
GetMapping增
DeleteMapping删
PutMapping改
PostMapping查
17、ObjectUtils.isEmpty()非空判断
18、@RequestParam 方法注解(参数设置必传参数)
| required | 设置必要参数(默认true) |
| value | 起别名 |
| defaultValue | 设置默认值 |
19、用springboot自带的json数据可以避免乱码问题(序列化框架)
20、@RequestBody接收json数据
接收客户端传递的json数据,不要使用get请求
告诉Spring MVC从请求体中解析JSON(或其他格式的数据)并将其映射到 UserQo 类型的对象
@PostMapping("/json")
public String testJson(@RequestBody UserQo userQo){
System.out.println(userQo.getUsername());
return "测试接收json数据";
}
21、复杂对象尽量使用json格式
21、传递的是引用类型对象的话,传参数就传他的属性就行(多级就属性.属性)
22、传数组的时候就这样传
24、/和/*区别
servlet的url-pattern设置为/时, 它仅替换servlet容器的默认内置servlet,用于处理所有与其他注册的servlet不匹配的请求。直白点说就是,所有静态资源(js,css,image,html等)的访问都将交给该servlet处理,而jsp页面则交给servlet容器内置的JSP servlet处理。
servlet的url-pattern设置为/*时,它会覆盖其他所有的servlet,包括servlet容器提供的所有servlet,如缺省servlet和JSP servlet。 无论你发出什么请求,都会在该servlet拦截处理。通常我们不会这么做。如果你只是想使用/*,那么你可以在Filter中使用,它处理完后会将url交给servlet处理。(注意:DispatcherServlet自己处理不好这些jsp页面(不能对jsp页面进行解析),会直接返回它们的源码信息,并且编码都会变得不可控,编码会由原来的UTF-8变成GBK。)
注意:
- 仅仅只能拦截处理主页请求:
什么请求都不能拦截处理,相当于没有设置:
- /**
25、@PathVariable注解:用于从URL模板中获取变量的值
@GetMapping("/path/{page1}/{size}") public String testPath(@PathVariable(name = "page1") Integer page,@PathVariable Integer size){ System.out.println(page); System.out.println(size); return "从请求路径中获取参数"; }26、@ReqeustMapping核心注解功能(方法注解,类注解)
(1)作用:设置当前控制器方法的请求访问路径
作用:全局异常处理、统一结果集、跨域请求(浏览器安全机制)、参数校验
(1)核心属性
value/path 声音请求路径(如果在类上,表示所有请求的前缀) method 请求方式(默认get,只能用于修饰方法) (2)其他属性(限制请求的参数)
prams 设置请求参数必须包含指定的内容,格式 headers 限制请求头中的参数 consumes 限制ContentType的内容 produces 限制Accept内容 29、推荐三个以上的参数封装成对象类型,作为控制层和业务的入口参数
30、常见的JSON序列化框架
-
(1)fastjson
- 在Spring MVC中启用FastJson作为HTTP消息的转换器。
- 配置FastJson的日期格式为"yyyy-MM-dd HH:mm:ss"
-
-
(2)jackjson(多)
-
-
(3)gson
31、spring相关的bean加载控制(注解)

(1)方式一的实现:
注意:如果写了@Configuration,那么这个类也会被扫描同时里面的bean也会被加载
注意:这里的configuration必须取消掉,不然也会扫描到
(2)方式二:区分开@ComponentScan({"com.qf.service","com.qf.dao"})
调用的时候选择对应的
34、@RequestMapping默认使用GET请求方法,但是可接收所有请求方法
35、解决post乱码问题(注解)
//解决post乱码问题 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; }package com.qf.config; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import javax.servlet.Filter; /** * 定义一个servlet容器启动的配置类,在里面加载spring的配置 */ public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { //spring的 protected Class[] getRootConfigClasses() { return new Class[0]; } //springmvc的 protected Class[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } protected String[] getServletMappings() { return new String[]{"/"}; } //解决post乱码问题 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; } }37、@Requestparam注解:
绑定请求参数与处理器方法形参间的关系
38、接收请求中的json数据(注解版本)
(1)导入jackson依赖
(2)设置发送json数据
(3)开启自动转换数据的支持
(4)接收json数据
39、@EnableWebMvc配置类注解:开启自动转换数据的支持(注解)
40、@RequestBody(形参注解):从前端接收json数据(一个处理器方法只能使用一次)
非法
@RequestMapping("/some-endpoint") public ResponseEntity handleRequest(@RequestBody MyObject obj1, @RequestBody MyObject obj2) { // ... }
43、convert接口(转换格式:注解版)
45、在controller下面如果不写responsebody默认去找对应名字的前端界面
@RequestMapping("/toJumpPage") public String toJumpPage(){ System.out.println("跳转页面"); return "page.jsp"; }
48、rest风格
49、rest风格书写规范50、@PathVariable 形参注解
绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
51、@RequestBody、@RequestParam、@PathVariable、@Param区别(形参注解)
@RequestBody @RequestParam @PathVariable @Param 接收json数据(必须配合序列化框架使用) 接收url地址传参或表单传参 接收路径参数,使用{参数名称}描述路径参数 用于为Mapper接口方法的参数命名,使得在XML映射文件中可以更容易地引用这些参数 应用得多 非json数据 restful开发只有一个参数的时候,传递id值 例如:@RequestMapping("/example") public String example(@RequestBody Person person),其中Person是一个Java对象,表示请求体中的JSON数据结构。 例如:RequestMapping("/example/{id}") public String example(@PathVariable Long id) 52、查看自己写的sql语句
53、默认找前端jsp,以为要做转发

54、之所以不让mvc扫描重复的包是因为会导致事务失效
56、controller是spring的注解
57、@RequestBody和@ResponseBody
@RequestBody @ResponseBody 形参注解 方法注解 接收客户端传递的json数据,不要使用get请求 返回json数据 57、fastjson、json、gson都是作json数据的解析的(序列化和反序列化)
58、处理json数据需要序列化框架
流程
(1)导入jackson包
59、使用fastjson需要配置消息转换器+配置json解析的时间格式(spring-mvc.xml)
(1)导包
com.alibaba fastjson 1.2.83(2)在spring-mvc.xml里配消息转换器
优化方法
注意命名空间
这样写的话框架会帮我们转
60、时间格式问题
这样传会报错,因为前端传递的是String,你却用Date去接受了
@PostMapping("/login") public String login(Date date){ return "login"; }61、使用jackson指定日期时间格式(多)
62、返回json数据前提是一定要加入json框架,配合@RestController(默认全部返回json)使用
63、在时间配置的时候(前端传递的都是String类型)
请求方面:
(1)传递的是单Date类型的话,就加上@DateTimeFormat(pattern = "yyyy-MM-dd"),他就会转为Date类型在后端controller
@DateTimeFormat(pattern = "yyyy-MM-dd") Date date
(2)不传json的话,
响应那里就必须在接收的属性那里转@DateTimeFormat(pattern = "yyyy-MM-dd")
(3)传递的是对象类型的话,就这样json传(使用@RequestBody注解,必须配合序列化框架使用)(多),
然后响应再做处理 @JsonFormat(pattern = "yyyy-MM-dd")/全局
public Integer register(@RequestBody Brand brand){响应方面:
(1)可以单属性的配置@JsonFormat(pattern = "yyyy-MM-dd")
实体类里面
@JsonFormat(pattern = "yyyy-MM-dd") private Date createDate;
(2)可以配置全局转json的
注意:@JsonFormat(pattern = "yyyy-MM-dd")优先级高于全局
-


























