我正在使用spring JSF集成进行项目 我有一些具有某些属性的@RequestScope bean,它们在形式(搜索应用程序)中完成后,我从db值填充同一个bean的list属性,并使用datatable(在提交/搜索按钮上应用ajax)在同一页面上查看。 我第一次搜索时得到的结果很好但问题是当我在另一个浏览器页面刷新或打开页面时,数据表仍然是初始请求的数据,也从其他页面导航并返回到同一页面仍显示初始请求页面/数据为如果requestscope不起作用而不是会话范围。 我使用spring来管理bean及其创建和jsf用于前端页面。这可能是面孔和弹簧混合混合的问题,如果是这样的解决方案是什么?因为我也通过自动装配其他bean使用DAO方法。 e.g。
@ManagedBean(name="inputService")
@RequestScoped
public class InputService {
@Autowired
AdvancSearchDaoImpl Dao;
private String name;
private String bloodgroup;
private String dateofbirth;
List<Result> searchResults;
getter/setters of above attributes
public String outputService()
{
searchResults=Dao.getAdvacnceServiceSearch(name,bloodgroup,dateofbirth);
return "successful";
}
}
xhtml是:
<div >
<h:dataTable id="tbl" value="#{inputService.searchResults}" var="o" styleClass="display">
<h:column>
#{o.name}
</h:column>
<h:column>
#{o.dateofbirth}
</h:column>
<h:column>
#{o.bloodgroup}
</h:column>
</h:dataTable>
</div>
<h:form>
<table>
<tr><td>Full Name</td>
<td>
<h:inputText value="#{inputService.name}" styleClass="text-box" />
</td></tr>
<tr><td>Date of Birth</td>
<td>
<h:inputText value="#{inputService.dateofbirth}" />
</td></tr>
<tr><td>Blood group</td>
<td>
<h:inputText value="#{inputService.bloodgroup}" />
</td></tr>
<tr><td colspan="2" align="right">
<h:commandButton id="btnServiceSearch" value="Search" action="#{inputService.outputService}" styleClass="submitButton" >
<f:ajax execute="@form" render="tbl"></f:ajax>
</h:commandButton> </td> </tr>
</h:form>
所有bean都在应用程序上下文中定义:
答案 0 :(得分:1)
当我查看你的代码时,我发现了一行
@Autowired
AdvancSearchDaoImpl Dao;
这意味着您正在使用JSF + Spring构建应用程序。现在,您需要了解当您使用两个框架时,我们必须处理两个框架的范围(因为我确定Spring + JSF)。现在,在您的情况下,JSF请求范围不起作用,因为您的bean是由Spring捕获。因为Spring默认是Singleton范围,所以它仍然存在于容器中。现在,你需要在spring上下文中设置范围。你可以通过在你的bean上添加注释来做到这一点
@RequestScoped
或者通过在spring上下文中创建条目并在那里设置范围。Here you can find a brief tutorial about setting spring scopes