springmvc零xml配置原理

2021-03-07 08:30

阅读:441

标签:frame   mvcc   ash   work   The   targe   remes   lis   地方   

springmvc零xml配置原理与Servlet3.0SPI机制

传统springmvc项目,如果要采用xml文件的方式配置,则需要web.xml、spring-mvc.xml文件。

web.xml文件用来引入springmvc的配置文件contextConfigLocation,以及spring环境org.springframework.web.context.ContextLoaderListener

web.xml:

  
  listener>
    listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
  listener>
  servlet>
    servlet-name>springmvcservlet-name>
    servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    init-param>
      
      param-name>contextConfigLocationparam-name>
      param-value>spring-mvc.xmlparam-value>
    init-param>
    
    load-on-startup>1load-on-startup>
  servlet>
  servlet-mapping>
    servlet-name>springmvcservlet-name>
    url-pattern>*.dourl-pattern>
  servlet-mapping>

 

spring-mvc.xml文件:


context:annotation-config/>


mvc:annotation-driven/>



bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
property name="prefix" value="/WEB-INF/view/"/>
property name="suffix" value=".jsp"/>
property name="exposeContextBeansAsAttributes" value="true"/>
bean>


context:component-scan base-package="com.XXX"/>

那么,现在提供一种方式,可以不用配置任何的xml文件,也同样能搭建起springmvc项目。

现在一起来看一下spring官网提供的文档描述:

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-servlet-config

技术图片

 

 

这里可以看到需要实现一个接口的onStartup方法

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    //实现0XML
    //类实现WebApplicationInitializer【spring官方提供的方法。用于加载spring容器】
    //tomcat启动时会调用onStartup方法?

    @Override
    public void onStartup(ServletContext servletContext) {
        //传入一个ServletContext:web上下文对象。web.xml能做的事她都能做

        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(AppConfig.class);

        // Create and register the DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(context);
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("*.do");
    }

这里只是配置了一个DispatcherServlet,那试图解析器在哪里配置呢?再回到官方文档

技术图片

 

 

其实这里就是用来配置视图解析器的地方

写一个AppConfig类,作为Springmvc的配置类,实现

WebMvcConfigurer
@Configuration
@ComponentScan("com")
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {
 /***
     * 配置视图解析
     * @param registry
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/page/", ".html");
    }
/**
     * 配置一个消息转换器[对象的转换]
     * @param converters
     */
    @Override
    public void configureMessageConverters(List> converters) {
        for (HttpMessageConverter> converter : converters) {
            System.out.println(converter);
        }
        FastJsonHttpMessageConverter converter
                = new FastJsonHttpMessageConverter();
        converters.add(converter);
    }

技术图片

 

 

WebMvcConfigurer接口一共定义了若干方法,可以对照着官网学习配置。

此时就可以编写controller类来测试零xml配置的springmvc了

@Controller
public class TestController {


    /**
     * 访问普通的字符串,试图解析器会解析成对应的页面
     * @return
     */
    @RequestMapping("/str.do")
    public Object Test(){
        return "index";
    }

    /**
     * 因为返回值是一个对象,所以如果不做特殊处理,则试图解析器无法解析
     * 对象嵌套是一个难点
     * @param name
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/model.do")
    @ResponseBody
    public Object modeltest(String name, HttpServletRequest request, HttpServletResponse response){
        System.out.println("调用了modeltest");
        String req_name = request.getParameter("name");
        Map hashMap = new HashMap();
        hashMap.put("key", "value");
        return hashMap;
    }
}

//TODO Servlet3.0 SPI

 

springmvc零xml配置原理

标签:frame   mvcc   ash   work   The   targe   remes   lis   地方   

原文地址:https://www.cnblogs.com/yibao/p/14265097.html


评论


亲,登录后才可以留言!