質問

マイマイセンスプリングプロジェクトディレクトリ構造を以下に示します。 SPring-4アノテーションベースの設定を使用しています。以下のようなリソースを設定します。私は多くのスタックオーバーフローの質問やその他のWebサイトで提案されている多くの方法を試みました

Spring 4ロード静的リソース

http://imwill.com/ SPRING-MVC-4-ADD-STATIC-Resourcess-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?
     }

}
.

プロジェクト構造

役に立ちましたか?

解決

これは働いた、

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

およびJSPファイルでは、

のような静的リソースを参照しています。
<link href="resources/css/bootstrap.css" rel="stylesheet" media="screen">
.

他のヒント

私はそれが少し遅れていると思いますが、私は最近同様の問題に直面していました。いくつかのレスリングの後、最後に私のDispatcherServletが要求を処理するように構成されていないことがわかりました。したがって、リソースは見上げられませんでした。だから私は他の人がこの答えが役に立つと感じることを願っています。

上記の設定クラスを与えるディスパッチャサーブレットがルート( "/")にマッピングされていますが、トップワード( "/ data /")にマッピングされている場合は、同じ問題に直面する可能性があります。< / P>

ディスパッチャーサーブレットの「/ data / *」としてマッピングがあるとします。だから私の電話は

のように見えます
http://localhost:8080/myWebAppContext/data/command
.

とリソースマッピングがある場合は、 "/ content / ** / *"、それから私はそれを

としてアクセスできます
http://localhost:8080/myWebAppContent/content/resourcePath
.

しかしそれは本当ではない、私は

を使うべきです
http://localhost:8080/myWebAppContent/data/content/resourcePath
. 代わりに

。これは私には明らかではなく、ほとんどのサンプルはディスパッチャーサーブレットのマッピングのルート "/"を使用しているので、それはそこに問題ではありませんでした。後で考慮すると、私はそれを早く/データ/知っているべきであることを知っているべきである。ディスパッチサーバーが呼を評価するべきであり、そしてコンテンツ/はリソースハンドラが「コントローラ」であることをサーブレットに指示することを知らなければならない。

しかし、私のフロントエンド(Angularyjs)では、(RESTサービスを介して)またはコンテンツ(プレーンテキストを返す)を探しているかどうか。データはデータベースから来ていますが、コンテンツはファイル(例えばPDFドキュメント)から来ています。したがって、私はDispatcherサーブレットに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/")
        ;
    }
}
.

私の@コントローラにアクセスする場合は、/ data / prefixを使用し、私のリソースにアクセスしたい場合は、/ content / prefixを使用します。警告は、@RequestMapping( "/ about")メソッドを持つ@RequestMapping( "/ App")クラスを持っている場合、データ/ app / aboutとcontent / app / aboutの両方がそのメソッドだけを呼び出します。そして実際に試していなければ、ディスパッチャは "data /"と "content /"の両方にリソースされているため、リソースとしてリソースにアクセスするかもしれないと思います。 「両方の場合において)適切な@コントローラを見つけるために。

私が到達した現在の解決策は私にとって十分満足のいくものであるので、私はそれをそのまま残します。

これは私のために働いた。/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/");
    }
}
.

リソースのファイル名を含めるためにWebページのURIを単純化することが可能です。 <link href="bootstrap.css" rel="stylesheet" media="screen">
適切な設定は次のようになる可能性があります。

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

スプリング連結 '/ Resources / CSS /'文字列は、リソースの実際の場所を識別するためにURIから抽出されたファイル名を使用していかいです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top