在 Apache Tomcat 上运行 JSF 项目

Posted

技术标签:

【中文标题】在 Apache Tomcat 上运行 JSF 项目【英文标题】:Run JSF project on Apache Tomcat 【发布时间】:2011-06-27 11:52:57 【问题描述】:

如何在 Tomcat 上午餐 JSP 项目?我将WebContent 文件夹复制到Apache 的webapp 文件夹,但它找不到我的jsp 页面,但是如果我将jsp 更改为jsf(index.jsf)就可以了。我该如何解决这个问题?

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_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Graph</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <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>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <description>
    This parameter tells MyFaces if javascript code should be allowed in
    the rendered html output.
    If javascript is allowed, command_link anchors will have javascript code
    that submits the corresponding form.
    If javascript is not allowed, the state saving info and nested parameters
    will be added as url parameters.
    Default is 'true'</description>
    <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <description>
    If true, rendered HTML code will be formatted, so that it is 'human-readable'
    i.e. additional line separators and whitespace will be written, that do not
    influence the HTML code.
    Default is 'true'</description>
    <param-name>org.apache.myfaces.PRETTY_HTML</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <description>
    If true, a javascript function will be rendered that is able to restore the
    former vertical scroll on every request. Convenient feature if you have pages
    with long lists and you do not want the browser page to always jump to the top
    if you trigger a link or button action that stays on the same page.
    Default is 'false'
</description>
    <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
    <param-value>true</param-value>
  </context-param>
  <servlet>
    <servlet-name>faces</servlet-name>
    <servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>controler.UploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>faces</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>faces</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/Upload</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>
</web-app>

错误: 输入状态报告

消息 /Graph/index.jsp

description 请求的资源 (/Graph/index.jsp) 不可用。

【问题讨论】:

你的tomcat文件夹结构是什么样子的,你如何尝试调用jsps?在 jsf 应用程序中,您必须使用 .jsf 文件扩展名来调用它们。 【参考方案1】:

您可以使用 tomcat 管理器部署您的应用程序

http://tomcatIP:8080/manager/html

您可以在那里上传您的应用程序,它应该可以立即使用 如果你不知道应该输入什么用户名和密码,你必须配置你的 tomcat-users.xml

【讨论】:

【参考方案2】:

这不是问题。这是预期的行为。您只是误解了基本 Servlet API 的工作原理。您已将 JSF 标准 FacesServlet 配置为侦听与 /faces/* 匹配的 URL,并且您已将 Apache MyFaces 特定的 MyFacesServlet 配置为侦听与 *.jsf*.faces 匹配的 URL。

要让 JSF 运行,您必须通过与 FacesServlet 的映射匹配的 URL 在浏览器中打开页面。鉴于您有一个 index.jsp 文件并且您的上下文路径是 Graph 并且您已经在三种不同的 URL 模式上配置了两个 JSF servlet,您可以通过以下 URL 打开 JSP:

http://localhost:8080/Graph/faces/index.jsp(调用FacesServlet) http://localhost:8080/Graph/index.jsf(调用MyFacesServlet) http://localhost:8080/Graph/index.faces(调用MyFacesServlet

也就是说,您的配置过于复杂。删除MyFacesServlet 条目及其所有关联的URL 映射(servlet 名称为faces)。只需坚持标准FacesServlet 并改用它的映射,或者改用它。我个人推荐使用*.jsf

<servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

然后你就可以通过http://localhost:8080/Graph/index.jsf打开页面了。


与具体问题无关,您的welcome-file 不会那样工作。 Tomcat 会给出一个 HTTP 404 错误(找不到页面/资源)。您需要将index.jsf 指定为welcome-file,并在与index.jsp 相同的文件夹中提供一个具体但index.jsf 文件。这样 Tomcat 就会被骗到文件存在并通过调用 http://localhost:8080/Graph 来显示页面。


如果您担心可以通过 *.jsp 扩展名打开 JSF 页面,这将导致 RuntimeException: FacesContext not found 并且您实际上没有一个 JSP 文件可以提供普通的香草,那么您可以限制直接通过web.xml中的以下安全约束访问JSP文件:

<security-constraint>
    <display-name>Restrict direct access to JSP files</display-name>
    <web-resource-collection>
        <web-resource-name>JSP files</web-resource-name>
        <url-pattern>*.jsp</url-pattern>
    </web-resource-collection>
    <auth-constraint />
</security-constraint>

(在 JSF 2.0 中,顺便说一句,这不再需要,使用默认视图技术 Facelets,可以将 FacesServlet 映射到 *.xhtml,这与 Facelets 文件的默认扩展名相同)

【讨论】:

以上是关于在 Apache Tomcat 上运行 JSF 项目的主要内容,如果未能解决你的问题,请参考以下文章

无法将 JSF + CDI 项目从 Tomcat 迁移到 Wildfly

在同一个 Tomcat 服务器上部署 JSF 1.2 和 JSF 2.0 应用程序

从Tomcat 7迁移到8时的jsf实现版本NullPointerException

在 Servlet 2.4 容器上运行 JSF 2.0

将tomcat重定向到本地系统中的apache

将tomcat重定向到本地系统中的apache