有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用纯基于Java的配置配置Spring MVC?

我有一个非常简单的Spring MVC设置。我的应用程序上下文。xml是这样的:

<mvc:annotation-driven />
<mvc:resources mapping="/css/**" location="/css/" />
<context:property-placeholder location="classpath:controller-test.properties" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/views/" p:suffix=".jsp" />

我的网络。xml目前是这样的:

  <servlet>
   <servlet-name>springDispatcherServlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
  </servlet>

  <!-- Map all requests to the DispatcherServlet for handling -->
  <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

我试图将此设置转换为纯基于Java的配置。我搜索过网络,到目前为止,我找到了一些东西,解释了(一些什么)如何进行Java配置,但没有解释如何在环境中注册Java配置,即web上下文

到目前为止,我对@Configuration的了解是:

 @Configuration
 @EnableWebMvc
 @PropertySource("classpath:controller.properties")
 @ComponentScan("com.project.web")
 public class WebSpringConfig extends WebMvcConfigurerAdapter {

 @Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/css/**").addResourceLocations("/css/");
 }

 @Bean
 public ViewResolver configureViewResolver() {
     InternalResourceViewResolver viewResolve = new InternalResourceViewResolver();
     viewResolve.setPrefix("/WEB-INF/views/");
     viewResolve.setSuffix(".jsp");

     return viewResolve;
 }

 @Override
 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
   configurer.enable();
 }
}

如何在web容器中注册?我正在使用最新的spring(4.02)

谢谢


共 (1) 个答案

  1. # 1 楼答案

    基于Java的配置,无需向^{添加任何元素WebApplicationInitializer非常适合与Spring基于代码的@Configuration类一起使用

    WebApplicationInitializer«接口将在Servlet 3.0+ environments中实现,以便以编程方式配置ServletContext,而不是(或可能与)传统web。基于xml的方法<强>Implementations of this SPI will be detected automatically by SpringServletContainerInitializer, which itself is bootstrapped automatically by any Servlet 3.0 containerUsing Servlet Spec 3.0 of Tomcat 7

    Spring 3.2中列出了一些实现WebApplicationInitializer的抽象类,这些抽象类将由SrevletContainer自动检测

    AbstractAnnotationConfigDispatcherServletInitializer extends
    AbstractDispatcherServletInitializer extends
    AbstractContextLoaderInitializer implements WebApplicationInitializer
    

    将Spring 4.1.6.RELEASE版本与模块core, web, webmvc, beans一起使用

    public class WebXML_DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[] { MvcServletXMLConfigurer.class };
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return null;
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[] { "/" };
        }
    
    }
    

    基于Java的配置,为Spring提供静态资源Spring Boot

    @Configuration
    @EnableWebMvc // <mvc:annotation-driven />
    @ComponentScan(value = {"com.github.yash777.controllers"})
    // <context:component-scan base-package="com.github.yash777" />
    public class MvcServletXMLConfigurer extends WebMvcConfigurerAdapter implements WebMvcConfigurer {
    
        /**
         * <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
         * p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
         * 
         * @return InternalResourceViewResolver as a bean configuration.
         */
        @Bean
        public InternalResourceViewResolver getInternalResourceViewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/jsp/");
            resolver.setSuffix(".jsp");
            return resolver;
        }
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            System.out.println("WebMvcConfigurer - addResourceHandlers() function get loaded...");
    
            // <mvc:resources mapping="/styles/**" location="/css/" />
            registry
                .addResourceHandler("/styles/**") 
                .addResourceLocations("/css/") // webapp/css/
                .setCachePeriod(3600)
                .resourceChain(true) // Spring 4.1
                .addResolver(new GzipResourceResolver()) // Spring 4.1
                .addResolver(new PathResourceResolver()); // Spring 4.1
    
            // <mvc:resources mapping="/static/**" location="/static/" />
            registry.addResourceHandler("/static/**")
                    .addResourceLocations("/static/", "classpath:/static/") // src/main/resources/static/
                    .setCachePeriod(3600)
                    .resourceChain(true)
                    .addResolver(new PathResourceResolver());
        }
    }
    

    列出了一个示例控制器:

    @Controller
    @RequestMapping(value = { "/controller", "/c" })
    public class Test extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        @RequestMapping(value = {"/message", "/m"}, method = RequestMethod.GET )
        public void message(HttpServletRequest request, HttpServletResponse response ) throws IOException {
            System.out.println("@Controller Get method called.");
        }
    
        @RequestMapping(value = "/getView", method = RequestMethod.GET )
        public ModelAndView setViewName( Model model ) {
            System.out.println("GET... /getView");
            ModelAndView mav = new ModelAndView();
            mav.setViewName("test");
            return mav;
        }
    }
    

    WEB-INF/web.xml

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
    </web-app>