java 在 Apache Tomcat 上运行 JSF 项目
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5002190/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Run JSF project on Apache Tomcat
提问by Reza
How can lunch JSP project on Tomcat? I copy WebContent
folder to webapp
folder of Apache but it can't find my jsp page, but if I change jsp to jsf (index.jsf) works fine. How can I solve this problem?
如何在Tomcat上午餐JSP项目?我将WebContent
文件webapp
夹复制到Apache 的文件夹但它找不到我的 jsp 页面,但是如果我将 jsp 更改为 jsf (index.jsf) 工作正常。我怎么解决这个问题?
web.xml:
网页.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>
Error: type Status report
错误:输入状态报告
message /Graph/index.jsp
description The requested resource (/Graph/index.jsp) is not available.
消息/Graph/index.jsp
描述 请求的资源 (/Graph/index.jsp) 不可用。
回答by BalusC
That's not a problem. That's expected behaviour. You're just misunderstanding how the basic Servlet API works. You have configured the JSF-standard FacesServlet
to listen on URLs matching /faces/*
and you have configured Apache MyFaces specific MyFacesServlet
to listen on URls matching *.jsf
and *.faces
.
那不是问题。这是预期的行为。您只是误解了基本 Servlet API 的工作原理。您已将 JSF 标准配置FacesServlet
为侦听 URL 匹配,/faces/*
并且已将 Apache MyFaces 配置为特定MyFacesServlet
于侦听 URls 匹配*.jsf
和*.faces
.
To get JSF to run, you have to open the page in browser by an URL which matches the mapping of the FacesServlet
. Given the fact that you've an index.jsp
file and that your context path is Graph
and that you have configured two JSF servlets on three different URL patterns, you can open the JSP by the following URLs:
要运行 JSF,您必须在浏览器中通过匹配 .js 文件映射的 URL 打开页面FacesServlet
。鉴于您有一个index.jsp
文件并且您的上下文路径是Graph
并且您已经在三种不同的 URL 模式上配置了两个 JSF servlet,您可以通过以下 URL 打开 JSP:
- http://localhost:8080/Graph/faces/index.jsp(invokes
FacesServlet
) - http://localhost:8080/Graph/index.jsf(invokes
MyFacesServlet
) - http://localhost:8080/Graph/index.faces(invokes
MyFacesServlet
)
- http://localhost:8080/Graph/faces/index.jsp(调用
FacesServlet
) - http://localhost:8080/Graph/index.jsf(调用
MyFacesServlet
) - http://localhost:8080/Graph/index.faces(调用
MyFacesServlet
)
Said that, your configuration is unnecessarily overcomplicated. Get rid of the MyFacesServlet
entry and all of its associated URL mappings (with the servlet name of faces
). Just stick to the standard FacesServlet
and use its mapping instead, or alter it instead. I personally recommend using *.jsf
.
就是说,你的配置不必要地过于复杂。删除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>
Then you can just open the page by http://localhost:8080/Graph/index.jsf.
然后你可以通过http://localhost:8080/Graph/index.jsf打开页面。
Unrelated to the concrete problem, your welcome-file
won't work that way. Tomcat would give a HTTP 404 error on that (page/resource not found). You need to specify index.jsf
as welcome-file
and supply a concrete but emptyindex.jsf
file in the same folder as your index.jsp
. This way Tomcat will be fooled that the file exist and show the page by just calling http://localhost:8080/Graph.
与具体问题无关,你welcome-file
不会那样工作。Tomcat 会给出一个 HTTP 404 错误(页面/资源未找到)。你需要指定index.jsf
的welcome-file
,并提供一个具体的,但空index.jsf
在同一文件夹中文件index.jsp
。这样 Tomcat 就会被愚弄,认为该文件存在并通过调用http://localhost:8080/Graph 来显示页面。
If your concern is that it is possible to open JSF pages by their *.jsp
extension which would result in a RuntimeException: FacesContext not found
and you have actually no one JSP file which is to be served plain vanilla, then you can restrict direct access to JSP files by the following security constraint in web.xml
:
如果您担心有可能通过*.jsp
扩展名打开 JSF 页面,这会导致RuntimeException: FacesContext not found
您实际上没有一个 JSP 文件可以提供普通的普通版本,那么您可以通过以下安全约束来限制对 JSP 文件的直接访问在web.xml
:
<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>
(in JSF 2.0 this is by the way not needed anymore, with the default view technology Facelets it's possible to map the FacesServlet
on just *.xhtml
, which is the same as the default extension of Facelets files)
(顺便说一下,在 JSF 2.0 中,这不再需要了,使用默认的视图技术 Facelets 可以映射FacesServlet
on just *.xhtml
,这与 Facelets 文件的默认扩展名相同)
回答by k-deux
you can deploy your application with the tomcat manager
您可以使用 tomcat 管理器部署您的应用程序
http://tomcatIP:8080/manager/html
http://tomcatIP:8080/manager/html
there you can upload your application and it should run out of the box if you have no idea what username and password you should type in, you have to configure your tomcat-users.xml
在那里你可以上传你的应用程序,如果你不知道应该输入什么用户名和密码,它应该开箱即用,你必须配置你的 tomcat-users.xml