我正在使用JSF,javabeans和GlassFish,并且在使用参数时遇到了commandLinks和查询的问题(至少我认为是创建问题)。
我目前有两个页面,一个名为listRents.xhtml,它显示存储在RentProperty表中的所有RentProperty实体,以及另一个要从listRents.xhtml页面访问的rentDetails.xhtml。 listRents.xhtml页面工作正常,因为我只需要创建一个命名查询,我从表中获取所有RentProperty对象。
在这个页面上虽然我需要一个commandLink,它是每个RentProperty的ID,然后使用下面的findRentsById(Long id)方法转到rentDetails.xhtml页面来显示该对象的所有信息。
目前,当我点击commandLink时,它只刷新listRents.xhtml页面,没有结果,甚至没有更改为rentDetails.xhtml页面。
下面是我的类和xthml页面,我正在使用GlassFish Server 3.1.2,并且在使用链接和方法时不会出现任何错误。注意我已经删除了一些基本的getter和setter以及toString方法等。
我的java类:
@Stateless
public class RentPropertyEJB
{
@PersistenceContext(unitName = "MyPU")
private EntityManager em;
public List<RentProperty> findRents()
{
TypedQuery<RentProperty> query = em.createNamedQuery("findAllRent", RentProperty.class);
return query.getResultList();
}
public RentProperty findRentsById(Long id)
{
Query q = em.createQuery("SELECT r FROM RentProperty r where r.id = :id");
q.setParameter("id", id);
return (RentProperty) q.getSingleResult();
}
public RentProperty createRent(RentProperty rent)
{
em.persist(rent);
return rent;
}
}
@ManagedBean
@RequestScoped
public class RentPropertyController
{
@EJB
private RentPropertyEJB rentEJB;
private RentProperty rent = new RentProperty();
private List<RentProperty> rentList = new ArrayList<RentProperty>();
public String doCreateRent()
{
rent.setType("House");
rent = rentEJB.createRent(rent);
rentList = rentEJB.findRents();
return "listRents.faces";
}
public String showRentDetails(Long id)
{
rent = rentEJB.findRentsById(id);
return "rentDetails.faces";
}
public String goToListRents()
{
rentList = rentEJB.findRents();
return "listRents.faces";
}
}
@Entity
@NamedQueries({
@NamedQuery(name = "findAllRent", query = "SELECT r FROM RentProperty r"),
@NamedQuery(name = "findRentByID", query = "SELECT r FROM RentProperty r where r.id = :id")
})
@Table(name = "RentProperty")
public class RentProperty extends Property
{
private String furnished;
private Float rentPrice;
}
Xhtml页面:listRents.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">
<h:head>
<title>List of the Rent Properties</title>
</h:head>
<h:body>
<h1>List of the Rent Properties</h1>
<hr/>
<h:dataTable value="#{rentPropertyController.rentList}" var="rp" border="1">
<h:column>
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:form>
<h:commandLink value="#{rp.id}" action="#{rentPropertyController.showRentDetails(rp.id)}" />
</h:form>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Description"/>
</f:facet>
<h:outputText value="#{rp.description}"/>
</h:column>
</h:dataTable>
<h:form>
<h:link outcome="newRent.faces" value="Create a new Rent Property"/> |
<h:link outcome="index.faces" value=" Home"/>
</h:form>
<hr/>
</h:body>
</html>
rentDetails.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">
<h:head>
<title>Rent Property Details</title>
</h:head>
<h:body>
<h1>Rent Property Details</h1>
<hr/>
<h:dataTable value="#{rentPropertyController.rent}" var="rp" border="1">
<h:column>
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:outputText value="#{rp.id}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Rent Price"/>
</f:facet>
<h:outputText value="#{rp.rentPrice}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Number Of bedrooms"/>
</f:facet>
<h:outputText value="#{rp.nmOfBedrooms}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Number of bathrooms"/>
</f:facet>
<h:outputText value="#{rp.nmOfBathrooms}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Address"/>
</f:facet>
<h:outputText value="#{rp.address}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Description"/>
</f:facet>
<h:outputText value="#{rp.description}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Furnished"/>
</f:facet>
<h:outputText value="#{rp.furnished}"/>
</h:column>
</h:dataTable>
<h:form>
<h:link outcome="newRent.faces" value="Create a new Rent Property"/> |
<h:link outcome="index.faces" value=" Home"/>
</h:form>
<hr/>
</h:body>
</html>
的index.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">
<head>
<title>eBusiness</title>
</head>
<body>
<h1>eBusiness: Product, Customer, and Order Management</h1>
<h2>Products</h2>
<h:form>
<a href="newRent.faces">Create a new Rent Property</a> |
<h:commandLink value="List Rent Properties" action="#{rentPropertyController.goToListRents}" /> |
<h:commandLink value="This one works for some reason" action="#{rentPropertyController.showRentDetails(22)}" /> |
<a href="searchRents.faces">Searh for a Rent Property</a><br/>
<a href="newSale.faces">Create a new Sale Property</a> |
<h:commandLink value="List Sale Properties" action="#{salePropertyController.goToListSales}" /> |
<a href="searchSales.faces">Searh for a Sale Property</a><br/>
</h:form>
</body>
</html>
此处演示的是一个屏幕截图,显示了在点击commandLink之前和之后。上半部分显示listRents.xhtml页面,当它导航到使用'#{rentPropertyController.goToListRents}'动作时,第二页显示当我点击commandLink时会发生什么。
请注意,Web地址似乎仍然位于newRent.xhtml页面上(在listRents.xhtml页面上),这是我用来创建要添加到表中的新RentProperty对象的页面。如果需要,我可以包括这个,但我不认为它是必要的。 Screen shot
这真让我感到困惑,我不知道如何修复它,因为我似乎无法找到问题。任何帮助表示赞赏。对于任何不良格式,我很抱歉使用此功能。
编辑:好的,显然当我直接在commandLink中使用ID时它只能在我的index.xhtml页面上工作,即使我在listRents页面上添加以下作为commandLink它也不起作用,例如:
action="#{rentPropertyController.showRentDetails(22)}"
关于为什么rp.id不起作用的任何想法?
答案 0 :(得分:-1)
看起来你正在使用Request Scope。在JSF中,有不同的范围可用。每个范围用于不同的目的。
提到了 @RequestScoped Managed Bean。例如:
<强> @RequestScoped 强> 只要HTTP请求响应存在,Bean就会存在。它在HTTP请求时创建,并在与HTTP请求关联的HTTP响应完成时被销毁。
<强> @ViewScoped 强> 只要用户在浏览器窗口/选项卡中与相同的JSF视图进行交互,Bean就会存在。它是在HTTP请求时创建的,一旦用户回发到另一个视图就会被销毁。