2013-01-12 34 views
13

Tôi đã tạo 'cho bây giờ' một ứng dụng web mùa xuân đơn giản và cơ bản. Tôi đã từng có một bộ mô tả triển khai như là một tệp tin web.xml đơn giản, và sau đó là một bối cảnh ứng dụng như một tệp xml.Cách sử dụng thẻ <mvc: resources> của Spring MVC trong ngữ cảnh ứng dụng java?

Mặc dù, bây giờ tôi muốn cố gắng tạo toàn bộ ứng dụng web mùa xuân bằng cách chỉ sử dụng các tệp java. Vì vậy tôi đã tạo WebApplicationInitializer của tôi thay vì bộ mô tả triển khai bình thường và ngữ cảnh ứng dụng của tôi sử dụng chú thích @Configuration.

Deployment Descriptor

package dk.chakula.config; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration.Dynamic; 
import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 
/** 
* 
* @author martin 
* @since 12-1-2012 
* @version 1.0 
*/ 
public class Initializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) 
      throws ServletException { 
     registerDispatcherServlet(servletContext); 
    } 

    private void registerDispatcherServlet(final ServletContext servletContext) { 
     WebApplicationContext dispatcherContext = createContext(ChakulaWebConfigurationContext.class); 
     DispatcherServlet dispatcherServlet = new DispatcherServlet(dispatcherContext); 
     Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 
    } 

    private WebApplicationContext createContext(final Class<?>... annotatedClasses) { 
     AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
     context.register(annotatedClasses); 
     return context; 
    } 

} //End of class Initializer 

bối cảnh ứng dụng

package dk.chakula.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.view.UrlBasedViewResolver; 
import org.springframework.web.servlet.view.tiles2.TilesConfigurer; 
import org.springframework.web.servlet.view.tiles2.TilesView; 

/** 
* 
* @author martin 
* @since 12-01-2013 
* @version 1.0 
*/ 
@Configuration 
@EnableWebMvc 
@ComponentScan("dk.chakula.web") 
public class ChakulaWebConfigurationContext { 

    @Bean 
    public TilesConfigurer setupTilesConfigurer() { 
     TilesConfigurer configurer = new TilesConfigurer(); 
     String[] definitions = {"/layout/layout.xml"}; 
     configurer.setDefinitions(definitions); 
     return configurer; 
    } 

    @Bean 
    public UrlBasedViewResolver setupTilesViewResolver() { 
     UrlBasedViewResolver viewResolver = new UrlBasedViewResolver(); 
     viewResolver.setViewClass(TilesView.class); 
     return viewResolver; 
    } 

} //End of class ChakulaWebConfigurationContext 

Vấn đề của tôi là tôi dường như không thể tìm thấy một cách 'cô lập' lập bản đồ của tôi vào thư mục nguồn lực mà chứa hình ảnh, css javascript, vv .. Khi bối cảnh ứng dụng của tôi là trong java.

Với bối cảnh ứng dụng XML bình thường tôi sử dụng thẻ này để cô lập các bản đồ đến/nguồn/

<mvc:resources mapping="/resources/**" location="/resources/" /> 

Làm thế nào tôi có thể làm được điều này, vì vậy ứng dụng web của tôi có thể sử dụng hình ảnh của tôi, css, vv

+0

Phiên bản nào bạn đang sử dụng? –

+0

Tôi đang sử dụng 3.2.0 – Rohwedder

Trả lời

30

Để có thể phục vụ tài nguyên tĩnh trong ứng dụng Spring MVC, bạn cần hai thẻ XML: <mvc:resources/><mvc:default-servlet-handler/>. Điều tương tự trong cấu hình Spring Java dựa trên sẽ là:

@Configuration 
@EnableWebMvc 
public class WebMvcConfig extends WebMvcConfigurerAdapter { 

    // equivalents for <mvc:resources/> tags 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926); 
     registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926); 
     registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926); 
    } 

    // equivalent for <mvc:default-servlet-handler/> tag 
    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    // ... other stuff ... 
} 

Lưu ý rằng kể từ khi @EnableWebMvc chú thích được sử dụng không cần phải mở rộng trực tiếp WebMvcConfigurationSupport, và bạn chỉ nên mở rộng WebMvcConfigurerAdapter. Xem JavaDoc for @EnableWebMvc để biết chi tiết.

+0

đã lưu ngày của tôi Tôi đã mở rộng cả WebMvcConfigurationSupport và WebMvcConfigurerAdapter.my xấu. –

9

Sau khi sử dụng giờ tìm kiếm trên internet đọc về Spring MVC 3 chỉ sử dụng các tệp java tôi đã sử dụng một số bài viết sử dụng phương pháp mở rộng từ lớp WebMvcConfigurationSupport và sau đó ghi đè 2 phương thức - addResourceHandler (ResourceHandlerRegistry) và ResourceHandlerMapping().

Ngữ cảnh ứng dụng mới của tôi giờ trông như thế này.

package dk.chakula.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.HandlerMapping; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; 
import org.springframework.web.servlet.handler.AbstractHandlerMapping; 
import org.springframework.web.servlet.view.UrlBasedViewResolver; 
import org.springframework.web.servlet.view.tiles2.TilesConfigurer; 
import org.springframework.web.servlet.view.tiles2.TilesView; 

/** 
* 
* @author martin 
* @since 12-01-2013 
* @version 1.0 
*/ 
@Configuration 
@EnableWebMvc 
@ComponentScan("dk.chakula.web") 
public class ChakulaWebConfigurationContext extends WebMvcConfigurationSupport { 

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

    @Override 
    @Bean 
    public HandlerMapping resourceHandlerMapping() { 
     AbstractHandlerMapping handlerMapping = (AbstractHandlerMapping) super.resourceHandlerMapping(); 
     handlerMapping.setOrder(-1); 
     return handlerMapping; 
    } 

    @Bean 
    public TilesConfigurer setupTilesConfigurer() { 
     TilesConfigurer configurer = new TilesConfigurer(); 
     String[] definitions = {"/layout/layout.xml"}; 
     configurer.setDefinitions(definitions); 
     return configurer; 
    } 

    @Bean 
    public UrlBasedViewResolver setupTilesViewResolver() { 
     UrlBasedViewResolver viewResolver = new UrlBasedViewResolver(); 
     viewResolver.setViewClass(TilesView.class); 
     return viewResolver; 
    } 

} //End of class ChakulaWebConfigurationContext 

Như tôi đã hiểu Chúng tôi phải ghi đè addResourceHandler, để thêm vị trí và ánh xạ tài nguyên vào sổ đăng ký. Sau đó, chúng ta cần một bean trả về một đối tượng của HandlerMapping. Trình tự HandlerMapping này nên được đặt là -1, bởi vì như tôi có thể đọc từ tài liệu lò xo, sau đó -1 nghĩa

HandlerMapping lệnh tại Integer.MAX_VALUE-1 để phục vụ tĩnh yêu cầu tài nguyên. tại

Ứng dụng của tôi có thể tải các tập tin css và hình ảnh vào quan điểm của họ, và tôi muốn soi sáng cho bạn khác với câu trả lời như vậy, mọi người trong tương lai có thể nhận được lợi ích của việc này.

+3

Hơi là một cách cồng kềnh! Lưu ý rằng '@ EnableWebMvc' đã nhập' WebMvcConfigurationSupport' vào cấu hình, vì vậy không cần sử dụng chú thích '@ EnableWebMvc' và mở rộng lớp cấu hình từ' WebMvcConfigurationSupport' cùng một lúc. Xem [JavaDoc cho @EnableWebMvc] (http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html) để biết chi tiết. –

4

Hãy thử điều này:

@Override 
    public void addResourceHandlers(final ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
    } 
Các vấn đề liên quan