正文

都市供求信息網(wǎng)(15)

JSP項目開發(fā)案例全程實錄(第2版) 作者:明日科技


代碼貼士

獲取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>


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號