Spring-SSM整合详细版本-纯注解

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 本质

image.png

SpringConfig

记得加 @Bean 不然会IoC 容器找不到了

静态资源访问

在webapp下面创建 asset 然后创建 test.html 然后用contenxt 地址去访问

image.png

  • 实现接口 WebMvcConfigurer
/**
 * 相当于<mvc:default-servlet-handler/>
 * 用以处理静态资源
 */
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}
复制代码

image.png

拦截器

可以创建 自定义拦截器 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/**");
}
复制代码

image.png

ViewResolver

这个我咋重视 随便来来吧

  • 先创建 test.jsp

image.png

  • 复制代码
@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";
    }
}
复制代码

image.png

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 中文";
}
复制代码

image.png

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

先看痛点

image.png

image.png

  • 创建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;
        }
    }
}
复制代码

image.png

@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, "/*");
    }
}
复制代码

Guess you like

Origin juejin.im/post/7069693301988786207