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

3

我是JSF和Spring Framework的新手,正在尝试弄清楚如何使它们配合使用。 目前的问题是应用程序输出我的JSF文件而没有解释它们。 以下是我认为可能相关的一些代码片段:

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。请谨慎选择标签 ;) - BalusC
1个回答

2
如果JSF标签未被解析,那么很可能是请求URL与web.xml中定义的FacesServlet的url-pattern不匹配。FacesServlet负责所有JSF相关操作。您需要验证请求URL是否与FacesServlet的url-pattern匹配。例如,如果url-pattern是*.jsf,则需要通过http://example.com/context/page.jsf调用它,而不是通过http://example.com/context/page.xhtml。
然而,我不确定Spring在其中扮演什么角色,因为我没有使用过它,但要使JSF正常工作,您确实需要首先将请求传递给FacesServlet,而不是通过某个Spring控制器。Spring应该在此之后完成其工作。

我正在尝试按照您的建议更改web.xml,但是我遇到了以下错误: 警告:ApplicationDispatcher[/PodleRose2] PWC1231:servlet jsp的Servlet.service()抛出异常 java.lang.RuntimeException:找不到FacesContext 警告:StandardWrapperValve [dispatcher]:PWC1406:servlet dispatcher的Servlet.service()抛出异常 java.lang.RuntimeException:找不到FacesContext 这是什么意思? - Jakub Stejskal
天啊...现在它可以工作了,但我比之前更加沮丧,因为我有98%的把握之前至少尝试过同样的设置3次,但都没有成功 :-O 这是Netbeans的问题还是Java Web应用程序领域的标准行为? :-D - Jakub Stejskal
当您未通过FacesServlet传递请求时,前一个异常确实会被抛出。它负责创建FacesContext。XHTML页面中的JSF组件正在抱怨此问题,因为它们需要FacesContext才能正常工作。很高兴您总体上还是解决了这个问题 :) - BalusC
无论如何,感谢您的帮助,它似乎做了我期望它做的事情(这次不同)。现在我可以希望解决昨天的原始应用程序作用域bean问题 :) - Jakub Stejskal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接