0

次のプログラムで、dispatcher-servlet.xml と index.jsp で「/home.htm」を「/home.jsp」に置き換えると、サーバーは home.jsp を見つけることができません。「.jsp」で終わる文字列は Bean 名として無効ですか?

dispatcher-servlet.xml

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

    <bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean name="/home.htm" class="com.sample.HomePageController" />

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

</beans>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Dynamic Tiles</title>
  </head>
  <body>
    <form action="/home.htm" method="post">
        Please enter your name:&nbsp;
        <input type="text" name="visitorName" />
        <input type="submit" value="Go"/>
    </form>
  </body>
</html>

HomePageController.java

package com.sample;

import org.apache.log4j.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class HomePageController  extends AbstractController {

    private static Logger logger = Logger.getLogger(HomePageController.class);

    HomePageController () {
        logger.info("Constructing HomePageController object");
    };

    public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        logger.info("Handling request for home.jsp");

        return new ModelAndView("home", "visitorName", request.getParameter("visitorName"));
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">

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

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

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

</web-app>
4

2 に答える 2

1

意図したとおりに動作させるには、アプリケーションのいくつかの部分を変更する必要があります。最初の部分は、web.xml の Dispatcher Servlet マッピングです。Spring では、ディスパッチャを使用して、特定のリクエストをクライアントからアプリケーション内の Spring コントローラにルーティングします。ディスパッチャーを介してルーティングされるリクエストは、サーブレットの web.xml ファイルで指定された url-pattern によって決定されます: org.springframework.web.servlet.DispatcherServlet.

あなたの場合、url-pattern を jsp ファイルへのアクセスと競合しないものに設定したいと考えています。ジェネリック名の前に /WEB-INF/jsp/ を付け、最後に .jsp を付ける Spring 構成で viewResolver を指定したため、.jsp 以外の URL パターンを使用する必要があります。

.jsp url-pattern が使用された場合、リクエストは最初にディスパッチャ サーブレットによって処理され、マップされたコントローラにルーティングされます。コントローラーがビュー名を使用して別のページ (ホームなど) に移動しようとすると、ビュー名に接頭辞/接尾辞が付けられ、URL は /WEB-INF/jsp/home.jsp になります。この構築された URL は、ディスパッチャーに指定された .jsp url-pattern と一致し、/WEB-INF/jsp/home.jsp をルーティングしようとしますが、マッピングが見つからないために失敗する可能性があります。

この問題を解決するために、web.xml を次のようにセットアップします。

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

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

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

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

ご覧のとおり、ディスパッチャーを URL パターン *.do にマップします。これにより、ディスパッチャを使用して、一般的なファイル プレフィックスに干渉することなくリクエストをルーティングできます。url-pattern を *.do に変更すると、フォームのアクションを変更する必要があります。フォームを次のように変更しました。

索引.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>Dynamic Tiles</title>
</head>
<body>
    <form action="home.do" method="post">
        Please enter your name:&nbsp; <input type="text" name="visitorName" />
        <input type="submit" value="Go" />
    </form>
</body>
</html>

また、すべての .jsp ファイルが WEB-INF ディレクトリ内にあると仮定しました。これには、コントローラーを使用してこれらの .jsp ファイルのそれぞれにアクセスする必要があります。コントローラーへのマッピングは、Spring 構成ファイルでディスパッチャー用に作成する必要があり、index.jsp 用の適切なコントローラーを作成する必要があります。マッピングに .do サフィックスを使用していることに注意してください。

dispatcher-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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="handlerMapping"
        class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    <bean name="/home.do" class="com.sample.HomePageController" />
    <bean name="/index.do" class="com.sample.IndexPageController" />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
</beans>

IndexPageController.java

package com.sample;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class IndexPageController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        return new ModelAndView("index");
    }
}

念のため、アプリケーションをテストするために home.jsp ファイルを作成しました。ここに私のhome.jspファイルがあります:

ホーム.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <title>Home</title>
</head>
<body>
<h1>
    Hello, ${visitorName}  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>
于 2012-08-25T09:36:40.633 に答える
0

終了した URLdispatcherのみを処理することにしましたが、終了した URL を処理する必要があります。後者が機能するには、要素のコンテンツを次のように変更するだけです。.htm.jspurl-patternweb.xml

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>
于 2012-08-26T07:18:58.967 に答える