为啥我的 JSF + Spring Web 应用程序输出 JSF 源代码而不是解释的 HTML 页面?

Posted

技术标签:

【中文标题】为啥我的 JSF + Spring Web 应用程序输出 JSF 源代码而不是解释的 HTML 页面?【英文标题】:Why does my JSF + Spring web application output JSF source code instead of interpreted HTML page?为什么我的 JSF + Spring Web 应用程序输出 JSF 源代码而不是解释的 HTML 页面? 【发布时间】:2011-02-20 16:16:19 【问题描述】:

我是 JSF 和 Spring 框架的新手,我正在尝试弄清楚如何让它们一起工作。 我当前的问题是应用程序输出我的 JSF 文件而不解释它们。 以下是我认为可能相关的代码的一些 sn-ps:

dispatcher-servlet.xml

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="login.htm">loginController</prop>
        </props>
    </property>
</bean>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/pages/"
      p:suffix=".xhtml" />

<bean name="loginController" class="controller.LoginController" />

登录控制器

public class LoginController extends MultiActionController 
 public ModelAndView login(HttpServletRequest request,
   HttpServletResponse response) throws Exception 
    System.out.println("LOGIN");
    return new ModelAndView("login");

WEB-INF/pages/login.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html">
<h:head>
    <title>#message.log</title>
</h:head>
<h:body>
    <h:form>
        <h:outputLabel value="#message.username" for="userName">
            <h:inputText id="userName" value="#User.name" />
        </h:outputLabel>            
        <h:commandButton value="#message.loggin" action="#User.login" />
    </h:form>
</h:body>
</html>

任何想法可能是问题所在?这段代码有任何意义吗?我很清楚事实,这可能完全糟透了,我很高兴在这里为什么它糟透了以及如何使它变得更好。谢谢:)

编辑:我正在添加一段代码,这似乎是问题的根源,而我(当然)没有包含在原始问题中:

web.xml

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<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>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

Faces Servlet 的 url-pattern 必须更改为 *.xhtml 才能正常工作。

【问题讨论】:

PS:J2EE 已经死了快 4 年了。自 Java EE 5.0 发布以来,它被称为 Java EE。仔细选择标签;) 【参考方案1】:

如果JSF标签没有被解析,那么它仅仅意味着请求URL不匹配FacesServlet中定义的url-patternweb.xml。它对所有 JSF 事件负责。您需要验证请求 URL 是否与 FacesServleturl-pattern 匹配。如果它是例如*.jsf,那么您需要通过http://example.com/context/page.jsf 调用它,而不是通过http://example.com/context/page.xhtml

但是我不确定 Spring 如何适合我,因为我不使用它,但要让 JSF 工作,你确实需要首先通过 FacesServlet 传递请求,而不是通过一些 Spring 控制器。 Spring 应该在之后完成它的工作。

【讨论】:

我正在尝试按照您所说的更改 web.xml,但出现以下错误: WARNING: ApplicationDispatcher[/PodleRose2] PWC1231: Servlet.service() for servlet jsp throw exception java.lang .RuntimeException: 找不到 FacesContext WARNING: StandardWrapperValve[dispatcher]: PWC1406: Servlet.service() for servlet dispatcher throw exception java.lang.RuntimeException: Cannot find FacesContext 这是什么意思? 天啊......现在它可以工作了,但我比以前更沮丧,因为我 98% 确定我之前至少尝试了 3 次相同的设置,但它没有工作:- O 那是 Netbeans 还是 Java Web 应用程序领域的标准行为? :-D 如果不通过FacesServlet传递请求,确实会抛出前一个异常。它负责创建FacesContext。 XHTML 页面中的 JSF 组件抱怨这一点,因为它们需要 FacesContext 才能正常工作。很高兴你让它正常工作:) 无论如何.. 感谢您的帮助,它似乎做了我期望它做的事情(改变)。现在我有望从昨天开始解决我原来的应用程序范围 bean 问题 :)

以上是关于为啥我的 JSF + Spring Web 应用程序输出 JSF 源代码而不是解释的 HTML 页面?的主要内容,如果未能解决你的问题,请参考以下文章

jsf spring安全访问被拒绝认证登录

为啥我的 Spring Boot Web 应用程序无法在 Gradle 中完全运行?

如何在 JSF-Spring 集成应用中启用 CSRF 保护

java中的Web开发存在哪些Spring+JSF/Facelets的替代品?

为啥我的控制器中的根路径映射到 Spring Boot Web 应用程序中的 index.html?

具有 Spring 安全性的 JSF - 登录后重定向到指定页面