2016-11-14 15 views
1

割り当てのために、Webアプリケーションを作成するためのJavaのSpring MVCを実践しています。私はIDE Intellij Ultimate 2016.2.5でこのプロジェクト全体を構築しました。無効なルーティングのため、スプリングルーティングで404エラーが発生する

私はこのためにMavenプロジェクトを作成し、これに対して正しい依存関係と依存関係をインポートしてビルドしました。

IDEは、次のディレクトリ構造を構築する:

├───src 
│ └───bas 
│  └───animalkingdom 
│   ├───config 
│   ├───controllers 
├───test 
│ └───bas 
│  └───animalkingdom 
└───web 
    ├───META-INF 
    ├───resources 
    └───WEB-INF 
     └───pages 

私のコンフィギュレーションクラスがWebMvcConfigurerAdapterから延びる、ここでconfigパッケージは次のとおりです。

パッケージbas.animalkingdom.config。

import ... 

@Configuration 
@ComponentScan("bas.animalkingdom") 
@EnableWebMvc 
public class Config extends WebMvcConfigurerAdapter { 
    @Bean 
    public UrlBasedViewResolver setupViewResolver() { 
     UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
     resolver.setPrefix("/WEB-INF/pages/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setViewClass(JstlView.class); 
     return resolver; 
    } 

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

@ComponentScanは、すべてのソースファイルがあるメインソースディレクトリを指していなければならないと思っていました。

私はまた、WebApplicationInitializerからのクラスが必要であると言われました。私は私の学校からこれを持ってきました

package bas.animalkingdom.config; 

import ... 

public class WebInitializer implements WebApplicationInitializer { 
    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(Config.class); 
     ctx.setServletContext(servletContext); 

     ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     servlet.addMapping("/"); 
     servlet.setLoadOnStartup(1); 
    } 
} 

これはconfigパッケージにもあります。

Configクラスは、私のIDEのプロジェクト構造設定にSpring Application Contextとして設定されています。


ルートディレクトリには、webというフォルダがあります。フォルダWEB-INFに空のweb.xmlファイルがあります。これは、設定が設定クラスを介してロードされるため、私は必要としないと言われました。それは次のようになります。webフォルダのルートディレクトリに

<web-app id="WebApp_ID" version="2.4" 
     xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

</web-app> 

index.jspファイルです。

bas.animalkingdom.controllersパッケージには、私のコントローラがあります。私はlocalhost/animals URLに移動し、それは私のweb\WEB-INF\pages\パッケージにanimals.jspファイルをロードすることをできることを期待このコントローラでは

package bas.animalkingdom.controllers; 

import ... 

@Controller("AnimalC") 
public class AnimalController { 
    @RequestMapping(value = "/animals", method = RequestMethod.GET) 
    public String getAnimals(ModelMap modelMap) { 
     Animal animal = new AfricanElephant(new Male(), "Body Covering", "Ename", " acolor", 123, 321); 
     modelMap.put("animal", animal); 
     return "animals"; 
    } 
} 

:テストpurposingのために、私は一つだけを作成しました。

私のコードにはコンパイルエラーはありません。

TomCatサーバーを実行し、ブラウザーを開いて対応するホストでlocalhostに移動すると、index.jspファイルが問題なくロードされます。このファイルはweb\パッケージに含まれています。

localhost:(port)/animalsに行くと、404ページが表示され、ページが見つからないというメッセージが表示されます。

この原因は何ですか?私はそのルートを正しく設定するコントローラを定義しましたか?

また、他のSpring MVCチュートリアルを見ると、それらはすべて別のパッケージを使用していますが、これも同様ですか?

+0

手始めに、あなたがそれを必要としない、それは現在、仕事をしてから 'WebInitializer'を防ぐweb.xml'あなた'取り除きます。 –

+0

コントローラに 'pages/animals'を返す必要はありませんか? –

+0

@OlarAndreiなぜですか? – Bas

答えて

1

すべてのJavaクラスとJSPは問題ありません。問題はあなたのモジュール構造です。基本的には、従来の(推奨されている)斬新な方法で2つのアプローチがあります。より速く、ないことをお勧めします型破りな方法で始まるのをしてみましょう:

A.非在来型:

以下に示すように、あなたのmaven-戦争 - プラグインにwarSourceDirectoryタグを追加します。

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>3.0.0</version> 
      <configuration> 
       <warSourceDirectory>${basedir}/web</warSourceDirectory> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 

このアプローチを使用することの短所は、他のプラグインが予期しない問題を引き起こす可能性があることです。たとえば、このアプローチでは、maven-jetty-pluginはそのままでは動作しません。デフォルトではsrc/main/webappを見るようになっていますが、設定は可能です。従来の方法に従えば、Mavenの方が簡単です。

B.従来のアプローチは:

ソリューションは、あなたのモジュールのための従来のMaven構造を有することにある、次の操作を行うことを確認してください。

  1. は、あなたのweb.xmlファイルを削除します。 Mavenのパッケージが見つからないため、web.xmlファイルの失敗した場合は、あなたのpom.xmlのビルドセクションでプラグインの下に追加します:フォルダ構造/srcに/メイン/ javaのを作成し、すべて入れ

    <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-war-plugin</artifactId> 
        <version>3.0.0</version> 
        <configuration> 
         <failOnMissingWebXml>false</failOnMissingWebXml> 
        </configuration> 
    </plugin> 
    
  2. このjavaディレクトリにあなたのJavaパッケージ。あなたのパッケージが正しくフォーマットされていない場合は、javaというフォルダを右クリックし、[ディレクトリをマークする] - > [ソースルート]に移動します。

  3. フォルダ構造/src/test/javaを作成し、すべてのテストパッケージをjavaディレクトリに配置します。

  4. フォルダ構造/srcに/メイン/ webappのを作成し、Webアプリケーションディレクトリにフォルダウェブのすべての内容を置きます。

この後、アプリケーションをテストできます。あなたは以下の構成を使用してWebアプリケーションをデプロイするために桟橋のプラグインを使用して試すことができます:

<build> 
    <finalName>spring-mvc</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>3.0.0</version> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>9.2.11.v20150529</version> 
      <configuration> 
       <scanIntervalSeconds>10</scanIntervalSeconds> 
       <webApp> 
        <contextPath>/</contextPath> 
       </webApp> 
       <httpConnector> 
        <port>8080</port> 
       </httpConnector> 
      </configuration> 
     </plugin> 
    </plugins> 
    </build> 
+0

これは問題ありませんが、IDE内でディレクトリをソースまたはテストとしてマークしないでください。上で概説した変更を完了してから、プロジェクトをpom.xmlファイルから直接インポートし直す必要があります。これにより、すべてのパスが更新され、プロジェクトが正しく設定されます。 –

+0

@田中玉倉私はまだそのプラグインを持っていなかった、それは問題でしたか? – Bas

+0

@Basモジュールを戦争としてパッケージ化する場合は、ビルドセクションに "maven-war-plugin"プラグインを置くことをお勧めします。 "jetty-maven-plugin"に関しては、あなたがそれを使用していない場合は、ビルドセクションから削除することができます。 Jettyプラグインは、開発フェーズテストのためだけに推奨されています。mvn jetty:run(jettyの起動とモジュールのデプロイ) –

関連する問題