1.8 信息發(fā)布模塊設(shè)計(jì)
1.8.1 信息發(fā)布模塊概述
單擊頁(yè)面頂部的“發(fā)布信息”超鏈接,將進(jìn)入信息發(fā)布頁(yè)面。在該頁(yè)面中,用戶可從下拉列表中選擇一種信息類別(共包括11個(gè)信息類別:公寓信息、招聘信息、求職信息、培訓(xùn)信息、家教信息、房屋信息、車輛信息、求購(gòu)信息、出售信息、招商引資、尋找啟示),然后輸入其他信息,如圖1.38所示。
信息錄入完整后,單擊“發(fā)布”按鈕,即可發(fā)布信息。此時(shí),程序首先會(huì)驗(yàn)證用戶是否輸入了信息,若驗(yàn)證失敗,則返回信息發(fā)布頁(yè)面,進(jìn)行相應(yīng)提示;若驗(yàn)證成功,則會(huì)繼續(xù)驗(yàn)證輸入的聯(lián)系電話和E-mail格式是否正確,若該驗(yàn)證成功,則向數(shù)據(jù)庫(kù)中插入記錄,完成發(fā)布操作。信息發(fā)布成功后,返回給用戶信息的ID值。發(fā)布的信息還需要管理員進(jìn)行審核,只有審核成功的信息才能顯示在前臺(tái)頁(yè)面中。信息發(fā)布的流程如圖1.39所示。
1.8.2 信息發(fā)布技術(shù)分析
信息發(fā)布技術(shù)所要實(shí)現(xiàn)的是將用戶填寫的數(shù)據(jù)保存到數(shù)據(jù)表中。要實(shí)現(xiàn)這樣一個(gè)目的,首先要解決在Struts 2.0中如何獲取表單數(shù)據(jù)以及如何驗(yàn)證表單數(shù)據(jù)的問題。下面分別進(jìn)行介紹。
1.如何獲取表單數(shù)據(jù)
在Struts 2.0中不存在與表單對(duì)應(yīng)的ActionForm,而是直接在處理類中設(shè)置與表單字段相對(duì)應(yīng)的屬性,并為屬性創(chuàng)建setXXX()與getXXX()方法來(lái)獲取、返回表單數(shù)據(jù)。
下面以應(yīng)用Struts 2.0實(shí)現(xiàn)一個(gè)簡(jiǎn)單的用戶登錄為例介紹如何獲取表單數(shù)據(jù)。當(dāng)用戶輸入的用戶名為tsoft、密碼為111時(shí),則登錄成功,返回到welcome.jsp頁(yè)面,顯示用戶輸入的用戶名和密碼。
首先,創(chuàng)建一個(gè)請(qǐng)求處理類LoginAction,表單請(qǐng)求被提交到該類中進(jìn)行處理,為了能夠獲取表單數(shù)據(jù),需要?jiǎng)?chuàng)建與表單字段對(duì)應(yīng)的屬性并設(shè)置它們的setXXX()與getXXX()方法。LoginAction類的具體代碼如下:
package com.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String userName; //對(duì)應(yīng)表單中的“用戶名”字段
private String userPass; //對(duì)應(yīng)表單中的“密碼”字段
private String message; //用來(lái)保存提示消息
……//省略了屬性的setXXX()與getXXX()方法
public String execute() {
if(userName.equals("tsoft")&&userPass.equals("111")) {
message="登錄成功!";
return "yes";
}else{
message="登錄失?。?;
return "no";
}
}
}
然后,創(chuàng)建登錄頁(yè)面login.jsp,在該頁(yè)面中應(yīng)用Struts 2.0標(biāo)簽來(lái)創(chuàng)建一個(gè)Form表單、文本輸入框、密碼輸入框和“登錄”、“重置”按鈕,運(yùn)行效果如圖1.40所示。
login.jsp頁(yè)面的關(guān)鍵代碼如下:
<%@ taglib uri="/struts-tags" prefix="s" %>
<s:form action="login.action" theme="simple">
<table border="0">
<tr>
<td>用戶名:</td>
<td><s:textfield name="userName"/></td>
</tr>
<tr>
<td>密 碼:</td>
<td><s:password name="userPass"/></td>
</tr>
</table>
</s:form>
代碼貼士
form標(biāo)簽用于生成一個(gè)表單,其action屬性指定請(qǐng)求路徑,若該路徑以“.action”為后綴,則會(huì)到Struts 2.0的配置文件中查找與之對(duì)應(yīng)的配置,根據(jù)配置將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的Action類進(jìn)行處理;將theme屬性值設(shè)為simple,可以取消其默認(rèn)的表格布局。
textfield標(biāo)簽表示文本輸入框,其name屬性指定了該文本框與表單處理類中對(duì)應(yīng)的屬性u(píng)serName。實(shí)際上,textfield標(biāo)簽的name屬性值并不是必須與處理類中的屬性具有相同的名稱。如上述代碼,當(dāng)表單提交后,會(huì)自動(dòng)調(diào)用處理類中的setUserName()方法和setUserPass()方法將表單數(shù)據(jù)賦值給類中指定的屬性,因此該屬性的命名是任意的,如命名為myName。不過為了便于理解,通常情況下都是將屬性與表單字段設(shè)置為相同的名稱,讀者也應(yīng)按照該規(guī)則命名屬性。
password標(biāo)簽表示密碼輸入框,其用法同textfield標(biāo)簽。
其次,在配置文件中對(duì)表單所請(qǐng)求的路徑進(jìn)行配置。配置代碼如下:
<package name="login" extends="struts-default">
<action name="login" class="com.action.LoginAction">
<result name="yes">welcome.jsp</result> <!-- 配置登錄成功后返回的頁(yè)面 -->
<result name="no">welcome.jsp</result> <!-- 配置登錄失敗后返回的頁(yè)面 -->
</action>
</package>
關(guān)于Struts 2.0配置文件的介紹,讀者可查看1.14.2節(jié)。
接下來(lái),創(chuàng)建登錄操作后的提示頁(yè)面welcome.jsp,在該頁(yè)面中輸出用戶登錄結(jié)果,并輸出用戶輸入的用戶名和密碼。welcome.jsp頁(yè)面的關(guān)鍵代碼如下:
<%@ taglib uri="/struts-tags" prefix="s" %>
<b><s:property value="message"/></b>
<table>
<tr>
<td>
用戶名:<b><s:property value="userName"/></b>--
密 碼:<b><s:property value="userPass"/></b>
</td>
</tr>
</table>
welcome.jsp頁(yè)面是從LoginAction處理類中進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)來(lái)訪問的,只有在這種情況下,property標(biāo)簽采用如上用法時(shí),才能輸出LoginAction類中message、userName和userPass屬性的值;否則若是通過地址欄或超鏈接直接訪問welcome.jsp頁(yè)面,如上用法的property標(biāo)簽將不輸出任何值。
最后,分別在“用戶名”和“密碼”文本框中輸入“tsoft”和“111”,單擊“登錄”按鈕,登錄成功,并將出現(xiàn)如圖1.41所示的運(yùn)行結(jié)果。若輸入的數(shù)據(jù)為“yxq”和“123”,則登錄失敗,出現(xiàn)如圖1.42所示的運(yùn)行結(jié)果。
圖1.41 登錄成功 圖1.42 登錄失敗
Struts 2.0還允許將封裝表單數(shù)據(jù)的代碼從Action類中分離出來(lái),寫在另一個(gè)JavaBean中。例如,將上述例子進(jìn)行如下修改。
首先,創(chuàng)建一個(gè)存儲(chǔ)表單數(shù)據(jù)的JavaBean。代碼如下:
package com.model;
public class User {
private String userName; //對(duì)應(yīng)表單中的“用戶名”字段
private String userPass; //對(duì)應(yīng)表單中的“密碼”字段
……//省略了屬性的setXXX()與getXXX()方法
}