基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù)-課堂.ppt_第1頁(yè)
基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù)-課堂.ppt_第2頁(yè)
基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù)-課堂.ppt_第3頁(yè)
基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù)-課堂.ppt_第4頁(yè)
基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù)-課堂.ppt_第5頁(yè)
已閱讀5頁(yè),還剩192頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),濟(jì)南大學(xué)信息學(xué)院 劉鹍 ,第2講 基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),第2章 基于Java EE開(kāi)發(fā)環(huán)境的構(gòu)建 第3章 Struts2應(yīng)用 第4章 Hibernate應(yīng)用 第5章 Spring應(yīng)用 第6章 Struts2、Hibernate和Spring整合應(yīng)用,第2講 基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),Servlet Servlet是Java語(yǔ)言的CGI實(shí)現(xiàn),與傳統(tǒng)的CGI和許多其他類(lèi)似CGI的技術(shù)相比,Java Servlet具有更高的效率,更容易使用,功能更強(qiáng)大,具有更好的可移植性。 高效: 傳統(tǒng)的CGI程序以進(jìn)程方式運(yùn)行,而Servlet以線程方式運(yùn)行。

2、方便: Servlet提供了大量的實(shí)用工具例程,例如自動(dòng)地解析和解碼HTML表 單數(shù)據(jù)、讀取和設(shè)置HTTP頭、處理Cookie、跟蹤會(huì)話狀態(tài)等。 功能強(qiáng)大:可以完成很多傳統(tǒng)的CGI程序很難做到的事情。 可移植性好:Servlet API具有完善的標(biāo)準(zhǔn)。,Web服務(wù)器,doGet()方法,doPost()方法,HTTP GET請(qǐng)求,HTTP POST請(qǐng)求,響應(yīng),響應(yīng),客戶機(jī),第2講 基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),JSP JSP(Java Server Pages)是由Sun Microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)有點(diǎn)類(lèi)似ASP技術(shù),它是在

3、傳統(tǒng)的網(wǎng)頁(yè)HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標(biāo)記(tag),從而形成JSP文件(*.jsp)。 用JSP開(kāi)發(fā)的Web應(yīng)用是跨平臺(tái)的,既能在Linux下運(yùn)行,也能在其他操作系統(tǒng)上運(yùn)行。 JSP采用的是動(dòng)態(tài)代碼與靜態(tài)HTML頁(yè)面相結(jié)合的方式,JSP的語(yǔ)法內(nèi)容放入在以“%”開(kāi)始,以“%”結(jié)束的特殊標(biāo)記之內(nèi)。 JSP頁(yè)面文件通常以.jsp為擴(kuò)展名。雖然從代碼編寫(xiě)來(lái)看,JSP頁(yè)面更象普通Web頁(yè)面而不象Servlet,但實(shí)際上,JSP最終會(huì)被轉(zhuǎn)換成正規(guī)的Servlet,靜態(tài)HTML直接輸出到和Servlet service方法關(guān)聯(lián)的輸出流。,第2講

4、 基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),Struts 2框架 Struts是開(kāi)源軟件。使用Struts的目的是為了幫助我們減少在運(yùn)用MVC設(shè)計(jì)模型來(lái)開(kāi)發(fā)Web應(yīng)用的時(shí)間。 Struts框架具有組件的模塊化、靈活性和重用性的優(yōu)點(diǎn),同時(shí)也簡(jiǎn)化了基于MVC的Web應(yīng)用程序的開(kāi)發(fā)。 從應(yīng)用的角度來(lái)說(shuō),Struts有三大塊,分別是Struts核心類(lèi)、Struts配置文件及Struts標(biāo)簽庫(kù)。,Hibernate框架 傳統(tǒng)的Java應(yīng)用都是采用JDBC來(lái)訪問(wèn)數(shù)據(jù)庫(kù),它是一種基于SQL的操作方式,但對(duì)目前的Java EE信息化系統(tǒng)而言,通常采用面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計(jì)的過(guò)程。系統(tǒng)從需求分析到系統(tǒng)設(shè)計(jì)都是按

5、面向?qū)ο蠓绞竭M(jìn)行,但是到詳細(xì)的數(shù)據(jù)訪問(wèn)設(shè)計(jì)階段,又回到了傳統(tǒng)的JDBC訪問(wèn)數(shù)據(jù)庫(kù)的老路上來(lái)。 Hibernate的問(wèn)世解決了這個(gè)問(wèn)題,Hibernate是一個(gè)面向Java環(huán)境的對(duì)象/關(guān)系映射工具,它用來(lái)把對(duì)象模型表示的對(duì)象映射到基于SQL的關(guān)系數(shù)據(jù)模型中去,這樣就不用再為怎樣用面向?qū)ο蟮姆椒ㄟM(jìn)行數(shù)據(jù)的持久化而大傷腦筋了。,第2講 基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),第2講 基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),Spring框架 Spring框架是Rod Johnson開(kāi)發(fā)的,2003年發(fā)布了Spring框架的第一個(gè)版本。Spring是一個(gè)從實(shí)際開(kāi)發(fā)中抽取出來(lái)的框架,因此它完成了大量開(kāi)發(fā)中的通

6、用步驟,從而大大提高了企業(yè)應(yīng)用的開(kāi)發(fā)效率。 Spring為企業(yè)應(yīng)用的開(kāi)發(fā)提供了一個(gè)輕量級(jí)的解決方案。其中依賴(lài)注入、基于AOP的聲明式事務(wù)管理、多種持久層的整合與優(yōu)秀的Web MVC框架等最為人們關(guān)注。Spring可以貫穿程序的各個(gè)層之間,但它并不是想取代那些已有的框架,而是以高度的開(kāi)放性和它們緊密的整合。這也是Spring被廣泛應(yīng)用的原因之一。,第2講 基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),JSP+Servlet+JavaBean實(shí)現(xiàn)MVC,JSP,JSP,JSP,Servlet,JavaBean,EJB,Web服務(wù),視圖,控制器,模型,JDBC,DataBase,第2講 基于開(kāi)源框架的企業(yè)級(jí)

7、信息系統(tǒng)開(kāi)發(fā)技術(shù),Struts2、Spring和Hibernate框架,第2講 基于開(kāi)源框架的企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),Struts2、Spring和Hibernate框架,IService,jsp,command,IDomain,IDao,資源層,發(fā)出請(qǐng)求,viewbean,databean,databean,service實(shí)現(xiàn)類(lèi),domain實(shí)現(xiàn)類(lèi),組織數(shù)據(jù),在頁(yè)面顯示,dao實(shí)現(xiàn)類(lèi),Spring框架,Struts框架,Hibernate框架,第2章 Java EE開(kāi)發(fā)環(huán)境的構(gòu)建,JSP和Servlet例子,JSP和Servlet例子,JSP JSP(Java Server Pages)是由

8、Sun Microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)有點(diǎn)類(lèi)似ASP技術(shù),它是在傳統(tǒng)的網(wǎng)頁(yè)HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標(biāo)記(tag),從而形成JSP文件(*.jsp)。 用JSP開(kāi)發(fā)的Web應(yīng)用是跨平臺(tái)的,既能在Linux下運(yùn)行,也能在其他操作系統(tǒng)上運(yùn)行。 簡(jiǎn)單的說(shuō)JSP就是: HTML文件中嵌入Java程序段和JSP標(biāo)記 擴(kuò)展名是*.jsp,JSP和Servlet例子,看個(gè)JSP的例子計(jì)算圓面積: 新建Web Project,項(xiàng)目名稱(chēng):test 輸入半徑的頁(yè)面input.jsp(WebRo

9、ot文件夾下):, 請(qǐng)輸入半徑r: ,JSP和Servlet例子,看個(gè)例子計(jì)算圓面積: 計(jì)算圓面積的頁(yè)面result.jsp:, ,JSP和Servlet例子,看個(gè)例子計(jì)算圓面積: 發(fā)布 啟動(dòng)Tomcat服務(wù)器,在IE瀏覽器中輸入“http:/localhost:8080/test/input.jsp”,系統(tǒng)會(huì)顯示input.jsp頁(yè)面,如圖2.1所示。當(dāng)在文本框中輸入10后,單擊【計(jì)算】按鈕會(huì)跳轉(zhuǎn)到另外一個(gè)頁(yè)面,也就是result.jsp頁(yè)面,并且輸出結(jié)果314.0,如圖2.2所示。,圖2.1 input.jsp頁(yè)面圖2.2 result.jsp頁(yè)面,JSP和Servlet例子,Servle

10、t Servlet是一種服務(wù)器端的Java應(yīng)用程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性,可以生成動(dòng)態(tài)的Web頁(yè)面。 它擔(dān)當(dāng)客戶請(qǐng)求(Web瀏覽器或其他HTTP客戶程序)與服務(wù)器響應(yīng)(HTTP服務(wù)器上的數(shù)據(jù)庫(kù)或應(yīng)用程序)的中間層。 Servlet是位于Web 服務(wù)器內(nèi)部的服務(wù)器端的Java應(yīng)用程序,與傳統(tǒng)的從命令行啟動(dòng)的Java應(yīng)用程序不同,Servlet由Web服務(wù)器進(jìn)行加載,該Web服務(wù)器必須包含支持Servlet的Java虛擬機(jī)。 簡(jiǎn)單的理解: Servlet是Java類(lèi) Servlet可以接收客戶請(qǐng)求request Servlet可以給客戶響應(yīng)response Servlet在服務(wù)器端加載 Se

11、rvlet運(yùn)行在Servlet容器中,JSP和Servlet例子,看個(gè)Servlet的例子:計(jì)算圓面積 新建Web Project:項(xiàng)目名稱(chēng):servlet 新建Servlet類(lèi)(繼承HttpServlet類(lèi)):Servlet.java,package .ujn.servletdemo; /省略import public class Servlet extends HttpServlet Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletExc

12、eption, IOException resp.setCharacterEncoding(GBK); PrintWriter pw=resp.getWriter(); double radius = Double.valueOf(req.getParameter(radius); pw.println(圓的面積是:+radius*radius*3.14); Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException re

13、sp.setCharacterEncoding(GBK); PrintWriter pw=resp.getWriter(); double radius = Double.valueOf(req.getParameter(radius); pw.println(圓的面積是get:+radius*radius*3.14); ,JSP和Servlet例子,看個(gè)Servlet的例子:計(jì)算圓面積 編輯web.xml,增加該Servlet的配置:, servletdemo .ujn.servletdemo.Servlet servletdemo /servlet ,JSP和Servlet例子

14、,看個(gè)Servlet的例子:計(jì)算圓面積 新建JSP頁(yè)面:inputservlet.jsp 發(fā)布 測(cè)試POST方式,在瀏覽器中輸入:http:/localhost:8080/servlet/inputservlet.jsp 測(cè)試GET方式,在瀏覽器中輸入:http:/localhost:8080/servlet/servlet?radius=18, 請(qǐng)輸入半徑r: ,JSP和Servlet例子,JSP數(shù)據(jù)定義: JSP程序塊: JSP表達(dá)式 JSP指令 page指令:設(shè)定整個(gè)JSP文件的屬性和相關(guān)功能 include指令:導(dǎo)入包含靜態(tài)的文件(JSP、HTML) taglib指令:標(biāo)簽引用(Str

15、uts2中會(huì)用到),21,JSP和Servlet例子,JSP動(dòng)作 賦值: 向一個(gè)對(duì)象提出請(qǐng)求 尋找或者實(shí)例化一個(gè)JavaBean 設(shè)置JavaBean的屬性 輸出某個(gè)JavaBean的屬性 把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面 根據(jù)瀏覽器類(lèi)型為Java插件生成OBJECT或EMBED標(biāo)記 JSP注釋 輸出注釋?zhuān)?隱藏注釋?zhuān)?該注釋不發(fā)送給用戶,JSP和Servlet例子,JSP內(nèi)置對(duì)象,JSP和Servlet例子,Servlet主要接口和類(lèi) Servlet接口(實(shí)現(xiàn)init、service、destroy方法) GenericServlet類(lèi)(覆寫(xiě)service方法) HttpServlet類(lèi)(覆寫(xiě)doPo

16、st或doGet方法) HttpServletRequest和HttpServletResponse接口 Servlet生命周期 當(dāng)Servlet被裝載到容器后,生命周期開(kāi)始。 首先調(diào)用init()方法進(jìn)行初始化。 初始化后,調(diào)用service()方法,根據(jù)請(qǐng)求的不同調(diào)用不同的doXxx()方法處理客戶請(qǐng)求,并將處理結(jié)果封裝到HttpServletResponse中返回給客戶端。 當(dāng)Servlet實(shí)例從容器中移除時(shí)調(diào)用其destroy()方法,這就是Servlet運(yùn)行的整個(gè)過(guò)程。,思考:MVC模式,怎樣應(yīng)用MVC模式?, MVC 用戶登錄 登錄名: 密碼: , login 登錄成功! 登錄失敗

17、! 數(shù)據(jù)庫(kù)操作失敗,請(qǐng)聯(lián)系管理員。 ,login.jsp,loginok.jsp,思考:MVC模式,JSP+Servlet+JavaBean實(shí)現(xiàn)MVC模式 抽取表示層(JSP) 抽取“領(lǐng)域?qū)ο蟆?實(shí)現(xiàn)“控制層”Servlet 抽取業(yè)務(wù)邏輯層接口 實(shí)現(xiàn)業(yè)務(wù)邏輯層 實(shí)現(xiàn)其他業(yè)務(wù)邏輯層(數(shù)據(jù)庫(kù)連接),思考:MVC模式,login.jsp,成功頁(yè)面,失敗頁(yè)面, String username = request.getParameter(username); String pwd = request.getParameter(pwd); Dlb dl = new Dlb(); dl.setXh(use

18、rname); dl.setKl(pwd); ICheckLoginDomain dlDomain = new CheckLoginDomainImpl(); if(dlDomain.checkLogin(dl) response.sendRedirect(./secondloginok.jsp); else response.sendRedirect(./secondloginfalse.jsp); ,web.xml,LoginServlet,ICheckLoginDomain接口, public boolean checkLogin(Dlb dl) try DBConn conn = ne

19、w DBConn(); String sql = select * from dlb where ; ResultSet rs = conn.executeQuery(sql); if(rs.next() return true; else return false; catch (SQLException e) return false; , private String id; private String xh; private String kl; ,Dlb.java,CheckLoginDomainImpl.java, Class.forName DriverManager.getC

20、onnection createStatement executeQuery ,DBConn.java,思考:MVC模式,MVC模式?jīng)]有給出代碼結(jié)構(gòu)性的具體要求 MVC的控制器是做一個(gè)Servlet,還是多個(gè)Servlet? 跳轉(zhuǎn)頁(yè)面的名稱(chēng)是寫(xiě)在代碼中還是配置文件中?,企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),濟(jì)南大學(xué)信息學(xué)院 劉鹍 ,JSP+Servlet+JavaBean,JSP+Servlet+JavaBean實(shí)現(xiàn)MVC,請(qǐng)求,FORM,POST GET,request,JSP,Servlet,JavaBean,DB,request,object,object,list,getParameter 實(shí)例化對(duì)

21、象 調(diào)用JavaBean,JDBC 數(shù)據(jù)庫(kù) 增刪改查 ,返回結(jié)果 setParameter setAttribute,顯示數(shù)據(jù),session,session,第3章 Struts2應(yīng)用,3.1 Struts 2概述 3.2 Struts 2基本應(yīng)用及工作流程,3.1 Struts 2概述,Struts 2與Struts 1 Webwork + Struts 1 = Struts 2,3.1 Struts 2概述,3.1.1 MVC簡(jiǎn)介 MVC有以下優(yōu)點(diǎn): 多個(gè)視圖可以對(duì)應(yīng)一個(gè)模型。 模型返回的數(shù)據(jù)與顯示邏輯分離。 應(yīng)用被分隔為三層,降低了各層之間的耦合,提供了應(yīng)用的可擴(kuò)展性。 控制層的概念也

22、很有效,由于它把不同的模型和不同的視圖組合在一起,完成不同的請(qǐng)求,因此控制層可以說(shuō)是包含了用戶請(qǐng)求權(quán)限的概念。 MVC更符合軟件工程化管理的精神。不同的層各司其職,每一層的組件具有相同的特征,有利于通過(guò)工程化和工具化產(chǎn)生管理程序代碼。,回顧:JSP+Servlet實(shí)現(xiàn)MVC模式,login.jsp,成功頁(yè)面,失敗頁(yè)面, String username = request.getParameter(username); String pwd = request.getParameter(pwd); Dlb dl = new Dlb(); dl.setXh(username); dl.setKl(

23、pwd); ICheckLoginDomain dlDomain = new CheckLoginDomainImpl(); if(dlDomain.checkLogin(dl) response.sendRedirect(./secondloginok.jsp); else response.sendRedirect(./secondloginfalse.jsp); ,web.xml,LoginServlet,ICheckLoginDomain接口, public boolean checkLogin(Dlb dl) try DBConn conn = new DBConn(); Strin

24、g sql = select * from dlb where ; ResultSet rs = conn.executeQuery(sql); if(rs.next() return true; else return false; catch (SQLException e) return false; , private String id; private String xh; private String kl; ,Dlb.java,CheckLoginDomainImpl.java, Class.forName DriverManager.getConnection createS

25、tatement executeQuery ,DBConn.java,3.1.2 Struts 2體系結(jié)構(gòu),Struts2的MVC原理,3.1.2 Struts 2體系結(jié)構(gòu),3.1.2 Struts 2體系結(jié)構(gòu),Struts 2框架的應(yīng)用著重在控制上。 簡(jiǎn)單的流程是:頁(yè)面控制器頁(yè)面。 最重要的是控制器的取數(shù)據(jù)與處理后傳數(shù)據(jù)的問(wèn)題。 Struts 2的體系結(jié)構(gòu)還可以參考圖3.1,更直觀地展現(xiàn)出其流程。,圖3.1 Struts 2體系結(jié)構(gòu),第3章 Struts2應(yīng)用,3.1 Struts 2概述 3.2 Struts 2基本應(yīng)用及工作流程,3.2.1 簡(jiǎn)單Struts 2實(shí)例開(kāi)發(fā),Struts2開(kāi)

26、發(fā)步驟: 添加Struts2開(kāi)發(fā)能力 添加類(lèi)庫(kù) 添加配置文件 添加過(guò)濾器 開(kāi)發(fā)JSP頁(yè)面 開(kāi)發(fā)Action類(lèi) 配置Actioin類(lèi) 設(shè)置校驗(yàn)器 開(kāi)發(fā)攔截器 國(guó)際化應(yīng)用,3.2.1 簡(jiǎn)單Struts 2實(shí)例開(kāi)發(fā),hello.jsp ,web.xml filter,StrutsAction.java public String execute() return “success”; ,ok.jsp,3.2.1 簡(jiǎn)單Struts 2實(shí)例開(kāi)發(fā),小結(jié):Struts2的開(kāi)發(fā)步驟 新建Web項(xiàng)目 導(dǎo)入類(lèi)庫(kù)(5個(gè)jar) 修改web.xml(配置過(guò)濾器) 新建struts.xml 新建JSP 新建Action

27、類(lèi) 修改struts.xml (package、action、result),3.2.2 Struts 2工作流程及各種文件詳解,1. Struts 2的工作流程 Web瀏覽器請(qǐng)求一個(gè)資源。 過(guò)濾器Dispatcher查找請(qǐng)求,確定適當(dāng)?shù)腁ction。 攔截器自動(dòng)對(duì)請(qǐng)求應(yīng)用通用功能,如驗(yàn)證和文件上傳等操作。 Action的execute方法通常用來(lái)存儲(chǔ)和(或)重新獲得信息(通過(guò)數(shù)據(jù)庫(kù))。 結(jié)果被返回到瀏覽器??赡苁荋TML、圖片、PDF或其他。,3.2.2 Struts 2工作流程及各種文件詳解,web.xml filter Filter-mapping struts.xml package:

28、 action: result: ActionSupport Struts2中Action與容器是完全解耦(不繼承類(lèi)、不實(shí)現(xiàn)接口) 繼承ActionSupport,降低工作難度,充分利用Struts2提供的功能。, struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* ,/welcome.jsp,Struts 2數(shù)據(jù)驗(yàn)證有兩種實(shí)現(xiàn)方式: Action類(lèi)中validate方法 繼承ActionSupport 覆寫(xiě)validate方法(或者新建命名規(guī)則為validata*的方法) 增加“input”的result JSP

29、頁(yè)面中用標(biāo)簽 驗(yàn)證框架(xml) 位置:與Action類(lèi)同一路徑下 命名: -validation.xml -validation.xml 校驗(yàn)器:conversion validator 、date validator 、double validator 、email validator 、expression validator 、fieldexpression validator 、int validator 、regex validator 、required validator 、requiredstring validator 、stringlength validator 、ur

30、l validator 、visitor validator,3.2.3 Struts 2數(shù)據(jù)驗(yàn)證及驗(yàn)證框架的應(yīng)用,補(bǔ)充:在Action中訪問(wèn)Web對(duì)象,在Action中訪問(wèn)Web對(duì)象 通過(guò)ActionContext訪問(wèn) 直接訪問(wèn)Web對(duì)象,public static ActionContext getContext():獲得ActionContext 對(duì)象。 public Map getParameters():從請(qǐng)求對(duì)象(HttpServletRequest)中獲取請(qǐng)求參數(shù)。 public Map getApplication():獲取ServletContext中保存的Attribute

31、。 public Map getSession():獲取HttpSession中保存的Attribute。,Struts2框架提供org.apache.struts2.ServletActionContext輔助類(lèi)來(lái)獲得web對(duì)象。 HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession(); ServletC

32、ontext application = ServletActionContext.getServletContext();,擴(kuò)充:多方法Action的配置,多方法Action的配置及調(diào)用方法有如下幾種: 1為Action配置method屬性 2動(dòng)態(tài)方法調(diào)用 動(dòng)態(tài)方法調(diào)用是指采用如下格式調(diào)用Action中對(duì)應(yīng)的方法: 用這種方式需要先開(kāi)啟一個(gè)開(kāi)關(guān)(struts.xml) 3. 使用通配符映射方式 在struts.xml文件中配置action元素時(shí),它的name、class、method屬性都可支持通配符,這種通配符的方式是另一種形式的動(dòng)態(tài)方法調(diào)用。,控制名!方法名.action, ,回顧:St

33、ruts 2應(yīng)用,Struts 2開(kāi)發(fā)流程: 2個(gè)XML+Action類(lèi)+JSP頁(yè)面+JavaBean 校驗(yàn)器: validate方法或者XML校驗(yàn)器 注意:命名+位置,企業(yè)級(jí)信息系統(tǒng)開(kāi)發(fā)技術(shù),濟(jì)南大學(xué)信息學(xué)院 劉鹍 ,補(bǔ)充:Struts 2配置,Struts2中配置: struts.xml中constant參數(shù)配置: 動(dòng)態(tài)加載struts.xml:,第4章 Hibernate應(yīng)用,4.1 Hibernate概述,1. ORM簡(jiǎn)介 對(duì)象/關(guān)系映射ORM(Object-Relation Mapping) 對(duì)象與對(duì)象之間的關(guān)系對(duì)應(yīng)到數(shù)據(jù)庫(kù)表與表之間的關(guān)系的一種模式。 簡(jiǎn)單地說(shuō),ORM是通過(guò)使用描述

34、對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將Java程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。 對(duì)象和關(guān)系數(shù)據(jù)是業(yè)務(wù)實(shí)現(xiàn)的兩種表現(xiàn)形式,業(yè)務(wù)實(shí)體在內(nèi)存中表現(xiàn)為對(duì)象,在數(shù)據(jù)庫(kù)中表現(xiàn)為關(guān)系數(shù)據(jù)。內(nèi)存中的對(duì)象之間存在著關(guān)聯(lián)和繼承關(guān)系。而在數(shù)據(jù)庫(kù)中,關(guān)系數(shù)據(jù)無(wú)法直接表達(dá)多對(duì)多關(guān)聯(lián)和繼承關(guān)系。因此,ORM系統(tǒng)一般以中間件的形式存在,主要實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)的映射。,4.1 Hibernate概述,2. Hibernate體系結(jié)構(gòu) Hibernate作為模型層/數(shù)據(jù)訪問(wèn)層。 配置文件(hibernate.cfg.xml或perties) 映射文件(*.hbm.xml) POJO類(lèi),圖4.

35、1 Hibernate體系結(jié)構(gòu),把Java對(duì)象或持久化對(duì)象(Persistent Object,PO)映射到數(shù)據(jù)庫(kù)中的數(shù)據(jù)表,然后通過(guò)操作PO,對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行各種操作,其中PO就是POJO(普通Java對(duì)象)加映射文件。,4.2 Hibernate應(yīng)用基礎(chǔ),4.2 Hibernate應(yīng)用基礎(chǔ),Hibernate工作流程,4.2 Hibernate應(yīng)用基礎(chǔ),Hibernate開(kāi)發(fā)步驟: (1)創(chuàng)建Hibernate的配置文件。 (2)創(chuàng)建持久化類(lèi)。 (3)創(chuàng)建對(duì)象-關(guān)系映射文件。 (4)創(chuàng)建SessionFactory。 (5)通過(guò)Hibernate API編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼。 MyEcl

36、ipse中Hibernate開(kāi)發(fā)步驟: (1)新建表,創(chuàng)建數(shù)據(jù)庫(kù)連接。 (2)添加Hibernate開(kāi)發(fā)能力。 (3)反向工程,生成POJO類(lèi)和映射文件。 (4)創(chuàng)建HibernateSessionFactory。 (5)調(diào)用Hibernate API開(kāi)發(fā),4.2.2 Hibernate各種文件的作用,1. POJO類(lèi)和其映射配置文件 2. hibernate.cfg.xml文件 3. HibernateSessionFactory,4.2.2 Hibernate各種文件的作用,1. POJO類(lèi)和其映射配置文件 POJO類(lèi)如下:,package org.model; public class

37、Kcb implements java.io.Serializable private String kch; / 對(duì)應(yīng)表中KCH字段 private String kcm; / 對(duì)應(yīng)表中KCM字段 private Short kxxq; / 對(duì)應(yīng)表中KXXQ字段 private Integer xs; / 對(duì)應(yīng)表中XS字段 private Integer xf; / 對(duì)應(yīng)表中XF字段 public Kcb() / 省略上述屬性的getter和setter方法 ,4.2.2 Hibernate各種文件的作用,POJO類(lèi)中的屬性和表中的字段通過(guò)*.hbm.xml映射文件來(lái)一一對(duì)應(yīng)。本例就是Kcb

38、.hbm.xml,代碼如下:, ,4.2.2 Hibernate各種文件的作用,native:由數(shù)據(jù)庫(kù)對(duì)id賦值。當(dāng)設(shè)置時(shí),數(shù)據(jù)庫(kù)負(fù)責(zé)主鍵id的賦值,最常見(jiàn)的是int型的自增型主鍵。 hilo:通過(guò)hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫(kù)表保存主鍵生成歷史狀態(tài)。 seqhilo:與hi/lo類(lèi)似,通過(guò)hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,只是主鍵歷史狀態(tài)保存在sequence中,適用于支持sequence的數(shù)據(jù)庫(kù),如Oracle。 increment:主鍵按數(shù)值順序遞增。此方式的實(shí)現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?作為主鍵。 i

39、dentity:采用數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制,如SQL Server、MySQL中的自增主鍵生成機(jī)制。 sequence:采用數(shù)據(jù)庫(kù)提供的sequence機(jī)制生成主鍵,如Oracle sequence。 uuid.hex:由Hibernate基于128位唯一值產(chǎn)生算法,根據(jù)當(dāng)前設(shè)備IP、時(shí)間、JVM啟動(dòng)時(shí)間、內(nèi)部自增量等4個(gè)參數(shù)生成十六進(jìn)制數(shù)值(編碼后長(zhǎng)度為32位的字符串表示)作為主鍵。即使是在多實(shí)例并發(fā)運(yùn)行的情況下,這種算法在最大程度上保證了產(chǎn)生id的唯一性。當(dāng)然,重復(fù)的概率在理論上依然存在,只是概率比較小。 uuid.string:與uuid.hex類(lèi)似,只是對(duì)生成的主鍵進(jìn)行編碼(長(zhǎng)度16

40、位)。 foreign:使用外部表的字段作為主鍵。 select:Hibernate 3新引入的主鍵生成機(jī)制,主要針對(duì)遺留系統(tǒng)的改造工程。,4.2.2 Hibernate各種文件的作用,2. hibernate.cfg.xml文件 該文件是Hibernate重要的配置文件,配置該文件主要是配置SessionFractory類(lèi)。, jdbc:mysql:/localhost:3306/javaee org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver liukun liukun com.mysql.jdbc.Driver ,4.2.2

41、Hibernate各種文件的作用,2. hibernate.cfg.xml文件,4.2.2 Hibernate各種文件的作用,3. HibernateSessionFactory HibernateSessionFactory類(lèi)是自定義的SessionFactory,名字可以根據(jù)自己的喜好來(lái)決定。這里用的是HibernateSessionFactory,在Hibernate中,Session負(fù)責(zé)完成對(duì)象持久化操作。該文件負(fù)責(zé)創(chuàng)建和關(guān)閉Session對(duì)象。Session對(duì)象的創(chuàng)建大致需要以下3個(gè)步驟: 初始化Hibernate配置管理類(lèi)Configuration。 通過(guò)Configuration

42、類(lèi)實(shí)例創(chuàng)建Session的工廠類(lèi)SessionFactory。 通過(guò)SessionFactory得到Session實(shí)例(事務(wù))。, / 定義一個(gè)靜態(tài)字符串變量存放Hibernate的配置文件名 private static String CONFIG_FILE_LOCATION=/hibernate.cfg.xml; / 創(chuàng)建一個(gè)線程局部變量對(duì)象 private static final ThreadLocal threadLocal=new ThreadLocal(); private static Configuration configuration=new Configuration(

43、); / 創(chuàng)建一個(gè)靜態(tài)的Configuration對(duì)象 private static org.hibernate.SessionFactory sessionFactory; / 定義一個(gè)靜態(tài)的SessionFactory對(duì)象 private static String configFile=CONFIG_FILE_LOCATION; configuration.configure(configFile); sessionFactory=configuration.buildSessionFactory(); Session session=(sessionFactory != null) ?

44、 sessionFactory.openSession(): null; Transaction ts=session.beginTransaction();,回顧,Hibernate開(kāi)發(fā)步驟: (1)創(chuàng)建Hibernate的配置文件。 (2)創(chuàng)建持久化類(lèi)。 (3)創(chuàng)建對(duì)象-關(guān)系映射文件。 (4)通過(guò)Hibernate API編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼(創(chuàng)建SessionFactory類(lèi))。 Hibernate各種文件 POJO類(lèi)和映射配置文件 Hibernate.cfg.xml文件 HibernateSessionFactory Hibernate核心接口 Configuration、Sessio

45、nFactory、Session、Transaction、Query HQL查詢,4.3 Hibernate關(guān)系映射,4.3 Hibernate關(guān)系映射,一對(duì)一關(guān)聯(lián) 共享主鍵方式 唯一外鍵方式 多對(duì)一單向關(guān)聯(lián) 一對(duì)多雙向關(guān)聯(lián) 多對(duì)多關(guān)聯(lián)(單向、多向),4.4 Hibernate高級(jí)功能,4.4 Hibernate高級(jí)功能,批量處理(插入、更新、刪除) 實(shí)體對(duì)象生命周期 事務(wù)管理 基于JDBC的事務(wù)管理 基于JTA的事務(wù)管理概念 鎖,4.4 Hibernate高級(jí)功能,4.4.1 Hibernate批量處理 1. 批量插入 (1)通過(guò)Hibernate的緩存進(jìn)行批量插入 使用這種方法時(shí),首先要在

46、Hibernate的配置文件hibernate.cfg.xml中設(shè)置批量尺寸屬性hibernate.jdbc.batch_size,且最好關(guān)閉Hibernate的二級(jí)緩存以提高效率。 例如:, 50 / 設(shè)置批量尺寸 false / 關(guān)閉二級(jí)緩存 ,4.4.1 Hibernate批量處理,下面以4.2.1節(jié)的例子中的課程進(jìn)行批量插入為例,說(shuō)明批量插入操作的具體過(guò)程,這里假設(shè)批量插入500個(gè)課程到數(shù)據(jù)中:,Session session=HibernateSessionFactory.getSession(); Transaction ts=session.beginTransaction();

47、 for(int i=0;i500;i+) Kcb kcb=new Kcb(); / 這里設(shè)置課程號(hào)為i,在實(shí)際應(yīng)用中應(yīng)該是被插入的課程對(duì)象 / 已經(jīng)放在集合或數(shù)組中,這里只要取出 kcb.setKch(i+); session.save(kcb); if(i%50=0) / 以50個(gè)課程為一個(gè)批次向數(shù)據(jù)庫(kù)提交,此值應(yīng)與配置的批量尺寸一致 session.flush(); / 將該批量數(shù)據(jù)立即插入數(shù)據(jù)庫(kù)中 session.clear(); / 清空緩存區(qū),釋放內(nèi)存供下批數(shù)據(jù)使用 mit(); HibernateSessionFactory.closeSession();,4.4.1 Hiber

48、nate批量處理,(2)繞過(guò)Hibernate直接調(diào)用JDBC進(jìn)行插入 由于Hibernate只是對(duì)JDBC進(jìn)行了輕量級(jí)的封裝,因此完全可以繞過(guò)Hibernate直接調(diào)用JDBC進(jìn)行批量插入。因此上例可以改成如下代碼:,Session session=HibernateSessionFactory.getSession(); Transaction ts=session.beginTransaction(); Connection conn=session.connection(); try PreparedStatement stmt=conn.prepareStatement(insert

49、 into KCB(KCH) values(?); for (int i=0; i 500; i+) stmt.setString(1, i+); stmt.addBatch(); / 添加到批處理命令中 stmt.executeBatch(); / 執(zhí)行批處理任務(wù) catch (SQLException e) e.printStackTrace(); mit(); HibernateSessionFactory.closeSession();,4.4.1 Hibernate批量處理,2. 批量更新 (1)由Hibernate直接進(jìn)行批量更新 為了使Hibernate的HQL直接支持updat

50、e/delete的批量更新語(yǔ)法,首先要在Hibernate的配置文件hibernate.cfg.xml中設(shè)置HQL/SQL查詢翻譯器屬性hibernate.query.factory_class。, org.hibernate.hql.ast.ASTQueryTranslatorFactory ,4.4.1 Hibernate批量處理,下面使用HQL批量更新把課程表中的XS修改為30。由于這里是用Hibernate操作,故HQL要用類(lèi)對(duì)象及其屬性。,Session session=HibernateSessionFactory.getSession(); Transaction ts=sess

51、ion.beginTransaction(); /在HQL查詢中使用update進(jìn)行批量更新 Query query=session.createQuery(update Kcb set xs=30); query.executeUpdate(); mit(); HibernateSessionFactory.closeSession();,4.4.1 Hibernate批量處理,(2)繞過(guò)Hibernate調(diào)用JDBC進(jìn)行批量更新 由于這里是直接操作數(shù)據(jù)庫(kù),故要操作對(duì)應(yīng)表,而不是類(lèi)。,Session session=HibernateSessionFactory.getSession();

52、Transaction ts=session.beginTransaction(); Connection conn=session.connection(); try Statement stmt=conn.createStatement(); /調(diào)用JDBC的update進(jìn)行批量更新 stmt.executeUpdate(update KCB set XS=30); catch (SQLException e) e.printStackTrace(); mit(); HibernateSessionFactory.closeSession();,4.4.1 Hibernate批量處理,3.

53、 批量刪除 (1)由Hibernate直接進(jìn)行批量刪除 與批量更新一樣,為了使Hibernate的HQL直接支持update/delete的批量刪除語(yǔ)法,首先要在Hibernate的配置文件hibernate.cfg.xml中設(shè)置HQL/SQL查詢翻譯器屬性hibernate.query.factory_class。, org.hibernate.hql.ast.ASTQueryTranslatorFactory ,4.4.1 Hibernate批量處理,下面將使用HQL批量刪除課程表中課程號(hào)大于200的課程。,Session session=HibernateSessionFactory.g

54、etSession(); Transaction ts=session.beginTransaction(); /在HQL查詢中使用delete進(jìn)行批量刪除 Query query=session.createQuery(delete Kcb where kch200); query.executeUpdate(); mit(); HibernateSessionFactory.closeSession();,4.4.1 Hibernate批量處理,(2)繞過(guò)Hibernate調(diào)用JDBC進(jìn)行批量刪除 同樣刪除課程表中課程號(hào)大于200的課程。,Session session=Hibernate

55、SessionFactory.getSession(); Transaction ts=session.beginTransaction(); Connection conn=session.connection(); try Statement stmt= conn.createStatement(); /調(diào)用JDBC的delete進(jìn)行批量刪除 stmt.executeUpdate(delete from KCB where KCH200); catch (SQLException e) / TODO Auto-generated catch block e.printStackTrace(

56、); mit(); HibernateSessionFactory.closeSession();,4.4.2 實(shí)體對(duì)象生命周期,實(shí)體對(duì)象的生命周期有以下3種狀態(tài)。 1transient(瞬時(shí)態(tài)) 瞬時(shí)態(tài),即實(shí)體對(duì)象在內(nèi)存中的存在,與數(shù)據(jù)庫(kù)中的記錄無(wú)關(guān)。如下面的代碼:,Student stu=new Student(); stu.setSnumber(081101); stu.setSname(李方方); stu.setSage(21);,4.4.2 實(shí)體對(duì)象生命周期,實(shí)體對(duì)象的生命周期有以下3種狀態(tài)。 2persisent(持久態(tài)) 在這種狀態(tài)下,實(shí)體對(duì)象的引用被納入Hibernate實(shí)體容

57、器中加以管理。處于持久狀態(tài)的對(duì)象,其變更將由Hibernate固化到數(shù)據(jù)庫(kù)中。例如下面的代碼:,Student stu=new Student(); Student stu1=new Student(); stu.setSnumber(081101); stu.setSname(李方方); stu.setSage(21); stu1.setSnumber(081102); stu1.setSname(程明); stu1.setSage(22);/ 到此為止,stu和stu1均處于瞬時(shí)態(tài) Transaction tx=session.beginTransaction(); / 通過(guò)save()方

58、法,stu對(duì)象轉(zhuǎn)換為持久態(tài),由Hibernate納入實(shí)體管理容器,而stu1仍然處于瞬時(shí)態(tài) session.save(stu); / 事務(wù)提交之后,數(shù)據(jù)庫(kù)表中插入一條學(xué)生的記錄,對(duì)于stu1則無(wú)任何操作 mit(); Transaction tx2=session.beginTransaction(); stu.setSname(李方); stu1.setSname(程明明); mit();,雖然這個(gè)事務(wù)中沒(méi)有顯示調(diào)用session.save()方法保存stu對(duì)象,但是由于stu為持久態(tài),將自動(dòng)被固化到數(shù)據(jù)庫(kù), 因此數(shù)據(jù)庫(kù)的學(xué)號(hào)為“081101” 學(xué)生記錄的姓名已被更改為“李方”,此時(shí)stu1仍然是一個(gè)普通Java對(duì)象,對(duì)數(shù)據(jù)庫(kù)未產(chǎn)生任何影響。,處于瞬時(shí)態(tài)的對(duì)象,可以通過(guò)Session的save()方法轉(zhuǎn)換成持久狀態(tài)。同樣,如果一個(gè)實(shí)體對(duì)象由Hibernate加載,那么,它也處于持久狀態(tài)。例如下面的代碼: / 由Hibernate返回的持久對(duì)象 Student stu=(Student)session.load(Student.class,new Integer(1);,4.4.2 實(shí)體對(duì)象生命周期,3Detached(脫管狀態(tài)) 處于持久態(tài)的對(duì)象,其對(duì)應(yīng)的Session實(shí)例關(guān)閉之后,此對(duì)象就處于脫管狀態(tài)。Session實(shí)例可以看做是持久對(duì)象的宿主,一旦此

溫馨提示

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

評(píng)論

0/150

提交評(píng)論