999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Struts2框架在信息發布系統中的應用研究*

2014-06-13 11:32:36歐陽宏基
微處理機 2014年2期
關鍵詞:頁面信息

葛 萌,歐陽宏基

(咸陽師范學院信息工程學院,咸陽712000)

1 引言

Struts作為Apache組織的一個開源項目,是一種基于MVC設計模式的Java Web開發框架[1],其第一代產品Struts1在Java Web開發領域具有非常高的市場占有率。隨著時間的推移,Struts1的一些弊端逐漸顯露出來,例如表現層所支持的技術單一、Action組件與Servlet API緊密耦合并且是單例實現、存在線程安全性問題、侵入式框架、嚴重依賴于Struts1 API等。因此Struts2在Struts1和WebWork的技術基礎上進行了整合。它以WebWork為核心,采用攔截器的機制來處理用戶請求,目的是為了使業務邏輯控制器能夠與Servlet API完全脫離開,便于開發與測試[2]。分析了Struts2的體系結構,詳細描述了Struts2各組件在響應客戶端請求時的調用過程。按照MVC設計模式,依據一個Web站點的信息發布系統,詳細描述了表現層、控制層和模型層的實現過程,對于利用Struts2開發Java Web應用具有一定的借鑒意義。

2 Struts2體系結構

Struts2的體系結構(如圖1所示)與Struts1差別非常大,因為Struts2使用了WebWork的設計核心,而不是Struts1的設計核心。Struts2框架的基本執行流程如下描述:

(1)客戶端向Servlet容器(例如 Tomcat)發送HttpServletRequest請求。

(2)該請求經過一系列的過濾器(Filter)進行過濾,其中ActionContextCleanUp是一個可選過濾器,該過濾器對于Struts2和其他框架的集成起作用(例如:SiteMesh Plugin)。

(3)FilterDispatcher是Struts2的核心過濾器,擔當MVC模式中控制層的核心功能。FilterDispatcher根據ActionMapper來決定當前用戶請求是否需要調用某個Action。

(4)如果 ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給 Action-Proxy。

(5)ActionProxy通過Configuration Manager讀取框架的配置文件(struts.xml),找到需要調用的Action類,并創建一個ActionInvocation實例。

(6)ActionInvocation實例使用命名模式來調用,在調用 Action的過程前后,涉及到相關攔截器(Intercepter)的調用。

(7)默認情況下,Action調用execute()方法執行相應的業務邏輯(也可以是Action中其它的方法,但這些方法在調用時需要顯示聲明)。

(8)當 Action執行完畢,ActionInvocation實例根據配置文件(查找響應的是什么信息如:SUCCESS、ERROR,INPUT等)找到對應的返回結果。返回結果通常是(也可能是另外的一個Action)JSP頁面或者FreeMarker的模版來響應用戶請求,在表示過程中可以使用Struts2提供的標簽。

圖1 Struts2體系結構

3 信息發布系統的實現

目前幾乎所有Web站點都具備信息的動態維護功能。管理人員合法登錄到站點的后臺模塊就可以對最新信息、文檔、圖片等資源進行添加、上傳等操作,使得前臺頁面顯示的內容呈現出動態變化的過程。本節以咸陽師范學院國際交流學院的Web站點為例,依據MVC模式結合Struts2和FCKEditor框架,詳細描述信息發布系統的實現過程。

3.1 表示層的實現

表示層主要由JSP頁面、FCKEditor和Struts2標簽構成。FCKeditor是目前最優秀的可見即可得網頁文檔編輯器之一,它采用JavaScript編寫,具備功能強大、配置容易、跨瀏覽器、支持多種編程語言(可以和 PHP、JavaScript、ASP、ASP.NET、Java 等不同的編程語言相結合)、開源等特點[3]。本系統選用的是Java版本的FCKEditor2.6,首先將fckeditorjava-core-2.6.jar包導入到 WEB -INF/lib目錄中,然后在需要FCKEditor的JSP頁面頭部加入以下聲明代碼。

< %@taglib uri="http://java.fckeditor.net"prefix="FCK"%>

< %@page import="net.fckeditor.*"% >在頁面需要顯示文檔編輯器的位置,加入如下Java代碼段:

//以JSP內置對象request為實參創建FCKEditor對象并命名

FCKeditor fckEditor=new FCKeditor(request,"EditorDefault");

//FCKEditor一些簡單屬性的設置,并通過out內置對象將文檔編輯器顯示在JSP頁面上fckEditor.setValue("");

fckEditor.setHeight("500");

out.println(fckEditor);

Struts2提供了功能強大的標簽庫,這些標簽不依賴于任何的表現層技術,同時支持用戶自定義標簽以滿足頁面復雜多變的需求[4]。Struts2提供的標簽主要包括:UI類標簽、控制類標簽和支持Ajax的標簽等。使用Struts2標簽前需要添加導入標簽庫的語句:<%@taglib uri="/struts-tags"prefix="s"%>

下面是前臺JSP頁面顯示最新信息標題和發布日期的Struts2控制類標簽-iterator的使用代碼。

<s:iterator value="list_news"var="infos">

<tr width="100%"height="20">

<td width="85%">

<a class="t1"href="content.jsp?id= < s:property value="#infos.id"/>"target="blank"> <s:property value="#infos.title"/> < /a>

</td>

<td width="15%"><s:property value="#in-fos.publishDate"/>

</td>

</tr>

</s:iterator>

其中value屬性的值list_news為相應Action中的一個集合,這個集合里封裝的是與數據庫表對應的信息實體的JavaBean對象,再通過property標簽將需要的屬性顯示在頁面中。

3.2 控制層的實現

控制層主要完成Action和配置文件的定義。Struts2框架有兩個核心配置文件,其中struts.xml是整個Struts2應用程序的核心配置文件(存放在項目的src目錄下),其中主要包括包配置、命名空間配置、攔截器配置、Action映射及Action處理結果和物理資源之間的映射配置及異常處理配置等。另一個struts.properties配置文件中主要定義了Struts2框架的大量常量屬性。但通常推薦也是在struts.xml文件中來配置這些常量屬性。以下是本系統中struts.xml配置文件的部分代碼。

<struts>

<constant name="struts.i18n.encoding"value="UTF-8"/>

< constant name="struts.multipart.maxSize"value="10701096"/>

<package name="lhy-default"namespace="/bgm"extends="struts-default">

<global-results>

<result name="error" > /bgm/error.jsp < /result>

< /global-results>

<global-exception-mappings>

<exception-mappingresult="error"exception="java.lang.Exception" > < /exception -mapping>

</global-exception-mappings>

</package>

<package name="backgroud"namespace="/bgm"extends="lhy-default">

<action name="InformationManage"class="lhy.action.InformationAction" >

<result name="success">${destinationPage}</result>

<resultname ="error" >/bgm/Information Manage-Result.jsp < /result>

</action>

</package>

</struts>

其中constant標簽用于配置相應常量屬性。package標簽用于定義包配置,name為必填屬性,用來指定包的名字,extends為可選屬性,用來指定該包繼承其他包。如果繼承其它包,可以繼承其它包中的Action、攔截器等。namespace為可選屬性,用來指定該包的命名空間。global-results和globalexception-mapping兩個標簽結合起來完成異常的聲明式處理方式,exception屬性指明了處理異常的類型,result屬性指明了產生該異常時的返回類型,從而在global-results標簽中找到對應的顯示頁面。由于異常的聲明式處理方式配置在一個package標簽中,那么其他的package可以進行繼承,從而共享這個異常處理方式。action標簽用來配置Action對象,name為必填屬性(在一個 package中Action的name值唯一),class為必填屬性用來指定Action字節碼的位置。result為action的子標簽,name為可選屬性,其值默認是SUCCESS(可選值為SUCCESS、NONE、ERROR、INPUT、LOGIN)表示Action執行的結果,不同的結果定位到不同的資源。

除了配置文件外,控制層最主要的任務是根據用戶請求定義相應的Action來進行處理。Struts2的Action采用了低侵入式設計,即Action可以是一個POJO,不與任何Struts2的基類和接口打交道。但實際上為了方便實現Action,大多數情況下都會繼承com.opensymphony.xwork2.ActionSupport類,并重寫此類的execute()方法。因為此類中實現了很多的實用接口,提供了很多默認方法,這些默認方法包括獲取國際化信息的方法、數據校驗的方法、默認的處理用戶請求的方法等,這樣可以大大簡化Action的開發。以下是信息發布業務所對應的Action核心代碼。

import com.opensymphony.xwork2.ActionSupport;

public class InformationAction extends ActionSupport{

privateInformationBean infoBean;//HTTP 向Action傳遞參數采取域模型的方式

public String execute(){

String tag=ERROR;

int opResult=0;

if(opType.equals("add"))//當前執行添加操作

{

//調用模型層組件,執行持久化操作

InfoDAO infoDAO=DAOFactory.getDAOInstance(InfoBean.class);

opResult=infoDAO.addInformation(infoBean);

if(opResult==1)

{

tag=SUCCESS;

destinationPagePath="/lhy/bgm/ShowInfo.jsp";

}

}

r eturn tag;

}}

由于Struts2的Action直接封裝了HTTP請求參數,與Servlet API實現了松耦合。Struts2的Action接收HTTP請求參數一共有三種方式:使用Action的屬性、域模型、實現ModelDriver泛型接口。本系統采用域模型方式來接收請求參數,此方式的優點在于避免Action內部出現大量與實體相關的屬性和實現過多的接口。例如上述代碼中的infoBean,它是一個JavaBean對象,內部封裝了與信息實體相關的屬性。Action類中要提供infoBean的get和set方法。

3.3 模型層的實現

和Struts1一樣,Struts2也沒有在模型方面提供現成的組件,為了達到Java EE分層模型之間的松散耦合,開發人員需要選取JavaBean或者EJB組件來完成業務邏輯和持久化邏輯。本系統選取JavaBan來實現業務邏輯,利用泛型DAO模式結合JDBC來實現持久化邏輯。DAO模式是Java EE數據持久層所使用的最廣泛的模式,它的核心思想是向外部提供一個訪問數據源的統一接口,對外隱藏操作數據源的實現細節,以至于將來更換數據持久化方式時不影響上層的調用者。由于一個系統中可能會存在多個需要持久化操作的實體類,這些實體類對數據源的CRUD操作都具有相同點,因此在DAO模式的基礎上加入泛型機制可以避免大量重復的CRUD代碼并且能夠解決強制類型轉換所可能產生的異常。

控制層通過Action調用持久化層邏輯的過程如圖2所示。DAOFactory通過工廠模式向上層調用者隱藏了具體DAO實現類的創建過程。實體類通常與數據庫表對應,每個實體類都有相應的DAO實現,由于不同的實體類基本上都具有相同的CRUD操作,所以定義了泛型DAO接口提取了所有實體類共有的持久化方法,并在泛型實現類中通過模板模式進行抽象,將不同實體類屬性與表中字段的映射留給具體泛型實現類去完成。JdbcUtil是采用單例模式設計的一個JDBC工具類,提供了通過DataSource獲取Connection對象的方法以及釋放相關JDBC資源的方法。為了實現對Connection對象的復用以提高數據庫訪問的性能,在Tomcat中配置了DBCP連接池。Tomcat Servlet容器將DBCP數據源作為一個JND I數據源,通過配置參數來使用DBCP 連接池[5]。在 DBPool.config 配置文件中定義了連接池的相關參數(初始連接數、最大活動連接數、最小空閑連接數、最大空閑連接數等)。

圖2 Action調用持久化層邏輯

4 結束語

論文詳細分析了Struts2框架的組成部分以及響應用戶請求的執行過程,按照MVC模式的視圖、控制、模型三個部分結合信息發布系統詳細描述了Struts2框架的實現過程。實踐表明:Struts2框架能夠簡化Web應用的開發過程,使得程序具有清晰的結構框架,并且開發人員能夠分工協作,從而提高開發效率和系統的可擴展性和可維護性。

[1]甘文麗,劉為超.基于Struts2和Ajax的企業級Web應用開發[J].工礦自動化,2013,39(2):24 -25.

[2]丁波,晁愛農.基于Struts2框架的 AJAX開發研究[J].計算機工程與設計,2009,30(16):3910 -3911.

[3]董海燕,王衛東.基于JSF、Spring和Hibernate的技術資料綜合管理系統設計[J].計算機應用與軟件,2012,29(5):214 -214.

[4]陸舟.Struts2技術內幕:深入解析Struts架構設計與實現原理[M].機械工業出版社,2012,185-187.

[5]陳潔.DBCP數據庫連接池的自優化配置[J].計算機與現代化,2010(12):112-113.

猜你喜歡
頁面信息
微信群聊總是找不到,打開這個開關就好了
大狗熊在睡覺
刷新生活的頁面
保健醫苑(2022年1期)2022-08-30 08:39:14
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
展會信息
中外會展(2014年4期)2014-11-27 07:46:46
同一Word文檔 縱橫頁面并存
淺析ASP.NET頁面導航技術
其實IE也懂Chrome的心
信息
建筑創作(2001年3期)2001-08-22 18:48:14
健康信息
祝您健康(1987年3期)1987-12-30 09:52:32
主站蜘蛛池模板: 国产精品开放后亚洲| 久久精品国产一区二区小说| 中文国产成人精品久久| 亚洲AV人人澡人人双人| 亚洲综合狠狠| 国产欧美另类| 国产在线观看一区精品| 亚洲福利一区二区三区| 国产精品对白刺激| 国产美女叼嘿视频免费看| 一级毛片中文字幕| 一本久道久久综合多人| 亚洲欧美国产五月天综合| 成人免费黄色小视频| 99久久成人国产精品免费| 狂欢视频在线观看不卡| 欧美中日韩在线| 国产精品久久久久久影院| 99热这里都是国产精品| 久久无码高潮喷水| 中国国产A一级毛片| 国产迷奸在线看| 暴力调教一区二区三区| 国产在线观看第二页| 婷婷综合缴情亚洲五月伊| 亚洲视频一区在线| 免费国产高清视频| 91网址在线播放| 欧美黄网站免费观看| 国产精品自在在线午夜区app| 综1合AV在线播放| 国内黄色精品| 99热这里只有免费国产精品 | 中文字幕免费视频| www.91在线播放| 国产精品微拍| 国产亚洲欧美在线人成aaaa| 日韩毛片基地| 99国产精品免费观看视频| 最新国产网站| 国产伦精品一区二区三区视频优播| 久久99国产综合精品1| 日韩东京热无码人妻| 国产福利一区在线| 久热中文字幕在线| 国产乱子伦手机在线| 中文字幕无线码一区| 欧美亚洲欧美| 白丝美女办公室高潮喷水视频| 国产在线八区| 黄色免费在线网址| 伊人久久大香线蕉成人综合网| 国产本道久久一区二区三区| 亚瑟天堂久久一区二区影院| 欧美综合区自拍亚洲综合绿色 | 秋霞午夜国产精品成人片| 东京热av无码电影一区二区| 2020精品极品国产色在线观看 | 日韩无码黄色| 亚洲无限乱码| 成人在线综合| 国产在线视频福利资源站| 国产精品无码翘臀在线看纯欲| 国产精品开放后亚洲| 久久青青草原亚洲av无码| 国产成人一区| 久草视频福利在线观看| 午夜色综合| 亚洲天堂视频在线观看| 国产激情无码一区二区免费| 亚洲妓女综合网995久久| 亚洲成a人片| 亚洲美女操| 欧美一区福利| AV无码国产在线看岛国岛| 国产91麻豆免费观看| 欧美日韩亚洲国产| 97影院午夜在线观看视频| 成年女人a毛片免费视频| 国产高潮视频在线观看| 亚洲国产精品一区二区高清无码久久| 91在线免费公开视频|