代碼貼士
獲取request范圍內(nèi)allsublist屬性存儲的List集合對象,賦值給變量allsublist。
判斷allsublist變量引用的List集合對象是否存在或大小是否為0。
遍歷allsublist變量引用的List集合對象。
遍歷當(dāng)前從allsublist變量引用的List集合對象中遍歷出的對象。
如果當(dāng)前元素為第一個元素,執(zhí)行if標(biāo)簽體中的內(nèi)容,該標(biāo)簽體內(nèi)的代碼用來輸出信息類別。
以超鏈接形式顯示信息標(biāo)題,該超鏈接請求的路徑為Info/work/info_SingleShow.action,根據(jù)在Struts 2.0配置文件中的配置,將調(diào)用InfoAction類中的SingleShow()方法處理請求。
如果當(dāng)前元素為最后一個元素,則執(zhí)行if標(biāo)簽體中的內(nèi)容,該標(biāo)簽體內(nèi)的代碼用來輸出“更多”超鏈接。
該超鏈接請求的路徑為Info/work/info_ListShow.action,根據(jù)在Struts 2.0配置文件中的配置,將調(diào)用InfoAction類中的ListShow ()方法處理請求。
在首頁中列表顯示免費(fèi)信息的運(yùn)行效果如圖1.32所示。
2.列表顯示某類別中所有信息的實現(xiàn)過程
當(dāng)用戶單擊導(dǎo)航菜單中的類別時,將會列表顯示該類別中的所有信息,其實現(xiàn)與首頁付費(fèi)信息顯示技術(shù)是相同的。下面介紹列表顯示某類別中所有信息的實現(xiàn)過程。
(1)創(chuàng)建處理用戶請求的Action類:InfoAction。在該類中創(chuàng)建ListShow()方法來處理列表顯示某類別中所有信息的請求。代碼如下:
例程33 代碼位置:光盤\TM\01\src\com\yxq\action\InfoAction.java
package com.yxq.action;
import java.util.List;
import com.yxq.actionSuper.InfoSuperAction;
import com.yxq.dao.OpDB;
import com.yxq.model.CreatePage;
public class InfoAction extends InfoSuperAction {
public String ListShow(){ //處理列表顯示某類別中所有信息的請求
request.setAttribute("mainPage","/pages/show/listshow.jsp"); //設(shè)置在內(nèi)容顯示區(qū)中顯示的頁面
String infoType=request.getParameter("infoType"); //獲取信息類別
Object[] params={infoType};
OpDB myOp=new OpDB(); //創(chuàng)建一個業(yè)務(wù)處理對象
/* 獲取所有的付費(fèi)信息 */
String sqlPayfor="SELECT * FROM tb_info WHERE (info_type = ?) AND (info_state='1') AND (info_payfor = '1') ORDER BY info_date DESC"; //查詢某類別中所有付費(fèi)信息的SQL語句
List onepayforlist=myOp.OpListShow(sqlPayfor, params); //獲取所有付費(fèi)信息
request.setAttribute("onepayforlist",onepayforlist); //保存onepayforlist對象
/* 獲取當(dāng)前頁要顯示的免費(fèi)信息 */
String sqlFreeAll="SELECT * FROM tb_info WHERE (info_type = ?) AND (info_state='1') AND (info_payfor = '0') ORDER BY info_date DESC"; //查詢某類別中所有免費(fèi)信息的SQL語句
String sqlFreeSub=""; //查詢某類別中某一頁的SQL語句
int perR=3; //每頁顯示3條記錄
String strCurrentP=request.getParameter("showpage"); //獲取請求中傳遞的當(dāng)前頁碼
String gowhich="Info/work/info_ListShow.action?infoType="+infoType; //設(shè)置分頁超鏈接請求的資源
CreatePage createPage=myOp.OpCreatePage(sqlFreeAll, params,perR,strCurrentP,gowhich); //調(diào)用OpDB類中的OpCreatePage()方法計算出總記錄數(shù)、總頁數(shù),并且設(shè)置當(dāng)前頁碼,這些信息都封裝到createPage對象中
int top1=createPage.getPerR(); //獲取每頁顯示記錄數(shù)
int currentP=createPage.getCurrentP(); //獲取當(dāng)前頁碼
if(currentP==1){ //設(shè)置顯示第1頁信息的SQL語句
sqlFreeSub="SELECT TOP "+top1+" * FROM tb_info WHERE (info_type = ?) AND (info_state = '1') AND (info_payfor = '0') ORDER BY info_date DESC";
}
else{ //設(shè)置顯示除第1頁外其他指定頁信息的SQL
語句
int top2=(currentP-1)*top1;
sqlFreeSub="SELECT TOP "+top1+" * FROM tb_info i WHERE (info_type = ?) AND (info_state = '1') AND (info_payfor = '0') AND (info_date < (SELECT MIN(info_date) FROM (SELECT TOP "+top2+" (info_date) FROM tb_info WHERE (info_type = i.info_type) AND (info_state = '1') AND (info_payfor = '0') ORDER BY info_date DESC) AS mindate)) ORDER BY info_date DESC";
}
List onefreelist=myOp.OpListShow(sqlFreeSub, params); //獲取當(dāng)前頁要顯示的免費(fèi)信息
request.setAttribute("onefreelist",onefreelist); //保存onefreelist對象
request.setAttribute("createPage", createPage); //保存封裝了分頁信息的JavaBean對象
return SUCCESS;
}
}
InfoAction類繼承自定義類InfoSuperAction,InfoSuperAction類繼承MySuperAction類(在1.7.4節(jié)將介紹InfoSuperAction類)。在InfoAction類中并沒有實現(xiàn)execute()方法來處理請求,而是創(chuàng)建了ListShow()方法來處理列表顯示某類別中所有信息的請求,這種改變調(diào)用默認(rèn)方法的功能,與Struts之前版本中的org.apache.struts.actions.DispatchAction類實現(xiàn)的功能有些類似。改變Struts 2.0中這種默認(rèn)方法的調(diào)用可通過兩種方法實現(xiàn):
通過<action>元素的method屬性指定要調(diào)用的方法。
在請求Action時,在Action名字后加入“!xxx”,其中xxx表示要調(diào)用的方法名。
下面分別該兩種方法進(jìn)行介紹。
若存在一個Action類——LogXAction,該類中存在login()和logout方法()。代碼如下:
package com.action;
import com.opensymphony.xwork2.ActionSupport;
public class LogXAction extends ActionSupport{
public String login(){
System.out.println("用戶登錄");
return SUCCESS;
}
public String logout(){
System.out.println("成功注銷");
return SUCCESS;
}
}
在JSP頁面中提供“登錄”和“注銷”兩個超鏈接,當(dāng)用戶單擊“登錄”超鏈接時,調(diào)用LogXAction類,并執(zhí)行l(wèi)ogin()方法;當(dāng)單擊“注銷”超鏈接時,調(diào)用LogXAction類,并執(zhí)行l(wèi)ogout()方法。
先來介紹第一種方法的實現(xiàn):通過struts.xml文件中<action>元素的method屬性指定調(diào)用的方法。
在struts.xml文件中進(jìn)行如下配置:
<struts>
<package name="logX" extends="struts-default">
<!-- 用戶登錄配置 -->
<action name="in" class="com.action.LogXAction" method="login">
<result>/login.jsp</result>
</action>
<!-- 用戶注銷配置 -->
<action name="out" class="com.action.LogXAction" method="logout">
<result>/logout.jsp</result>
</action>
</package>
</struts>
在JSP頁面中實現(xiàn)“登錄”與“注銷”超鏈接的代碼如下:
<a href="in.action">登錄</a>
<a href="out.action">注銷</a>
完成如上編碼后,單擊“登錄”超鏈接,將在控制臺中輸出“用戶登錄”,單擊“注銷”超鏈接將輸出“成功注銷”。
在上面struts.xml文件的配置中,可以通過一個<action>元素來配置“登錄”與“注銷”兩個請求。實現(xiàn)代碼如下:
<package name="logX" extends="struts-default">
<action name="user_*" class="com.action.LogXAction" method="{1}">
<result>/{1}.jsp</result>
</action>
</package>
代碼中<action>元素的name屬性值為“user_*”,其中“*”表示可取任意值,其中的“{1}”占位符將被賦值為“*”部分的內(nèi)容。
更改JSP頁面中“登錄”與“注銷”超鏈接代碼:
<a href="user_login.action">登錄</a>
<a href="user_logout.action">注銷</a>
在經(jīng)過上述編碼后,單擊“登錄”超鏈接將調(diào)用login()方法,單擊“注銷”超鏈接將調(diào)用logout()方法。
下面介紹第二種方法的實現(xiàn):在請求Action時,在Action名字后加入“!xxx”。
首先在struts.xml配置文件中進(jìn)行如下配置:
<package name="logX" extends="struts-default">
<action name="logInOut" class="com.action.LogXAction">
<result>/message.jsp</result>
</action>
</package>
更改JSP頁面中“登錄”與“注銷”超鏈接代碼:
<a href="logInOut!login.action">登錄</a>
<a href="logInOut!logout.action">注銷</a>
在經(jīng)過上述編碼后,單擊“登錄”超鏈接將調(diào)用login()方法,單擊“注銷”超鏈接將調(diào)用logout()方法。
(2)配置cityinfo.xml配置文件。
例程34 代碼位置:光盤\TM\01\WEB-INF\classes\cityinfo.xml
<!-- 前臺信息處理 -->
<action name="info_*" class="com.yxq.action.InfoAction" method="{1}">
<result>/view/IndexTemp.jsp</result>
<result name="input">/view/IndexTemp.jsp</result> <!-- 指定進(jìn)行信息發(fā)布時,表單驗證失敗后返回的頁面 -->
</action>
上述的配置,是針對單擊導(dǎo)航菜單中的超鏈接所觸發(fā)的請求的配置。在view目錄下的top.jsp頁面中實現(xiàn)的導(dǎo)航菜單的代碼如下:
例程35 代碼位置:光盤\TM\01\view\top.jsp
<s2:set name="types" value="#session.typeMap"/>
<s2:iterator status="typesStatus" value="types">
<td>
<a href="info_ListShow.action?infoType=<s2:property value='key'/>" style="color:white">
<s2:property value="value"/>
</a>
</td>
</s2:iterator>