我正在使用Spring JSF集成做项目我@RequestScope具有某些属性的 bean,在表单(搜索应用程序)中填充后,我的相同 bean 的列表属性从 db 值填充并使用数据表在同一页面上查看(ajax 应用于提交/搜索按钮)。我第一次搜索时得到的结果很好,但问题是当我在另一个浏览器页面中刷新或打开页面时,数据表仍然包含初始请求的数据也从其他页面导航并返回同一页面仍然显示初始请求页面/数据,就好像 requestscope 不起作用而不是会话范围。我正在使用 Spring 来管理 Bean 及其创建,并使用 JSF 来管理前端页面。这可能是面部和弹簧注释混合的问题,如果是这样,这里的解决方案是什么?因为我也通过自动连接其他 bean 来使用 DAO 方法。例如
@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 都是在应用程序上下文中定义的:
当我查看您的代码时,我发现了一行
@Autowired
AdvancSearchDaoImpl Dao;
这意味着您正在使用JSF + Spring构建应用程序。现在,您需要了解,当您使用两个框架时,我们必须处理两个框架的范围(正如我确定 Spring+JSF 一样)。现在,在您的情况下,JSF 请求范围不起作用,因为您的 bean 也被 Spring 捕获了。由于 Spring 默认是单例范围,因此它仍然存在于容器中。现在,您还需要在 弹簧上下文 中设置范围 .您可以通过在 Bean
上添加注释来做到这一点
@RequestScoped
或者通过在 spring 上下文中进行输入并在那里设置范围。在这里,您可以找到有关设置弹簧示波器的简短教程