我想使用requestcope使用相同的支持bean将数据从datatable传递到另一个页面,这是否可以不使用datamodel?我正在使用Servlet 3.0
这是我的数据表页面
<p:dataTable var="entity" value="#{collegeController.allCollege}">
<p:column headerText="Code">
#{entity.collegeCode}
</p:column>
<p:column headerText="Description">
#{entity.collegeDesc}
</p:column>
<p:column headerText="">
<p:commandLink value="Edit" action="#{collegeController.prepareEdit(entity)}"/>
</p:column>
</p:dataTable>
这是我的支持豆
@ManagedBean
@RequestScoped
public class CollegeController implements Serializable {
private String redirect = ".jsf?faces-redirect=true";
private CollegeCatalog entity;
public CollegeController() {
}
public String prepareEdit(CollegeCatalog selectedEntity) {
Session s = NewHibernateUtil.getSessionFactory().getCurrentSession();
s.beginTransaction();
entity = (CollegeCatalog) s.load(CollegeCatalog.class, selectedEntity.getCollegeKey());
return "update" + redirect;
}
public List getAllCollege() {
Session s = NewHibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = s.beginTransaction();
String query = ""
+ "FROM CollegeCatalog entity "
+ "WHERE entity.deleted = FALSE";
Query q = s.createQuery(query);
List l = q.list();
tx.commit();
return l;
}
/**
* @return the entity
*/
public CollegeCatalog getEntity() {
if (entity == null) {
entity = new CollegeCatalog();
}
return entity;
}
/**
* @param entity the entity to set
*/
public void setEntity(CollegeCatalog entity) {
this.entity = entity;
}
}
这是我的更新页面(这是我要显示所选数据的地方)
<h:form>
<p:outputLabel value="Code:" for="txtCode"/>
<p:inputText id="txtCode" value="#{collegeController.entity.collegeCode}"/>
<br/>
<p:outputLabel value="Description:" for="txtDesc"/>
<p:inputText id="txtDesc" value="#{collegeController.entity.collegeDesc}"/>
<br/><br/>
<p:commandButton value="Update" action="#{collegeController.update()}"/>
<p:commandButton value="Back" action="index.jsf?faces-redirect=true"/>
</h:form>
它始终返回null
。
答案 0 :(得分:3)
您发送到collegeController.action
方法的参数将丢失,因为您有一个@RequestScoped
托管bean,并且将在每个请求中创建整个托管bean。此外,根据您的实际设计,将在每个collegeController.allCollege
方法调用上重新创建列表。
解决您的问题:
将托管bean范围更改为更广泛的范围。在这种情况下,@ViewScoped
就可以了。有关托管bean范围的更多信息:Communication in JSF 2 - Managed Bean Scopes
将所有业务逻辑移到getter之外。由于您正在使用JSF 2并希望在创建bean时加载列表,因此可以使用@PostConstruct
方法并在其中加载列表。在JSF中使用托管bean时,请记住不要在getter / setter中放置任何业务逻辑。更多信息:Why JSF calls getters multiple times
将这些建议应用到您的代码中,托管bean将类似于:
@ManagedBean
@ViewScoped
public class CollegeController implements Serializable {
private String redirect = ".jsf?faces-redirect=true";
private CollegeCatalog entity;
private List<CollegeCatalog> collegeCatalogList;
public CollegeController() {
}
@PostConstruct
public void init() {
Session s = NewHibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = s.beginTransaction();
String query = ""
+ "FROM CollegeCatalog entity "
+ "WHERE entity.deleted = FALSE";
Query q = s.createQuery(query);
collegeCatalogList = (List<CollegeCatalog>)q.list();
tx.commit();
entity = new CollegeCatalog();
}
public String prepareEdit(CollegeCatalog selectedEntity) {
Session s = NewHibernateUtil.getSessionFactory().getCurrentSession();
s.beginTransaction();
entity = (CollegeCatalog)
s.load(CollegeCatalog.class, selectedEntity.getCollegeKey());
return "update" + redirect;
}
public List<CollegeCatalog> getAllCollege() {
return collegeCatalogList;
}
/**
* @return the entity
*/
public CollegeCatalog getEntity() {
return entity;
}
/**
* @param entity the entity to set
*/
public void setEntity(CollegeCatalog entity) {
this.entity = entity;
}
}
但请注意,此方法只是帮助您将entity
中的<p:commandLink action="#{collegeController.prepareEdit(entity)}"/>
参数发送到托管bean。如果不是重定向页面而是转发它,那会更好。
如果您仍然希望使用重定向执行此操作,则此方法无法帮助您将数据发送到其他页面。如果您使用<h:button>
(或更好,<h:link>
)将重定向到您的其他页面并且您可以在那里处理参数,那将会更好。这里有更好的解释:Communication in JSF 2 - Processing GET Request Parameters。
答案 1 :(得分:0)
尝试使用f:setPropertyActionListener
和@ViewScoped
像这样的东西
<p:column headerText="">
<p:commandLink value="Edit" action="#{collegeController.action" >
<f:setPropertyActionListener value="#{collegeController.entity}" target="#{collegeController.targetEntity}">
</p:commandLink>
</p:column>