web-dev-qa-db-ja.com

WEB-INFフォルダー内のjspファイルは機能するのに、WEB-INFの下のフォルダーの下に配置された場合は機能しないのはなぜですか?

Jspファイルが(/WEB-INF/file.jspとして)WEB-INFフォルダー内にある場合、ローカルホスト:8080/ProjectCtxtRoot /からアクセスできますが、/ WEB-に配置されている場合はアクセスできません。 INF/jsp/file.jsp?

Web.xmlのwelcome-listタグのパスを次のように変更しました

<welcome-file-list>
       <welcome-file>/JSP/fileName.jsp</welcome-file>
</welcome-file-list>

また、dispatcher-servlet.xmlを次のように変更しました

   <bean id="jspViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" /> 

それでも動作しません。上記の場合に使用されるURLは

 localhost:8080/ContextRoot/jsp/
 localhost:8080/ContextRoot/jsp/fileName.jsp
 localhost:8080/ContextRoot/jsp/fileName 

上記のURLでは機能しません。

しかし、それは

 <welcome-file-list>
       <welcome-file>/fileName.jsp</welcome-file>
</welcome-file-list>

次のようにdispatcher-servlet.xml

<bean id="jspViewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/"
      p:suffix=".jsp" /> 

上記の場合に使用されるURLはlocalhost:8080/ContextRoot /であり、機能します。

Tomcat v7.0サーバーを使用しています。プロジェクトをEclipseIDEで更新し、クリーンアップしてビルドし、mvn clean installを使用してwarをビルドし、Tomcatマネージャーのホームページからwarを選択してデプロイします。私は毎回これをします。

これは、diapatcher-servlet.xmlがプロセス全体でどのように見えるかを示しています。上記のように特定のセクションを変更するだけです

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
                    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd     
                    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <mvc:annotation-driven/>

    <context:component-scan base-package="com.projectName.www" />

    <!-- Factory bean that creates the Mongo instance -->
    <bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
        <property name="Host" value="localhost" />
    </bean>

    <!-- MongoTemplate for connecting and quering the documents in the database -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongo" ref="mongo" />
        <constructor-arg name="databaseName" value="tableName" />
    </bean>

    <!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />



    <bean id="jspViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" /> 

  <!--   <bean class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>

    <bean class=
    "org.springframework.web.servlet.view.tiles2.TilesConfigurer"> -->
 <!--  <property name="definitions">
    <list>
      <value>/WEB-INF/views/views.xml</value>
    </list>
  </property> 
</bean> -->




</beans>

これは私のweb.xmlがどのように見えるかです

<web-app>

<!--   <display-name>Archetype Created Web Application</display-name> -->

   <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/src/main/webapp/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </context-param> 

   <!--  <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> -->

    <welcome-file-list>
       <welcome-file>/fileName.jsp</welcome-file>
    </welcome-file-list> 


</web-app>

OK。 jspフォルダー全体を/webapp/WEB-INF/jsp/fileName.jspから/webapp/jsp/fileName.jspに移動すると機能します。 1.なぜ今機能するのか知りたいのですが。 2.これは物事を行う正しい方法ですか? 3. URLがlocalhost:8080/CtxtRoot/jsp /またはlocalhost:8080/CtxtRoot/jsp/search.jspの場合は機能しますが、localhost:8080/AnnaUnivResults/jsp/searchの場合は機能しません。なぜそうなのですか?

7
sofs1

ここにはいくつかの問題があると思います。

  1. あなたは春のMVCとの道について混乱しています
  2. Webxmlを正しく構成していません

残念ながら、すべての詳細をカバーすることはできません。多くのスプリングは構成可能であるため、私の説明では最も基本的なシナリオについて説明します。誰かが間違いを見つけたら教えてください、そして私はそれを修正します。

パスについては、物事を段階的に考えることが役立つ場合があります。

  1. ブラウザからURLをリクエストします。ブラウザはプロトコル、ホスト、ポートを確認し、DNSを使用して接続する適切なIPアドレスを見つけます。
  2. ブラウザとホストの間で接続が確立されます。ホストは、指定したポートで実行されているプロセスを探します。TCP接続が適切なセキュリティシステムによって許可されている場合、要求はそのポートで実行されているプロセス、つまりWebにストリーミングされます。サーバ。
  3. Webサーバーは、ポートの後にあるものに基づいて決定を下します。具体的には、指定されたパスを確認することにより、Webアプリケーションのコンテキストが何であるかを判別します。アプリケーションコンテキストルートを決定すると、どのWebアプリケーションがその要求を処理する必要があるかがわかります。決定は、Webサーバーの構成方法に基づいており、コンテキストルートなしまたは特定のコンテキストルートを使用してWebアプリケーションに要求を処理させることができます。たとえば、localhost:8080/CtxtRoot/jsp/をリクエストした場合、コンテキストルートが「CtxtRoot」であるサーバー上に1つのWebアプリケーションがあり、そのリクエストを処理します。または、コンテキストに「」が含まれるアプリケーションを作成して、その要求を処理することもできます。サーバーの構成方法によって異なりますが、デフォルトでは、Tomcatはwar名をコンテキストルートとして使用します。
  4. Webアプリケーションがリクエストを受信します。要求された完全なURLを認識していますが、コンテキストルート以降のすべてに基づいて決定を下すだけです。したがって、たとえば、localhost:8080/CtxtRoot/jsp/へのリクエストでは、Webアプリケーションはパスとして「jsp」に基づいて物事をルーティングします。
  5. Webアプリケーションには、最初に要求を送信するフィルターチェーンがあります。フィルタのパターンがリクエストに一致する場合、そのフィルタはリクエストを評価できます。リクエストをブロックしたり、リクエストを処理したり、渡したりする可能性があります。あなたの質問にはフィルターが含まれていないので、これ以上は言いません。
  6. Webアプリは、パターンがリクエストに一致するリソースを探し、最初にサーブレットを検討し、次に静的リソースを検討します。コンテキストの後に来るURL部分は一致させようとするものであるため、リクエストがlocalhost:8080/CtxtRoot/jsp/に対するものであり、コンテキストルートが「CtxtRoot」である場合、Webアプリケーションは「/ jsp /」をすべてのサーブレットのマッピング。 WEB-INFでの静的リソースの要求は常に拒否されますが、サーブレットとフィルタはWEB-INFからデータを返すことができます。
  7. リクエストがSpringDispatcherServletに送信され、リクエストを受信し、サーブレットパス以降のすべてを考慮すると仮定して続行します。 SpringのDispatcherServletは、サーブレットパスの後のパスとパスが一致するコントローラーを探します。サーブレットパスは、基本的にWebxmlのサーブレットマッピングに入力するパスです。例を挙げましょう。コンテキストが「app」であるWebアプリがあり、サーブレットマッピングが「/ mvc」であるSpringMVCサーブレットと、パス「sales」を処理するコントローラーがあるとします。 http://localhost:8080/app/mvc/salesでそのコントローラーに到達します。
  8. DispatcherServletがコントローラーを見つけられない場合、着信要求はコントローラーによって返されたものとして扱われると思います。したがって、サブパスが「sales」の場合、それを引数としてビューリゾルバーに渡します。見つからない場合、サーバーはnotfoundエラーを返します。
  9. 通常、コントローラーは、完了すると文字列を返します。これは、リソースへのパスです。 'popular'を文字列として返すことができます。次に、SpringはこれをViewResolverに転送し、InternalResourceViewResolverを使用していると想定します。接頭辞と接尾辞を調べ、基本的に与えられたものをラップします。したがって、プレフィックスが「/ WEB-INF/views /」、サフィックスが「.jsp」、引数が「popular」の場合、「/ WEB-INF/views /popular.jsp」でリソースを検索します。 '。文字通り、これらの文字列を連結してパスを作成するだけです。パスは常にここのWebアプリケーションルートを基準にしています。生成されたパスがjspファイルの場合、返される前に解釈されます。
  10. その後、最終的にユーザーに返されます。

あなたの例から、localhost:8080/ContextRoot/jsp/fileNameをリクエストしていたので、「CtxRoot」はコンテキストルート、サーブレットのパスは「/」のように見えるので、その後はすべてコントローラーに渡す必要があります。 DispatcherServletがリクエストを受信するまでに、「jsp」をパスとして処理するコントローラーを検索しています。何もなかったので、それをリソースパスとして扱うことにしました。ビューリゾルバーを使用して、パス/WEB-INF/jsp/jsp/fileName.jspを形成しましたが、これは明らかに存在しません。

代わりにlocalhost:8080/ContextRoot/fileNameをリクエストしたとすると、リクエストはDispatcherServletに到達し、「fileName」をパスとして処理するコントローラーが見つからないため、リソースとして扱われます。パス/WEB-INF/jsp/fileName.jspを形成し、結果を返します。

ただし、WebxmlはSpringを初期化するように構成されていません。したがって、Webアプリケーションは、実際には、Webアプリケーションのルートに関連するリソースに対するものであるかのように、すべての要求を処理していました。 Springを正しく初期化してリクエストを行っていれば、うまくいったのではないかと思います。

これを行う方法の良い例を次に示します。

http://www.mkyong.com/spring3/spring-3-mvc-hello-world-example/

彼のWebxmlにはContextLoaderListenerがあり、これはコメントアウトされていることに注意してください。これは、WebアプリでSpringを初期化するために不可欠です。ディスパッチャにパス/ src/main/resourcesのコメントも表示されますが、Web xmlのすべてのパスは、Webアプリケーションのルートからの相対パスであると想定されています。実行時には、Webサーバーはプロジェクトを認識しておらず、「src」はWebアプリのルート内のディレクトリではありません。また、MVCのものに対してメインのSpringコンテキストとは異なるアプリケーションコンテキストを持つことができ、これは一般的であることに注意してください。

あなたがこれらのことをすればそれはうまくいくと思います:

  1. Jspを/WEB-INF/jsp/fileName.jspに移動します
  2. アプリのコンテキストを更新して、「/ WEB-INF/jsp /」がプレフィックス、「。jsp」がサフィックスになるようにします。
  3. コンテキストローダーリスナーをWebxmlに追加し、アプリのコンテキストルートを基準にしてcontextConfigLocationパスを設定します。たとえば、/ WEB-INF /appContext.xmlのようになります。
  4. リクエストを行う

    localhost:8080/CtxtRoot/fileName

また、ウェルカムファイルについて話し続けましたが、リソースへのフルパスを提供していました。ウェルカムファイルは、ユーザーが次のようにディレクトリのルートにリクエストを送信した場合にのみ機能します。

localhost:8080/CtxtRoot/

そのリクエストはウェルカムファイルに転送されます。それを試したのは、たまたまjspがアプリのルートにあり、ウェルカムファイルとして構成されていたため、機能したと思います。それは「機能」しましたが、実際にはそれを返すためにスプリングを使用していませんでした。

頑張って。

24
msknapp