0

Spring MVC と Java Server Faces を混在させようとしています。JSF ビューに解決される@Controllerを返すSpring 3.2クラスがあります。ModelAndViewそのビューには<h:form>タグが含まれています。私が抱えている問題は、レンダリングされた HTML で、フォームaction属性が元のリクエスト URL を名前と組み合わせてビューを解決し、フォームが POST される奇妙な無意味な URL を作成することです。私が欲しいのは、元のリクエスト URL のないビュー名だけです。

これが私のコントローラークラスです(org.my.test.MainController):

@Controller
@RequestMapping("/items")
public class MainController
{
  @RequestMapping(value="/{itemId}", method=RequestMethod.GET)
  public ModelAndView retrieveItem( @PathVariable long itemId ) {

    /* Retrieve item */

    ModelAndView mav = new ModelAndView();
    mav.addObject ("itemName", "A retrieved item");
    mav.addObject ("itemId", itemId);
    mav.setViewName ("/items");
    return mav;
  }
}

これが私の JSF テンプレートです ( /items.xhtml)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <title>Edit item</title>
</h:head>
<h:body>
    <h:form>
        <h3>Edit item</h3>
        <p>
            Item name: <h:inputText name="itemName" value="#{itemName}" />
        </p>
        <p>
            Item id: <h:inputText name="itemId" value="#{itemId}" />
        </p>
        <p>
            <h:commandButton value="Submit" />
        </p>
    </h:form>
</h:body>
</html>

ページをリクエストするとhttp://localhost:8081/items/12345、提供されるのは次のとおりです。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml"><head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <title>Edit item</title></head><body><form id="j_id_6" name="j_id_6" method="post" action="/items/12345/items.xhtml" enctype="application/x-www-form-urlencoded">
        <h3>Edit item</h3>
        <p>
            Item name: <input id="j_id_6:j_id_8" name="j_id_6:j_id_8" type="text" value="A retrieved item" />
        </p>
        <p>
            Item id: <input id="j_id_6:j_id_a" name="j_id_6:j_id_a" type="text" value="12345" />
        </p>
        <p><input id="j_id_6:j_id_c" name="j_id_6:j_id_c" type="submit" value="Submit" />
        </p><input type="hidden" name="j_id_6_SUBMIT" value="1" /><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="oyc7wGGKZrPGinPPmrv9PmTDy0GBlI3c+pjWpdK0KuY69faJ" /></form></body>
</html>

私の問題は、action="/items/12345/items.xhtml"私が欲しいものはaction="/items"またはaction="/items.xhtml"

私の質問には 2 つの部分があります。リクエスト URL とビュー ID をこのように組み合わせているのはなぜですか?どうすればそれを停止できますか?

ここにあるweb.xml

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

    <display-name>Minimal JSF + Spring test</display-name>

    <!-- - Location of the XML file that defines the root application context. 
        - Applied by ContextLoaderListener. -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/spring/application-config.xml</param-value>
    </context-param>

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

    <listener>
        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    </listener>


    <!-- - Servlet that dispatches request to registered handlers (Controller 
        implementations). -->
    <servlet>
        <servlet-name>ui</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/ui-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

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

    <!-- Just here so the JSF implementation can initialize, *not* used at runtime -->
    <servlet>
        <servlet-name>faces</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Just here so the JSF implementation can initialize -->
    <servlet-mapping>
        <servlet-name>faces</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>

</web-app>

ここに春の設定がありますui-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:context="http://www.springframework.org/schema/context"
    xmlns:faces="http://www.springframework.org/schema/faces"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        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.xsd
        http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces-2.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <context:component-scan base-package="org.my.test" />
    <mvc:annotation-driven />
    <bean id="faceletsViewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.faces.mvc.JsfView" />
        <property name="prefix" value="" />
        <property name="suffix" value=".xhtml" />
    </bean>

</beans>

ここにメインのSpring構成がありますapplication-config.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:context="http://www.springframework.org/schema/context"
    xmlns:faces="http://www.springframework.org/schema/faces"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        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.xsd
        http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces-2.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <context:component-scan base-package="org.my.test" />
</beans>

そしてここにあるfaces-config.xml

<?xml version='1.0' encoding='UTF-8'?>
<faces-config 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-facesconfig_2_0.xsd"
        version="2.0">

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>

</faces-config>

これはすべて組み込みの Jetty 9.0.4 で実行されています。Apache My-Faces 2.1.11 と Mojarra 2.2.1 の 2 つの異なる JSF 実装を試しましたが、どちらも同じ効果がありました。Spring のバージョンは 3.2.3 です。

4

1 に答える 1

0

url-mappinginweb.xmlを "/" から "/*" に変更すると、問題が修正されました。

実際、すべてがサーブレット仕様 (Java サーブレット仕様バージョン 3.0 Rev a、セクション 12.2、116 ページ) に従って動作しています。

  • 文字で始まり接尾辞/で終わる文字列/*は、パス マッピングに使用されます。

    ...

  • 文字のみを含む文字列/は、アプリケーションの「デフォルト」サーブレットを示します。この場合、サーブレット パスはリクエスト URI からコンテキスト パスを引いたものであり、パス情報は null です。

(Coderanch のこの投稿に感謝します: http://www.coderanch.com/t/366340/Servlets/java/servlet-mapping-url-pattern )

(Java Servlet 3.0 仕様はhttp://download.oracle.com/otndocs/jcp/servlet-3.0-mrel-eval-oth-JSpec/で入手可能)

于 2013-07-26T21:59:45.440 に答える