0

我正在使用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 都在应用程序上下文中定义:

4

1 回答 1

1

当我查看您的代码时,我发现了一行

 @Autowired
 AdvancSearchDaoImpl Dao;

这意味着您正在使用 JSF + Spring 构建应用程序。现在,您需要了解,当您使用两个框架时,我们必须处理两个框架的范围(我确信 Spring + JSF)。现在,在您的情况下,JSF 请求范围不起作用,因为您的 bean 是也被 Spring 捕获。由于默认情况下 Spring 是 Singleton 范围,因此它仍然存在于容器中。现在,您还需要在 spring 上下文中设置范围。您可以通过在 bean 上添加注释来做到这一点

@RequestScoped

或者通过在 spring 上下文中输入并在那里设置范围。在这里您可以找到有关设置弹簧范围的简短教程

于 2013-02-25T07:45:22.817 回答