数据库系统实验项目2014-2015上课程_第1页
数据库系统实验项目2014-2015上课程_第2页
数据库系统实验项目2014-2015上课程_第3页
数据库系统实验项目2014-2015上课程_第4页
数据库系统实验项目2014-2015上课程_第5页
已阅读5页,还剩184页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java2EnterpriseEdition

SSH

FrameworkIntegrationAgendaWeb应用的发展1JSP2Struts23Hibernate4Spring5Web应用的发展Html,CGI,ASP,PHP,JSP,MVC,Ajax.

PartⅠPartⅠWeb应用的发展Web应用程序即基于网页的应用程序,用户无需安装任何专用程序,只用浏览器来访问服务器,通过浏览网页就可以实现业务流程。相对于原来的客户端/服务器(C/S)模式,这种新程序开发模式称为浏览器/服务器(B/S)模式。Web应用的业务逻辑完全在应用服务器端实现,客户端只需要浏览器即可进行业务处理,是一种全新的软件系统构造技术,是当今应用软件的首选体系结构。1.1从静态网页说起最开始的Web只是一个一个的站点(website),它们由很多静态网页堆积而成,内容更新只能通过修改网页本身来实现。静态网页是指没有后台数据库、不含程序、不可交互和不会有任何改变的网页。静态网页的内容变化只能通过重新编辑网页文件来实现。在程序设计中一般又把html网页称为静态网页。HTML是HypertextMarkupLanguage的缩写,中文也就是超文本链接标示语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。1.2动态网页的鼻祖CGI随着互联网的发展越来越多的应用程序转移到Web上去,如:查询数据库、调用程序处理等。真正的Web应用开始出现,必须要有动态网页才能满足用户的需求,最早的动态网页是CGI程序。CGI(Commongateintergace)通用网关接口的简称。它是一段部署在服务器上的程序供同客户端的页面来调用的接口,通俗的讲CGI就像是一座桥把网页和Web服务器中的执行程序连接起来。CGI应用程序的工作原理浏览器通过HTML表单或超链接请求指向一个CGI应用程序的URL。服务器收到请求。服务器执行所指定CGI应用程序。CGI应用程序执行所需要的操作,通常是基于浏览者输人的内容。CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。网络服务器把结果返回到浏览器中。CGI编写语言CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。UNIX环境中:Perl(PracticalExtractionandReportLanguage)BourneShell或者Tcl(ToolCommandLanguage)PHP(HypertextPreprocessor)

Windows环境中:C和C++Perl由于其跨操作系统、易于修改的特性成为了CGI的主流编写语言,以至于一般的“cgi程序”就是Perl程序。1.3三足鼎立虽然CGI可以实现动态网页,但它还是基于传统的编程方式,尤其是不适合网页输出。网页的输出需要用大量的print语句来实现,开发者几乎无法从程序中看出最后输出的网页的是什么样,更无法使用网页编辑工具,程序设计人员与网页开发人员无法分工协助。于是替代CGI专为开发动态网页的语言出现了,目前最热门的有3种:ASP、JSP和PHP。它们占据了Web应用的绝大部分市场,而且各有优势成了三足鼎立之势。1.3.1系出名门ASP和ASP(ActiveServerPage)是微软公司开发的代替CGI脚本程序的一种应用。ASP是在服务器端运行的,可以用来创建和运行动态网页或Web应用程序。ASP网页可以包含HTML标记、普通文本、脚本命令以及COM组件等。利用ASP可以向网页中添加交互式内容(如在线表单),也可以创建使用HTML网页作为用户界面的Web应用程序。ASP在外表上看起来仍然是一个HTML文件,只是在需要变化的部分加入的了一些ASP特有的脚本,这些脚本又称为ASPBean。ASP-工作原理

用户向浏览器地址栏输入网址,默认页面的扩展名是.asp。浏览器向服务器发出请求。服务器引擎开始运行ASP程序。ASP文件按照从上到下的顺序开始处理,执行脚本命令,执行HTML页面内容。页面信息发送到浏览器。1.3.2草根中走出的巨人PHPPHP是:HypertextPreprocessor(超级文本预处理语言)的缩写。PHP是一种开放源代码的脚本编程语言,与ASP和JSP一样都是一种在服务器端执行的嵌入HTML文档的脚本语言,也需要在容器中运行。PHP独特的语法混合了C、Java、Perl以及PHP自创新的语法。PHP具有非常强大的功能,所有的CGI或者JavaScript的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系统。PHP成功的两大秘诀,第一条就是简单,为编程者提供最大的便利。第2条就是“Community(强大的社区)”,众多的个人参与者对PHP的发展提供了非常大的帮助,所以PHP被戏称为草根语言。PHP的最新版本也具备了面向对象语言的特性。1.3.3来自Java阵营JSP和J2EEJSP(JavaServerPage)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的HTML文件中插入Java程序段(Scriptlet)和JSP标签(tag),从而形成JSP文件,文件扩展名就是.jsp。JSP技术使用Java编程语言编写类、标签和Scriptlets,来封装产生动态网页的处理逻辑,可以说JSP的跨平台能力是与生俱来的。JSP也需要自己的运行环境,称为JSP服务器或者JSP容器,目前流行的JSP服务器有开源项目ApacheTomcat、JBoss和厂商提供产品的weblogic、webshpere等。1.4模型-视图-控制器(MVC)设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。MVC正是这样的一个设计模式,它强制性的使应用程序的输入、处理和输出分开。在Web应用中MVC模式被极为广泛的采用,几乎所有的设计人员都或多或少的要遵循或者参考MVC模式。1.4.1MVC简介MVC本来是存在于桌面应用程序中,M(model)是指数据模型,V(View)是指用户界面,C(Control)则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。后来MVC被借用到Web应用开发中去,发现更能发挥它的威力,最后被Sun公司推荐为J2EE平台的一个经典模式。模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。1.4.2MVC的组成部分视图(View)代表用户交互界面,对于Web应用来说就是HTML界面。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。模型(Model)就是业务流程/状态的处理以及业务规则的制定。控制(Controller)可以理解为一个分发器,他来决定选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求,控制层并不做任何的数据处理。1.4.3MVC带来的好处大部分Web应用程序是用ASP,PHP或者JSP开发出来。它们将像数据库查询语句这样的程序代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常比较困难,尤其是维护他人编写的已有代码。MVC从根本上强制性的将它们分开,最大程度上实现了程序代码与网页的分离。多个视图能共享一个模型,现在需要用越来越多的方式来访问应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是WAP界面,用一个模型就能处理它们。由于数据和业务规则从表示层分开,所以可以最大化的重用代码。1.5Ajax的兴起J2EE和.NET等框架使服务器端的设计和开发有了很大的发展,而用户界面的改善却一直比较滞后,总是一个网页转向另一个网页,强制用户进入提交、等待、重新显示的范例,用户的动作总是与服务器的“思考时间”同步。Ajax的出现极大的丰富了用户体验,出现时间不长其影响却非常之大。这里不得不提到Google,Google是Ajax的推广者也是实践者,他的产品中大量使用了Ajax,同时也提供了很好的Ajax的开发包。1.5.1什么是AjaxAjax不是一种新技术,实际上它由几种蓬勃发展的技术以新的强大方式组合而成。Ajax包含:基于XHTML和CSS标准的表示;使用DocumentObjectModel进行动态显示和交互;使用XML和XSLT进行数据交换与处理;使用XMLHttpRequest与服务器进行异步通信;使用JavaScript绑定一切;Ajax是由JesseJamesGarrett创造的,称它为“AsynchronousJavaScript+XML(异步JavaScript和XML)的简写”。1.5.2Ajax的工作原理Ajax的核心是JavaScript对象XmlHttpRequest。该对象在InternetExplorer5中首次引入,它是一种支持异步请求的技术。异步交互意味着在发送请求之后浏览器可以继续处理页面中的事件。数据在后台进行传递,并且可以自动装入到页面中,无需进行页面刷新。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。Ajax常用的框架是:DWR,Ext,jQuery,MooTools,Prototype,Scriptaculous1.5.3Ajax的优势所在Ajax引擎读取信息,并且互动地重写网页,这使网页能无缝化更新,也就是在页面已经下载完毕后改变页面内容,这不仅仅是网页内部的互动还可以从外部获取数据。在以前只能有用户来输入数据提交并刷新网页,但现在使用XMLHTTPRequest可以不重载页面的情况下读写服务器上的数据,使用户的输入达到最少。基于XML的网络通讯也并不是新事物,与FLASH和JAVAApplet相比,Ajax并且不需要插件或下载小程序,不打破沙箱原则,对用户更安全。JSP工作原理,Web.xml,基本语法,编译指令,

动作标签,内置对象,Servlet,Filter,Listener.

PartⅡPartⅡ学习JSPJSP完全以Java语言开发,是纯Java的应用。JSP经服务器转换后与一般的Java类完全相同,而这一特性也使JSP具有了Java所具备的所有优势,如面向对象、简单性、跨平台等等。J2EE提供了良好的框架和指南,在此标准中开发程序层次更加清楚开发更有效率,产品的可用性、可移植性更好。JSP的工作原理JSP服务器管理JSP页面有两个阶段:转换阶段(translationphase)和执行阶段(executionphase)。当一个客户发送请求时,JSP服务器检验JSP页面的语法是否正确,将JSP页面转换为Servlet(Servlet就是用Java语言实现的CGI程序)源文件,然后调用javac工具类编译Servlet源文件生成class文件,这一阶段是转换阶段。JSP目录结构在Tomcat上发布Web应用之前,首先要了解Tomcat的目录结构,Tomcat6.0与以前的版本相比较对目录结构做了很大改动,合并和简化了一些目录,现在的结构简单而且清晰。解读web.xmlJavaWeb应用通过一个基于XML的发布描述符文件来配置其发布信息,这个文件名为web.xml,它存放于WEB-INF子目录下。在web.xml文件中可主要包含如下配置信息:(1)Servlet的定义。(2)Servlet的初始化参数。(3)Servlet以及JSP的映射。(4)Filter的定义。(5)安全域配置参数。(6)e文件清单。(7)资源引用。(8)环境变量的定义。JSP基本的语法JSP网页主要分为脚本与网页数据两部分。网页数据就是JSP服务器不处理的部分,例如:HTML的内容,会直接送到客户端端执行。脚本必须经由JSP服务器处理的部分,而大部分脚本都以XML作为语法基础,并且大小写必须要一致。脚本有4种类型:编译指令、JSP脚本、动作标签和表达式语言(ExpressionLanguage),其中表达式语言又简称为EL是JSP2.0新增的功能。编译指令和动作标签编译指令主要用来提供整个JSP网页相关的信息,并且用来设定JSP网页的相关属性,例如:网页的编码方式、语法、信息等。起始符号为“<%@”,终止符号为“%>”中间部分就是一些指令和一连串的属性设定。JSP有3编译指令:page、include和taglib。动作标签又称为动作元素、动作指令,也可以理解为JSP自带的标准标签库。动作标签利用XML语法格式的标记来控制JSP服务器的行为。利用动作标签可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。起始符号为<jsp:xxx>,终止符号为</jsp:xxx>。JSP的内置对象内置对象也称内建对象、隐含对象,是不需要声明,直接可以在JSP中使用的Java对象。JSP基于Java语言,面向对象也是它的一大特色。JSP的内置对象就是把最常用最重要的几个对象直接创建然后内置了,用户无需再显示的用代码声明,用好JSP内置对象是JSP编程的精髓。JSP有以下九个内置对象:request、response、out、pageContext、session、application、config、page、exception。JSP的内置对象pageContext是javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。request是最常用的内置对象。request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法。session可以存贮用户的状态信息。session在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。JSP的内置对象服务器启动后就产生了这个application对象,当客户再所访问的网站的各个页面之间浏览时,这个application对象都是同一个。JSP4个内置对象的范围(scope),分别为

pageContext<request<session<application 都具有方法setAttribute()和getAttribute()。JSP的内置对象page是java.lang.Object的实例,表示从该页面产生的一个Servlet实例,相当于这个JSP产生的Servlet类的this,可以通过page对象访问实例的属性和函数。在JSP页面中,很少使用page对象。out对象是javax.jsp.JspWriter的一个实例,是一个输出流,用来向客户端输出数据。config表示一个javax.servlet.ServletConfig对象。该对象用于存取Servlet实例的初始化参数。Exception对象用作处理JSP文件执行时发生的错误和异常只有在错误页面里才可以使用,前提是:在页面指令里要有isErrorPage=true的页面中。ServletServlet所提供的功能就是一个Java版本的CGI。JavaServletAPI定义了Servlet和服务器之间的标准接口,这使得Servlet具有跨服务器平台的特性。Servlet通过创建一个框架扩展服务器的能力,采用请求-响应模式提供Web服务。当客户机发送请求至服务器时,服务器将请求信息发送给Servlet,Servlet生成响应内容并将其传给Server服务器,然后再由Server服务器将响应返回给客户端。过滤器(Filter)一个过滤器是一个可以传送请求或修改响应的对象。过滤器并不是Servlet,他们并不实际创建一个请求。他们是请求到达一个Servlet前的预处理程序,在响应离开Servlet后的后处理程序。就像你将在后面的例子中看到的,一个过滤器能够做如下工作。(1)在一个Servlet被调用前截获该调用。(2)在一个Servlet被调用前检查请求。(3)修改在实际请求中提供了可定制请求对象的请求头和请求数据。(4)修改在实际响应中提供了可定制响应对象的响应头和响应数据。(5)在一个Servlet被调用之后截获该调用。监听器(Listener)监听器可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1。监听器还有一个好处是可以在不修改现有系统基础上,增加Web应用程序生命周期事件的跟踪。编写监听器需要实现相应的接口,常用的监听接口:(1)ServletContextAttributeListener(2)ServletContextListener(3)HttpSessionListener(4)HttpSessionAttributeListenerStruts2体系结构,Action,Result,Interceptors,Tags,EL,OGNL,Theme,View,国际化.

PartⅢPartⅢStruts2Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架,顾名思义它提供了一个基本框架和众多组件。它是Apache基金会的一个开源项目,采用MVC模式,能够很好地帮助Java开发者利用J2EE开发Web应用。Struts主要采用Servlet和JSP技术来实现,把Servlet、JSP、自定义标签和信息资源(messageresources)整合到一个统一的框架中。而新的MVC框架WebWork是由OpenSymphony组织开发的,也是致力于组件化和代码重用的J2EEWeb框架,后来Struts与WebWork两合并,称为Sturts2。框架的意义框架可以极大地提高开发效率,RickardOberg(WebWork创造者和JBoss创始人之一)曾经说过:框架的强大之处不是源自它能让你做什么,而是它不能让你做什么。Rickard所说的话解释了什么是框架:框架使混乱的东西变得结构化。Web应用程序框架鼓励开发人员使用一系列框架所提供的基础类和类库,从而避免杂乱的JSP所造成的混乱。这句话对初学者更有意义,框架能保证开发和设计不会偏离正确的方向。Struts2配置Struts2的配置非常简单,在web.xml中配置Struts2提供的过滤器并把所有的请求(/*)映射到这个过滤器。<web-app> <filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2. dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>Struts2体系结构Struts2工作流程客户端提起一个(HttpServletRequest)请求,即在浏览器中输入。请求被提交到一系列(三层)过滤器,ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher。FilterDispatcher是控制器核心,即MVC中的C,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理(request)请求,如果是,则FilterDispatcher把请求的处理交给ActionProxy。ActionProxy通过ConfigurationManager(struts.xml)找到需要调用的Action类.ActionProxy创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor。一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。示例程序——login.jsp(1)<%@pagelanguage=“java”contentType=“text/html;charset=UTF-8”%>

<%@taglibprefix=“s”uri=“/struts-tags”%>

<html>

<head><title><s:textname=“login.jsp.title”></s:text></title></head>

<body>

<s:formaction=“login”>

<tablealign=“center”>

<tr>

<td><s:textfieldname=“username”key=“login.jsp.username”/></td>

<td></td>

</tr>

<tr>

<td><s:passwordname="password"key="login.jsp.password“/></td>

<td></td>

</tr>

<tr>

<td><s:submitkey="login.jsp.login"></s:submit>

</td>

<td><s:resetkey="login.jsp.reset"></s:reset></td>

</tr>

</table></s:form></body></html>示例程序——LoginAction(2)

packagecom.annlee.login.action;importcom.annlee.constant.StrutsConstant;

importcom.opensymphony.xwork2.ActionContext;

importcom.opensymphony.xwork2.ActionSupport;publicclassLoginActionextendsActionSupport

{

privateStringusername;

privateStringpassword;

publicStringgetUsername()

{

returnusername;

}

publicvoidsetUsername(Stringusername)

{

this.username=username;

}

publicStringgetPassword()

{

returnpassword;

}

publicvoidsetPassword(Stringpassword)

{

this.password=password;

}publicStringexecute()throwsException

{

if(getUsername().equals("aaa")

&&getPassword().equals("fff"))

{

ActionContext.getContext().getSession().put("user",getUsername());

returnStrutsConstant.STRING_SUCCESS;

}

else

{

returnStrutsConstant.STRING_ERROR;

}

}}示例程序——web.xml(3)

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appversion="2.4"xmlns=""

xmlns:xsi=""

xsi:schemaLocation="/web-app_2_4.xsd"><!--Struts定义Struts2的FilterDispathcer的Filter-->

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter><!--FilterDispatcher用来初始化struts2并且处理所有的WEB请求-->

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping></web-app>示例程序——struts.xml(4)

<?xmlversion="1.0"encoding="GBK"?>

<!DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"">

<struts>

<packagename="lee"extends="struts-default">

<actionname="login"class="com.annlee.login.action.LoginAction">

<resultname="input">/login.jsp</result>

<resultname="error">/error.jsp</result>

<resultname="success">/mainpage.jsp</result>

</action>

</package>

</struts>示例程序——perties(5)struts.custom.i18n.resources=resource.messageResourceLoginAction-validation.xml(6)<?xmlversion="1.0"encoding="GBK"?>

<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"

""><validators>

<fieldname="username">

<field-validatortype="requiredstring">

<messagekey="login.jsp.username.required"/>

</field-validator>

</field>

<fieldname="password">

<field-validatortype="requiredstring">

<messagekey="login.jsp.password.required"/>

</field-validator>

</field>

</validators>3.1ActionAction是Struts2编程的核心部分,在MVC模式中担任控制部分的角色,在Struts2中使用的最多。ActionSupport是一个让action类能够更好工作的基类,包含了action能够提供的许多可选服务的默认实现,让开发者更容易地开发自己的action类。用ActionContext与Web容器发生联系在Action的接口定义中,excute()方法并没有HttpServletRequest和HttpServletResponse参数,也就是说Struts2的Action不用去依赖于任何Web容器。但在Web应用程序开发中,往往需要在Action里直接获取请求(Request)或会话(Session)的一些信息。Struts2提供了ActionContext对象,与Web容器发生联系。ActionContext是Action执行时的上下文,可以把它看作是一个Map,存放的是Action在执行时需要的对象,如参数(Parameter)、会话(Session)、Servlet上下文、本地化(Locale)信息等。在每次执行Action之前都会创建新的ActionContext,也就是说在同一个线程里ActionContext里的属性是唯一的,这样的Action就可以在多线程中使用。Action驱动模式Struts2中,提供了两种Action驱动模式:Property-Driven(属性驱动)和Model-Driven(模型驱动)。模型驱动的Action很像Struts1中的FormBean,在传递过程中有一个单独的值对象来作为参数的载体,但在Struts2中这个值对象不必再继承任何接口,只要普通JavaBean就可以充当模型部分。Property-Driven就是Action将直接用自己的字段来充当FormBean的功能,如:在Action中直接包含了username属性和它set、get方法。它一般用在页面表单比较简单的情况使用,而且可以直接把属性作为Action的字段。3.2Result类型Result是在Action执行完,一个结果返回后决定发生什么事的类。开发者可以根据他们的应用和环境的需要创建自己的Result类型。所有Result都实现了com.opensymphony.xwork.Result接口,它是所有action执行结果的通用接口。在struts-default.xml中定义了系统提供的缺省Result类型,并把它们映射为action配置中可以引用的名字。页面跳转ResultDispatcherResult是最常用的一种result,也是Struts2默认的result,称为通用result。action执行完后,请求会导向对应的View,相当于<jsp:forword>标签实现的跳转功能。示例:<resultname="success"type="dispatcher"> <paramname="location">foo.jsp</param></result>RedirectResult与DispatcherResult作用类似,也是实现页面跳转。对上次的响应将重定向到指定的位置,可以理解为在客户端跳转用户又重新请求了一个新的URL。Redirect是重新产生一个新的request,因此原来request保存的东西将不再有效。创建action链ChainResult是一种result类型,它基于自己的拦截器stack(堆栈)和result调用一个action,这样允许一个action附带着原来的状态将请求转到目标action。Struts2提供把多个Action按照预先定义好的顺序或者流程链接起来的能力。这个特性通过给指定的Action设置一个ChainResult,然后通过一个ChainingInterceptor拦截目标Action来实现。3.3拦截器(Interceptors)拦截器是Struts2的一个强有力工具,有许多功能都是构建于它之上,如国际化、转换器,校验等。Interceptor是Struts2的一大特色,在执行action之前和之后可以使请求通过一个或多个Interceptor。多个拦截器组合在一起实现某一个功能称为interceptor链(在Struts2中称为拦截器栈InterceptorStack)。interceptor链就是将interceptor按一定的顺序联结成一条链。在访问被拦截的方法或字段时,interceptor链中的interceptor就会按其之前定义的顺序被调用。Interceptor的原理Struts2的interceptor实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相应的interceptor对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。3.4Struts2TagsStruts2的标签库与先取版本有很大进步,不再仅依赖于JSP标签,还包括FreeMarker和Velocity。标签可以分为两类:通用标签和UI标签(也可称为HTML标签)。在使用的时候与使用JSP自定义标签相同第一步就是要导入标签库,Struts2的引用方法简单如下:<%@taglibprefix="s"uri="/struts-tags"%>标签语法Struts2的标签语法非常容易理解,所有的属性最初都是被设置为字符串的,然后它们会解析%{}语法,任何大括号之间的内容都会基于valuestack求值。注意3个规范:(1)所有String类型属性的都会解析%{}中间的字符。(2)所有非字符串类型属性都不会解析,但是会直接被当作一个OGNL表达式求值。(3)对第二个规则的例外情况是如果非字符串属性以“%{”开始并以“}”结束,这些字符在对表达式求值之前会被截取出来。HTML标签HTML标签不过多提供控制结构或逻辑,而是着重于如何使用action类、valuestack或者DataTags中的数据,并且在HTML的中呈现出来。如果说普通标签只是简单的输出结果的话,HTML标签的输出则是因模板(template)而异,它们常常组合在一个作为一个主题(theme),做实际的渲染输出html的工作。模板(templates)和主题(theme)Struts提供的Html标签的核心是主题和模板。首先明确一下3个概念:(1)Tag(标签):小段代码,在JSP、FreeMarker或者Velocity里执行。(2)Template(模板):一个文件,通常使用JSP或者FreeMarker编写,能被特定的标签(HTMLtags)输出。(3)Theme(主题):一系列templates打包在一起,提供通用的功能。模板装载Struts2的模板缺省情况下总是FreeMarker模板(在以前的webwork中是Velocity),标签模板装载方式:首先搜索web应用程序然后搜索classpath。这和其他FreeMarker文件的加载方式一样,例如在result中可以配置使用FreeMarker所为结果页面。模板是基于主题和模板目录来装载的。模板目录使用struts.ui.templateDir属性,在perties里来定义(缺省是_template_).这意味着,如果一个标签使用了ajax主题,下面的两个位置将会被搜索(按照顺序):(1)在web应用中:/template/ajax/template.ftl。(2)在classpath里:/template/ajax/template.ftl。选择主题(theme)主题可以使用不同的规则来选择,按照下面的顺序:(1)特定标签上的主题属性。如:<s:textfieldlabel="%{getText("state.label")}"name="state"theme=”sample”/>(2)一个标签外围的Form标签的主题属性。可以简单地改变form的theme属性来覆盖整个表单的主题设置。这可以轻松地在几个选择的地方使用ajax主题。(3)page会话范围内的以theme为名称的属性。选择主题(theme)(4)request会话范围内的命名为theme的属性。可以基于用户的request来改变主题。如果根据请求的不同而改变结果页面的风格,这可能很有用。(5)session会话范围内的命名为theme的属性。可以基于用户的session来改变theme。如果需要用户能个性化他们的界面感观时,每个用户可以自定义自己的风格,这可能很有用。(6)application会话范围内的命名为theme的属性。(7)perties内的struts.ui.theme属性(缺省是xhtml)。如果想要改变整个应用的主题,调整perties。Struts2自带主题Struts2自带了4中主题,可以根据需要来选择不同的主题,甚至的同一个网页中使用多个主题。1.simple主题2.xhtml主题3.css_xhtml主题4.Ajax主题3.5EL简介EL全名为ExpressionLanguage,它原本是JSTL为方便存取数据所自定义的语言。开始EL只能在JSTL标签中使用,到了JSP2.0之后,EL已经正式纳入成为标准规范之一。因此,只要是支持Servlet2.4/JSP2.0的Container,就都可以在JSP页面中直接使用EL了。使用方法如:<p>Hi!${username}</p>3.6OGNL概述OGNL就是ObjectGraphNavigationLanguage的缩写(对象图形导航语言)。可以从http:获取OGNL的完整文档。Struts2使用标准的上下文命名来进行OGNL表达式求值。OGNL有一个根对象的概念(在Struts2中,它就是ValueStack)。顺着根对象,其他对象被放置在contextmap中(作为上下文引用),包括session、application、request、attr这些map。这些对象与根对象无关,它们只是存在于contextmap的一边(保存在contextmap中)。所以,访问这些对象时需要使用#来告诉OGNL不要在根对象中寻找,而是在其他的上下文中进行寻找.3.7整合各种View技术Velocity、Freemarker、JasperReports、xslt这4种result都是为了整合不同的视图技术而设计的。1.Velocity是一个基于java的模板引擎(templateengine)。2.Freemarker也是一个模板引擎,允许JavaServlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成HTML。3.JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其他IDE报表工具一样来制作报表。4.XSLTResult用XSLT来转换action对象到XML。在Struts中使用FreeMarkerFreeMarker是一个Java模版语言,它是JSP的绝佳替代方案,也是一个开源项目。FreeMarker允许Javaservlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成HTML,由FreeMarker编写的文件后缀名为“.ftl”。在struts中对FreeMarker提供了完美的支持,struts-default.xml已经配置好了将FreeMarkerResult映射到模版文件。在struts.xml配置FreeMarker类型的result:<actionname=“test”class=“com.TestAction"><resultname="success"type="freemarker">test-success.ftl</result></action>模版加载顺序Struts2在两个位置查找FreeMarker模版:Web应用程序目录(Webapplication)、classpath。这个顺序对于在完全编译的jar中提供模版很理想,但是也同时支持在Web应用程序目录中定义这些模版来覆盖jar中的模版文件。事实上,这就是为什么可以覆盖struts中默认的UItags和FormTags的原理。还有可以通过templatePath上下文变量(contextvariable)指定一个路径(文件系统中的任意一个目录)。如果指定了该变量,那么这个目录中的内容将会被优先寻找。在FTL文件中使用标签注意:Struts2提供标签库与表现方式是分离的,所以可以在JSP/FreeMarker/Velocity都可以使用这些标签。例如,在JSP中可能这样创建一个form:<s:formaction="updatePerson"><s:textfieldlabel="Firstname" name="firstName"/><s:submitvalue="Update"/></s:form>Velocity的应用开始使用Velocity,首先需要保证所有的依赖都已经被加入到工程的classpath。其次,struts-default.xml中要配置好VelocityResult,它将影射action和模版。这里给出的例子功能FreeMarker节给出的一样,struts.xml配置如下:<actionname=“test”class=“com.TestAction"><resultname="success"type="velocity">test-success.vm</result></action>变量解析在Velocity中,从几个不同的位置查找变量,顺序如下:(1)值栈(valuestack)(2)action上下文(context)(3)内置对象在VM文件中使用标签Velocity标签是WebWork提供的一般Tag的扩展.只要简单的了解这些标签的访问方式:#sxxx(...)...#end(),就可以马上开始使用了。注意:“#s”后面是没空格的,它与标签名称直接连在一起(虽然不会发生什么混乱但在阅读上实在很不舒服,而且Velocity很遗憾的没有采用主流的xml格式)。在Struts中使用JasperReportsJasperReports(简称JR)是目前应用广泛并且技术领先的java开源报表库。它将.jrxml(XML源文件)编译为.jasper(=编译后版本)文件,它可以被转换为多种格式输出(PDF、CSV、XLS和HTML)。准备JasperReports库在使用JasperReports前,需要将JR库添加到classpath。需要如下文件:dist/jasperreports-X.jarmons-*.jar(allthecommons-exceptmaybeforcommons-logging)lib/itext-X.jarpiler.jar定义值对象先定义一个简单的POJO(简单的Java对象(PlainOldJavaObjects)实际就是普通JavaBeans,使用POJO名称是为了和EJB区分,而且简称比较直接。有一些属性及其gettersetter方法的类,可以作为值对象来使用)。编写action类JasperAction创建了一些人员的列表。pileManager会将jrxml模版编译为.jasper文件。在实际程序中不要这样做,不需要在每个请求中都把jrxml文件编译为jasper文件,只需要执行一次就可以了,发布的时候直接使用jasper文件就可以了,编写Jasper模版JR使用一种特殊的XML页面来定义模版,它会被编译为.jasper文件。这些模版将会被用来设计结果报表。对于更加复杂的模板建议使用Jasper相关的GUI设计器(比如ireport)来定义。将文件存储到工程的目录下的“WW_WEBAPP/jasper”目录(此目录名是固定的不能改变),命名为“our_jasper_template.jrxml”。最重要的:声明了name和lastName字段(这两个属性来自Person.class)。这意味着现在可以在的Jasper模版中使用这些字段。配置struts.xml将action添加到struts.xml,给这个action配置一个类型为jasper的result。Jasper类型的result不是struts2缺省就提供了的,而是作为一个plugin出现,所以在配置中要继承包jasperreports-default。代码JasperReports:struts.xml<!—JasperReports在struts.xml中的配置--><packagename="jasper"extends="jasperreports-default"><actionname="myJasperTest"class="jasperreports.JasperAction"><resultname="success"type="jasper"> <paramname="location">/jasper/jasper_template.jasper</param> <paramname="dataSource">myList</param> <paramname="format">PDF</param></result></action></package>3.8国际化Struts2提供了广泛的功能可以处理构建一个国际化应用程序的技术方面。Struts的国际化功能也可以用其他领域如格式化日期等数据。使用本地的资源文件在Java中用户语言和地区的信息被封装在java.util.Local类中,而action则通过一个定义与com.opensymphony.xwork.LocaleProvider接口的方法判断使用哪个Locale,这个接口中只定义了一个方法:PublicLocalegetLocale()在ActionSupport中,这个方法的默认实现为:通过调用AcitonContext.getContext().getLocale()方法,利用ActionContext获得locale的值。Struts2通过查询HttpServletRequest对象并调用它的getLocale()方法将Local与action调用联系起来。信息的来源为了给不同的地区提供不同的字符串信息,需要一个应用程序的源文件来为给定的locale找到正确的字符串信息。幸运的是,Java以Java.util.ResourceBundle抽象类的方式提供了这些功能。JDK带来了资源包的实现:java.util.PropertyResouceBundle和java.util.ListResouceBundle。这两个类会自动加载含有国际化信息的属性文件(*.properties文件)。当ResourceBundle.getBundle()被调用的时候,会查找正确的ResourceBundle名字,如CreateLocalizedCperties(缺省是英文)或CreateLocalizedCategory_perties(简体中文)。资源包搜索顺序资源包按照下面的顺序搜索:(1)ActionCperties。(2)BaseCperties。(3)Iperties(每一个接口和子接口)。(4)ModelDriven的model(如果实现了ModelDriven),对于model对象从第一步重复执行。(5)perties(类所在的目录和每个父目录直到根目录)。(6)搜索i18nmessagekey自己的层次关系。(7)全局资源属性(struts.custom.i18n.resources),在perties里定义的。添加默认的资源包经常会有一系列的信息用于应用程序中,并且经常要在得到一个本地化的信息是让那个应用程序可以得到它们。Struts提供了几种方法来配置这些本地化信息的:(1)通过配置属性或者编程的方式注册默认资源包的功能。修改perties文件中的:struts.custom.i18n.resources属性如:struts.custom.i18n.resources=org.hibernate.auction.i18n(2)资源包可以被添加到一个启动类中,例如ServletContextListerner,方法是通过对com.LocaclizedTextUtil类做调用:LocaclizedTextUtil.addDefaultResouceBundle(“org.hibernate.auction.i18n”);(3)<s:i18n>标签除了确定的默认资源包搜索之外,可以通过<s:i18n>标签来是一个资源包在JSP页面里可用。使用国际化信息本节将介绍如何利用Struts2的几种技术配合使用来实现国际化。(1)使用<s:text>标签(2)在标签属性中使用getText()(3)格式化日期和数字(4)在校验里使用国际化信息(5)类型转换中使用国际化信息PartⅣHibernateHibernate是一个免费的开源Java包,它使得程序与数据库的交互变得十分容易,更加符合面向对象的设计思想,像数据库中包含普通Java对象一样,而不必考虑如何把它们从数据库表中取出。使开发者可以专注于应用程序的对象和功能,而不必关心如何保存它们或查找这些对象。4.1JDBC简介Java访问数据库最原始的方法是通过JDBC来完成的。JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC是J2EE标准的一部分,它提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。JDBC提供的工具接口java.sql包提供了JDBCAPI,开发者可以通过它们编写数据库的程序代码。DriverManager类:负责管理JDBC驱动程序。使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可以使用,并提供方法来建立与数据库的连接。Connection类:负责维护JSP/JAVA数据库程序和数据库之间的联机。可以建立三个非常有用的类对象。JDBC提供的工具接口Statement类:通过Statement类所提供的方法,可以利用标准的SQL命令,对数据库直接新增、删除或修改操作PreparedStatement类:PreparedStatement类和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令比多次执行时,用PreparedStatement类会比Statement类有效率。ResultSet类:负责存储查询数据库的结果。并提供一系列的方法对数据库进行新增、删除和修改操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。

JDBC访问数据库使用JDBC操作数据库,一般基本都是如下几个步骤:(1)载入数据库驱动。不同的数据库驱动程序是不同的,一般由数据库厂商提供这些驱动程序。(2)建立数据库连接,获得Connection对象。(3)根据SQL语句建立Statement对象或PreparedStatement对象。(4)用Connection对象执行SQL语句,获得结果集ResultSet对象。(5)然后一条一条读取结果集ResultSet对象中的数据,保存在某个Java对象中。(6)如果是修改或者删除操作需要对数据发commit命令。(7)最后依次关闭各个Statement对象和Connection对象。4.2ORM介绍ORM的全称是Object/RelationMapping,即对象/关系映射。面向对象程序设计语言与关系数据库发展不同步时,需要一种中间解决方案,ORM框架就是这样的解决方案。ORM也可理解是一种规范,具体的ORM框架可作为应用程序和数据库的桥梁。ORM并不是一种具体的产品,而是一类框架的总称,它概述了这类框架的基本特征:完成面向对象的程序设计语言到关系数据库的映射。目前ORM框架的产品非常多,包括如下产品:EJB,Hibernate,IBATIS,Oracle的TopLink,OJB,JPA(JavaPersistenceAPI)。ORM带来了什么面向对象的程序设计语言,代表了目前程序设计语言的主流和趋势,其具备非常多的优势,比如:面向对象的建模、操作。多态、继承。摒弃难以理解的过程。简单易用,易理解性。4.3Hibernate项目简介Hibernate是目前最流行的ORM轻量级框架,它是一个面向Java环境的对象/关系数据库映射工具。Hibernate具有面向对象的特征,采用低侵入式的设计,即完全采用普通的Java对象(POJO),而不必继承Hibernate的某个超类或实现Hibernate的某个接口。Hibernate是面向对象的程序设计语言和关系数据库之间的桥梁,真正实现了开发者采用面向对象的方式来操作关系数据库。Hinbernate的传奇经历为了解决ORM的问题,Sun公司首先推出了EntityEJB的解决方案,这是一种优秀的、但备受争议的解决方案——主要问题是EJB的开发相当繁琐,而且需要EJB容器支持,影响了EntityEJB的实际应用。这一时期,iBATIS和Apache组织下的另一个持久层框架,在许多J2EE应用中大展拳脚,但iBATIS并不是真正的O/RMapping,它仅仅停留在SQLMapping映射阶段——并未让开发者能完全运行面向对象的种种优势。在这种背景下,Java开发界在等待一种成熟的O/RMapping解决方案,它应该具有简单易用的特性,最好能开源免费,而且无须任何容器支持,Hibernate应运而生,于是Hibernate迅速在J2EE开发领域流行开来。体系结构(Architecture)Hibernate体系结构的概要图,从这个图可以看出,Hibernate使用数据库和配置信息来为应用程序提供持久化服务(以及持久的对象)。持久化层访问数据库代码与业务逻辑混杂在一起带来了很多问题,这样的程序设计严重显示了程序的可扩展性和适应性,所以有必要要把涉及数据库操作的代码分离出来与业务逻辑分离。就形成了所谓“持久化层”的概念。持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等。持久化类(PersistentClasses)在应用程序中,用来实现业务问题实体的(如,在电子商务应用程序中的Customer和Order)类就是持久化类。不能认为所有的持久化类的实例都是持久的状态——一个实例的状态也可能是临时的或脱管的。如果这些持久化类遵循一些简单的规则,Hibernate能够工作得更好,这些规则也被称作简单传统Java对象(POJO)编程模型。但是这些规则并不是必需的。实际上,Hibernate3对于的持久化类几乎不做任何设想。可以用其他的方法来表达领域模型:比如,使用Map实例的树型结构。实例的状态一个持久化类的实例可能处于三种不同状态中的某一种。这三种状态的定义则与所谓的持久化上下文(persistencecontext)有关。Hibernate的Session对象就是这个所谓的持久化上下文:数据库连接配置Hibernate支持两种数据库连接方式:JDBC和JNDI方式。全局属性配置Hibernate提供很多方便的全局配置,可以通过调整这些参数,控制Hibernate的行为。连接池配置Hibernate自带的连接池算法相当不成熟。它只是为了让使用者快些上手,并不适合用于产品系统或性能测试中。出于最佳性能和稳定性考虑应该使用第三方的连接池。只需要用特定连接池的设置替换hibernate.connection.pool_size即可。这将关闭Hibernate自带的连接池。在实际应用中更多的看到使用Hibernate提供了一个缺省的第三方连接池C3P0,它位于lib目录下。如果设置了hibernate.c3p0.*相关的属性,Hibernate将使用C3P0ConnectionProvider来缓存JDBC连接。Configuration类Configuration类的作用是对Hibernate进行配置,以及对它进行启动,可以完成以下几方面的工作:(1)加载配置文件。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象,(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论