java求職筆試面試網(wǎng)絡(luò)資源打包_第1頁
java求職筆試面試網(wǎng)絡(luò)資源打包_第2頁
java求職筆試面試網(wǎng)絡(luò)資源打包_第3頁
java求職筆試面試網(wǎng)絡(luò)資源打包_第4頁
java求職筆試面試網(wǎng)絡(luò)資源打包_第5頁
已閱讀5頁,還剩175頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Struts+Hibernate+Spring3

Web開發(fā)流行架構(gòu)課程總體目標3

我們的目標是:能夠熟練運用當前流行的java開源框架:Struts、Hibernate以及Spring來構(gòu)建靈活、易于擴展的多層Web應(yīng)用程序。什么是模式?什么是框架?3模式,即pattern。其實就是解決某一類問題的方法論。你把解決某類問題的方法總結(jié)歸納到理論高度,那就是模式。3

模式分為:

3

體系結(jié)構(gòu)模式3

設(shè)計模式3

框架,即framework。建立在體系結(jié)構(gòu)模式的基礎(chǔ)上。包括大量組件,設(shè)計模式,與某一領(lǐng)域的具體應(yīng)用無關(guān),供你選用完成你自己的系統(tǒng)。而且,框架一般是成熟的,不斷升級的軟件。3

領(lǐng)域模型(業(yè)務(wù)模型)多層架構(gòu)概述3

C/S:以數(shù)據(jù)庫為中心3

B/S:多層架構(gòu)才是真正的目的3B/S多層架構(gòu)將顯示、業(yè)務(wù)運算、數(shù)據(jù)庫等功能完全分離,杜絕彼此的耦合與影響,從而實現(xiàn)松耦合和良好的可維護性。3

呈現(xiàn)層(UI

Layer/Presentation

Layer)3

struts3

業(yè)務(wù)邏輯層(Business

Layer)3

spring3

持久化層(Persistence

Layer)3

hibernateStruts3

開源MVC框架Struts課程目標3

深入理解MVC模式3

掌握Struts體系架構(gòu)3

掌握Struts開發(fā)流程3

熟練掌握Struts的配置方法從Servlet說開去3

什么是Servlet?

3

如何編寫Servlet?3

如何映射Servlet?3

相對路徑與絕對路徑的基本概念3

如何基于Servlet編程?3

JavaBeans3

JavaBean是一種java類3

JavaBean必須是具體的和公共的,并且具備無參構(gòu)造器3

JavaBean通過提供符合一致性設(shè)計模式的公共方法將內(nèi)部域暴露稱為屬性3

JavaBean提供兩種方法來訪問Bean的內(nèi)部狀態(tài):3

訪問器(getters)用來讀JavaBean狀態(tài)–以小寫get前綴開始,后跟屬性名,屬性名的第一個字母必須大寫,返回值必須匹配相應(yīng)修改器的方法的參數(shù);如果訪問器返回boolean值,則使用is前綴開始,后跟屬性名,屬性名第一個字母必須大寫。3

修改器(setters)用來改變JavaBean狀態(tài)–以小寫set前綴開始,后跟屬性名,屬性名的第一個字母必須大寫,修改器的返回值通常為voidStruts是什么?Struts的目標是提供一個開發(fā)Web應(yīng)用的開源框架。Struts鼓勵基于M2模式(即MVC設(shè)計模式)來開發(fā)程序。Model

ViewControllerModel1與Model2設(shè)計模式簡介3

以JSP為中心的開發(fā)模型,稱為Model1(JSP+JAVABEAN)3

業(yè)務(wù)邏輯與表示邏輯混和,不利維護與重用3

HTML中嵌入了大量的JAVA代碼3

驗證、流程控制、更新程序的狀態(tài)全部在JSP中完成3

以servlet為中心的開發(fā)模型,稱為Model2(JSP+Servlet+JAVABEAN)3

基于MVC模式的框架3

MVC將問題進行分解3模型包含應(yīng)用程序的核心功能。模型封裝了應(yīng)用程序的狀態(tài)。它對視圖或控制器一無所知。3視圖提供模型的表示。它是應(yīng)用程序的外觀。視圖可以訪問模型的讀方法,但不能訪問寫方法。此外,它對控制器一無所知。3

控制器對用戶的輸入作出反應(yīng)。它創(chuàng)建并設(shè)置模型。Model2Struts框架概覽Struts框架概覽:3

控制器3控制器接收來自瀏覽器的請求,在struts中,是由一個servlet來充當控制器的角色,struts-config.xml文件配置控制器3

模型3

Struts沒有提供model的實現(xiàn)3

視圖3

JSP、tag。

struts官方解釋3

The

framework

provides

its

own

web

Controller

component

and

integrates

withother

technologies

to

provide

the

Model

and

the

View.

For

the

Model,

theframework

can

interact

with

standard

data

access

technologies,

like

JDBC

andEJB,

as

well

as

most

any

third-party

packages,

like

Hibernate,

iBATIS,

or

ObjectRelational

Bridge.

For

the

View,

the

framework

works

well

with

JavaServerPages,

including

JSTL

and

JSF,

as

well

as

Velocity

Templates,

XSLT,

and

otherpresentation

systems.3

The

framework"s

Controller

acts

as

a

bridge

between

the

application"s

Model

andthe

web

View.

When

a

request

is

received,

the

Controller

invokes

an

Actionclass.

The

Action

class

consults

with

the

Model

(or,

preferably,

a

Facaderepresenting

your

Model)

to

examine

or

update

the

application"s

state.

Theframework

provides

an

ActionForm

class

to

help

transfer

data

between

Model

and

View.3

Most

often,

the

Model

is

represented

as

a

set

of

JavaBeans.

Typically,developers

will

use

the

Commons

BeanUtils

to

transfer

data

betweenActionForms

and

the

Model

objects

(or

a

Facade).

Preferably,

the

Model

will

dothe

"heavy

lifting",

and

the

Action

will

act

as

a

"traffic

cop"

or

adapter.Struts框架組件3

ActionServlet類控制導(dǎo)航流3

ActionServlet根據(jù)URI來決定哪個Action類被用于處理請求,Action可以校驗輸入,并訪問業(yè)務(wù)層以便從數(shù)據(jù)庫檢索信息3

RequestProcessor:輔助ActionServlet3

Action需要知道頁面提交了哪些內(nèi)容,所以

由ActionServlet根據(jù)請求URI來決定將請求參數(shù)綁定到哪個ActionForm中,并傳入Action3

Action在完成業(yè)務(wù)邏輯后,返回一個ActionForward對象,ActionServlet根據(jù)ActionForward對象中的路徑來調(diào)用頁面完成響應(yīng)3Struts將這些信息綁定在一個ActionMapping對象中,一個ActionMapping對應(yīng)一個請求URI,當請求路徑到達的時候,ActionServlet就會查詢ActionMapping對象,ActionMapping對象將告訴ActionServlet哪個Action類會被調(diào)用、哪個ActionForm類被用于傳遞頁面數(shù)據(jù)以及哪些

ActionForward將被用于轉(zhuǎn)向3

有關(guān)Action、ActionForm、ActionForward等信息,Struts通過一個配置文件:struts-config.xml文件來定義。Struts1.X和Struts2.X3

Struts1.X與Struts2.X的差異較大3

Struts1.X應(yīng)用更加廣泛3

Struts2.X實際上是另外一個框架Webwork發(fā)展而來的3

后續(xù)課程將會有對webwork/Struts2.X的介紹以及實例操作快速開始一個Struts項目3

第一個項目,實現(xiàn)用戶登錄操作3

用戶將看到一個登錄頁面,要求用戶輸入用戶名以及密碼3

如果用戶名以及密碼都是admin,提示登錄成功3

否則提示登錄失敗3

1、用Eclipse創(chuàng)建一個J2EE

Web應(yīng)用項目,如右圖所示3

2、下載并解壓Struts項目33*從Apache網(wǎng)站下載struts最新版*將壓縮包解壓到一個目錄,此目錄為STRUTS_HOME目錄3

3、將STRUTS_HOME/lib目錄下的所有.jar文件拷貝到剛創(chuàng)建的3

web項目的WebContent/WEB-INF/lib目錄下3

4、配置ActionServlet:33修改web項目的web.xml文件,添加如下Servlet映射配置(轉(zhuǎn)下一頁)web.xml的配置<servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>LoginAction應(yīng)用程序的流程圖Struts項目架構(gòu)圖Struts工作流程圖Struts與MVC3

視圖(View)3

在使用Struts框架的web應(yīng)用程序中,JSP以及相關(guān)的技術(shù)(如Taglib)等共同組成視圖層,這一層的主要職責是顯示用戶界面。Struts提供了很多機制讓我們能更加輕松地創(chuàng)建視圖3

控制器(Controller)3

Struts中,ActionServlet是控制器層組件3

模型(Model)3

模型包括:系統(tǒng)的內(nèi)部狀態(tài)以及改變系統(tǒng)狀態(tài)的動作3

Struts中的Action和ActionForm是模型的一部分3

Struts建議把”做什么”(Action)和”如何做”(業(yè)務(wù)邏輯)相分離創(chuàng)建業(yè)務(wù)邏輯處理類(Model)3使用單例模式(Singleton)來創(chuàng)建業(yè)務(wù)邏輯處理類3創(chuàng)建UserManager業(yè)務(wù)邏輯處理類3

創(chuàng)建validate方法3

創(chuàng)建UserNotFoundException3

創(chuàng)建PasswordErrorExceptionpackage

com.bjsxt.strutstest;public

class

UserManager

{private

static

UserManager

userManager;private

UserManager(){}public

static

synchronized

UserManager

getInstance(){if(userManager

==

null){userManager

=

new

UserManager();}return

userManager;}public

void

validate(String

username,String

password)throwsUserNotFoundException,PasswordErrorException{if(!"admin".equals(username)){throw

new

UserNotFoundException();}if(!"admin".equals(password)){throw

new

PasswordErrorException();}}}Action中如何調(diào)用業(yè)務(wù)邏輯處理類?3

我們看下面的代碼:3

try

{3UserManager.getInstance().validate(username,password);3333333return

mapping.findForward("success");}

catch

(UserNotFoundException

e)

{e.printStackTrace();}

catch

(PasswordErrorException

e)

{e.printStackTrace();}return

mapping.findForward("error");3

通過添加業(yè)務(wù)邏輯處理類,我們將驗證邏輯轉(zhuǎn)移到了業(yè)務(wù)邏輯處理層頁面之間數(shù)據(jù)的傳遞3

如何將數(shù)據(jù)從Action中傳遞到下一個JSP頁面?3

一般使用request.setAttribute方法:3

在Action中,使用request.setAttribute(String

name,Object

data)方法往request中設(shè)置參數(shù)3

在JSP中,使用request.getAttribute(String

name)來獲取相應(yīng)的參數(shù)3

在原來LoginAction的基礎(chǔ)上編寫相應(yīng)的代碼,測試頁面數(shù)據(jù)傳遞3

傳遞登錄成功者的帳號信息到成功頁面,并顯示進一步理解Struts控制流細節(jié):所有的頁面請求由容器接收3Struts的核心組件是ActionServlet,像其它所有Servlet一樣,它是生存在容器中的,比如Tomcat、WebLogic等,當容器啟動的時候,它會讀取web.xml文件(部署描述符),告訴容器它會裝入哪些Servlet3一個標準的Servlet是通過servlet-mapping來設(shè)定,哪些請求,將會被提交到哪些servlet中3

Struts的servlet-mapping配置一般是:3

<servlet-mapping>3

<servlet-name>action</servlet-name>3

<url-pattern>*.do</url-pattern>3

</servlet-mapping>3

這樣配置的意思是:任何以.do結(jié)尾的URL請求,都會被發(fā)送到ActionServlet進行處理小結(jié)3

MVC基本結(jié)構(gòu)3

Struts的主要組成部分3

如何編寫ActionForm

3

如何編寫Action3

如何在配置文件中定義映射URL、Action以及ActionForm3

如何獲取從頁面?zhèn)鬟f到Action的數(shù)據(jù)3

如何將數(shù)據(jù)從Action傳遞到下一個頁面3

如何將業(yè)務(wù)邏輯與表示層分離3需牢記原則:不要在Action中進行業(yè)務(wù)邏輯的處理,業(yè)務(wù)邏輯應(yīng)交給專門的Model層去做3

在業(yè)務(wù)邏輯層拋出異常,并在Action中捕捉和處理Struts

Taglib3

易于使用,能代替直接在頁面上寫JAVA腳本

3

便于重用3

用Struts

Taglib實現(xiàn)成功頁面3

在以后的開發(fā)中,將逐步介紹一些常用的Taglib嘗試簡單的tag

lib使用3

在JSP文件的頭部添加如下聲明:3

<%@

taglib

prefix="bean"uri=""

%>3<%@

taglib

prefix="logic"

uri=""

%>3<%@

taglib

prefix="html"

uri=""

%>3關(guān)于struts

tag

lib的說明,可以查看相關(guān)的參考文檔3常用的struts

tag

lib3<bean:write>3<logic:empty>和<logic:notEmpty>3<logic:present>和<logic:notPresent>3<logic:iterate>JSTL3

簡介:SUN的標準Taglib庫3

JSP標準標簽庫(JSP

Standard

Tag

Library,JSTL

)3

迭代和條件判斷3

數(shù)據(jù)管理格式化3

XML操作3

數(shù)據(jù)庫訪問3

函數(shù)標簽庫3

表達式語言(EL)3

EL隱式對象3

存取器3

運算符在項目中使用JSTL3拷貝jstl.jar和standard.jar到WEB-INF/lib目錄下3在JSP中添加偽指令3<%@

taglib

prefix="c"

uri=""%>3<%@

taglib

prefix="fmt"

uri=""%>3常用JSTL標記3<c:out>3<c:if>3<c:choose>、<c:when>和<c:otherwise>3<c:forEach>3<fmt:formatNumber>3<fmt:formatDate>進一步理解ActionForm3

ActionForm的要求3

必須擴展自org.apache.struts.action.ActionForm3

如果要獲取表單的值,必須定義一個public屬性3如果要求在將ActionForm傳遞到Action之前進行校驗,必須實現(xiàn)validate方法3

如果想要在組裝前初始化屬性,必須實現(xiàn)reset方法

3

DynaActionForm3

舉例說明DynaActionForm的配置3

DynaActionForm的使用ActionForm作為表單字段收集器3

通過HTTP提交表單數(shù)據(jù)3

通過HTTP上傳文件3

通過例子演示文件上傳的簡易方法3

通過HTTP提交空字段3

修改原來的JSP文件,提交空字段ActionForm作為類型轉(zhuǎn)換器3

所有從表單提交到后臺的數(shù)據(jù)均為字符串類型3

如何利用ActionForm自動轉(zhuǎn)換int數(shù)據(jù)類型3

舉例說明3

如何利用ActionForm自動轉(zhuǎn)換boolean數(shù)據(jù)類型3

舉例說明3

如何利用ActionForm自動轉(zhuǎn)換Date類型

3

定義Converter3

注冊Converter3

舉例說明3

如何利用ActionForm自動轉(zhuǎn)換Double類型

3

舉例說明ActionForm作為傳輸對象3

ActionForm可以被其它bean或者過程作為數(shù)據(jù)載體。3Transfer對象(也稱為值對象(value

object))用來通過發(fā)送粗糙—規(guī)整的數(shù)據(jù)視圖來交換精細規(guī)整的數(shù)據(jù)。3

ActionForm的各個屬性都必須是可變的。3

提示:3

使用粗糙—規(guī)整ActionForm來減小類維護。3

應(yīng)用中的表單一般共享屬性3

創(chuàng)建一個基本的ActionForm,具有表單需要的所有屬性ActionForward3

ActionForward能做什么?3

在Action中,經(jīng)常問的問題是:“OK,操作成功了,然后呢?”3

ActionForward會回傳給ActionServlet3

ActionForward中的路徑,可以是一個帶參數(shù)的URI3

ActionForward的屬性3

name3

path3

redirect3

className3

轉(zhuǎn)發(fā)(forward)與重定向(redirect)3

全局ActionForward與局部ActionForward動態(tài)創(chuàng)建ActionForward3

將ActionForward定義在一個Struts配置文件中是個好的選擇3但也可以在Action中動態(tài)創(chuàng)建ActionForward,而不需要在配置文件中指定3

如下所示:3

ActionForward

forward=new

ActionForward("/do/itemEdit?action=edit");3

舉例說明ActionMapping3

理解ActionMapping3

path3

forward3

type3

name3

scope3

validate3

input3

parameter3

unknow

ActionMappingScope屬性3

在Action映射配置中,Scope屬性可以取值為:request或session3

Scope屬性表示:Struts框架在將ActionForm對象(與目標Action匹配的ActionForm)傳送到Action之前,會將ActionForm對象保存的位置3

如:scope=“request”配置,將指示struts調(diào)用

request.setAttribute(“ActionForm名稱”,ActionForm對象)方法,將

ActionForm對象保存到request。3其中,ActionForm名稱與struts-config.xml配置中的ActionForm名稱一致,如:<form-bean

name=“uploadForm”type=“com.bjsxt.struts.actionform.UploadActionForm”/>,其中uploadForm就是其名稱。3我們明白scope屬性的意義之后,就可以利用struts的這些特性,來解決開發(fā)過程中的某些常見問題常見問題:如何在程序出現(xiàn)異常的時候返回錄入界面重新錄入3假設(shè)現(xiàn)在要在一個頁面上輸入用戶的信息(可能會有十幾個屬性值需要輸入),用戶不小心輸入了一個重復(fù)的帳號,而帳號是不允許重復(fù)的,這個時候,系統(tǒng)應(yīng)該提示用戶有關(guān)帳號重復(fù)的信息,同時讓用戶重新選擇一個帳號。3

這種情況下,我們需要返回用戶錄入界面,讓用戶修改帳號字段。3現(xiàn)在的問題是:如何在返回這個錄入界面的時候,將用戶輸入的其它信息保持住?搞定Action對象3

如果應(yīng)用需要保存一個記錄到數(shù)據(jù)庫中,典型的過程可能是3

ActionForward提供一個鏈接到輸入頁面3

ActionForm捕獲輸入3

ActionMapping配置Action3Action將輸入送到數(shù)據(jù)庫中(通常會將這一步操作委托給業(yè)務(wù)邏輯類去實現(xiàn))3J2EE是一個多線程的環(huán)境,服務(wù)器針對每個請求啟動一個線程來處理。所以有可能會有多個線程同時訪問一個Servlet實例的情況3在Struts里面也是一樣的,有可能會有多個線程同時訪問一個Action實例的情況3所以必須保證Action類中的方法具有“可重入性”,即不能在Action的方法里改變實例變量的值A(chǔ)ction的主要職責3

校驗輸入數(shù)據(jù)3

調(diào)用業(yè)務(wù)邏輯方法3

檢測處理異常3

根據(jù)邏輯進行轉(zhuǎn)向操作I18N問題3

什么是I18N問題?3

在英文中,國際化(Internationalization)被縮寫為I18N,即只取首尾兩個字母,中間字母為18個3

問題在哪里?3

頁面字符串硬編碼3

異常消息的硬編碼3

提示信息的硬編碼Java如何支持I18N?2支持I18N2我們需要將硬編碼文本轉(zhuǎn)移到外部的資源文件2編寫MessagesBperties2編寫MessagesBundle_zh_CN.properties2編寫MessagesBundle_en_US.properties2亂碼?2因為資源文件必須是Latin-1或Unicode編碼(如\udddd)的字符2使用native2ascii工具,將中文資源文件進行轉(zhuǎn)換Java支持I18N的編碼過程總結(jié)3

1、創(chuàng)建屬性文件(可能要用native2ascii工具轉(zhuǎn)換)3

2、定義Locale對象3

3、創(chuàng)建一個ResourceBundle對象3

ResourceBundle對象用于分離跟本地相關(guān)的數(shù)據(jù)3如果找不到相應(yīng)語言或國家代碼的屬性文件,將使用默認的屬性文件(即沒有標識語言和國家代碼的屬性文件:MessagesBperties)3

其創(chuàng)建方式如下:3

message

=

ResourceBundle.getBundle("MessagesBundle",

currentLocale);3第一個參數(shù),表示要從哪些資源屬性文件中(MessagesBundle_XX.properties)獲取數(shù)據(jù)3

第二個參數(shù),是一個Locale對象,表示要選擇哪個資源屬性文件3

4、從ResourceBundle對象中獲取數(shù)據(jù)Locale對象berlin.de/diverse/doc/ISO_3166.html3

我們通過指定一個語言代碼和國家代碼來創(chuàng)建一個Locale對象

3

國家代碼是可選的3

語言代碼是小寫字母;國家代碼是大寫字母3

Locale.getDefault()可以獲得系統(tǒng)當前的Locale3

Java都支持哪些語言代碼和國家代碼?3

DateFormat.getAvailableLocales()3

語言代碼標準:333333國家代碼標準:與Locale相關(guān)的數(shù)據(jù):消息文本(帶參數(shù)?)日期(時間)貨幣(數(shù)字)等等。。。Struts如何支持I18N3

1、需要在struts配置文件中指定資源屬性文件的位置和名稱,如

3

<message-resources

parameter="MessageResources"/>3

2、在相應(yīng)的位置放置相應(yīng)的文件33、在JSP頁面中使用<bean:message

key=“key

string”/>來輸出文本,以避免硬編碼3

以登錄頁面的國際化作為例子講解3

創(chuàng)建相應(yīng)的資源屬性文件3

用<bean:message/>標簽替換登錄頁面的硬編碼文本3

測試(更改網(wǎng)頁顯示語言,以便測試不同的版本)關(guān)于message-resources配置中parameter的值3

parameter的值,可以指定資源文件的位置和名稱3

舉例:3

<message-resources

parameter="MessageResources"/>

3

表示在類路徑根目錄(WEB-INF/classes目錄)下有MessageResources_XX_XX.properties文件(注意:國家代碼可以省略,跟java中對資源屬性文件的處理一樣)3

<message-resources

parameter="resources.application"/>3表示在類路徑根目錄下,有一個resources目錄,在這個resources目錄中存放著所有的application_XX_XX.properties資源屬性文件如何用程序切換網(wǎng)頁顯示的語言3

struts利用在session中存放一個Locale對象來達到設(shè)置當前語言的目的3

默認的情況下,struts根據(jù)網(wǎng)頁向后臺提交時所包含的語言編碼信息來提供缺省的Locale對象,這就是我們?yōu)槭裁纯梢酝ㄟ^更改網(wǎng)頁顯示語言設(shè)置,就能顯示不同的語言文字的原因。3

struts在session中存放的這個Locale對象,取名為:Globals.LOCALE_KEY的值,Globals是struts框架提供的一個對象3

利用這個原理,我們可以用編程的方式來手工切換整個應(yīng)用系統(tǒng)的語言。3

舉例說明3

ChangeLanguageActionStruts消息處理3

為什么需要消息處理?3

比如登錄成功的提示

3

比如創(chuàng)建失敗的提示3等等……總之,程序總是要通過界面來跟用戶交互,所以,在交互的過程中,就產(chǎn)生了眾多的消息文本3struts提供了專門的處理機制,來將這些消息文本國際化,避免消息文本的硬編碼3消息處理,就是在Action和JSP之間傳遞的消息文本的處理(區(qū)別于JSP頁面硬編碼文本的消息,JSP頁面消息可以使用<bean:message/>標簽來處理)3

Struts交互消息,是通過Actionmessages等對象,以及相應(yīng)的<html:messages/>標簽來處理的如何創(chuàng)建消息對象?3

Actionmessages與Actionmessage對象3

Actionmessages對象是Actionmessage對象的集合3

一個Actionmessage對象,代表一個國際化消息文本(字符串)3

如何創(chuàng)建Actionmessages對象?3

Actionmessages

messages=new

Actionmessages();3

如何創(chuàng)建Actionmessage對象?3

Actionmessage

msg

=

new

Actionmessage(“key”);3其構(gòu)造方法帶的參數(shù),就是一個在資源屬性文件中的key,所以,它能表示一個國際化消息文本3

如何將Actionmessage對象添加到Actionmessages對象中?3

messages.add(“message_id”,msg);3第一個參數(shù)(message_id)表示本Actionmessage對象在Actionmessages對象中區(qū)別于其它Actionmessage對象的標識符如何將消息對象從Action中傳遞到下一個頁面(JSP)?3

首先我們要決定的是,我們要傳遞的消息是普通消息還是錯誤消息?3

普通消息:即普通的消息文本3

錯誤消息:即提示錯誤的消息文本3

本質(zhì)上,這兩種消息沒有什么區(qū)別,都是消息文本,但是如果一個頁面同時需要顯示普通的消息文本和錯誤消息文本的時候,就需要進行區(qū)分了,比如不同類型的消息文本可能要用不同的樣式來顯示3

通過一句簡單的代碼,將Actionmessages對象保存到HttpServletRequest對象中3

保存普通消息:this.saveMessages(request,messages);3

保存錯誤消息:this.saveErrors(request,messages);3

這就是調(diào)用父類(Action)所提供的方法saveMessages()/saveErrors()來保存消息對象3

實際上,父類的saveMessages()方法,將消息對象保存在了request中,并命名為Globals.MESSAGE_KEY3

saveErrors()方法,將消息對象保存在了request中,并命名為Globals.ERROR_KEY如何在JSP中使用消息對象?3

使用<html:messages/>標簽來顯示消息3

<html:messages/>標簽既可以顯示普通消息,也可以顯示錯誤消息3

<html:messages/>標簽的重要屬性:3

name–消息對象的名稱,如果我們調(diào)用saveMessages/saveErrors方法來傳遞消息,那么這個名字不需要標識(struts使用缺省的名稱,即

Globals.MESSAGE_KEY或Globals.ERROR_KEY

)3

id–(這是必需的屬性)因為我們傳遞的是Actionmessages對象,而不是Actionmessage對象,Actionmessages對象相當于一個集合,我們需要在JSP上依次輸出它所包含的消息,因此需要一個id標識一個變量來臨時存放其每條消息(與<logic:iterate/>標簽的id屬性的意義是一樣的)3

property–我們傳遞的Actionmessages對象,包含了多條消息文本,如果我們只需要顯示其中一條,則可以通過property屬性來指定顯示哪條消息3

message–可以取值為true或false,如果取值為true,將顯示普通消息,如果取值為false,將顯示錯誤消息<html:errors/>標簽3

<html:errors/>標簽只顯示錯誤消息3

<html:errors/>標簽與<html:messages/>標簽類似,但無id屬性3

<html:errors/>標簽通過提供header/footer屬性以及prefix/suffix屬性來定制每條消息的顯示格式3

header/footer–定義整個錯誤消息顯示之前(之后)要顯示的內(nèi)容,這些內(nèi)容也是在資源屬性文件中定義的一些key值,默認的情況下,它們的取值分別為:errors.header和errors.footer3

prefix/suffix–定義每條錯誤消息顯示之前(之后)要顯示的內(nèi)容,這些內(nèi)容也是在資源屬性文件中定義的一些key值,默認的情況下,它們的取值分別為:errors.prefix和errors.suffix3

舉例如下:3

errors.header=<UL>3

errors.prefix=<LI>3

errors.suffix=</LI>3

errors.footer=</UL>Struts的異常自動處理機制3

編程式異常處理3即我們在Action中調(diào)用業(yè)務(wù)邏輯層對象的方法時,用try{}catch的方式來截獲異常之后,手工對異常進行處理3

我們以前的開發(fā)過程中,都是使用編程式的異常處理3在編程式異常處理的時候,我們可以使用struts的消息處理機制(前面所講的內(nèi)容)來對這些異常信息進行處理3

自動異常處理機制3

即在Action中不捕捉異常,而是將異常拋出給struts框架處理3

我們需要在配置文件中指示struts如何處理這些被拋出的異常3

使用<exception/>元素來定義自動異常處理<exception/>元素的配置及使用3

<exception/>元素的配置,指示了struts如何處理異常的方式3在通常的情況下,我們得到異常以后,需要將頁面導(dǎo)航到一個錯誤提示的頁面,提示錯誤信息3

<exception/>元素配置的關(guān)鍵屬性是:3key–即這個異常所對應(yīng)的錯誤提示消息文本的key,這個key的值,需要在資源屬性文件中進行定義3

type–即定義需要處理哪種類型的Exception3

path–定義一旦出現(xiàn)異常,需要轉(zhuǎn)向哪個頁面來進行提示,如果不定義path屬性,默認情況下,將使用Action配置中的input屬性的值來作為轉(zhuǎn)向的頁面3

如何顯示錯誤消息?3在JSP頁面中,使用<html:errors/>標簽,即可將其異常對應(yīng)的錯誤消息文本進行顯示(測試login.jsp頁面)標準Action3

Struts框架缺省提供了一些Action,來完成一些常見的功能3

ForwardAction-ForwardAction僅僅簡單的轉(zhuǎn)發(fā)控制到其他資源3

為什么需要ForwardAction?3

目的是發(fā)出一個RequestDispatcher轉(zhuǎn)發(fā)3

ForwardAction的絕大多數(shù)使用是作為Action的占位符3

ForwardAction創(chuàng)建一個請求分派器,并根據(jù)ActionMapping提供的上下文相關(guān)的URI轉(zhuǎn)發(fā)控制3

許多Struts開發(fā)人員避免從一個頁面直接連接到其他地方而是通過Action或者

ActionForward來傳遞控制。這保證了工作流在Struts配置的控制之下,在這里可以進行集中管理。3

然而,許多頁面并不需要特殊的預(yù)處理(至少還不需要)。如果為這些頁面創(chuàng)建ActionMapping,你可以使用ForwardAction,來僅進行路由控制。如果以后,需求改變,又需要進行預(yù)處理,你可以改變mapping來為那個頁面引用到一個

Action。因為鏈接是引用到mapping,而不是Action類,所以你可以修改Action類而不用改變鏈接。標準的Base

Action3

DispatchAction–避免每個Action創(chuàng)建一個類3

DispatchAction的配置方法3

添加parameter屬性到Action的配置中3

unspecified方法3

舉例說明DispatchAction的使用struts配置中的路徑與模式匹配3

struts配置中的action,有一個path屬性,它表明請求的URI3

一般情況下,我們需要在配置文件中明確指定某個特定的URI,如path=“/user/add”3在一些大型應(yīng)用中,如果能夠制定一套嚴格的路徑及其操作規(guī)范的話,我們可以利用path的路徑模式匹配功能,來簡化struts配置文件繁瑣的編寫工作量3

假設(shè)有如下規(guī)范:路徑匹配規(guī)范示例3

對user對象的所有處理Action,均需要以如下的路徑進行訪問:3

/user/add.do–處理用戶添加的有關(guān)操作3

/user/delete.do–處理用戶刪除的有關(guān)操作

3

/user/update.do–處理用戶更新的有關(guān)操作

3

…3

所有操作(Action)對應(yīng)的JSP如下:3

所有操作成功(失?。┲蟮霓D(zhuǎn)向頁面,有如下命名規(guī)范:3

/user/add.do->/user/add_success.jsp或/user/add_error.jsp3

/user/delete.do->/user/delete_success.jsp或/user/delete_error.jsp3

…3

所有操作的輸入界面有如下命名規(guī)范:3

添加操作->/user/add_input.jsp3

更新操作->/user/update_input.jsp3

…Action配置示例<actionpath="/user/*"type="com.bjsxt.struts.web.actions.UserAction"name="userForm"parameter="method"><forward

name="index"

path="/user/index.jsp"/><forward

name="success"

path="/user/{1}_success.jsp"/><forward

name="error"

path="/user/{1}_error.jsp"/><forward

name="input"

path="/user/{1}_input.jsp"/></action>Action配置解釋3

所有的/user/*.do請求,都將由UserAction這個類來處理,UserAction類繼承DispatchAction,它將根據(jù)傳入的method參數(shù)的值,來分發(fā)到不同的方法來進行處理3

在UserAction類中的任何一個方法,都可以返回index/success/error/input等名稱的ActionForward3

根據(jù)請求路徑的不同,即使調(diào)用相同的返回代碼,但其轉(zhuǎn)向也將不同,如:3

/user/add.do?method=add請求,將被轉(zhuǎn)發(fā)給UserAction類的add方法處理,假設(shè)它用mapping.findForward(“success”);來返回成功頁面,這將轉(zhuǎn)向的實際JSP頁面是:/user/add_success.jsp3

而/user/delete.do?method=delete請求,將被轉(zhuǎn)發(fā)給UserAction類的delete方法處理,假設(shè)它用mapping.findForward(“success”);來返回到刪除成功頁面,這將轉(zhuǎn)向的實際JSP頁面是:/user/delete_success.jsp,所以,不同URI請求的相同名稱的返回頁面將是不同的。3

而/user/index.do請求(或者任何一個其它請求,如/user/abcd.do或/user/test.do),都因為沒有傳遞method參數(shù),而觸發(fā)調(diào)用UserAction的unspecified方法Struts回顧3

Struts

tag

lib的配置和使用3

JSTL的配置和使用3

錯誤消息的處理3

ActionForm的多種用途3

DynaActionForm3

ActionForward的主要作用,如何動態(tài)創(chuàng)建ActionForward3

Action的主要職責和處理過程3

如何保證Action的線程安全性

3

國際化與資源文件的配置、使用3

ForwardAction3

DispatchActionHibernate3

開源O/R映射框架課程目標?

課程目標:?

理解O/R

Mapping原理?

掌握Hibernate開發(fā)的相關(guān)知識?

能使用Hibernate進行實際項目開發(fā)?

Hibernate高手進級:性能優(yōu)化策略目錄3

什么是Hibernate3

快速體驗Hibernate的開發(fā)步驟3

認識Hibernate基本核心接口

3

Hibernate的對象關(guān)系映射3

Hibernate查詢語句(HQL)Hibernate?3

直接使用JDBC操作數(shù)據(jù)庫的步驟很繁瑣3

JDBC操作的是關(guān)系型數(shù)據(jù)庫3

我們用JAVA開發(fā)程序,則使用面向?qū)ο蟮乃枷?Hibernate正是在這兩種不同的模型之間建立關(guān)聯(lián),Hibernate給我們提供了利用面向?qū)ο蟮乃枷雭聿僮麝P(guān)系型數(shù)據(jù)的接口什么是關(guān)系模型(Relational

Model)?3

關(guān)系模型把世界看作是由實體(Entity)和聯(lián)系(Relationship)構(gòu)成的。

3

所謂實體就是指現(xiàn)實世界中具有區(qū)分與其它事物的特征或?qū)傩圆⑴c其它實體有聯(lián)系的對象。在關(guān)系模型中實體通常是以表的形式來表現(xiàn)的。表的每一行描述實體的一個實例,表的每一列描述實體的一個特征或?qū)傩浴?

所謂聯(lián)系就是指實體之間的關(guān)系,即實體之間的對應(yīng)關(guān)系。3

1:13

1:n3

m:n3

關(guān)系數(shù)據(jù)庫3

表3

字段

3

主鍵

3

外鍵什么是面向?qū)ο螅?

面向?qū)ο笕筇卣鳎悍庋b、繼承(一般與特殊)、多態(tài)(覆蓋與重載)3

類3

對象

3

屬性

3

關(guān)系3

一般與特殊關(guān)系(is

a)3

組成(has

a)3

關(guān)聯(lián)及其多重性3

1:13

1:n3

m:n3

雙向關(guān)聯(lián)與單向關(guān)聯(lián)對象關(guān)系映射(Object

Relational

Mapping,簡稱ORM)3ORM是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。簡單的說,ORM是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將java程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。3

Why

ORM?3

面向?qū)ο蟮拈_發(fā)方法是當今企業(yè)級應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方法3

關(guān)系數(shù)據(jù)庫是企業(yè)級應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲系統(tǒng)3字母O起源于“對象”(Object),而R則來自于“關(guān)系”(Relational)。幾乎所有的程序里面,都存在對象和關(guān)系數(shù)據(jù)庫。在業(yè)務(wù)邏輯層和呈現(xiàn)層中,我們是面向?qū)ο蟮?。當對象信息發(fā)生變化的時候,我們需要把對象的信息保存在關(guān)系數(shù)據(jù)庫中。3

當你開發(fā)一個應(yīng)用程序的時候(不使用O/R

Mapping),你可能會寫不少數(shù)據(jù)訪問層的代碼,用來從數(shù)據(jù)庫保存,刪除,讀取對象信息,等等。而這些代碼寫起來總是重復(fù)的。對象-關(guān)系映射模式3

屬性映射3

類映射

3

關(guān)聯(lián)映射3

一對一

3

一對多

3

多對多什么是Hibernate?3

對象/關(guān)系映射一直都是數(shù)據(jù)庫技術(shù)中的難點,盡管人們提出了許多方案解決這個問題,但都不能完全做到即便利又高效。EJB的推出讓人們看到了希望,但實踐證明實體Bean的效率并不高,并且還十分難于為初學者理解。由Gavin

King創(chuàng)建的Hibernate框架,從某種程序上正在朝著正確的方向邁走,并且得到越來越多IT從業(yè)人員的認可。就像當年的Struts框架一樣,Hibernate也已經(jīng)在許多項目中得到廣泛應(yīng)用。Hibernate由于投注了更多的精力在提升效率上,使用起來又十分方便,新版的EJB規(guī)范正在向Hibernate方向靠攏。正是由于得到廣泛的認可,Hibernate已經(jīng)成為程序員必須掌握的技術(shù)之一。Hibernate能做什么?-理解O/R映射3Hibernate能幫助我們利用面向?qū)ο蟮乃枷?,開發(fā)基于關(guān)系型數(shù)據(jù)庫的應(yīng)用程序3

第一:將對象數(shù)據(jù)保存到數(shù)據(jù)庫3

第二:將數(shù)據(jù)庫數(shù)據(jù)讀入對象中3

基于B/S的典型三層架構(gòu)關(guān)于分層×業(yè)務(wù)邏輯層和持久化層絕對不能依賴于展現(xiàn)層Hibernate與O、R之間的關(guān)系快速體驗Hibernate–安裝以及創(chuàng)建新的項目3

下載Hibernate,并解壓縮3

使用Eclipse創(chuàng)建新的項目3

引入Hibernate及其依賴庫(jar包)3

引入mysql數(shù)據(jù)庫驅(qū)動包3

打開mysql控制臺,創(chuàng)建測試數(shù)據(jù)庫”hibernate”3

Create

database

hibernate;3

Use

hibernate創(chuàng)建Hibernate配置文件–hibernate.cfg.xml3

<?xml

version="1.0"

encoding="utf-8"?>3

<!DOCTYPE

hibernate-configuration3

PUBLIC

"-//Hibernate/Hibernate

Configuration

DTD//EN"3

"

">3

<hibernate-configuration>3

<session-factory>3

<property

name="hibernate.connection.url">jdbc:mysql:///hibernate</property>3

<property

name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>3

<property

name="hibernate.connection.username">root</property>3

<property

name="hibernate.connection.password">mysql</property>3

<property

name="dialect">org.hibernate.dialect.MySQLDialect</property>333</session-factory></hibernate-configuration>創(chuàng)建持久化類User.java3

public

class

User

{private

String

id;private

String

name;private

String

password;private

Date

createTime;private

Date

expireTime;…..getters/setters3333333

}創(chuàng)建類的映射文件–User.hbm.xml"

"><hibernate-mapping>3

<?xml

version="1.0"?>3

<!DOCTYPE

hibernate-mapping

PUBLIC3

"-//Hibernate/Hibernate

Mapping

DTD

3.0//EN"333333333333<class

name="com.bjsxt.hibernate.User"><id

name="id"><generator

class="uuid"/></id><property

name="name"/><property

name="password"/><property

name="createTime"/><property

name="expireTime"/></class></hibernate-mapping>將類的映射文件加入Hibernate3為了讓Hibernate能夠處理User對象的持久化,需要將它的映射信息加入到Hibernate中3

加入的方法很簡單,在Hibernate配置文件中加入:3

<mapping

resource="com/bjsxt/hibernate/User.hbm.xml“/>3

即可3

resource屬性指定了映射文件的位置和名稱創(chuàng)建數(shù)據(jù)庫表–利用SchemaExport工具類3

利用Hibernate提供的工具類來創(chuàng)建數(shù)據(jù)庫表3

創(chuàng)建ExportToDB類3

public

class

ExportToDB

{3public

static

void

main(String[]

args)

throws

Exception{3//讀取配置文件3Configuration

cfg

=

new

Configuration().configure();33//創(chuàng)建SchemaExport對象3SchemaExport

export

=

new

SchemaExport(cfg);33//創(chuàng)建數(shù)據(jù)庫表3export.create(true,true);3}3}將對象保存到數(shù)據(jù)庫–UserTest1.javapublic

static

void

main(String[]

args)

throws

Exception{Configuration

cfg

=

new

Configuration().configure();SessionFactory

factory

=

cfg.buildSessionFactory();Session

session

=

factory.openSession();session.beginTransaction();User

user=new

User();user.setName("管理員");

user.setPassword("admin");user.setCreateTime(new

Date());user.setExpireTime(new

Date());session.save(user);session.getTransaction()

mit();if(session.isOpen()){session.close();}3333333333333333333}實際操作體驗Hibernate開發(fā)步驟3

按照上面的步驟,先快速體驗一下Hibernate實際所做的事情3

Hibernate開發(fā)步驟3

實體類(持久化類)的設(shè)計3

實體類與關(guān)系數(shù)據(jù)庫的映射3

應(yīng)用的開發(fā)認識Hibernate的基本組件3

實體類3

實體類映射文件3

重點學習的部分3

Hibernate配置文件3

輔助工具Hibernate核心接口Configuration

概述:Configuration類負責管理Hibernate的配置信息。它包括如下內(nèi)容:

Hibernate運行的底層信息:數(shù)據(jù)庫的URL、用戶名、密碼、JDBC驅(qū)動類,數(shù)據(jù)庫Dialect,數(shù)據(jù)庫連接池等。Hibernate映射文件(*.hbm.xml)。Hibernate配置的兩種方法:屬性文件(perties)。調(diào)用代碼:Configuration

cfg=new

Configuration();Xml文件(hibernate.cfg.xml)。

調(diào)用代碼:Configuration

cfg=newConfiguration().configure();SessionFactory?

概述:應(yīng)用程序從SessionFactory(會話工廠)里獲得Session(會話)實例。它在多個應(yīng)用線程間進行共享。通常情況下,整個應(yīng)用只有唯一的

一個會話工廠——例如在應(yīng)用初始化時被創(chuàng)建。然而,如果你使用

Hibernate訪問多個數(shù)據(jù)庫,你需要對每一個數(shù)據(jù)庫使用一個會話工廠。會話工廠緩存了生成的SQL語句和Hibernate在運行時使用的映射元數(shù)據(jù)。調(diào)用代碼:SessionFactory

sessionFactory

=

cfg.buildSessionFactory();

說明:SessionFactory由Configuration對象創(chuàng)建,所以每個Hibernate配置文件,實際上是對SessionFactory的配置Session(會話)概述:

Session不是線程安全的,它代表與數(shù)據(jù)庫之間的一次操作,它的概念介于Connection和Transaction之間。

Session也稱為持久化管理器,因為它是與持久化有關(guān)的操作接口。

Session通過SessionFactory打開,在所有的工作完成后,需要關(guān)閉。它與Web層的HttpSession沒有任何關(guān)系。調(diào)用代碼Session

session

=

sessionFactory.openSession();持久化對象的狀態(tài)

瞬時對象(TransientObjects):使用new操作符初始化的對象不是立刻就持久的。它們的狀態(tài)是瞬時的,也就是說它們沒有任何跟數(shù)據(jù)庫表相關(guān)聯(lián)的行為,只要應(yīng)用不再引用這些對象(不再被任何其它對象所引用),它們的狀態(tài)將會丟失,并由垃圾回收機制回收。

持久化對象(PersistObjects):持久實例是任何具有數(shù)據(jù)庫標識的實例。它有持久化管理器Session統(tǒng)一管理,持久實例是在事務(wù)中進行操作的——它們的狀態(tài)在事務(wù)結(jié)束時同數(shù)據(jù)庫進行同步。當事務(wù)提交時,通過執(zhí)行SQL的INSERT、UPDATE和DELETE語句把內(nèi)存中的狀態(tài)同步到數(shù)據(jù)庫中。

離線對象(DetachedObjects):Session關(guān)閉之后,持久化對象就變?yōu)殡x線對象。離線表示這個對象不能再與數(shù)據(jù)庫保持同步,它們不再受Hibernate管理。持久化對象的生命周期(lifecycle)3Transaction(事務(wù))概述:

它將應(yīng)用代碼從底層的事務(wù)實現(xiàn)中抽象出來——這可能是一個JDBC事務(wù),一個JTA用戶事務(wù)或者甚至是一個公共對象

請求代理結(jié)構(gòu)(CORBA)——允許應(yīng)用通過一組一致的API控制事務(wù)邊界。這有助于保持Hibernate應(yīng)用在不同類型的執(zhí)行環(huán)境或容器中的可移植性。調(diào)用代碼:Transaction

tx

=

session.beginTransaction();注:使用Hibernate進行操作時必須顯式的調(diào)用Transaction(默認:autoCommit=false)。從代碼中體會Session和TransactionSession

session

=

factory.openSession();session.beginTransaction();User

user=new

User();user.setName("管理員");user.setPassword("admin");user.setCreateTime(new

Date());user.setExpireTime(new

Date());session.save(user);session.getTransaction()

mit();session.beginTransaction();User

user1

=

new

User();user1.setName("jjj");session.save(user1);session.getTransaction

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論