JSF导航问题Facelets和Bean

时间:2010-03-14 12:22:10

标签: jsf navigation facelets

我在简单的jsf系统中遇到导航问题。

MainBean有两种方法:public String register()public String login().

我和faces-config.xml玩了几个小时,我觉得我错过了一些非常重要的东西,因为我觉得到目前为止我已经尝试了所有简单的解决方案:)。

我已将MySQL连接器(jdbc)添加到Tomcat的lib文件夹中,我可以将该表注册到MySQL数据库。它甚至允许我的用户登录页面。

唯一的问题是我无法在login.xhtml以外的任何其他页面中使用导航。似乎导航仅在此活动上有效。我试图使用<from-view-id>*,但不是快乐。我确信有一个简单的解决方案,很快就会有人提出正确的解决方案。让我们跳过所有MySQL部分并尝试解决导航问题。

以下是faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
    version="1.2">
  <application>
    <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>    
  </application>
 <managed-bean>
  <managed-bean-name>mainBean</managed-bean-name>
  <managed-bean-class>dk.itu.beans.MainBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <managed-bean>
  <managed-bean-name>registerBean</managed-bean-name>
  <managed-bean-class>dk.itu.beans.RegisterBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <navigation-rule>
  <from-view-id>/login.xhtml</from-view-id>
  <navigation-case>
   <from-outcome>success</from-outcome>
   <to-view-id>/welcome.xhtml</to-view-id>
  </navigation-case>
        <navigation-case>
      <from-outcome>failure</from-outcome>
      <to-view-id>/login_failed.xhtml</to-view-id>
    </navigation-case>
        <navigation-case>
      <from-outcome>sign</from-outcome>
      <to-view-id>/register.xhtml</to-view-id>
    </navigation-case>
 </navigation-rule>
  <navigation-rule>
  <from-view-id>/login_failed.xhtml</from-view-id>
  <navigation-case>
  <from-outcome>back</from-outcome>
      <to-view-id>/login.xhtml</to-view-id>
  </navigation-case>
  </navigation-rule>
</faces-config>

此处login_failed.xhtml的最后一个导航规则根本不起作用。

这是login.xhtml(这是主要的起始视图):

<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
<body>
<ui:composition template="/template.xhtml">
  <ui:define name="body">
    <h:form id="helloForm">
    <h:panelGrid columns="2">
   <h:outputText value="Username2:" />
   <h:inputText id="username" value="#{mainBean.username}" />
   <h:outputText value="Password:" />
   <h:inputSecret id="password" value="#{mainBean.password}" />
  </h:panelGrid>
  <h:commandButton value="Log in" action="#{mainBean.login}" />
  <h:commandButton value="Sign up" action="sign" />
 </h:form>
  </ui:define>  
</ui:composition>
</body>
</html>
login_failed.xhtml:
<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
<body>
<ui:composition template="/template.xhtml">
  <ui:define name="body">
<f:view>
 <h:outputText value="Unknown username or password." />
 <h:commandButton value="Sign up" action="sign" />
 <h:commandButton value="Log in" action="back" />
</f:view>
</ui:define>  
</ui:composition>
</body>
</html>

这里我尝试了很多选项。我使用action="#{mainBean.register})"方法返回“sign”字符串,但这些方法都不起作用。还有一个文件(未在faces-config.xml文件中指定,因为也不起作用 - 但是从login.xhtml按钮按钮工作正常。我尝试先从login_failed.xhtml管理导航,然后我当客户注册他的昵称时,将使用相同的注册规则返回登录页面。

以下是register.xhtml

<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
<body>
<ui:composition template="/template.xhtml">
  <ui:define name="body">
    <h:form id="helloForm">
    <h:panelGrid columns="2">
       <h:outputText value="User Name:"/>
      <h:inputText type="text" id="userName" value=""/>
   <h:outputText value="Password:"/>
      <h:inputSecret type="text" id="userPassword" value=""/>
      <h:outputText value="Member Level:"/>
      <h:selectOneRadio value="">
                              <f:selectItem itemLabel="Platinium" itemValue="Platinum" />
                              <f:selectItem itemLabel="Gold" itemValue="Gold" />
                              <f:selectItem itemLabel="Normal" itemValue="Normal" />
                          </h:selectOneRadio>
      <h:outputText value="Full Name:"/>
      <h:inputText type="text" id="userFull" value=""/>
      <h:outputText value="Address:"/>
      <h:inputTextarea type="text" id="userAddress" value=""/>
      <h:outputText value="Zip Code:"/>
      <h:inputText type="text" id="userZip" value=""/>
      <h:outputText value="City:"/>
      <h:inputText type="text" id="userCity" value=""/>
   <h:commandButton value="Sign Up" action="#{mainBean.register}" />
    </h:panelGrid>
    </h:form>
  </ui:define>  
</ui:composition>
</body>
</html>

Basicaly mainBean.register现在调用数据库并返回字符串,但显然它不会导航到任何视图(但是会给数据库一个条目)。

我相信这对于大多数经验丰富的网络开发人员来说都是简单的解决方案,我们将非常感谢您的帮助。

如果有帮助,我会使用eclipse,tomcat 6和Widows Vista。)

提前谢谢你。 最诚挚的问候。

2 个答案:

答案 0 :(得分:2)

总的来说,我可以建议在继续使用模板之类的高级内容之前尝试简单的工作。一些指示:

  • 在登录页面的导航规则中使用重定向。这样你就不需要任何特殊的箍来使后退按钮工作。
  • 在验证登录之前创建会话bean通常是个坏主意。一个常见的解决方案是在登录页面上使用请求范围的标识bean ,然后将其注入 LoginAction ,验证凭据并创建用户会话。

我在线有一个相当完整的Facelets / JSF2示例,演示了这种行为:

您可以随意将复制粘贴设计模式应用于您的代码。

答案 1 :(得分:0)

UICommand组件应放在UIForm元素中。在login_failed.xhtml,您忘了使用h:form。添加它就可以了。