В настоящее время я разрабатываю дополнительную страницу для уже существующего веб-сайта.На самом деле эта часть не так уж и важна - страница выполняет свои собственные отдельные функции.
В любом случае, изначально эта «страница» состояла из двух страниц, управляемых одним потоком страниц jpdl.Все работало правильно, кроме как при ссылке на вторую страницу.Пользователь вводит в поля все, что ему нравится, и нажимает кнопку «Отправить».Все функционировало так, как ожидалось, за исключением того, что методы set никогда не вызывались.Несмотря на чтение существующих значений из Backing Bean, они никогда не вызывались.Я написал несколько тестов Seam и обнаружил, что могу создать свой собственный FacesRequest
, который будет вызывать setValue()
в том же выражении EL, и он работал нормально, что указывало на то, что что-то не так на стороне JSF.Тем не менее я никогда не понимал это и шел дальше.Конечно, теперь я должен был вернуться к нему.
Код, о котором идет речь, выглядит как ... (несущественные части удалены. Существует много ошибок, поскольку они довольно общие и используются во многихмест):
@Name("user")
@Install(precedence = Install.DEPLOYMENT)
@Scope(ScopeType.CONVERSATION)
@AutoCreate
public class UserBean{
private String username;
public void setUsername(String username){this.username = username;}
public String getUsername(){return username;}
}
Базовый фрагмент страницы "users.xhtml" ...
<h:form id="modifyUsersForm">
<rich:panel>
<rich:dataTable id="userTable" value="#{users}" var="myUser">
<rich:column style="text-align:center">
<h:commandButton id="modifyButton" type="submit" value="Modify" action="modify">
<f:setPropertyActionListener target="#{user.id}" value="#{myUser.id}"/>
</h:commandButton>
</rich:column>
</rich:dataTable>
</rich:panel>
<s:button id="modifyUserCancelButton" value="Cancel" action="cancel"/>
</s:fragment>
</h:form>
users - это bean-компонент, расширяющий LinkedList<UserBean>
.Все, что в основном делает, - это создает таблицу кнопок с надписью «Изменить»
Основной фрагмент страницы «user.xhtml» ...
<h:form id="modifyUserForm">
<rich:panel>
<h:inputText id="username" value="#{user.username}"/>
<div style="clear: both"/>
</rich:panel>
<s:button id="modifyUserCancelButton" value="Cancel" action="cancel"/>
<s:button id="modifyUserModifyButton" value="Modify" action="doModify"/>
</h:form>
"users.pageflow.jpdl.xml "of ...
<pageflow-definition xmlns="http://jboss.com/products/seam/pageflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="users">
<start-page name="start" view-id="/users.xhtml" no-conversation-view-id="/users.xhtml">
<transition name="cancel" to="cancelled"/>
<transition name="retrieve" to="retrieve"/>
</start-page>
<decision name="retrieve_agent" expression="#{action.retrieve}">
<transition name="success" to="retrieved"/>
<transition name="failure" to="start"/>
</decision>
<page name="retrieved" view-id="/users.xhtml" no-conversation-view-id="/users.xhtml">
<transition name="modify" to="retrieve_user"/>
<transition name="cancel" to="cancelled"/>
</page>
<decision name="retrieve_user" expression="#{action.retrieveUser}">
<transition name="success" to="modify"/>
<transition name="failure" to="start"/>
</decision>
<page name="modify" view-id="/user.xhtml" no-conversation-view-id="/user.xhtml">
<transition name="cancel" to="cancelled"/>
<transition name="doModify" to="doModify"/>
</page>
<decision name="doModify" expression="#{action.modifyUser}">
<transition name="success" to="start"/>
<transition name="failure" to="modify"/>
</decision>
<page name="cancelled" view-id="/users.xhtml">
<end-conversation before-redirect="true"/>
<redirect/>
</page>
</pageflow-definition>
Так чего мне не хватает?Почему setUsername не вызывается для user.xhtml во время как часть жизненного цикла JSF, когда он успешно вызывает getUsername на той же странице?Мы используем Java 1.6.0_07, Seam 2.2.1, JSF 1.1 (я полагаю, маловероятно, что это может быть 1.2) и разворачиваемся в JBoss 4.2.3.