0

我用 maven、jsf 和 richfaces 开发了一个动态 web 项目。我省略了历史,直奔我的问题。在与开发中断不久之后,我在 Eclipse->Tomcat 中陈述了我的项目。在我的起始页面上有图像和简单的登录表单。图像和设计都可以,地址http://localhost:8080/myapp/应为(图像和 css 的链接就像 - myapp/img/header.png

登录后我重定向到登录页面(这是richfaces动态页面)http://localhost:8080/myapp/faces/statistics.xhtml,所有指向图像和css的链接都转换为myapp/faces/img/header.png,之后没有图像和css。

我一头雾水,怎么回事?几天前它工作得很好。

在 web.xml 我有这个

<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>/faces/*</url-pattern>
  </servlet-mapping>
    <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>

我什至不知道从哪里开始解决我的问题。如何将图像返回设计?


更新

我发现这种不愉快的行为只存在于我的 layout.xhtml 中。因为只有我没有创建的这个文件。这是我们对所有项目的设计,简而言之,它看起来像这样:

…
<h:head>
<link href="css/main.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
<img src="img/header.png">
… design …
<div class="menuAndContent">
    <div class="menuLeft">
        <ui:insert name="menuLeft" />
    </div>
    <div class="content">
        <ui:insert name="content" />
    </div>
</div>
… design …
<img src="img/selector2.gif">
…

所以我只为 div=content 和 div=menu 创建文件。该文件效果很好,它们上的所有图像都存在。

只是这个布局文件在跟我“开玩笑”。所有链接:css/main.css img/header.png img/selector2.gif他们在第一步工作!在地址http://localhost:8080/myapp/和 browser.dev.tool 向我显示他从路径中获取这些资源myapp/css/main.css myapp/img/header.png ,当我更深入时http://localhost:8080/myapp/faces/statistics.xhtml,登录后,我重定向到具有不同内容的同一页面。在 browser.dev.tool 中,我看到带有此链接的页面css/main.css img/header.png img/selector2.gif- 一切都正确且很好,但是从这些资源中获取这些资源的路径myapp/css/main.css myapp/img/header.png转换为这些资源myapp/faces/css/main.css myapp/faces/img/header.png。那就是问题所在。

4

2 回答 2

1

你不应该在你的 webapp 中使用相对 URI 的 URL。

<link href="css/main.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
<img src="img/header.png">

正如您在浏览器的地址栏中看到的,它们相对于请求 URI。如果页面本身位于/faces文件夹中,则浏览器还将从该文件夹下下载所有与 URI 相关的资源。

你应该在你的 webapp 中使用上下文相关的 URL。

<link href="#{request.contextPath}/css/main.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="#{request.contextPath}/favicon.ico" type="image/x-icon" />
<img src="#{request.contextPath}/img/header.png">

但是,更好的是利用 JSF 资源管理。

<h:outputStylesheet name="css/main.css" />
<link rel="shortcut icon" href="#{resource['favicon.ico']}" type="image/x-icon" />
<h:graphicImage name="img/header.png" />

将这些资源放在/resources文件夹中。

WebContent
 |-- WEB-INF
 |-- META-INF
 |-- resources
 |    |-- css 
 |    |    `-- main.css
 |    |-- img
 |    |    `-- header.png
 |    `-- favicon.ico 
 :

也可以看看:

于 2013-06-12T13:30:46.337 回答
0

非常感谢Alexandre Lavoie(我没有意识到第一眼评论的含义)我的问题确实存在于 web.xml 文件中

答案就在问题中!

<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>/faces/*</url-pattern>
</servlet-mapping>
    <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>

这是双重映射!它应该只有一个映射!所以我只留下这个

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

我的问题已经消失了!

于 2013-06-12T09:20:43.333 回答