正文

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

JSP項(xiàng)目開(kāi)發(fā)案例全程實(shí)錄(第2版) 作者:明日科技


代碼貼士

獲取request范圍內(nèi)allsublist屬性存儲(chǔ)的List集合對(duì)象,賦值給變量allsublist。

判斷allsublist變量引用的List集合對(duì)象是否存在或大小是否為0。

遍歷allsublist變量引用的List集合對(duì)象。

遍歷當(dāng)前從allsublist變量引用的List集合對(duì)象中遍歷出的對(duì)象。

如果當(dāng)前元素為第一個(gè)元素,執(zhí)行if標(biāo)簽體中的內(nèi)容,該標(biāo)簽體內(nèi)的代碼用來(lái)輸出信息類別。

以超鏈接形式顯示信息標(biāo)題,該超鏈接請(qǐng)求的路徑為Info/work/info_SingleShow.action,根據(jù)在Struts 2.0配置文件中的配置,將調(diào)用InfoAction類中的SingleShow()方法處理請(qǐng)求。

如果當(dāng)前元素為最后一個(gè)元素,則執(zhí)行if標(biāo)簽體中的內(nèi)容,該標(biāo)簽體內(nèi)的代碼用來(lái)輸出“更多”超鏈接。

該超鏈接請(qǐng)求的路徑為Info/work/info_ListShow.action,根據(jù)在Struts 2.0配置文件中的配置,將調(diào)用InfoAction類中的ListShow ()方法處理請(qǐng)求。

在首頁(yè)中列表顯示免費(fèi)信息的運(yùn)行效果如圖1.32所示。

2.列表顯示某類別中所有信息的實(shí)現(xiàn)過(guò)程

當(dāng)用戶單擊導(dǎo)航菜單中的類別時(shí),將會(huì)列表顯示該類別中的所有信息,其實(shí)現(xiàn)與首頁(yè)付費(fèi)信息顯示技術(shù)是相同的。下面介紹列表顯示某類別中所有信息的實(shí)現(xiàn)過(guò)程。

(1)創(chuàng)建處理用戶請(qǐng)求的Action類:InfoAction。在該類中創(chuàng)建ListShow()方法來(lái)處理列表顯示某類別中所有信息的請(qǐng)求。代碼如下:

例程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(){ //處理列表顯示某類別中所有信息的請(qǐng)求

request.setAttribute("mainPage","/pages/show/listshow.jsp"); //設(shè)置在內(nèi)容顯示區(qū)中顯示的頁(yè)面

String infoType=request.getParameter("infoType"); //獲取信息類別

Object[] params={infoType};

OpDB myOp=new OpDB(); //創(chuàng)建一個(gè)業(yè)務(wù)處理對(duì)象

/* 獲取所有的付費(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語(yǔ)句

List onepayforlist=myOp.OpListShow(sqlPayfor, params); //獲取所有付費(fèi)信息

request.setAttribute("onepayforlist",onepayforlist); //保存onepayforlist對(duì)象

/* 獲取當(dāng)前頁(yè)要顯示的免費(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語(yǔ)句

String sqlFreeSub=""; //查詢某類別中某一頁(yè)的SQL語(yǔ)句

int perR=3; //每頁(yè)顯示3條記錄

String strCurrentP=request.getParameter("showpage"); //獲取請(qǐng)求中傳遞的當(dāng)前頁(yè)碼

String gowhich="Info/work/info_ListShow.action?infoType="+infoType; //設(shè)置分頁(yè)超鏈接請(qǐng)求的資源

CreatePage createPage=myOp.OpCreatePage(sqlFreeAll, params,perR,strCurrentP,gowhich); //調(diào)用OpDB類中的OpCreatePage()方法計(jì)算出總記錄數(shù)、總頁(yè)數(shù),并且設(shè)置當(dāng)前頁(yè)碼,這些信息都封裝到createPage對(duì)象中

int top1=createPage.getPerR(); //獲取每頁(yè)顯示記錄數(shù)

int currentP=createPage.getCurrentP(); //獲取當(dāng)前頁(yè)碼

if(currentP==1){ //設(shè)置顯示第1頁(yè)信息的SQL語(yǔ)句

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頁(yè)外其他指定頁(yè)信息的SQL

語(yǔ)句

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)前頁(yè)要顯示的免費(fèi)信息

request.setAttribute("onefreelist",onefreelist); //保存onefreelist對(duì)象

request.setAttribute("createPage", createPage); //保存封裝了分頁(yè)信息的JavaBean對(duì)象

return SUCCESS;

}

}

InfoAction類繼承自定義類InfoSuperAction,InfoSuperAction類繼承MySuperAction類(在1.7.4節(jié)將介紹InfoSuperAction類)。在InfoAction類中并沒(méi)有實(shí)現(xiàn)execute()方法來(lái)處理請(qǐng)求,而是創(chuàng)建了ListShow()方法來(lái)處理列表顯示某類別中所有信息的請(qǐng)求,這種改變調(diào)用默認(rèn)方法的功能,與Struts之前版本中的org.apache.struts.actions.DispatchAction類實(shí)現(xiàn)的功能有些類似。改變Struts 2.0中這種默認(rèn)方法的調(diào)用可通過(guò)兩種方法實(shí)現(xiàn):

通過(guò)<action>元素的method屬性指定要調(diào)用的方法。

在請(qǐng)求Action時(shí),在Action名字后加入“!xxx”,其中xxx表示要調(diào)用的方法名。

下面分別該兩種方法進(jìn)行介紹。

若存在一個(gè)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頁(yè)面中提供“登錄”和“注銷”兩個(gè)超鏈接,當(dāng)用戶單擊“登錄”超鏈接時(shí),調(diào)用LogXAction類,并執(zhí)行l(wèi)ogin()方法;當(dāng)單擊“注銷”超鏈接時(shí),調(diào)用LogXAction類,并執(zhí)行l(wèi)ogout()方法。

先來(lái)介紹第一種方法的實(shí)現(xiàn):通過(guò)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頁(yè)面中實(shí)現(xiàn)“登錄”與“注銷”超鏈接的代碼如下:

<a href="in.action">登錄</a>

<a href="out.action">注銷</a>

完成如上編碼后,單擊“登錄”超鏈接,將在控制臺(tái)中輸出“用戶登錄”,單擊“注銷”超鏈接將輸出“成功注銷”。

在上面struts.xml文件的配置中,可以通過(guò)一個(gè)<action>元素來(lái)配置“登錄”與“注銷”兩個(gè)請(qǐng)求。實(shí)現(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頁(yè)面中“登錄”與“注銷”超鏈接代碼:

<a href="user_login.action">登錄</a>

<a href="user_logout.action">注銷</a>

在經(jīng)過(guò)上述編碼后,單擊“登錄”超鏈接將調(diào)用login()方法,單擊“注銷”超鏈接將調(diào)用logout()方法。

下面介紹第二種方法的實(shí)現(xiàn):在請(qǐng)求Action時(shí),在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頁(yè)面中“登錄”與“注銷”超鏈接代碼:

<a href="logInOut!login.action">登錄</a>

<a href="logInOut!logout.action">注銷</a>

在經(jīng)過(guò)上述編碼后,單擊“登錄”超鏈接將調(diào)用login()方法,單擊“注銷”超鏈接將調(diào)用logout()方法。

(2)配置cityinfo.xml配置文件。

例程34 代碼位置:光盤\TM\01\WEB-INF\classes\cityinfo.xml

<!-- 前臺(tái)信息處理 -->

<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ā)布時(shí),表單驗(yàn)證失敗后返回的頁(yè)面 -->

</action>

上述的配置,是針對(duì)單擊導(dǎo)航菜單中的超鏈接所觸發(fā)的請(qǐng)求的配置。在view目錄下的top.jsp頁(yè)面中實(shí)現(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 ? 讀書(shū)網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)