正文

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

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


代碼貼士

調(diào)用ActionContext類(lèi)的getParameters()方法將請(qǐng)求中的參數(shù)封裝到Map對(duì)象中,并保存該Map對(duì)象。

調(diào)用ActionContext類(lèi)的get()方法獲取一個(gè)與請(qǐng)求對(duì)應(yīng)的Map對(duì)象,并保存該Map對(duì)象。

調(diào)用ActionContext類(lèi)的getSession()方法獲取一個(gè)與會(huì)話(huà)對(duì)應(yīng)的Map對(duì)象,并保存該Map對(duì)象。

所以,在用戶(hù)控制器中,若要對(duì)請(qǐng)求或會(huì)話(huà)存取數(shù)據(jù),可使該Action控制器繼承相應(yīng)的接口。例如:

package com.yxq.action;

import java.util.Map;

import org.apache.struts2.interceptor.RequestAware;

import org.apache.struts2.interceptor.ResponseAware;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class s extends ActionSupport implements RequestAware,SessionAware {

private Map request;

private Map session;

public void setRequest(Map request) { //繼承RequestAware接口必須實(shí)現(xiàn)的方法

this.request=request;

}

public void setSession(Map session) { //繼承SessionAware接口必須實(shí)現(xiàn)的方法

this.session=session;

}

public String execute() throws Exception {

request.get("userName"); //獲取請(qǐng)求中userName屬性值

session.put("longer","yxq"); //向會(huì)話(huà)中存儲(chǔ)值

return SUCCESS;

}

}

通過(guò)對(duì)攔截器中的Map對(duì)象進(jìn)行存取數(shù)據(jù)的操作,以實(shí)現(xiàn)對(duì)請(qǐng)求或會(huì)話(huà)進(jìn)行存儲(chǔ)數(shù)據(jù)的操作,這將避免用戶(hù)實(shí)現(xiàn)的Action控制器對(duì)Servlet API的依賴(lài)。

2.模型組件

實(shí)際上模型組件概念的范圍是很廣的,對(duì)于實(shí)現(xiàn)了MVC體系結(jié)構(gòu)的Struts 2.0框架來(lái)說(shuō),在模型的設(shè)計(jì)方面并沒(méi)有提供太多的幫助。在Java Web應(yīng)用中,模型通常由JavaBean組成,一種JavaBean被指定用來(lái)封裝表單數(shù)據(jù),實(shí)現(xiàn)了視圖與控制器之間的數(shù)據(jù)傳遞;另一種則實(shí)現(xiàn)了具體的業(yè)務(wù),稱(chēng)為系統(tǒng)的業(yè)務(wù)邏輯組件。

在MVC體系結(jié)構(gòu)中,位于控制層的業(yè)務(wù)控制器負(fù)責(zé)接收請(qǐng)求,然后調(diào)用業(yè)務(wù)邏輯組件處理請(qǐng)求,最后轉(zhuǎn)發(fā)請(qǐng)求到指定視圖。所以,真正用來(lái)處理請(qǐng)求的是系統(tǒng)中的模型組件。

3.視圖組件

在Struts 2.0中,請(qǐng)求處理結(jié)束后,返回的視圖不僅可以是JSP頁(yè)面、Action動(dòng)作,還可以是其他的視圖資源,如FreeMarker模板、Velocity模板和XSLT等。

Struts 2.0完成了請(qǐng)求的處理后,將根據(jù)在配置文件中的配置,決定返回怎樣的視圖,這主要通過(guò)<result>元素的type屬性來(lái)決定。若返回FreeMarker模板,則設(shè)置type屬性的值為freemarker;若返回Velocity模板,則設(shè)置為velocity;若返回另外一個(gè)Action動(dòng)作,則設(shè)置為redirectAction;在沒(méi)有設(shè)置type屬性的情況下,默認(rèn)返回的視圖為JSP頁(yè)面。例如下面的配置:

<action name="returnType" class="com.yxq.action.ReturnAction">

<result>/welcome.jsp</result> <!-- 返回JSP頁(yè)面 -->

<result name="vm" type=" velocity ">/welcome.vm </result> <!-- 返回Velocity模板 -->

<result name="action " type=" redirectAction ">myReturn.action</result> <!-- 返回Action動(dòng)作 -->

</action>

4.配置文件

Struts 2.0會(huì)默認(rèn)加載Web應(yīng)用WEB-INF/classes目錄下的struts.xml配置文件,通過(guò)該文件的配置為用戶(hù)請(qǐng)求指定處理類(lèi),并設(shè)置該請(qǐng)求處理結(jié)束后返回的視圖資源。在開(kāi)發(fā)大型項(xiàng)目時(shí),這往往會(huì)導(dǎo)致struts.xml文件過(guò)于龐大,降低了可讀性。此時(shí)可以自己創(chuàng)建配置文件,然后在struts.xml文件中通過(guò)<include>元素包含這些文件。例如在struts.xml文件中包含名為myxml.xml的文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"https://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<include file="myxml.xml"/> <!-- 包含myxml.xml文件 -->

</struts>

在myxml.xml文件中配置用戶(hù)請(qǐng)求與處理類(lèi)的關(guān)系。例如下面的配置:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"https://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name=" example" extends="struts-default">

<action name="my" class="com.yxq.action. MyAction">

<result>/welcome.jsp </result>

</action>

……//其他<action>元素的配置

</package>

</struts>

代碼貼士

Struts 2.0配置文件的根元素。

包元素。name屬性指定了包名稱(chēng);extends屬性指定了繼承的另一個(gè)包元素;struts-default是在struts-default.xml文件中定義的包的名稱(chēng)。struts-default.xml位于struts2-core-2.0.11.jar文件下,在該文件的struts-default包元素中,定義了<result>元素的type屬性所能指定的視圖類(lèi)型、Struts 2.0中提供的攔截器以及對(duì)繼承了struts-default包的XML配置文件中配置的所有Action類(lèi)默認(rèn)執(zhí)行的攔截器。

<action>元素,用來(lái)配置業(yè)務(wù)控制器與請(qǐng)求的關(guān)系。

<result>元素,指定請(qǐng)求處理結(jié)束后返回的視圖資源。

5.消息資源文件

在Struts 2.0中,用來(lái)存儲(chǔ)提示信息的properties資源文件有以下3種:應(yīng)用范圍內(nèi)的資源文件、包(package)范圍內(nèi)的資源文件和Action類(lèi)范圍內(nèi)的資源文件。

應(yīng)用范圍內(nèi)的資源文件。

該資源文件在整個(gè)應(yīng)用內(nèi)都可以被訪(fǎng)問(wèn),通常稱(chēng)為全局資源文件,它需要在struts.properties配置文件中指定。例如,在WEB-INF/classes目錄下創(chuàng)建了一個(gè)名為allMessage.properties的全局資源文件,在struts.properties文件中需進(jìn)行如下配置:

struts.custom.i18n.resources=allMessage

若將文件保存在WEB-INF/classes/messages目錄下,需進(jìn)行如下配置:

struts.custom.i18n.resources= messages.allMessage

struts.properties文件通常應(yīng)被存放到Web應(yīng)用的WEB-INF/classes目錄下,Struts 2.0會(huì)自動(dòng)加載該文件,該文件以key=value的形式存儲(chǔ)了一些在Struts 2.0啟動(dòng)時(shí)對(duì)Web應(yīng)用進(jìn)行的配置,key用來(lái)表示配置選項(xiàng)名稱(chēng),value表示配置選項(xiàng)的值,如解決Struts 2.0中文亂碼的問(wèn)題。

包(package)范圍內(nèi)的資源文件。

包范圍內(nèi)的資源文件必須命名為package_xx_XX.properties,其中xx表示語(yǔ)言代碼,XX表示地區(qū)代碼,例如package_zh_CN.properties表示中文(中國(guó))。通過(guò)這樣命名,可以實(shí)現(xiàn)應(yīng)用程序國(guó)際化。也可忽略語(yǔ)言代碼與地區(qū)代碼,命名為package.properties,表示任意語(yǔ)言(地區(qū))。包范圍內(nèi)的資源文件只可被當(dāng)前包中的類(lèi)文件訪(fǎng)問(wèn)。例如,存在如圖1.60所示的包結(jié)構(gòu),在actionA子包中存在一個(gè)package.properties資源文件,則actionA子包中的類(lèi)文件可以訪(fǎng)問(wèn)package.properties資源文件,而actionB子包中的類(lèi)文件則不能訪(fǎng)問(wèn)??蓪ackage.properties文件存放在com/yxq目錄下,使得可以訪(fǎng)問(wèn)com/yxq目錄下所有子目錄中的類(lèi)文件。

Action類(lèi)范圍內(nèi)的資源文件。

該資源文件只可被某一個(gè)Action類(lèi)訪(fǎng)問(wèn),它必須與訪(fǎng)問(wèn)它的Action類(lèi)存放在同一個(gè)目錄下,并且文件的命名與該Action類(lèi)的名稱(chēng)相同。例如,在com.yxq.action包下存在MyAction.java類(lèi)文件,若在com.yxq.action下創(chuàng)建一個(gè)MyAction.properties資源文件,則該文件只可被MyAction.java類(lèi)文件訪(fǎng)問(wèn)。

1.15 本 章 小 結(jié)

本章講解的是如何應(yīng)用Struts 2.0開(kāi)發(fā)一個(gè)Web項(xiàng)目。通過(guò)本章的學(xué)習(xí),讀者應(yīng)該對(duì)Struts 2.0框架有初步的了解,并能夠成功搭建Struts 2.0框架,應(yīng)用該框架開(kāi)發(fā)一個(gè)簡(jiǎn)單的Web應(yīng)用程序。

另外,通過(guò)閱讀本章內(nèi)容,讀者應(yīng)對(duì)一個(gè)項(xiàng)目的開(kāi)發(fā)過(guò)程有進(jìn)一步的了解,并要時(shí)刻牢記——在進(jìn)行任何項(xiàng)目的開(kāi)發(fā)之前,一定要做好充分的前期準(zhǔn)備,如完善的需求分析、清晰的業(yè)務(wù)流程、合理的程序結(jié)構(gòu)、簡(jiǎn)單的數(shù)據(jù)關(guān)系等,這樣在后期的程序開(kāi)發(fā)中才會(huì)得心應(yīng)手、有備無(wú)患。


上一章目錄下一章

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