首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JSF + Spring 3获得正确的html表单操作属性

使用JSF + Spring 3获得正确的html表单操作属性
EN

Stack Overflow用户
提问于 2013-07-25 17:48:22
回答 1查看 1.4K关注 0票数 0

我正在尝试将Spring与相结合。我有一个Spring3.2JSF类,它返回解析为@Controller视图的ModelAndView。该视图包含一个<h:form>标记。我遇到的问题是,在呈现的action属性上,表单POSTed属性将原始请求URL与名称结合起来来解决视图,从而创建了一个奇怪的、毫无意义的URL,表单就是POSTed。我想要的只是视图名,没有原始的请求URL。

下面是我的控制器类(org.my.test.MainController):

代码语言:javascript
运行
复制
@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)

代码语言:javascript
运行
复制
<?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时,所提供的内容如下:

代码语言:javascript
运行
复制
<?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"

我的问题有两个部分:为什么我的设置将请求URL和视图ID合并成这样,以及如何使它停止?

这是web.xml

代码语言:javascript
运行
复制
<?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>

这里是Spring ui-servlet.xml

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
<?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>

这都是在嵌入式Jetty9.0.4中运行的。我尝试过两种不同的JSF实现,Apache 2.1.11和mojarra2.2.1,两者效果相同。春季版本为3.2.3。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-26 21:59:45

url-mapping中的web.xml从"/“更改为"/*”更正了问题。

实际上,一切都符合Servlet规范(Java规范3.0 Rev a,第12.2节,第116页):

  • /字符开头、以/*后缀结尾的字符串用于路径映射。 ..。
  • 仅包含/字符的字符串指示应用程序的“默认”servlet。在本例中,servlet路径是请求URI,减去上下文路径,路径信息为null。

(感谢您在Coderanch:http://www.coderanch.com/t/366340/Servlets/java/servlet-mapping-url-pattern上发表的这篇文章)

(JavaServlet3.0规范可在http://download.oracle.com/otndocs/jcp/servlet-3.0-mrel-eval-oth-JSpec/上使用)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17865217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档