У меня проблема с навигацией в моей простой системе jsf.
У меня есть MainBean
, который имеет два метода: public String register()
и public String login().
Я играл с faces-config.xml
в течение нескольких часов, и мне кажется, что я упустил что-то очень важное, потому что я думаю, что я уже пробовал все простые решения:).
Я добавил соединитель MySQL (jdbc) в папку lib Tomcat, и я могу зарегистрировать таблицу в базе данных 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, если это поможет:)
Заранее спасибо.
С наилучшими пожеланиями.