SpringMvc---全注解开发
SpringMvc---全注解开发
使用配置类代替web.xml、SpringMvc.xml、Spring.xml。
首先
创建一个新的模块,引入依赖、规定打包方式war、创建webapp目录、WEB-INF目录。
然后
创建一个WebConfig类继承AbstractAnnotationConfigDispatcherServletInitializer类,实现里面的方法
在WebConfig中
//这个类的作用用来代替web.xml,继承AbstractAnnotationConfigDispatcherServletInitializer这个类。 //在web.xml文件中中完成的工作都在这个类中完成,配置字符编码过滤器、请求转换器、dispatcherServlet、声明SpringMvc配置类 public class TestWebConfig extends AbstractAnnotationConfigDispatcherServletInitializer { /** * 这个方法是用来返回Spring的配置类的class类型的数组,可以配置多个 * @return 这个方法是用来返回Spring的配置类的class类型的数组,可以配置多个 */ @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{ TestSpringConfig.class }; } /** * 这个方法是返回SpringMvc的配置类的class类型的数组 * @return 这个方法是返回SpringMvc的配置类的class类型的数组 */ @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{ TestSpringMvcConfig.class }; } /** * * @return 返回的是DispatchServlet的路径,就是管理请求的路径 */ @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
在SpringMvcConfig中
使用注解@Configration声明一个类为配置类,并开启注解扫描设置扫描范围,建立controller、Interceptor、视图
在配置类中你要完成很多工作。所以在声明为配置类后,再实现接口WebMvcConfigurer。在接口中提供了很多方法实现对应的功能。
使用@EnableWebMvc注解就是开启mvc注解驱动
视图解析器---先创建一个返回值为 ITemplateResolver 的方法,在里面通过 ServletContextTemplateResolver 对视图前缀、后缀、编码格式、文本格式属性设置值,发现要一个WebApplicationContext 就新建一个,之后设置好值后,将对象返回。使用@Bean标签标识,把返回的对象装进IOC容器中。参照配置文件中的配置丛里往外看,这时需要一个SpringTemplateEngine返回值的方法,建立这个方法并使用@Bean标识,把刚才返回的bean对象作为形参注入进去,SpringMvc会根据类型自动装配,类型和刚才返回的对象的bean对象的类型不同就会说AutoWire没有找到对应的类型。根据配置文件中配置视图解析器的代码知道现在要给TemplateResolve属性赋值,创建SpringTemplateEngine对象,调用set方法。将形参bean作为TemplateResolve的值。最后再创建ViewResolver为返回值的方法并标识@Bean,将刚才返回值为SpringTemplateEngine的方法的返回bean对象作为形参,在方法内参照配置文件代码创建ThymeleafViewResolver对象,调用set方法设置值,返回ThymeleafViewResolver对象。
其他功能可以通过接口提供的方法实现对应的功能,底下都有。
/** * SpringMvc配置类中要完成的工作 * 开启组件扫描、设置视图解析器、设置视图控制器、开启mvc注解驱动、注册文件上传服务需要的bean、 * 设置响应报文的格式和字符编码、设置拦截器、注册异常处理的bean、开启静态资源访问 */ @Configuration @ComponentScan("xlw.com.last") //这个注解能开启Mvc的注解驱动 @EnableWebMvc public class TestSpringMvcConfig implements WebMvcConfigurer { /** * 配置响应报文的格式和字符编码 * @param converters 将返回类型为StringHttpMessageConverter的方法的返回结果【处理响应输出输出的结果返回】放进 * List<HttpMessageConverter<?>>集合中。 */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { StringHttpMessageConverter converter = new StringHttpMessageConverter(); converters.add(converter()); } /** * 对使用了@ResponseBody注解的返回结果进行处理 * @return 响应处理结果 */ @Bean public StringHttpMessageConverter converter() { // 首先创建StringHttpMessageConverter的对象,要用它来安排响应报文的格式和编码 StringHttpMessageConverter converter = new StringHttpMessageConverter(); // 在调用set方法时发现,需要用到一个不为空的List<MediaType>类型的参数。创建它 // 在为list集合添加内容时,进入MediaType源码看,底下有有参构造方法还有静态代码块规定的常量。通过参数提示规定好响应的格式和编码格式 List<MediaType> mediaTypeList = new ArrayList<MediaType>(); MediaType mediaType = new MediaType(new MediaType(TEXT_HTML,Charset.forName("UTF-8"))); mediaTypeList.add(mediaType); converter.setSupportedMediaTypes(mediaTypeList); // 在这里设置默认的编码格式。 converter.setDefaultCharset(Charset.forName("UTF-8")); return converter; } /** * 开启静态资源访问 * * @param configurer 设置默认servlet对静态资源处理 */ @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } /** * 设置拦截器 * * @param registry 设置拦截器和拦截路径 */ @Override public void addInterceptors(InterceptorRegistry registry) { FirstInterceptor interceptor = new FirstInterceptor(); // 将自己写好的interceptor对象添加进去并设置拦截路径 registry.addInterceptor(interceptor).addPathPatterns("/**"); } /** * 注册异常处理类的bean的代替工作 * * @param resolvers 程序执行过程中可能出现的错误 */ @Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { // 首先创建SimpleMappingExceptionResolver的对象,在创建properties对象 SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver(); Properties prop = new Properties(); // 在SpringMvc配置文件中通过props标签中的prop标签对可能出现的异常进行属性注入,并规定异常的名字 prop.setProperty("java.lang.ArithmeticException", "error"); // 然后将上面的prop注入给属性ExceptionMappings,在SpringMvc的配置文件中就是用property标签对这个属性进行注入 simpleMappingExceptionResolver.setExceptionMappings(prop); // 将错误放进请求域中 simpleMappingExceptionResolver.setExceptionAttribute("ex"); } /** * 配置视图控制器 * * @param registry 视图的请求路径和视图名 */ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); } /** * 配置视图解析器 */ //配置生成模板解析器 @Bean public ITemplateResolver templateResolver() { WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext(); ServletContextTemplateResolver servletContextTemplateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext()); servletContextTemplateResolver.setPrefix("/WEB-INF/templates/"); servletContextTemplateResolver.setSuffix(".html"); servletContextTemplateResolver.setTemplateMode("HTML5"); servletContextTemplateResolver.setCharacterEncoding("UTF-8"); return servletContextTemplateResolver; } //生成模板引擎并为模板引擎注入模板解析器 @Bean public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver); return templateEngine; } //生成视图解析器并未解析器注入模板引擎 @Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setCharacterEncoding("UTF-8"); viewResolver.setTemplateEngine(templateEngine); return viewResolver; } }

浙公网安备 33010602011771号