Spring-SSM整合详细版本 建立在xml的基础上 进行整合的。
创建项目配置pom文件等。
Initializer 取代 web.xml
继承 AbstractAnnotationConfigDispatcherServletInitializer
创建2个类 分配配置 父容器 和 子 容器
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 父容器的配置类
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
/**
* 子容器的配置类(SpringMVC相关的配置类)
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
/**
* 配置DispatcherServlet的url-pattern
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
复制代码
Initializer 本质
SpringConfig
记得加 @Bean 不然会IoC 容器找不到了
静态资源访问
在webapp下面创建 asset 然后创建 test.html 然后用contenxt 地址去访问
- 实现接口 WebMvcConfigurer
/**
* 相当于<mvc:default-servlet-handler/>
* 用以处理静态资源
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
复制代码
拦截器
可以创建 自定义拦截器 MyInterceptor.java 然后引入到 SpringMVCConfig.java 中
- 给 自定义拦截器 添加
@Component
- @ComponentScan({"com.mj.interceptor"})
- 如下
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/asset/**");
}
复制代码
ViewResolver
这个我咋重视 随便来来吧
- 先创建 test.jsp
- 复制代码
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/page/");
resolver.setSuffix(".jsp");
return resolver;
}
复制代码
- 创建一个 Controller
@Controller
public class TestController {
@GetMapping("/test1")
public String test1() {
// /WEB-INF/page/test.jsp
return "test";
}
}
复制代码
MessageConverters
针对 文本、json 的编码
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 设置返回的普通字符串的编码
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
stringConverter.setDefaultCharset(StandardCharsets.UTF_8);
converters.add(stringConverter);
// 设置返回的JSON数据的编码
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
converters.add(jsonConverter);
}
复制代码
测试案例
@GetMapping("/test2")
@ResponseBody
public String test2() {
return "test 中文";
}
复制代码
POST编码问题
之前在 web.xml 中 搞得
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
// 添加Filter
FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("CharacterEncodingFilter", new CharacterEncodingFilter("UTF-8"));
encodingFilter.addMappingForUrlPatterns(null, false, "/*");
}
复制代码
Converter
时间 转 Date
先看痛点
- 创建DateConverter
记得把添加到 SpringConfig.java 中 就是父容器 这样子容器也可以用
@Component
public class DateConverter implements Converter <String, Date>{
@Override
public Date convert(String s) {
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(s);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
复制代码
@ComponentScan({"com.mj.converter"})
复制代码
- 在 springMVCConfig中 registry
自动注入即可
@Autowired
private DateConverter dateConverter;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(dateConverter);
}
复制代码
MultipartResolver
添加依赖 commons-fileupload
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
复制代码
在 SpringMVCConfig 中配置 bean
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");
return resolver;
}
复制代码
@PostMapping("/test4")
@ResponseBody
public String test4(@RequestParam("name") String name, @RequestParam("photo")MultipartFile photo) {
System.out.println(photo);
System.out.println(photo.toString());
return "Success:" + name;
}
复制代码
验证 WebApplicationInitializer 接口
不是啥 重点
一部署 就会打印
public class WebInitializer2 implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
System.out.println("WebInitializer2 - onStartup");
}
}
复制代码
public class WebInitializer2 implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// 父容器配置
AnnotationConfigWebApplicationContext springCtx = new AnnotationConfigWebApplicationContext();
springCtx.register(SpringConfig.class);
// 通过监听器加载配置信息
servletContext.addListener(new ContextLoaderListener(springCtx));
// 子容器配置
AnnotationConfigWebApplicationContext mvcCtx = new AnnotationConfigWebApplicationContext();
mvcCtx.register(SpringMVCConfig.class);
ServletRegistration.Dynamic servlet = servletContext.addServlet(
"DispatcherServlet",
new DispatcherServlet(mvcCtx));
servlet.setLoadOnStartup(0);
servlet.addMapping("/");
// filter
FilterRegistration.Dynamic encodingFilter = servletContext.addFilter(
"CharacterEncodingFilter",
new CharacterEncodingFilter("UTF-8"));
encodingFilter.addMappingForUrlPatterns(null, false, "/*");
}
}
复制代码