springMvc
请求与响应 rest风格开发 ssm整合 拦截器
springmvc工作流程
-
网页发来请求
-
发送到tomcat服务器
-
发送给springmvc的DispatcherServlet
-
分发根据路径分发给不同的控制器类处理
实现步骤
-
导包 springmvc和servlet
-
制作springmvc控制器类等同于servlet功能 controller
-
初始化spring环境绑定springmvc加载对应的bean
-
初始化servlet容器,加载spring环境,并设置springmvc技术处理的请求
实例
-
导包
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build>
-
制作控制器类
//spring管控注册为bean@Controller //定义处理请求的方法method() //定义请求的路径@RequestMapping("/hello") //设置响应结果为json@ResponseBody @Controller public class controller { @RequestMapping("/hello") @ResponseBody public String method(){ return "{'key':'value'}"; } }
-
初始化spring环境
@Configuration @ComponentScan("com.hang.controller") public class springConfig { }
-
初始化servlet环境
public class servletContainersInitConfig extends AbstractDispatcherServletInitializer { //加载springmvc相关配置 @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext app = new AnnotationConfigWebApplicationContext(); app.register(SpringmvcConfig.class); return app; } //配置tomcat接收的哪些请求归springmvc管理 @Override protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring相关配置 @Override protected WebApplicationContext createRootApplicationContext() { return null; } }
springmvc工作流程分析
-
服务器启动,执行servletContainersInitConfig类,初始化web容器
-
执行creatServletApplicationContext方法,创建WebApplicationContext对象
-
加载springMvcConfig
-
执行componetScan加载对应的bean
-
加载controller类,每个@requestMapping的名称对应一个具体的方法(决定请求的处理方法)
-
执行getServletMappings方法,定义所有请求都通过springMvc(决定哪些路径归springmvc管)
单次请求过程分析
-
发送请求localhost/save
-
web容器发现所有请求都经过springmvc,将请求交给springmvc处理
-
解析请求路径/save
-
由路径/save匹配到方法save()
-
执行save()方法
-
检测到有ResponseBody直接将save()方法的返回值作为响应体返回给请求方
controller加载控制与业务bean加载控制
-
方法一:spring加载所有包,排除掉controller中的bean
@Configuration @ComponentScan(value = "com.hang",excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class )) public class SpringConfig { }
-
方法二:spring加载bean设定精准范围,service,dao
@Configuration @ComponentScan({"com.hang.service","com.hang.dao"}) public class SpringConfig { }
请求与响应
请求路径
类上添加对应模块名称作为前缀+方法上的路径为后缀组成访问地址
参数
-
发送:url?参数名称=参数值
-
接受:形参 参数类型 参数名称
中文乱码处理(只有post请求有效)
-
在 servlet配置类中
-
重写getServletFilters();方法
-
添加编码过滤器 CharacterEncodingFilter
@Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter=new CharacterEncodingFilter("UTF-8"); return new Filter[]{characterEncodingFilter}; }
中文乱码原因(页面加码与解码字符集不同导致)
-
页面使用utf-8
-
tomcat解码使用iso-8859-1
-
解决方法:使用iso-8859-1加码再使用utf-8解码
String encode = URLEncoder.encode("张三", "utf-8"); String decode = URLDecoder.decode(encode, "Iso-8859-1"); //乱码 å¼ ä¸• System.out.println(URLDecoder.decode(URLEncoder.encode(decode, "iso-8859-1"), "utf-8"));
五种请求参数
-
普通参数:请求参数名称与接受名称参数不同,使用@requestParam绑定参数
-
实体类参数:请求参数与实体类属性名相同就行
-
实体类嵌套,引用类型属性:属性名.属性名.属性名
-
数组参数:同名参数放入数组
-
集合参数:使用@requestParam才能存数据将参数作为数据存储而不是属性.
json格式数据传输
-
导入json包
-
开启springmvc的json转化为对象功能@EnableWebMvc
-
使用@requestBody加载数据
-
发送json数据
日期参数
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")Date date
使用Converter接口的子类实现转换
响应
响应页面
页面名称(有后缀名)作为返回值,返回string
响应文本
方法上添加@responseBody
响应json
方法上添加@responseBody,返回json对象(实际对象),使用的外部json包转化,不是springmvc转换,需要导包.
转换原理,调用HttpMessageConverter做的转换与日期的转换不同
Restful
查询 get
删除delete
新增post
修改put
习惯将请求地址+s users/***
参数获取
使用@PathVariable 将形参名称写入路径中
@RequestMapping(value = "/parma9/{id}",method = RequestMethod.GET) public String parma9(@PathVariable int id){ System.out.println(id); return "{'model':'webmvc'}";}
springmvc使用aop的时候要在springmvc的配置中写@EnableAspectJAutoProxy否则controller的aop不生效
简化开发
@RestController 由@Controller和@ResponseBody组成
@GetMapping get方式的请求
@PostMapping post方式的请求
@DeleteMapping delete方式的请求
@PutMapping put方式的请求
静态资源放行
访问静态页面的时候不通过springmvc,通过tomcat直接访问
-
继承WebMvcConfigurationSupport类
-
重写addResourceHandlers()方法
-
添加对应访问路径的访问地址
@Configuration public class springMVCSupport extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/page/**").addResourceLocations("/page/"); } }