web-dev-qa-db-ja.com

Spring 4-静的リソースを解決しないaddResourceHandlers

私のMaven Springプロジェクトのディレクトリ構造を以下に示します。 Spring-4注釈ベースの構成を使用しています。以下のようにリソースを構成します。多くのStackoverflowの質問や他のWebサイトで提案されている多くの方法を試しました

春4静的リソースの読み込み

http://imwill.com/spring-mvc-4-add-static-resources-by-annotation/#.U5GZlXKs9i4

しかし、jspファイルはリソースをロードできませんでした。すべての静的コンテンツリクエストは404エラーを返します。これらのことをjspで試しましたが、

 <link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">
 <link href="/resources/css/bootstrap.css" rel="stylesheet" media="screen">
 <link href="css/bootstrap.css" rel="stylesheet" media="screen">

編集:私は現在、JBoss 5からより高いバージョンにプロジェクトをアップグレードできないため、サーブレット2.5を使用しています。 JBoss5はサーブレット3をサポートしていませんが、それは問題ですか?

@Configuration
@ComponentScan("com.mgage.mvoice")
public class MyAppWebConfig extends WebMvcConfigurerAdapter {
     public void addResourceHandlers(ResourceHandlerRegistry registry) {  
        // I tried these many combinations separately.

        ResourceHandlerRegistration resourceRegistration = registry
            .addResourceHandler("resources/**");
        resourceRegistration.addResourceLocations("/resources/**");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/**");
        registry.addResourceHandler("/img/**").addResourceLocations("/img/**");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/**");
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("classpath:/resources/"); 
              // do the classpath works with the directory under webapp?
     }

}

Project structure

29

これはうまくいきました、

   registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");

jspファイルでは、次のような静的リソースを参照しました

<link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">
17

少し遅れていると思いますが、最近同じような問題に直面していました。数日間の苦労の末、ようやくDispatcherServletがリクエストを処理するように設定されていなかったため、リソースが検索されなかったことが判明しました。だから、この答えが他の人にも役立つことを願っています。

上記の設定クラスに指定したディスパッチャサーブレットがルート( "/")ではなく最上位のWord(たとえば "/ data /")にマッピングされている場合、同じ問題に直面する可能性があります。

ディスパッチャサーブレットのマッピングが「/ data/*」であるとします。だから私の呼び出しは次のようになります

http://localhost:8080/myWebAppContext/data/command

そして、私はリソースマッピングを持っているなら、例えば「/ content/**/*」、それから次のようにアクセスできます

http://localhost:8080/myWebAppContent/content/resourcePath

しかし、それは真実ではない、私は使用する必要があります

http://localhost:8080/myWebAppContent/data/content/resourcePath

代わりに。これは私には明らかではありませんでした。また、サンプルのほとんどはディスパッチャサーブレットのマッピングにルート「/」を使用しているため、そこでは問題ではありませんでした。後で検討する際に、以前に知っていたはずです-/ data /はDispatcherServletが呼び出しを評価することを伝え、content /はリソースハンドラーが「コントローラー」であることをサーブレットに伝えます。

ただし、フロントエンド(angularJs)で、データ(RESTサービス)を使用して検索するか、コンテンツ(プレーンテキストを返す)を使用して検索するかを明確にする必要があります。データはデータベースから取得し、ただし、コンテンツはファイル(pdfドキュメントなど)から取得されるため、ディスパッチャサーブレットに2つのマッピングを追加することにしました。

public class MidtierWebConfig implements WebApplicationInitializer {

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

    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
    rootContext.register(MidtierAppConfig.class);

    servletContext.addListener(new ContextLoaderListener(rootContext));

    AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
    dispatcherContext.register(MidtierDispatcherConfig.class);

    Dynamic netskolaDispatcher = servletContext.addServlet(
        "dispatcher",
        new DispatcherServlet(dispatcherContext)
    );
    netskolaDispatcher.setLoadOnStartup(1);
    netskolaDispatcher.addMapping("/data/*");
    netskolaDispatcher.addMapping("/content/*");
}

}

MidtierAppConfigクラスは空ですが、MidtierDispatcherConfigは静的リソースを定義します。

@Configuration
@ComponentScan("my.root.package")
@EnableWebMvc
public class MidtierDispatcherConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
            .addResourceHandler("/courses/**/*")
            .addResourceLocations("/WEB-INF/classes/content/")
        ;
    }
}

@Controllerにアクセスしたいときは/ data /プレフィックスを使用し、リソースにアクセスしたいときは/ content /プレフィックスを使用します。警告:@RequestMapping( "/ about")メソッドを持つ@RequestMapping( "/ app")クラスがある場合、data/app/aboutとcontent/app/aboutの両方がそのメソッドだけを呼び出します(実際に試行することなく、リソースに/ app/courses/whatEverPathとしてアクセスすることも考えられます。これは、ディスパッチャが「data /」と「content /」の両方をリッスンし、残りのURL(「app/about」 「どちらの場合でも」適切な@Controllerを見つけます。

とにかく、私が到達した現在の解決策は私にとって十分であるため、そのままにします。

13
Ivan Ketler

これは私のために働いた。 /resources/js/select.jsで利用可能なファイル。 @EnableWebMvc注釈が欠落していないことに注意してください...

@EnableWebMvc
@EnableTransactionManagement
public class ApplicationContextConfig extends WebMvcConfigurerAdapter {

    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

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

リソースのファイル名を含めるだけでWebページのURIを単純化することができます。
<link href="bootstrap.css" rel="stylesheet" media="screen">
適切な構成は次のとおりです。

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

Springは、 '/ resources/css /'文字列をURIから抽出されたファイル名と連結して、リソースの実際の場所を識別します。

0
beemaster