【发布时间】:2014-01-21 14:01:38
【问题描述】:
您好,从搜索页面导航到编辑页面时,我在编辑页面中填充数据时遇到问题。我可以在employeeBean.edit 方法中看到employeeDTO 数据,但在编辑页面渲染完成时不可用。请帮我找出问题。
还请澄清以下内容。
1) 请求生命周期过程执行时@viewScoped bean 的作用域是什么。 @viewScoped bean 是否放入请求范围?
2) JSF 中的 Flash 作用域是什么。我是否需要在上述场景中使用 flash 范围在编辑页面中填充数据?
下面是代码。
EmployeeCreate.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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head><title>Employee Registration</title>
<link href="../css/styles.css"
rel="stylesheet" type="text/css"/>
</h:head>
<h:body>
<div align="center">
<h:form>
<h:panelGrid columns="3" styleClass="formTable">
Employee Name:
<h:inputText value="#{employeeBean.employeeDTO.empName}"
required="true"
id="empName">
</h:inputText>
<h:message for="empName" styleClass="error"/>
Employee Location:
<h:inputText value="#{employeeBean.employeeDTO.empLocation}"
required="true"
id="empLocation">
</h:inputText>
<h:message for="empLocation" styleClass="error"/>
</h:panelGrid>
<h:commandButton value="Submit"
action="#{employeeBean.submit}"/>
</h:form>
</div>
</h:body>
</html>
EmployeeSearch.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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head><title>Employee Search Result</title>
<link href="../css/styles.css"
rel="stylesheet" type="text/css"/>
</h:head>
<h:body>
<div align="center">
<h:form>
<h1>Employee List</h1>
<h:dataTable value="#{employeeSearchBean.employeesList}" var="emp">
<h:column>
<!-- column header -->
<f:facet name="header">Employee ID</f:facet>
<!-- row record -->
<h:commandLink value="#{emp.empId}" action="#{employeeBean.edit}">
<f:setPropertyActionListener target="#{employeeBean.employeeDTO}" value="#{emp}" />
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">Employee Name</f:facet>
#{emp.empName}
</h:column>
<h:column>
<f:facet name="header">Employee Location</f:facet>
#{emp.empLocation}
</h:column>
</h:dataTable>
</h:form>
</div>
</h:body>
</html>
EmployeeBean.java(用于创建/更新操作等)
package com.employee;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class EmployeeBean {
private EmployeeDTO employeeDTO;
@PostConstruct
public void init(){
System.out.println(">>>>>>> init >>>>");
}
public EmployeeDTO getEmployeeDTO() {
return employeeDTO;
}
public void setEmployeeDTO(EmployeeDTO employeeDTO) {
this.employeeDTO = employeeDTO;
}
public String edit(){
System.out.println(">>> edit employee Id >>> " + employeeDTO.getEmpId() );
return "edit";
}
public String submit(){
// to do
return null;
}
}
EmployeeSearchBean.java(我的项目需要单独的bean进行Search操作)
@ManagedBean
@ViewScoped
public class EmployeeSearchBean {
List<EmployeeDTO> employeesList;
public List<EmployeeDTO> getEmployeesList(){
employeesList = new ArrayList<EmployeeDTO>();
EmployeeDTO emp1 = new EmployeeDTO();
emp1.setEmpId(new Long(1));
emp1.setEmpLocation("Location1");
emp1.setEmpName("Mike");
EmployeeDTO emp2 = new EmployeeDTO();
emp2.setEmpId(new Long(2));
emp2.setEmpLocation("Location2");
emp2.setEmpName("name2");
EmployeeDTO emp3 = new EmployeeDTO();
emp3.setEmpId(new Long(3));
emp3.setEmpLocation("Location3");
emp3.setEmpName("name3");
employeesList.add(emp1);
employeesList.add(emp2);
employeesList.add(emp3);
return employeesList;
}
}
EmployeeDTO.java
public class EmployeeDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long empId;
private String empName;
private String empLocation;
// setters and getters ........
}
faces-config.xml
<managed-bean>
<managed-bean-name>employeeBean</managed-bean-name>
<managed-bean-class>com.employee.EmployeeBean</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
<managed-property>
<property-name>employeeDTO</property-name>
<value>#{employeeDTO}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>employeeDTO</managed-bean-name>
<managed-bean-class>com.employee.EmployeeDTO</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/jsf/EmployeeSearch.xhtml</from-view-id>
<navigation-case>
<from-outcome>edit</from-outcome>
<to-view-id>/jsf/EmployeeCreate.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
提前致谢。任何帮助表示赞赏。
【问题讨论】: