JSF 2.2 ViewSopoped bean ведет себя так, как если бы он был SessionScoped bean в WebSphere Portal - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю над проектом, который использует JSF 2.2 в среде "WebSphere Portal".

У меня странное поведение с компонентами ViewScoped.

Предположим, у меня две страницы вмой портал, один с именем "A", а другой с именем "B".

На моей странице "A" есть портлет с экраном со списком элементов подкачки Ajax.Предположим, я щелкаю, чтобы перейти на страницу 2 в этом списке элементов и перехожу на страницу «B» на портале.

Ожидаемое поведение компонента ViewScoped состоит в том, что при выходе из страницы компонент уничтожается.и когда мы возвращаем компонент, он создается, перезапуская все данные, то есть теряя состояние.

Однако, когда я снова перехожу на страницу «А», текущая страница пагинации экрана портлета имеет вид2, то есть сохранил состояние, даже если я перешел на другую страницу.

WebSphere Portal 9.0

JSF 2.2

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"
         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-app_3_0.xsd">

    <display-name>GSRE-GestaoUsuarios-Portlet</display-name>

    <context-param>
        <description>
            Load JSF runtime when the application server starts up. If this parameter is set to false or removed,
            JSF runtime will be loaded and initialized when the first JSF request is processed.
            This may disable custom JSF extensions, such as factories defined in the project.</description>
        <param-name>com.ibm.ws.jsf.LOAD_FACES_CONFIG_AT_STARTUP</param-name>
        <param-value>true</param-value>
    </context-param>

    <listener>
        <listener-class>com.ibm.faces20.portlet.httpbridge.PortletRequestAttributesListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <enabled>true</enabled>
        <async-supported>false</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>

</web-app>

face-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" 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">
  <application>
    <view-handler>com.ibm.faces20.portlet.FaceletPortletViewHandler</view-handler>
    <el-resolver>com.ibm.faces20.portlet.PortletELResolver</el-resolver>
    <resource-handler>com.ibm.faces20.portlet.httpbridge.PortletResourceHandler</resource-handler>
  </application>
  <component>
    <component-type>com.ibm.faces20.portlet.component.PortletActionURL</component-type>
    <component-class>com.ibm.faces20.portlet.component.PortletActionURL</component-class>
  </component>
  <component>
    <component-type>com.ibm.faces20.portlet.component.PortletResourceURL</component-type>
    <component-class>com.ibm.faces20.portlet.component.PortletResourceURL</component-class>
  </component>
  <component>
    <component-type>com.ibm.faces20.portlet.component.PortletRenderURL</component-type>
    <component-class>com.ibm.faces20.portlet.component.PortletRenderURL</component-class>
  </component>
  <component>
    <component-type>com.ibm.faces20.portlet.component.PortletParam</component-type>
    <component-class>com.ibm.faces20.portlet.component.PortletParam</component-class>
  </component>
  <component>
    <component-type>com.ibm.faces20.portlet.component.PortletProperty</component-type>
    <component-class>com.ibm.faces20.portlet.component.PortletProperty</component-class>
  </component>
  <component>
    <component-type>com.ibm.faces20.portlet.component.PortletNameSpace</component-type>
    <component-class>com.ibm.faces20.portlet.component.PortletNameSpace</component-class>
  </component>
  <render-kit>
    <renderer>
      <component-family>javax.faces.Output</component-family>
      <renderer-type>com.ibm.faces20.portlet.tag.render.ActionURLTagRender</renderer-type>
      <renderer-class>com.ibm.faces20.portlet.tag.render.ActionURLTagRender</renderer-class>
    </renderer>
  </render-kit>
  <render-kit>
    <renderer>
      <component-family>javax.faces.Output</component-family>
      <renderer-type>com.ibm.faces20.portlet.tag.render.ResourceURLTagRender</renderer-type>
      <renderer-class>com.ibm.faces20.portlet.tag.render.ResourceURLTagRender</renderer-class>
    </renderer>
  </render-kit>
  <render-kit>
    <renderer>
      <component-family>javax.faces.Output</component-family>
      <renderer-type>com.ibm.faces20.portlet.tag.render.RenderURLTagRender</renderer-type>
      <renderer-class>com.ibm.faces20.portlet.tag.render.RenderURLTagRender</renderer-class>
    </renderer>
  </render-kit>
  <render-kit>
    <renderer>
      <component-family>javax.faces.Output</component-family>
      <renderer-type>com.ibm.faces20.portlet.tag.render.PortletNameSpaceTagRender</renderer-type>
      <renderer-class>com.ibm.faces20.portlet.tag.render.PortletNameSpaceTagRender</renderer-class>
    </renderer>
  </render-kit>
</faces-config>

Как заставить область видимости @ViewScope работать должным образом, то есть как обновление страницы, так и обновление браузера уничтожают и создают компонент.

...