05、SpringMVC全注解开发

SpringMVC全注解开发:替代web.xml等配置

一、替代web.xml文件

Servlet3.0新特性

web.xml文件可以不用再写了,它提供了一个接口:ServletContainerInitializer

服务器在启动的时候会自动从容器中找ServletContainerInitializer接口实现类,自动调用onStartup()来完成Servlet的上下文初始化。

Spring3.1提供了实现类

实现类为:SpringServletContainerInitializer

从上面可以看到在服务器启动的时候,它会去加载所有实现WebApplicationInitializer接口的类

 

在这个接口下有一个子类:AbstractAnnotationConfigDispatcherServletInitializer

 

一旦我们自己提供类继承这个类之后,web服务器在启动时就会根据它来初始化Servlet上下文

 

自定义类替代web.xml

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    /**
     * Spring的配置
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    /**
     * SpringMVC的配置
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMVCConfig.class};
    }

    /**
     * DispatcherServlet的映射路径
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    /**
     * 配置过滤器
     * @return
     */
    @Override
    protected Filter[] getServletFilters() {
        // 字符编码过滤器
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceRequestEncoding(true);
        characterEncodingFilter.setForceResponseEncoding(true);
        // 隐藏域请求方法过滤器
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
    }
}

Spring配置类

/**
 * Spring的配置类
 */
@Configuration
public class SpringConfig {
}

SpringMVC配置类

/**
 * SpringMVC配置类
 */
@Configuration
@ComponentScan("com.xiaoxie")   // 指定组件扫描包
@EnableWebMvc   // 开启注解驱动
public class SpringMVCConfig {
    
    @Bean
    public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(springTemplateEngine);
        resolver.setCharacterEncoding("UTF-8");
        resolver.setOrder(1);
        return resolver;
    }
    
    @Bean
    public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(iTemplateResolver);
        return templateEngine;
    }
    
    @Bean
    public ITemplateResolver templateResolver(ApplicationContext applicationContext) {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML");
        resolver.setCharacterEncoding("UTF-8");
        resolver.setCacheable(false);   // 关闭缓存,开发时可以关闭,这样改动即会生效
        return resolver;
    }
}

SpringMVC的其它配置

SpringMVC配置类实现接口:WebMvcConfigurer

重写法方configureDefaultServletHandling可以开启默认Servlet处理静态资源

/**
 * 开启静态资源访问(默认Servlet处理)
 * @param configurer
 */
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

注意:一般来说是指定静态资源的访问规则,而不是直接启用DefaultServlet

所以上面的开启静态资源访问一般是不开启的,而是重写下面的方法来指定静态资源的访问规则

/**
* 指定静态资源位置
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}

重写方法可以添加视图映射

/**
 * 视图映射
 * @param registry
 */
@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/test").setViewName("test");
}

二、异常处理器

新增一个类做全局异常处理

@ControllerAdvice
public class MyExceptionHandler {
    @ExceptionHandler
    public String tip(Exception e, Model model) {
        // 把数据存储到request域中
        model.addAttribute("ex",e);
        return "tip";   // 返回逻辑视图
    }
}

三、拦截器

新增一个拦截器

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor - preHandle");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor - postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor - afterCompletion");
    }
}

四、模板文件及静态资源

模板文件

在前面的SpringMVC的配置类中可以看到模板文件需要放到WEB-INF/templates下

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>index</h1>
</body>
</html>

test.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>test</h1>
</body>
</html>

tip.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>出现异常了,请联系管理员!!</h1>
  <div th:text="${ex}"></div>
</body>
</html>

静态资源

根据SpringMVC配置类可以看到模板文件需要放到/static下,并且访问的路径是以/static开始的

经过上述的配置我们就替换掉了web.xml文件,开发的基它部分还是按照原来的来即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值