1

我正在使用 GlassFishV3、JSF2、漂亮的面孔 3

我已经尝试了很多组合来摆脱我的 *.xhtml 扩展名或美化我的 URL,但我没有设法这样做。

如果您知道另一种解决方案,请给我一个示例,说明如何做到这一点,或者我的解决方案是否合理,请告诉我我是否出错了:

我按照http://ocpsoft.org/prettyfaces/snd上的教程创建了一个只有一个 index.xhtml 的简单应用程序,并且我已经放置了 home.xhtml 的链接(两者都在 WebContent 中)。

  • 我已经 dwl 罐子(我不使用 Maven),我把它放在 WEB-INF/lib
  • 根据教程,我不需要更改我的 web.xml,因为在使用 GlassFishv3
  • 我的 web.xml

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>extension</display-name>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>com.ocpsoft.pretty.DEVELOPMENT</param-name>
        <param-value>true</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping></web-app>
    
  • 我的漂亮配置.xml

    <pretty-config xmlns="http://ocpsoft.com/prettyfaces/3.3.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://ocpsoft.com/prettyfaces/3.3.3 
    http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.3.xsd ">
    
    <url-mapping id="home">
        <pattern value="/home" />
        <view-id value="/home.xhtml"/>
    </url-mapping> </pretty-config>
    
    • 使用此配置,我不断收到 java.lang.StackOverflowError (与其他人或我的应用程序无法编译或我收到不同的错误)循环是

    在 com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:308) 在 com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:367) 在 com.sun.faces.facelets .impl.DefaultFacelet.include(DefaultFacelet.java:346) 在 com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199) 在 com.sun.faces.facelets.tag.ui.CompositionHandler.apply (CompositionHandler.java:155) 在 com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 在 com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)

    • 我的 index.xhtml 有效,但是当我单击链接时出现上述错误
    • 我没有豆子(另一个问题是,如果我设法让漂亮的面孔变得漂亮,我是否必须对映射的豆子进行任何注释)

    非常感谢您的宝贵时间!

修改:

  • 我做了一个简单的网络应用程序来看看扩展的隐藏是如何工作的。index.xhtml

    <!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"><ui:composition template="">
    <ui:define name="header">
        Add your header here or delete to use the default
    </ui:define>
    <ui:define name="content">
       <a id="home" href="home.xhtml">Home</a>
    </ui:define>
    <ui:define name="footer">
        Add your footer here or delete to use the default
    </ui:define></ui:composition>
    

和 home.xhtml

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="">
    <ui:define name="header">
        Add your header here or delete to use the default
    </ui:define>
    <ui:define name="content">
        home#######
    </ui:define>
    <ui:define name="footer">
        Add your footer here or delete to use the default
    </ui:define>
</ui:composition>
</html>

现在如果我启动应用程序 127.0.01:8080/myapp 会立即出现错误 java.lang.StackOverflowError

但如果我简单地放入 index.xhtml

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<h:body>
       <a id="home" href="home.xhtml">Home</a>
</h:body>
</html>

在 home.xhtml 中

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<h:body>
HOME
</h:body>
</html>

它可以工作,但扩展程序以 127.0.0.1:8080/myapp/ 开头,然后单击链接和 127.0.0.1:8080/myapp/home.xhtml

我想用模板做第一个索引和主页,因为我在一个已经有模板的网络应用程序上工作。CSS 使用“a href”标签中的 id="home"t know if it is necesary, the id it来格式化它,但我越来越绝望 :))

任何帮助,将不胜感激。谢谢!

### 修改
  • 所以我又开始用一个简单的网络应用程序来看看漂亮的面孔是如何工作的
  • 现在我不t get any errors but I still can改变我的网址
  • 到目前为止我做了什么:

  • 我把 pretty-faces-jsf-3.3.3.jar 放在 WEB-INF/lib

  • 我把 WEB-INF pretty-config.xml

    <?xml version="1.0" encoding="UTF-8"?><pretty-config xmlns="http://ocpsoft.com/prettyfaces/3.3.3" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xsi:schemaLocation="http://ocpsoft.com/prettyfaces/3.3.3
                                        http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.3.xsd">
    
    <url-mapping id="home">
        <pattern value="/home" />
        <view-id value="/home.xhtml" />
    </url-mapping>
    

  • 我的 web.xml

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>test</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>com.ocpsoft.pretty.DEVELOPMENT</param-name>
        <param-value>true</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping></web-app>
    
  • 在 WEB-INF 我有 index.html、home.xhtml 和 template.xhtml

索引.html

    <!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<h:body>
    <a href="home.xhtml">HOME</a>
</h:body>
</html>

主页.xhtml

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="/tempate.xhtml">
    <ui:define name="header">
        Add your header here or delete to use the default
    </ui:define>
    <ui:define name="content">
     ########################
    </ui:define>
    <ui:define name="footer">
        Add your footer here or delete to use the default
    </ui:define>
</ui:composition>
</html>

模板.xhtml

    <!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:ui="http://java.sun.com/jsf/facelets">
<head>
  <title><ui:insert name="title">Default title</ui:insert></title>
</head>

<body>

<div id="header">
    <ui:insert name="header">
        Header area.  See comments below this line in the source.
        <!--  include your header file or uncomment the include below and create header.xhtml in this directory -->
        <!-- <ui:include src="header.xhtml"/> -->
    </ui:insert>
</div>


<div id="content">
  <ui:insert name="content">

                <ui:include src="home.xhtml" />

  </ui:insert>
</div>

<div id="footer">
  <ui:insert name="footer">
        Footer area.  See comments below this line in the source.
        <!--  include your header file or uncomment the include below and create footer.xhtml in this directory -->
        <!--<ui:include src="footer.xhtml"/>  -->
  </ui:insert> </div> </body></html>

我没有用

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"><filter>
      <filter-name>Pretty Filter</filter-name>
      <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
      <async-supported>true</async-supported>
   </filter>

   <filter-mapping> 
      <filter-name>Pretty Filter</filter-name> 
      <url-pattern>/*</url-pattern> 
      <dispatcher>FORWARD</dispatcher> 
      <dispatcher>REQUEST</dispatcher> 
      <dispatcher>ERROR</dispatcher>
      <dispatcher>ASYNC</dispatcher>
   </filter-mapping></web-app>

因为我使用 Glassfishv3

正如我所说,这是一个微不足道的网络应用程序,只是为了看看它是如何工作的。请帮助我理解为什么我有困难...

4

1 回答 1

1

我不认为这个问题与 PrettyFaces 有任何关系。stacktrace 仅显示一些与 Facelets 相关的内容:

at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:308)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:367) 
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346) 
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199) 
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155) 
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)

我看到您使用的是空template属性:

<ui:composition template="">

如果不引用基本模板,您的页面将无法工作。我认为这可能会导致您遇到的错误。

顺便说一句:您可以在不使用 Facelets 模板的情况下测试 PrettyFaces。PrettyFaces 对模板一无所知。因此,如果它在没有模板的情况下工作,它也将与模板一起工作。:)

于 2012-11-25T15:04:40.720 回答