在 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:
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 应用程序