第2章学习JSPJSP完全来以Java语言开发,是纯Java的应用。JSP经服务器转换后与一般的Java类完全相同,而这一特性也使JSP具有了Java所具备的所有优势,如面向对象、简单性、跨平台等等。J2EE提供了良好的框架和指南,在此标准中开发程序层次更加清楚开发更有效率,产品的可用性、可移植性更好。本章将详细介绍JSP的工作原理和如何使用JSP。2.1环境准备这一节里主要介绍如何安装一个JSP运行环境,包括安装JDK和安装运行JSP的服务器Tomcat以及安装开发工具MyEclipse。2.1.1安装JDKJDK(JavaDevelopmentKit)java开发包,又叫做J2SE(Java2SDKStandardEdition),是SUN公司免费提供的,可以从SUN的Java网站上下载到,地址:/j2se/downloads.html,JDK当前最新的版本是J2SDK1.6,载页面中列出了符合多种操作系统的JDK,这里应该选择Windows平台的JDK。下载好的JDK是一个可执行安装程序,可以自定义安装路径选择只安装某些组件,推荐全部按默认值安装。2.1.2安装TomcatTomcat是一个免费并且开源的JSP服务器,它是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、SUN和其他一些公司及个人共同开发而成。由于有了SUN的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现。因为Tomcat技术先进、性能稳定,简单易用,成为目前应用最广泛的JSP服务器。本书所有例子都将以Tomcat为JSP服务器。2.1.3安装MyEclipseEclipse是一种可扩展的开放源代码集成开发环境。是一款非常受欢迎的Java开发工具,使用它开发人员是最多的。Eclipse的最大特点是它能接受各种开放源代码插件。而MyEclipse是对Eclipse的扩展,集成了很多常用的经典插件,支持HTML,Struts,JSF,CSS,Javascript,SQL,Hibernate利用它可以在数据库和J2EE的开发、发布,极大的提高工作效率。2.2第一个JSP程序本节介绍如何在Tomcat服务器上创建和发布JSP程序。这里首先讲解Tomcat的目录结构以及Web应用的目录结构,接着介绍如何将JSP部署到Web应用中,运行第一个JSP程序并测试它。2.2.1JSP的工作原理JSP服务器管理JSP页面有两个阶段:转换阶段(translationphase)和执行阶段(executionphase)。当有一个客户请求到来时,JSP服务器检验JSP页面的语法是否正确,将JSP页面转换为Servlet(Servlet就是用Java语言实现的CGI程序,后面章节将详细介绍)源文件,然后调用javac工具类编译Servlet源文件生成class文件,这一阶段是转换阶段。2.2.2JSP目录结构在Tomcat上发布Web应用之前,首先要了解Tomcat的目录结构,参见这些目录都是的子目录,Tomcat6.0与以前的版本相比较对目录结构做了很大改动,合并和简化了一些目录,现在的结构简单而且清晰。2.2.3解读web.xmlJavaWeb应用通过一个基于XML的发布描述符文件来配置其发布信息,这个文件名为web.xml,它存放于WEB-INF子目录下。在web.xml文件中可主要包含如下配置信息:(1)Servlet的定义。(2)Servlet的初始化参数。(3)Servlet以及JSP的映射。(4)Filter的定义。(5)安全域配置参数。(6)welcome文件清单。(7)资源引用。(8)环境变量的定义。2.2.4编写第一个JSP创建两个JSP文件,其中一个是login.jsp如代码2-2,它显示登录页面,要求输入用户名和口令,这个页面链接到另一个JSP文件是welcome.jsp如代码2-3,显示欢迎页面。JSP的语法将在以后的章节详细讨论,本节侧重于介绍JSP的发布过程。这两个JSP文件都应放在应用jsp_example自己的目录下。2.2.5发布与测试按上一节中表2-2Web应用的目录结构表,在Tomcat的webapps目录下创建目录jsp_example,将写好两个jsp文件和web.xml文件放入指定目录,重新启动tomcat。访问jsp可以看到结果。2.3JSP基本的语法JSP网页主要分为脚本与网页数据两部分。网页数据就是JSP服务器不处理的部分,例如:HTML的内容,会直接送到客户端端执行。脚本必须经由JSP服务器处理的部分,而大部分脚本都以XML作为语法基础,并且大小写必须要一致。脚本有4种类型:编译指令、JSP脚本、动作标签和表达式语言(ExpressionLanguage),其中表达式语言又简称为EL是JSP2.0新增的功能,将在后文的Struts2篇来介绍。2.3.1给JSP加注释一般批注可分为两种:一种为在客户端显示的批注;另外一种就是客户端看不到,只给开发程序员专用的批注。(1)客户端可以看到的批注,以“<!--”开头以“-->”结尾,如:<!--comment[<%=expression%>]-->(2)开发程序员专用的批注,以“<%--”开头以“--%>”结尾,如:<%--comment--%>2.3.2在JSP中声明变量和函数在JSP程序中声明是为了在JSP中声明变量或者函数,是以“<%!”开头以“--%>”结尾,如:<%!declaration;[declaration;]+...%>2.3.3用JSP表达式输出结果JSP表达式是以“<%=”为起始以“%>”为结尾,其中间内容包含一段合法的表达式,如:<%=expression%>前面章节中曾经使用JSP表达式:<fontsize=<%=i%>>读者,您好!</font>欢迎:<%=request.getParameter("username")%>2.3.4用JSP脚本实现程序逻辑JSP脚本又称为scriptlet是包含一个有效的程序段。是以“<%”开头以“%>”结尾,如:<%codefragment%>前面章节中您好,读者的例子就两次用到JSP脚本<HTML><BODY><!—嵌入JSP代码--><%for(inti=3,i<5,i++){%>//jsp脚本
<fontsize=<%=i%>><strong>读者,您好!</strong></font><%}%>//jsp脚本<%--这里所在的东西不会被编译,客户端的原文件中也不会出现--%></BODY></HTML>2.4编译指令和动作标签编译指令主要用来提供整个JSP网页相关的信息,并且用来设定JSP网页的相关属性,例如:网页的编码方式、语法、信息等。起始符号为“<%@”,终止符号为“%>”中间部分就是一些指令和一连串的属性设定。JSP有3编译指令:page、include和taglib。动作标签又称为动作元素、动作指令,也可以理解为JSP自带的标准标签库。动作标签利用XML语法格式的标记来控制JSP服务器的行为。利用动作标签可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。起始符号为<jsp:xxx>,终止符号为</jsp:xxx>。2.4.1使用page指令page指令是最复杂的编译指令,它的主要功能为设定整个JSP网页的属性和相关功能。page指令的基本语法如下:<%@pageattribute1="value1"attribute2="value2"attribute3=…%>如:<%@pageimport="java.util.*java.lang.*"%><%@pagebuffer="5kb"autoFlush="false"%><%@pageerrorPage="error.jsp"%>2.4.2用include指令插入其他JSPInclude指令是在JSP中包含一个静态的文件,同时解析这个文件中的JSP语句。Include指令只有一个参数就是要插入文件的相对路径,语法如下:<%@includefile="relativeURL"%>include指令将会在JSP编译时插入一个包含文本或代码的文件,当使用include指令时,这个包含的过程是静态的。也可以理解为不管要插入的文件内容是什么,简单的把其中所有的内容拷贝过来合并成一个新文件,然后提交给JSP服务器做接下来的工作。由此可以看出,如果两个文件中有重复的Java变量或函数定义,那么合并之后编译要出错,html的标签也同样会相互影响,要避免片段文件中有<html><body>之类的全局标签出现。2.4.3用taglib指令引入标签库taglib指令能够让用户自定义新的标签。这里只是先做一个简单介绍,在后面的章节再详细介绍如何自定义标签和如何使用标签。taglib指令的语法如下:<%@tagliburi="tagLibraryURI"prefix="tagPrefix"%>2.4.4用forward标签跳转页面forward动作把请求转到另外的页面。<jsp:forward>标签只有一个属性page。page属性包含的是一个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,如下面的例子所示:<jsp:forwardpage="/utils/errorReporter.jsp"/><jsp:forwardpage="<%=someJavaExpression%>"/>2.4.5动态插入文件<jsp:include>标签把指定文件插入正在生成的页面。其语法如下:<jsp:includepage="relativeURL"flush="true"/>所谓动态插入正是相对于前面已经介绍过静态include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的<jsp:include>动作不同,插入文件的时间是在页面被请求的时候。这里**入的文件是一个完整的JSP文件而非片段,把两个JSP输出到客户端的结果结合在一起,他们分别被JSP服务器转化为两个不同Java类,因此不存在变量定义方面的冲突。用<jsp:include>标签引入文件的效率要稍微差一点,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头),但它的灵活性却要好得多。2.4.6用标签操作JavaBean本节将涉及3标签,<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>。<jsp:useBean>标签用来装载一个将在JSP页面中使用的JavaBean。这个功能非常有用,因为它使得开发人员既可以发挥Java组件重用的优势,同时也避免了损失直接在JSP实例化对象的复杂操作。<jsp:useBean>标签最简单的语法为:<jsp:useBeanid="name"class="package.class"/>2.4.7其他动作标签<jsp:plugin>标签用来根据浏览器的类型,插入通过Java插件运行JavaApplet所必需的OBJECT或EMBED元素。当JSP网页被编译后送往浏览器执行时,<jsp:plugin>将会根据浏览器的版本替换成<object>标签或者<embed>标签。一般来说,<jsp:plugin>会指定对象Applet或Bean,同样也会指定类的名字和位置,另外还会指定将从哪里下载这个Java组件。<jsp:fallback>一段文字用于:当不能启动Applet或Bean时,那么浏览器会有一段错误信息。2.5JSP的内置对象内置java基础ppt课件对象也称内建对象、隐含对象是不需要声明,直接可以在JSP中使用的Java对象。JSP基于Java语言,面向对象也是它的一大特色。JSP的内置对象就是把最常用最重要的几个对象直接创建然后内置了,用户无需再显示的用代码声明,用好JSP内置对象是JSP编程的精髓。JSP有以下九个内置对象:request、response、out、pageContext、session、application、config、page、exception本节将分别讲述如何使用这些对象。2.5.1使用request对象获取请求request是最常用的内置对象。表示javax.servlet.http.HttpServletRequest对象request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。比较常用的方法:(1)ObjectgetAttribute(Stringname):返回由name指定的属性值,该属性不存在时返回null。(2)voidsetAttribute(Stringname,Objectvalue):在属性列表中添加/删除指定的属性。(3)StringgetParameter(Stringname):获取客户端发送给服务器端的参数值。(4)String[]getParameterValues(Stringname):获得请求中指定参数的所有值。(5)StringgetProtocol():返回请求使用的协议。可以是HTTP1.1或者HTTP1.0。(6)StringRequestURI():返回发出请求的客户端地址,但是不包括请求的参数字符串。(7)StringgetRemoteAddr():获取发出请求的客户端IP地址。(8)HttpSessiongetSession():获取session。2.5.2使用response对象做应答response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法,如比较常见的方法:(1)sendRedirect(URL):可以将用户重定向到一个不同的页面(URL)。(2)setContenType(Stringtype):响应设置内容类型头。(3)addHeader(Stringname,Stringvalue):添加String类型的值到HTTP文件头2.5.3在session对象中保存用户会话session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息。session在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法(比如cookie)知道这是同一个客户,这就需要session对象。2.5.4application对象、pageContext对象和JSP的Scope服务器启动后就产生了这个application对象,当客户再所访问的网站的各个页面之间浏览时,这个application对象都是同一个,可以理解为在一个应用中applications对象是一个全局的Map。pageContext与application对象类似有setAttribute()和getAttribute()方法来保存对象只是它的范围只限于本网页内。这里提到JSP的范围(scope),分别为Page、Request、Session、Application。在这4个范围分别有pageContext,request,session,appliaction4个内置对象对应用来保存对象,方法名都是setAttribute()和getAttribute()。范围的概念十分重要,很多配置都有范围这一属性。2.5.5使用out对象输出out对象是javax.jsp.JspWriter的一个实例,是一个输出流,用来向客户端输出数据。out对象用于各种数据的输出。常用方法如下:(1)out.print():输出各种类型数据。(2)out.newLine():输出一个换行符。(3)out.close():关闭流。2.5.6在exception对象中处理异常Exception对象用作处理JSP文件执行时发生的错误和异常只有在错误页面里才可以使用,前提是:在页面指令里要有isErrorPage=true的页面中;如:<%@pagecontentType="text/html;charset=gb2312"isErrorPage="true"%>则:在此页面中页面中便可使用exception内置对象,用法如下:<%=exception.getMessage()%>2.5.7page对象和config对象page表示从该页面产生的一个Servlet实例,相当于这个JSP产生Servlet类的this,可以通过page对象访问实例的属性和函数config表示一个javax.servlet.ServletConfig对象。该对象用于存取Servlet实例的初始化参数。常用方法如下:(1)StringgetInitParameter(Stringname):返回名称为name的促使参数的值。(2)EnumerationgetInitParameters():返回这个JSP所有的促使参数的名称集合。(3)ServletContextgetContext():返回执行者的Servlet上下文。(4)StringgetServletName():返回Servlet的名称。2.6Servlet就当时功能来说,Servlet所提供的功能就是一个Java版本的CGI。它依旧是一个具有跨平台特性、100%纯Java的Server-Side程序。JavaServletAPI定义了Servlet和服务器之间的一个标准接口,这使得Servlet具有跨服务器平台的特性。2.6.1Servlet简介Servlet通过创建一个框架扩展服务器的能力,采用请求-响应模式提供Web服务。当客户机发送请求至服务器时,服务器将请求信息发送给Servlet,Servlet生成响应内容并将其传给Server服务器,然后再由Server服务器将响应返回给客户端。图展示了Servlet的生命周期,定义了一个Servlet如何被加载、初始化,以及它怎样提供服务和最后销毁的过程。2.6.2创建Servlet所有的Servlet必须直接或间接地实现javax.servlet.Servlet接口,这样才能在Servlet服务器或称为Servlet容器、Servlet引擎上运行,更简单的方法是继承HttpServlet类。功能是在用户请求中获取name参数,然后向客户端输出一个HTML网页。2.6.3过滤器(Filter)一个过滤器是一个可以传送请求或修改响应的对象。过滤器并不是Servlet,他们并不实际创建一个请求。他们是请求到达一个Servlet前的预处理程序,在响应离开Servlet后的后处理程序。就像你将在后面的例子中看到的,一个过滤器能够做如下工作。(1)在一个Servlet被调用前截获该调用。(2)在一个Servlet被调用前检查请求。(3)修改在实际请求中提供了可定制请求对象的请求头和请求数据。(4)修改在实际响应中提供了可定制响应对象的响应头和响应数据。(5)在一个Servlet被调用之后截获该调用。2.6.4监听器(Listener)监听器可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1。监听器还有一个好处是可以在不修改现有系统基础上,增加Web应用程序生命周期事件的跟踪。编写监听器需要实现相应的接口,常用的监听接口:(1)ServletContextAttributeListener监听对ServletContext属性的操作,比如增加/删除/修改。(2)ServletContextListener监听ServletContext,当创建ServletContext时,激发contextInitialized方法;当销毁ServletContext时,激发contextDestroyed方法。(3)HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发sessionCreated方法;当销毁一个Session时,激发sessionDestroye方法。(4)HttpSessionAttributeListener2.7自定义JSP标签前面的章节介绍了JSP的动作标签,使用标签可以处理定向请求以简化JSP页面开发与维护。JSP技术提供了一种封装其它动态类型的机制——自定义标签,它扩展了JSP语言。自定义标签通常发布在标签库中,该库定义了一个自定义标签集并包含实现标签的对象。一些功能可以通过自定义标签来实现,包括对隐含对象的操作,处理表单,访问数据库集其它企业级服务,如e-mail,目录服务,处理流控制。很多JSP开发框架如Struts都提供了丰富的标签库,本节将以一个“helloreader”的例子来介绍如何自定义JSP标签。2.7.1标签库简介标签库涉及到4个基本概念:(1)标签(Tag)(2)标签库(Taglibrary)(3)标签库描述文件(TagLibraryDescriptor)(4)标签处理类(TagHandleClass)2.7.2创建标签的处理类标签处理类必须实现Tag接口的doStartTag和doEndTag方法。当jsp引擎碰到tag标签的开头时,doStartTag被调用,因为简单的tag没有body,所以此方法将返回SKIP_BODY。当JSP引擎碰到tag标签的结尾时,doEndTag被调用,如果余下的页面还要被计算,那它将返回EVAL_PAGE,否则将会返回SKIP_PAGE。一般的做法是不必直接实现Tag接口而是实现TagSupport类,如代码此签的作用是打印字符串“Hello.Reader”。2.7.3创建标签库描述文件标签库文件(TagLibraryDescrptorFile)简称TLD文件是用xml语言描述的。TLD包括了标签库中所有标签的描述,它一般用来被JSP服务器用来校验标签的语法正确性,或者被JSP开发者用来开发新的标签。TLD的文件扩展名必须为.tld,而且必须放在当前Web应用的WEB-INF目录或其子目录中。如代码与上一节中的处理类配合形成一个完整的标签。2.7.4使用自定义标签首先要配置web.xml使用自定义标签<taglib>。<taglib-uri>/WEB-INF/helloreader.tld</taglib-uri><!—加载标签,供页面中使用--><taglib-location>/WEB-INF/helloreader.tld</taglib-location></taglib>2.7.5JSP2.0中新增的标签定义方法JSP2.0提供一些较为简单的方法,让开发人员来撰写自定义标签。JSP2.0提供两种新的机制,分别为SimpleTag和TagFile。SimpleTagSupport类别顾名思义,就是可以处理一些简单的自订标签需求,它是在JSP2.0之后新增的类别,对于一些简单的自订标签页求,您可以继承它来实作标签处理类别,而不用为了处理一些TagSupport、BodyTagSuppourt类别中回传值的问题。2.8小结本章详细介绍JSP开发的基础知识,包括JSP语法、JSP指令和标签、JSP内置对象、自定义标签。JSP和Servlet是用Java开发Web应用的基础,是J2EE的重要的组成部分。在最后两节里我们介绍了Servlet、过滤器和自定义标签,很多开发框架包括后文会介绍的Struts和Spring都为开发人员提供了很多功能强大的过滤器和标签库。第3章Struts2概述Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。顾名思义它给开发者提供了一个基本框架和众多组件,那么在此框架下生产出的产品必然大量节省时间而且产品趋于标准化的,这也正是Struts项目的目的所在。Struts能充分满足应用开发的需求,简单易用,敏捷迅速,成为最成功的J2EE框架之一。3.1Struts项目简介Struts是Apache基金会Jakarta项目组的一个开源项目,它采用MVC模式,能够很好地帮助Java开发者利用J2EE开发Web应用,它能大量减少开发Web应用的时间,提高产品的重用度。Struts主要是采用Servlet和JSP技术来实现的,它把Servlet、JSP、自定义标签和信息资源(messageresources)整合到一个统一的框架中,Struts它只有一个中心控制器,他采用XML定制转向的URL,采用Action来处理逻辑,开发人员利用其进行开发时不用再自己编码实现全套MVC模式。Struts跟Tomcat、Velocity等诸多Apache项目一样是开源软件,这是它的一大优点,使开发者能更深入的了解其内部实现机制。3.2Struts2的前世今生经过多年的发展,Struts已经成为一个高度成熟的框架,不管是稳定性还是可靠性,都得到了广泛的证明。在国内Struts是使用最广泛的一个框架,也成为Java程序员一项基本技能。但毕竟Struts诞生于很多年前,近期Ajax、JSF技术的兴起,原有设计上的缺陷成为它的硬伤,Struts有点跟不上时代的步伐一些。大量新的MVC框架成了Struts强大的在竞争者,最有代表性的莫过于WebWork。WebWork是由OpenSymphony组织开发的,也是致力于组件化和代码重用的J2EEWeb框架。后来Struts与WebWork两大社区决定将两个项目合并,称为Sturts2。3.3Web世界中的MVC本节将着重讲述Web世界中MVC模式是如何应用的,与传统的C/S结构中MVC模式有哪些区别。另外,以网页为视图也为MVC带来了一些变化和发展,产生了新的处理方式前端控制器和页面控制器。3.3.1MVC在Web中的发展在经典MVC中的事件流中,用户与视图(View)进行交互,填入数据并单击按钮,控制器(Controller)接收到来自视图的事件并对模型(Model)进行操作,根据用户提供的数据更新模型(Model)。视图也会接到“模型改变”的事件通知,因此它会随着模型而更新,将模型更新的结果显示给用户。这种模式在单机且实时更新的应用程序中可以起到很好的作用。3.3.2前端控制器和页面控制器MVC也不是一成不变的,一种稍微有些不同的MVC实现已经通过一些框架,譬如Microsoft的ASP.NET,流行起来了。在这种MVC中,并不是令分发器去寻找一个控制器并执行之,而是直接到达视图并且在继续生成视图之前调用相应的控制器。与传统的MVC模式中的前端控制器对应这种模式成为页面控制器。3.4为什么要使用Struts2在Web应用中MVC如此的重要,那么在众多的MVC框架中Struts为何能脱颖而出受到绝大部分程序员的青睐呢?首先是它的技术水平,Struts2由Struts和webwork共同发展而来,集中来两者的优势于一身。其次是它在国内的认知度最高,在选择框架的时候,选择一个大家都普遍熟悉的框架来减少学习时间,无疑也是一个很重要的因素。3.4.1框架的意义框架可以极大地提高开发效率。为了能够满足用户的需求并且应对来自不断改变的商业世界的挑战,在构建Web应用程序的时候充分发挥MVC设计模式的优势。绝大多数的开发人员并不会自己从零开始写一个MVC框架,而是在已有框架(譬如Struts)的基础上进行改进。RickardOberg(WebWork的创造者和JBoss创始人之一)曾经说过:“框架的强大之处不是源自它能让你做什么,而是它不能让你做什么。”Rickard所说的话解释了什么是框架:框架使混乱的东西变得结构化。而Web应用程序框架则鼓励开发人员使用一系列框架所提供的基础类和类库,从而避免杂乱的JSP所造成的混乱。对句话可能对初学者更有意义,应该最先学习和了解的应该是最普通、最经典的应用,而用了框架就能保证开发和设计不会偏离正确的方向。3.4.2Struts2的优势由Struts2的发展过程我们可以看出,Struts2是集中了MVC领域最强大的两个社区的力量,其技术水平可谓是绝无仅有。Struts2又是一个崭新的项目,发展空间很大,当前最新的技术,最新的理念都包含着其中。使用了Struts2就相当于站沿了JavaWeb开发的最前沿,将与Struts2共同前进。在认识度上Struts无疑是国内影响力最大的,运用到特别广泛。以至于把Struts作为JavaWeb开发的必选框架来使用,也是Java开发人员的必备技能之一。另一种考虑,在项目中采用一种比较普遍的框架,也会免去开发人员的学习时间并降低风险。3.5小结本章介绍了在开发过程中运用框架的意义,借助框架可以极大的提高效率、降低风险、优化结构。简要回顾了Struts2的由来和发展历程,Struts是MVC模式在Web应用的**实践,在技术上处于领导地位,在实际项目中被最广泛使用。Struts是最成功的一个J2EE框架之一,非常值得了解和学习。第4章Struts2入门Struts一贯以结构清晰、简单易用而著称,Struts2继承了这一传统。虽然复杂度提高了、功能上增强了,但在安装和配置上甚至比前面的版本更简单。Struts2还提供了丰富的实例程序,使初学者很容易上手,在由浅入深的学习中一点不会感觉困难。4.1下载与安装Struts2本节将介绍如何下载和Struts2,并介绍Struts2包内都包含哪些文件,各自有什么作用,以及如何在Tomcat中安装Struts2。最后发布并测试Struts2自带的例子验证Struts2安装是否成功。4.1.1下载Struts2Struts2的安装非常简单,首先请到/struts下载struts2,应该选择完全发布版(FullDistribution),它包含必要的jar文件、自带的例子和文档,下载后得到的是一个zip文件,文件名为struts-2.XXX-all.zip,将zip包解开,可以看到4目录分别为:(1)src为源代码目录,*.java文件在此存放。Struts2是一个开源项目,可在此目录中所有的代码。(2)docs为文档目录。(3)lib为Struts2提供库目录,里面是提供给开发人员的jar文件,在开发过程中需要把这些jar加入的CLASSPATH。发布的时候需要把这些jar文件拷贝到Web工程的WEB-INF/lib下。(4)apps为例子目录,里面是Struts2给出的几个例子都是*.war文件。4.1.2发布Struts2自带的例子把apps目录下文件名为struts2-blank-2.0.11.war文件拷贝到Tomcat的webapps下。重新启动Tomcat。直接访问http://localhost:8080/struts2-blank-2.0.11/测试这个例子。4.2第一个Struts2程序本节将介绍如何使用Struts2来开发Web应用,还是用一个HelloReader的例子来说明Struts2基础配置和结构。4.2.1配置web.xmlStruts2的配置非常简单,在web.xml中配置Struts2提供的过滤器并把所有的请求(/*)都要经过这个过滤器。如代码所示。代码Sturts2示例:web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-app<display-name>StrutsBlank</display-name><filter><!—添加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>注意:在Struts1.x中web.xml配置了一个全局的Servlet来执行分发的,而在Struts2中是一个过滤器(Filter)。4.2.2编写JSP界面在使用Struts2提供的标签库之前需要在JSP中引入这个标签库,前缀定义为“s”,如代码所示,例子中用到了一个“property”标签来显示message这个属性值。代码Sturts2示例:helloreader.jsp<!—引入Struts标签--><%@taglibprefix="s"uri="/struts-tags"%><html><head><title>HelloReader!</title></head><body><!—使用property标签来获取Action中的属性,直接显示在页面中-><h2><s:propertyvalue="message"/></h2></body></html>4.2.3编写Action类Action类是最基本的逻辑处理单元,在MVC模式中分发器分发给不同的Action类,来处理请求。在Struts2中Action类不必再实现Action接口,可以是任何类。但一般的还是需要继承ActionSupport类,后文中会讲到,因为ActionSupport提供了很多很好的基本功能如错误信息处理等。4.2.4添加映射到配置文件Struts2的配置文件是struts.xml,所有请求和分发以及其他配置都在这个文件中定义,struts.xml文件应该放在WEB-INF目录下。在Struts1.x中这个文件的文件名为struts-config.xml,而在Webwork中这个文件名为xwork.xml。如代码4-4所示,配置了一个名称为HelloReader的action,处理类是tutorial.HelloReader,处理后的结果转到HelloReader.jsp。4.3发布与测试本节将展示在Tomcat中如何发布一个借助Struts2框架开发的应用程序,并展示测试结果。最后通过分析这个例子是如何工作的,说明Struts2各个模块之间的关系,请求是如何在其间流转的。4.3.1发布在Tomcat的webapps目录下创建一个Web应用目录struts2,JSP文件应该放在这个目录下。在此目录下创建子目录WEB-INF,web.xml文件应该在此目录下。程序中编写的类class文件和struts.xml文件应该放在WEB-INF/classes目录下,最重要的是要把Struts2提供的jar文件拷贝到WEB-INF/lib下,这样在程序中才能引用到Struts2的API。4.3.2测试结果重新启动Tomcat,访问http://localhost:8080/struts2/HelloReader.action,4.3.3分析处理流程这个例子的处理流程如图所示。4.4小结本章从Struts2的下载安装开始叙述,以一个简单的例子带领读者走入Struts2世界,并详细解读了Struts2最基本的业务处理流程:受用户请求、处理业务逻辑和返回结果页面。分析了请求如何在各个模块中流转。例子虽然简单,但包含了Struts2的几大要素,Action、标签库、过滤器。下一章将详细说明Struts2的这些核心概念。第5章Struts2的核心概念本章将深入探讨了Struts2的核心概念,首先介绍的是Struts2的体系结构和几个重要的配置文件,并会举例说明Struts2的核心对象如何配置。然后介绍Struts2最重要的3个组成部分Action、Result、Interceptor(拦截器)的原理和使用方法。5.1术语概述Action在Struts2中是负责Web应用程序中具体逻辑实现的。Action是一个Java类,一般的继承于com.opensymphony.xwork.ActionSupport类,这个类在Struts2的Dispatcher接受到HTTP请求的时候被调用。当一个action执行完毕之后,它将返回一个返回码,譬如“SUCCESS”“INPUT”或者其他“返回代码”。这些“返回代码”通过查找struts.xml中的定义告诉Struts2下一步该做什么而这个下一步就称为result。Struts2支持许多种不同的result类型,比如返回结果页面给用户。可选择的显示模板技术有JSP、Velocity或者是FreeMarker。5.2Struts2的体系结构Struts2的核心体系结构如图5.1所示。用户在Struts2框架下只需编写自己的Action类来处理逻辑、编写JSP页面(或者其他方式)来展示用户界面和在struts.xml配置映射关系就可以完成基本的业务流程。5.3Struts2的配置文件Struts2框架主要有两个核心配置文件:perties和struts.xml。struts.xml与Struts1版本中的struts-config.xml非常类似,主要负责管理应用中的Action映射,以及该Action包含的Result定义等,而perties文件则定义了Struts2框架的全局属性。所有的配置文件说明见表所示,图展示了几个配置文件所在位置和相互关系。5.3.1全局配置文件--perties
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/668.html