大魚

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

          1.     環(huán)境

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

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

          2.     問題描述

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

          3.     嘗試實現(xiàn)以及出現(xiàn)的問題

          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頁面內(nèi)容

          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>
           


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

          4.     解決辦法

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

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

          首先修改UserInfo類,讓他實現(xiàn)Serializable接口,其他代碼完全一樣,實現(xiàn)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博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/pengrg166/archive/2007/01/22/1490174.aspx

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

          主站蜘蛛池模板: 民乐县| 斗六市| 保定市| 措勤县| 突泉县| 游戏| 西乡县| 高密市| 嘉黎县| 临江市| 宁国市| 沐川县| 永寿县| 泾阳县| 洛浦县| 敦煌市| 巩留县| 舟山市| 吴川市| 永丰县| 漾濞| 通渭县| 陆川县| 海阳市| 五寨县| 浦北县| 神农架林区| 宝坻区| 高州市| 鄂托克旗| 华池县| 东至县| 广汉市| 保德县| 松阳县| 奉新县| 武宁县| 顺昌县| 台前县| 云南省| 肇源县|