SpringMVC学习笔记-基本配置

Controller加载控制(重点)

静态资源加载

中文乱码处理

注解驱动


Controller加载控制(重点)

我们之前说Spring和SpirngMVC的配置文件要分开写,那么它们在加载的时候就可能会产生冲突!

Spring配置的bean被SpringMVC扫描到了,是没有用的!所有我们在写代码的时候,就应该让SpringMVC仅扫描spring-mvc.xml中配置的bean。

我们只要在<context:component-sacn>标签下加一个<context:include-filter>

<context:component-scan base-package="com.Harmony">
    <!-- include 包含 -->
    <context:include-filter
            type="annotation"
            expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

include包含的意思,type我们选注解expression我们选择@Controller对应的类。

意思就是加载被@Controller注解的类。

纯注解的写法就是:

SpringMVC中的bean加载说明

静态资源加载

当我们访问程序中静态资源的时候,会发现访问不了,页面资源会报一个404

这是为什么呢?

我们可以看一下web.xml中的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <!--要配置servlet,在SpringMVC中叫 DispatcherServlet-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载配置文件 spring-mvc.xml -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!--表示拦截所有的请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

我们可以看到<servlet-mapping>标签下是拦截所有请求!!!当然也包括静态资源的请求了,例如:js、css、jsp、图片...

处理办法加载静态资源的时候不使用DispatcherServlet就行了,所以我们可以在spinrgmvc.xml配置文件中对静态资源进行放行。

我们可以指定要放行的静态资源 

<!--放行指定类型静态资源配置方式-->
<mvc:resources mapping="/img/**" location="/img/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>

当然SpringMVC还提供给我们了一种通用资源放行方式

<!--SpringMVC提供的通用资源放行方式-->
<mvc:default-servlet-handler/>

注意:xml上面的命名空间"mvc"要记得配哈... 

中文乱码处理

SpringMVC提供专用的中文字符过滤器,用于处理乱码问题

配置在 web.xml 里面

<!--乱码处理过滤器,与Servlet中使用的完全相同,差异之处在于处理器的类由Spring提供-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注解驱动

就是不使用xml配置了,即不用写web.xml、spring-mvc.xml程序还能运行即可!

使用注解形式转化SpringMVC核心配置文件为配置类

SpringMVCConfiguration 

@Configuration
@ComponentScan(value = "com.itheima",includeFilters =
    @ComponentScan.Filter(type=FilterType.ANNOTATION,classes = {Controller.class})
    )
public class SpringMVCConfiguration implements WebMvcConfigurer{
    //注解配置放行指定资源格式
//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        registry.addResourceHandler("/img/**").addResourceLocations("/img/");
//        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
//        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
//    }

    //注解配置通用放行资源的格式
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();;
    }
}

ServletContainersInitConfig 

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //创建Servlet容器时,使用注解的方式加载SPRINGMVC配置类中的信息,并加载成WEB专用的			           //ApplicationContext对象
    //该对象放入了ServletContext范围,后期在整个WEB容器中可以随时获取调用
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMVCConfiguration.class);
        return ctx;
    }

    //注解配置映射地址方式,服务于SpringMVC的核心控制器DispatcherServlet
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    //乱码处理作为过滤器,在servlet容器启动时进行配置,相关内容参看Servlet零配置相关课程
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        CharacterEncodingFilter cef = new CharacterEncodingFilter();
        cef.setEncoding("UTF-8");
        FilterRegistration.Dynamic registration = servletContext.addFilter("characterEncodingFilter", cef);
        registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE),false,"/*");
    }
}

posted @ 2022-03-22 04:53  金鳞踏雨  阅读(21)  评论(0)    收藏  举报  来源