2013-04-14 2 views
1

Я использую JSF 2.0 в простом приложении. У меня есть три фасоли, которые являются логином в области запроса, в то время как другие 2 в области видимости. Я настроил в faces-config.xml.Проблема в приложении JSF 2.0

<faces-config 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 
<navigation-rule> 
     <from-view-id>*</from-view-id> 
     <navigation-case> 
      <from-outcome>loginSuccess</from-outcome> 
      <to-view-id>/pages/ReportSubmit.jsp</to-view-id> 
     </navigation-case> 
     <navigation-case> 
      <from-outcome>reportStatus</from-outcome> 
      <to-view-id>/pages/ReportStatus.jsp</to-view-id> 
     </navigation-case> 
     <navigation-case> 
      <from-outcome>logout</from-outcome> 
      <to-view-id>/pages/logout.jsp</to-view-id> 
     </navigation-case> 
    </navigation-rule> 
    <managed-bean> 
     <managed-bean-name>UserBean</managed-bean-name> 
     <managed-bean-class>com.cognizant.reportgen.LoginBean</managed-bean-class> 
     <managed-bean-scope>request</managed-bean-scope> 
    </managed-bean> 

    <managed-bean> 
     <managed-bean-name>ReportBean</managed-bean-name> 
     <managed-bean-class>com.cognizant.reportgen.ReportGeneratorBean</managed-bean-class> 
     <managed-bean-scope>view</managed-bean-scope> 
    </managed-bean> 

    <managed-bean> 
     <managed-bean-name>ReportStatus</managed-bean-name> 
     <managed-bean-class>com.cognizant.reportgen.ReportStatusBean</managed-bean-class> 
     <managed-bean-scope>view</managed-bean-scope> 
    </managed-bean> 

</faces-config> 

У меня есть menu.jsp, который имеет под кодом

menu item1 <h:commandLink action="loginSuccess" value="Generate Reports"></h:commandLink> 
menu item 2<h:commandLink action="reportStatus" value="Report Status"></h:commandLink> 

В 2 фасолью, у меня есть методы, чьи возвращаемый тип является ничтожным.

Входящий запрос, я создаю сеанс и устанавливаю детали пользователя в атрибуте session.

Теперь Проблема, с которой я столкнулся в том, что

  1. я Войти с user1, выберите пункт меню 1, поэтому соответствующие данные отображаются.

  2. Я вхожу в систему с user2 в следующем окне браузера, выберите пункт меню 1, чтобы отобразить соответствующие данные.

  3. Вернусь в окно браузера 1 (user1), снова выберите пункт меню 1, но теперь в заголовке отображается имя user2. Также он отображает данные, соответствующие user2.

Пожалуйста, помогите мне с этой проблемой.

//ReportStatusBean.java 
public class ReportStatusBean { 
    private List<ReportAttrDO> reportList; 
    private HtmlDataTable reportStatusTable; 
    // getters and setter for above included.... 
    public void checkReportStatus(ActionEvent event) { 

     ReportGenService reportGenObj = new ReportGenServiceImpl(); 
     HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false); 
     UserDetail user = (UserDetail)session.getAttribute("user"); 
     List<ReportAttrDO> reportList = reportGenObj.getReportStatusList(user.getUserId()); 
     setReportList(reportList); 
     if(reportList.isEmpty()) 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No Records to display.", null)); 
    } 

    public void viewReport(ActionEvent event) { 
     ReportAttrDO reportAttrDO = (ReportAttrDO)getReportStatusTable().getRowData(); 
     System.out.println(reportAttrDO.getRequestHeaderId()); 
    } 

} 

// ReportStatus.jsp 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> 
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> 
<f:view> 
<html> 
<head> 
....some script functions.. 
</head> 
<body onload="noBack();" onpageshow="if (event.persisted) noBack();" onunload=""> 

<center> 
    <div class="wrapper"> 
    <%@include file="../include/pageheader.jsp"%> 
    <%@include file="../include/menu.jsp"%> 
    <h:form id="form2"> 
    <table border="0"> 
    <tr> 
      <td colspan="2"><h:messages style="color:red;margin:8px;" /></td> 
     </tr> 
     <tr> 
      <td colspan="2"><h:commandButton value="Check Status" actionListener="#{ReportStatus.checkReportStatus}" /></td> 
     </tr> 
    </table> 
       <c:if test="${not empty ReportStatus.reportList}" > 
       <div style="height:200px;width:600px;overflow:auto;"> 

       <h:dataTable id="table" border="1" 
        var="row" value="#{ReportStatus.reportList}" cellpadding="5" cellspacing="5" 
        binding="#{ReportStatus.reportStatusTable}"> 

        <h:column> 
         <f:facet name="header"> 
          <f:verbatim> 
           <h:outputText value="Application Name" /> 
          </f:verbatim> 
         </f:facet> 
         <h:outputText id="applName" value="#{row.applicationName}" ></h:outputText> 

        </h:column> 
        <h:column> 
         <f:facet name="header"> 
          <f:verbatim> 
           <h:outputText value="Report Name" /> 
          </f:verbatim> 
         </f:facet> 
         <h:outputText id="reportReqName" value="#{row.reportRequestName}"></h:outputText> 
        </h:column> 
        <h:column> 
         <f:facet name="header"> 
          <f:verbatim> 
           <h:outputText value="Generated Report" /> 
          </f:verbatim> 
         </f:facet> 
         <h:commandLink id="viewReport" value="View" rendered="#{row.status == 'Completed'}" actionListener="#{ReportStatus.viewReport}"></h:commandLink> 
        </h:column> 
       </h:dataTable> 
       </div> 
       </c:if> 
    </h:form> 
    </div> 
</center> 
</body> 
</html> 
</f:view> 

ответ

1

HTTP-сессия разделяется между вкладками браузера, поэтому то, что вы испытываете, является ожидаемым поведением. Когда вы вошли в систему на следующей вкладке, вы, скорее всего, заменили существующий атрибут сеанса.

Вы также можете попробовать его в разных браузерах, но не на разных вкладках одного и того же браузера, чтобы увидеть, как он работает, поскольку вы ожидаете его работы. В конце сеанс является на пользователя и должен рассматриваться как таковой. Вы должны определить правильные области для ваших компонентов, чтобы приложение запускалось в соответствии с вашими ожиданиями и для хорошего пользовательского опыта.

Не связанная с вашей конкретной проблемой использование командных ссылок, использующих запросы POST для простой навигации по страницам, считается плохой практикой: вместо этого вы должны использовать <h:link>. Подробнее см. Третью ссылку ниже.

Кроме того, использование faces-config.xml для настройки правил навигации и объявления управляемых компонентов в приложении JSF 2.0, на мой взгляд, несколько старой школы.Последнее, но не менее важное, JSP - это устаревшая технология просмотра, которая была заменена фишками, поэтому следует тщательно пересмотреть разработку нового приложения с использованием JSP как технологии просмотра.

Смотрите также:

  1. How to choose the right bean scope?;
  2. Communication in JSF 2.0, section on bean scopes;
  3. When should I use h:outputLink instead of h:commandLink?.
+2

Похоже, что кто-то читал много ответов от BalusC и пытался подражать его стилю :) –

+0

Кстати, проблема не в определении области управляемого компонента, находится в этих двух строках: ' HttpSession session = (HttpSession) FacesContext.getCurrentInstance(). GetExternalContext(). GetSession (false); UserDetail user = (UserDetail) session.getAttribute («user»); '(и затем приходит объяснение, которое вы даете о работе с сеансом) –

+0

Еще одна вещь, в которой OP использует JSTL среди кода JSF 2, вы также можете добавить [JSTL в JSF2 Facelets ... имеет смысл?] (Http://stackoverflow.com/q/3342984/1065197) вопрос на ваш * См. Также * список. –

0

Вы должны сделать ваше меню conditionnaly вашего сеанса пользователя, а не ваш результат входа в систему, например:

<h:form> 
    <h:panelGroup rendered="#{not userbean.isLogged}"> 
     <h:inputText value="#{userBean.username}" /> 
     <h:inputText value="#{userBean.password}" /> 
     <h:commandButton actionListener="#{userBean.login}" /> 
    </h:panelGroup> 

    <h:panelGroup rendered="#{userBean.isLogged}"> 
     <h:commandLink rendered="#{userBean.user eq "user1"}" action="loginSuccess" value="Generate Reports"></h:commandLink> 
     <h:commandLink rendered="#{userBean.user eq "user2"}" action="reportStatus" value="Report Status"></h:commandLink> 
    </h:panelGroup> 
</h:form> 

Конечно, это потребует некоторой функции внутри UserBean, чтобы получить имя пользователя, например.

Также вы имеете в виду, что вы настроили свой боб с помощью ViewScoped, все они RequestScoped в коде при условии.

Я предлагаю вам использовать расширения имени файла .xhtml, который является стандартом в представлениях JavaServer Faces.

+0

Привет, я редактировал свое сообщение, на самом деле это только просмотр, по ошибке я написал запрос. Также см. Пункт номер 3. – Soheb

+0

Можете ли вы опубликовать код представления при отображении информации о пользователях? –

+0

Я добавил bean-компонент и jsp – Soheb