大魚

          JSF中commandLink與dataTable搭配不能正常工作的解決辦法

          1.     環境

          Myfaces1.4 + tomahawk-1.1.3 + tomcat5.x + JDK5

          下載:http://myfaces.apache.org

          2.     問題描述

          假設場景,首先顯示用戶列表(用dataTable來實現列表顯示),然后可以點擊用戶的名字導航到用戶詳細信息頁面。

          3.     嘗試實現以及出現的問題

          UserInfo.java

          package com.wide.jsf.model;

           

          /**

           * 用戶信息

           *

           * @author cydooo

           *

           */

          public class UserInfo {

              private Long userId;

              private String username;

              private String userdesc;

              public UserInfo() {

              }

              public UserInfo(Long userId, String username) {

                  this.userId = userId;

                  this.username = username;

              }

              public UserInfo(Long userId, String username, String userdesc) {

                  this(userId, username);

                  this.userdesc = userdesc;

              }

              //省略getter和setter

          }
           


          UserInfoAction.java

          package com.wide.jsf.web;

           

          import java.util.Arrays;

          import java.util.List;

           

          import javax.faces.context.FacesContext;

           

          import com.wide.jsf.model.UserInfo;

           

          public class UserInfoAction {

           

              /*

               * 用于顯示詳細信息

               */

              private UserInfo userInfo;

           

              /*

               * 用于顯示用戶列表

               */

              private List<UserInfo> userInfos;

           

              public UserInfo getUserInfo() {

                 return userInfo;

              }

           

              public void setUserInfo(UserInfo userInfo) {

                 this.userInfo = userInfo;

              }

           

              public List<UserInfo> getUserInfos() {

                 return userInfos;

              }

           

              public void setUserInfos(List<UserInfo> userInfos) {

                 this.userInfos = userInfos;

              }

           

              public String listUser() {

                 userInfos = Arrays.asList(new UserInfo[] { new UserInfo(1L, "Tom"),new UserInfo(2L, "John"), new UserInfo(3L, "Lily") });

                   return "listUser";

              }

           

              public String showDetail() {

                 FacesContext context = FacesContext.getCurrentInstance();

                 Long userId = Long.parseLong((String) context.getExternalContext()

                        .getRequestParameterMap().get("userId"));

                 System.out.println("==>" + userId);

                 switch (userId.intValue()) {

                 case 1:

                     userInfo = new UserInfo(1L, "Tom", "I am Tom");

                     break;

                 case 2:

                     userInfo = new UserInfo(2L, "John", "I am John");

                     break;

                 case 3:

                     userInfo = new UserInfo(3L, "Lily", "I am Lily");

                 }

                 return "userdetail";

              }

          }
           


          Backingbean和navigation的配置

          <managed-bean>

                 <managed-bean-name>userInfoAction</managed-bean-name>

                 <managed-bean-class>

                     com.wide.jsf.web.UserInfoAction

                 </managed-bean-class>

                 <managed-bean-scope>request</managed-bean-scope>

              </managed-bean>

              <navigation-rule>

                 <from-view-id>/listUser.jsp</from-view-id>

                 <navigation-case>

                     <from-outcome>userdetail</from-outcome>

                     <to-view-id>/userdetail.jsp</to-view-id>

                 </navigation-case>

              </navigation-rule>

              <navigation-rule>

                 <from-view-id>/userdetail.jsp</from-view-id>

              </navigation-rule>
           


          Jsp頁面內容

          A. listUser.jsp

          <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

          <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

          <%@ page contentType="text/html; UTF-8" pageEncoding="UTF-8"%>

           

          <f:view>

          <html>

            <head>

              <title>userlist</title>

            </head>

           

            <body>

              <h:form>

                 <h:dataTable var="user" value="#{userInfoAction.userInfos}">

                     <h:column>

                        <h:commandLink value="#{user.username}" action="#{userInfoAction.showDetail}">

                            <f:param value="#{user.userId}" name="userId"/>

                        </h:commandLink>

                     </h:column>

                 </h:dataTable>

              </h:form>

            </body>

          </html>

          </f:view>
           


          B. userdetail.jsp

          <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

          <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

          <%@ page contentType="text/html; UTF-8" pageEncoding="UTF-8"%>

           

          <f:view>

          <html>

            <head>

              <title>userDetail</title>

            </head>

           

            <body>

              <h:form>

              <h:outputText value="#{userInfoAction.userInfo.userdesc}"/>

              </h:form>

            </body>

          </html>

          </f:view>
           


          編碼結束,啟動tomcat測試,進入userlist頁面之后,我們可以看到用戶列表,但點擊用戶查看詳細信息的時候,發現并沒有調用showDetail方法。

          4.     解決辦法

          A.                        將<managed-bean-scope>request</managed-bean-scope>改為<managed-bean-scope>session</managed-bean-scope>。這是最簡單的做法,改了之后重起Tomcat之后馬上就看到效果了。但是很明顯的使用session scope不好,比如這個例子,用戶列表在當前seesion有效的情況下將一直保留,多窗口瀏覽器中也容易發生意想不到的問題。沒有必要不要用session。

          B.                        將用戶列表綁定到dataTable控件。

          首先修改UserInfo類,讓他實現Serializable接口,其他代碼完全一樣,實現Serializable接口是必須的,否則會拋出java.io.NotSerializableException異常。

          public class UserInfo implements Serializable{…}
           


          UserInfoAction.java的修改

          package com.wide.jsf.web;

           

          import java.util.Arrays;

          import java.util.List;

           

          import javax.faces.component.html.HtmlDataTable;

          import javax.faces.context.FacesContext;

           

          import com.wide.jsf.model.UserInfo;

           

          public class UserInfoAction {

           

              /*

               * 用于顯示詳細信息

               */

              private UserInfo userInfo;

           

              /*

               * 綁定用戶列表

               */

              private HtmlDataTable dataTable = new HtmlDataTable();

             

              public UserInfo getUserInfo() {

                 return userInfo;

              }

           

              public void setUserInfo(UserInfo userInfo) {

                 this.userInfo = userInfo;

              }

           

              public String listUser() {

                 List<UserInfo> userInfos = Arrays.asList(new UserInfo[] { new UserInfo(1L, "Tom"),

                        new UserInfo(2L, "John"), new UserInfo(3L, "Lily") });

                 dataTable.setValue(userInfos);

                 return "listUser";

              }

           

              public String showDetail() {

                 FacesContext context = FacesContext.getCurrentInstance();

                 Long userId = Long.parseLong((String) context.getExternalContext()

                        .getRequestParameterMap().get("userId"));

                 System.out.println("==>" + userId);

                 switch (userId.intValue()) {

                 case 1:

                     userInfo = new UserInfo(1L, "Tom", "I am Tom");

                     break;

                 case 2:

                     userInfo = new UserInfo(2L, "John", "I am John");

                     break;

                 case 3:

                     userInfo = new UserInfo(3L, "Lily", "I am Lily");

                 }

                 return "userdetail";

              }

           

              public HtmlDataTable getDataTable() {

                 return dataTable;

              }

           

              public void setDataTable(HtmlDataTable dataTable) {

                 this.dataTable = dataTable;

              }

          }
           


          listUser.jsp的修改

          <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

          <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

          <%@ page contentType="text/html; UTF-8" pageEncoding="UTF-8"%>

           

          <f:view>

          <html>

            <head>

              <title>userlist</title>

            </head>

           

            <body>

              <h:form>

                 <h:dataTable var="user" binding="#{userInfoAction.dataTable}">

                     <h:column>

                        <h:commandLink value="#{user.username}" action="#{userInfoAction.showDetail}">

                            <f:param value="#{user.userId}" name="userId"/>

                        </h:commandLink>

                     </h:column>

                 </h:dataTable>

              </h:form>

            </body>

          </html>

          </f:view>
           


          重起Tomcat一切OK,不需要非得在session scope下了。

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/pengrg166/archive/2007/01/22/1490174.aspx

          posted on 2009-10-15 14:28 大魚 閱讀(602) 評論(0)  編輯  收藏 所屬分類: JSF

          主站蜘蛛池模板: 白沙| 璧山县| 清镇市| 南部县| 冀州市| 公主岭市| 宿迁市| 酉阳| 蒙城县| 会理县| 丰镇市| 远安县| 永昌县| 平阴县| 江西省| 宁远县| 若尔盖县| 嵊泗县| 来凤县| 屏山县| 文山县| 江津市| 松阳县| 同仁县| 白银市| 于田县| 阳山县| 山东省| 正定县| 镇雄县| 铜陵市| 澜沧| 新化县| 忻州市| 丹江口市| 阳城县| 黎川县| 广安市| 错那县| 静安区| 宁远县|