《JavaEE架构设计与开发教程》课件-第5章Struts2开发_第1页
《JavaEE架构设计与开发教程》课件-第5章Struts2开发_第2页
《JavaEE架构设计与开发教程》课件-第5章Struts2开发_第3页
《JavaEE架构设计与开发教程》课件-第5章Struts2开发_第4页
《JavaEE架构设计与开发教程》课件-第5章Struts2开发_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

Struts2开发第五章熟悉Struts的概念以及与MVC的关系掌握Struts工作原理以及运行过程学习内容掌握Struts2拦截器的使用了解国际化、标签校验以及文件上传等内容熟练配置Struts.xmlStruts2简述1Struts2工作原理2Struts2配置文件

3拦截器与常用标签4目录CONTENTS国际化5Struts2简述Struts2简介Struts2技术优势1Struts2优、缺点Struts2简述Struts2简介Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2简述Struts2简介MVC(Model-View-Controller)作为一种流行的软件设计模式,它把系统分为3个部分:模型(Model)、视图(View)、控制器(Controller)Struts2简述Struts2简介Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。虽然从Struts1到Struts2有着太大的变化,但是相对于WebWork,Struts2的变化很小。Struts2简述Struts2技术优势Struts2是一个非常优秀的MVC框架,基于Model2设计模型。Strust2有以下核心功能:允许POJO(PlainOldJavaObjects)对象作为Action。Action的execute方法不再与ServletAPI耦合,更易测试。支持更多视图技术(JSP、FreeMarker、Velocity)。基于SpringAOP思想的拦截器机制,更易扩展更强大、更易用输入校验功能Struts2简述Struts2技术优势SSH框架系统从职责上分为四层:表示层、业务逻辑层、数据持久层和实体层。Struts2作为表现层的框架设计存在,Hibernate处于数据持久层,Spring处于业务逻辑层,担任连接Struts和Hibernate桥梁的角色。系统的整个层次关系可以一目了然。Struts2简述Struts2技术优势Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/serverHTTP交换协议,这样我们可以在业务逻辑部分使用功能强大的Java语言进行程序设计。二是提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所有请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。Struts2简述Struts2优、缺点优点:在软件设计上Struts2的应用可以不依赖于ServletAPI和StrutsAPI。Struts2提供了很多拦截器,实现如参数拦截注入等功能。提供了类型转换器,可以把特殊的请求参数转换成需要的类型。提供多种表现层技术,如:JSP、freeMarker、Velocity等。Struts2的输入校验可以对指定某个方法进行校验;提供了全局范围、包范围和Action范围的国际化资源文件管理实现。Struts2简述Struts2优、缺点缺点:转到表示层时,需要配置forward,每次修改配置之后,要求重新部署整个项目,如果业务变更复杂频繁的系统,这样的操作简单不可想象。Struts的Action必需是线程安全的,它仅仅允许一个实例去处理所有的请求。所以Action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。测试不方便。Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具StrutsTestCase可以实现它的单元测试。Struts2简述Struts2优、缺点缺点:类型的转换。Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。对Servlet的依赖性过强。Struts处理Action时必需要依赖ServletRequest和ServletResponse,所有它摆脱不了Servlet容器。对事件支持不够。在Struts中是一个表单只能对应一个事件,Struts这种事件方式称为applicationevent。Struts2工作原理组成部分工作原理2Struts2工作原理组成部分Struts2是一个典型的MVC架构,在Struts2中,其中M(服务层)用Java程序来实现,V(表示层)用JSP来实现,C(控制层)用Action来实现。Struts本身不提供模型组件,但可以支持Spring和Hibernate等框架,与其他框架组成应用。Struts2工作原理ActionServlet,前端控制器。它的目的是:根据相应的规则截取Http请求的URL

,并将Http请求分发到相应的Action处理。ActionForm,相当于实体。收集表单数据,将表单数据转换成相应的数据类型。Action,业务层控制器。它有三个主要功能:取得表单数据

,调用业务逻辑和返回转向信息。组成部分Struts2工作原理一个请求在Struts2框架中的处理大概分为以下几个步骤

:客户端初始化一个指向Servlet容器(例如Tomcat)的请求。这个请求经过一系列的过滤器(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMeshPlugin)

。工作原理Struts2工作原理接着控制器FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

。如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

代理对象。工作原理Struts2工作原理ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类

,我们一般是从struts.xml配置中读取。ActionProxy创建一个ActionInvocation的实例。工作原理Struts2工作原理ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。工作原理Struts2配置文件简述常用常量3编辑struts2.xml文件Bean配置Package配置编辑web.xml文件ActionStruts2配置文件简述Struts2核心配置文件是struts.xml,该文件主要负责管理业务控制器Action。Struts2有很多配置文件。在服务器开启时,加载web.xml文件,然后初始化核心过滤器,核心过滤器的init初始化方法中,提供了加载配置文件的方法。所以服务器一启动,这些配置文件就已经加载到内存中了。Struts2配置文件简述常用的配置文件:perties:该文件保存在struts2-core-2.3.31.jar中的org.apache.struts2包里面,里面保存一些常量。struts-default.xml:该文件保存在struts2-core-2.3.31.jar中定义了一些struts2的基础Bean和struts2内建支持的结果类型,还有struts2内建的拦截器(拦截器有很多,分为一系列的拦截器块,我们默认使用defaultStack拦截器块)。Struts2配置文件简述常用的配置文件:struts-plugin.xml:该文件保存在struts-xxx-2.3.31.jar等struts2插件jar包中我们整合spring等框架时,都需要这种插件的jar包。struts.xml:是Web应用默认的自己的struts2配置文件。perties:是Struts2的默认配置文件。web.xml:Web应用的配置文件。Struts2配置文件常用常量Struts2的配置文件中有一些常用的常量。struts.objectFactory.spring.autoWire:和spring框架整合有关。struts.multipart.parser:指定文件上传用的组件。默认为jakarta(即common-fileupload上传组件)struts.multipart.saveDir:指定上传文件的临时保存路径struts.multipart.maxSize:指定上传中整个请求所允许上传的最大字节数struts.serve.static.browserCache:设置浏览器是否缓存静态内容,当应用处于开发阶段时,我们希望不缓存,可设置为falseStruts2配置文件编辑struts.xml文件框架的核心配置文件就是这个默认的struts.xml文件,在这个默认的配置文件里可以根据需要再包括其它一些配置文件。在通常的应用开发中,有时想为每个不同的模块单独配置一个struts.xml文件,这样有利于管理和维护。这也是开发者要配置的主要文件。在struts.xml文件中配置,使用<constant/>配置常量。内部属性包括name:常量名和value:常量值。<constantname=""value=""/>Struts2配置文件编辑struts.xml文件为了避免随着应用规模的增加,而导致的struts.xml文件过于庞大,臃肿,从而是该文件的可读性下降,可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他的配置文件。Struts2配置文件编辑web.xml文件编写JSP页面:前三个都请求失败,最后.do结尾的请求成功。这也验证了我们说的配置文件的加载顺序。Struts2配置文件Bean配置我们深入Struts2配置文件中,首先先了解下Bean配置。Struts2是一个高度可扩展的框架。框架的大部分核心组件,并不是硬编码写在代码中,而是以自己的IOC容器管理框架的核心组件。Struts2以可配置的方式来管理核心组件,从而允许开发者很方便的扩展该框架的核心组件,当开发者需要扩展,替换核心组件时,只需要提供自己组件的实现类,将其部署在Struts2的IoC容器中即可。struts-default.xml文件中配置了大量的Struts2框架的内置Bean。Struts2配置文件Bean配置我们在struts.xml中定义Bean时,通常有两个作用:一、创建该Bean的实例,将该实例作为Struts2框架的核心组件使用。二、Bean包含的静态方法需要注入一个值。可以很方便地允许不创建某个类的实例,却可以接受框架常量。Struts2配置文件Bean配置使用<bean/>元素在struts.xml定义Bean。包含属性如下:class:必填属性。指定了Bean实例的实现类type:可选属性,制定了Bean实例实现的struts2规范,该规范通过某个接口实现。name:可选属性。Bean实例的名字static:可选属性。指定Bean是否使用静态方法注入。scope:可选属性。指定Bean实例的作用域optional:可选属性。指定该Bean是否是一个可选Bean。Struts2配置文件Package配置struts2框架的核心组件就是Action、拦截器等。struts2使用包来管理Action,拦截器等。其中包含以下属性:name:配置包时,必须指定name属性,是包的唯一标识。extends:属性值必须是另一个包的name属性。指定extends属性表示继承其他包。子包可以集成一个或多个父包中的拦截器、拦截器栈、Action等配置。abstract:可选属性。指定该包是否是抽象包,抽象包不能包含Action定义。Struts2配置文件Package配置namespace:可选属性,定义该包的命名空间。一个web应用中可能出现同名Action。同一个命名空间中不能有同名Action,某个包指定命名空间后,该包下的所有Action的url地址必须是命名空间+Action。例如我们加一个命名空间,则访问这个动作的时候必须加上命名空间。Struts2配置文件Package配置如果包没有指定命名空间,则默认的命名空间为"",根命名空间为"/"。包的执行顺序如下:搜索配置文件所有package的namespace;先去匹配命名空间/user/my,如果匹配到,就查找Action,查找到就执行,没查找到会到默认命名空间查找Action,查找到执行,没找到报错。Struts2配置文件Package配置如果没匹配到该命名空间,就接着匹配命名空间/user,如果匹配到,就查找Action,查找到就执行,没查找到会到默认命名空间查找Action,查找到执行,没找到报错。没匹配到就去根命名空间(“/”)查找action,没查找到会到默认命名空间查找Action,查找到执行,没找到报错。没匹配到任何命名空间直接报错。Struts2配置文件Action开发者需要提供大量的Action,并在struts.xml中配置Action类里包含了对用户请求的处理逻辑,因为我们也称Action为业务控制器。Struts2配置文件Action创建一个类实现Action接口,该接口定义了五个字符串常量。还包括一个Stringexecute()方法。还有一种方法,就是继承Action接口的实现类ActionSupport,该类提供了很多的默认方法,包括获取国际化信息,数据校验的方法等。大大简化了Action的开发,我们在开发中多数选择这种方法。编写Action处理类Struts2配置文件Action配置Action在struts.xml文件中配置。struts2使用包来组织action。所以action定义放在包定义的下面。定义方法为<action/>,内部属性有:name:action的名字;class:可选,指定该action的实现类。如果我们不指定class属性,系统默认使用ActionSupport类。我们可以使用<default-class-refclass=""></default-class-ref>来指定默认的动作处理类。Struts2配置文件ActionAction的方法调用我们继承的ActionSupport,当我们执行Action的时候,默认执行他的execute方法,现在我们来执行自己的方法。<action>中有一个method属性,可以指定用户调用哪个方法。拦截器与常用标签拦截器简介实现拦截器原理4Struts2常用标签

标签使用拦截器功能拦截器配置拦截器与常用标签拦截器简介Struts2框架的大部分核心功能都是通过拦截器来实现的,如防止重复提交、类型转换、对象封装、校验、文件上传、页面预装载等等。拦截器与常用标签拦截器简介Struts2拦截器是在访问某个Action或Action的某个方法时,对字段之前或之后实施拦截,功能类似于web.xml文件中的Filter,能对用户的请求进行拦截,通过拦截用户的请求来实现对页面的控制。每一个拦截器都是独立装载的(pluggable),我们可以根据实际的需要为每一个action配置它所需要的拦截器。拦截器与常用标签拦截器简介Struts2拦截器功能类似于Servlet过滤器。在Action执行execute方法前,Struts2会首先执行struts.xml中引用的拦截器,如果有多个拦截器则会按照上下顺序依次执行。Struts2的拦截器必须从erceptor.Interceptor中实现该接口,在被定义的拦截器中有下面三个方法需要被实现:拦截器与常用标签拦截器简介自定义的拦截器需要重写上面三个方法。另外Struts2的拦截器配置文件struts.xml,它是继承了原始文件struts-default.xml文件的,这样在相应的<package>中就会自动拥有struts-default.xml中的所有配置信息了。具体代码如下:<packagename="demo"extends="struts-default">...</package>拦截器与常用标签拦截器简介拦截器的工作原理如图所示,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。拦截器与常用标签拦截器配置拦截器的配置非常简单,主要是在struts.xml文件中来定义的。定义拦截器使用<interceptor…/>元素。其格式为:在拦截器实现类中会定义一些参数时,格式为:拦截器与常用标签拦截器配置多个拦截器一起使用来进行过滤时,定义拦截器栈用<interceptor-stackname=“拦截器栈名”/>元素,其格式为:拦截器与常用标签拦截器配置当在struts.xml中配置一个包时,可以为其指定默认的拦截器,如果为包指定了某个拦截器,则该拦截器会对每个Action起作用,但是如果显式地为某个Action配置了拦截器,则默认的拦截器将不会起作用。默认拦截器用<default-interceptor-refname=””>元素来定义。默认拦截器的配制方法:拦截器与常用标签实现拦截器原理Struts

2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts

2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后封装成一个列表,最后一个一个地调用列表中的拦截器。事实上,我们之所以能够如此灵活地使用拦截器,完全归功于“动态代理”的使用。动态代理是代理对象根据客户的需求做出不同的处理。对于客户来说,只要知道一个代理对象就行了。拦截器与常用标签实现拦截器原理那在Struts2中,拦截器是如何通过动态代理被调用的呢?当Action请求到来的时候,会由系统的代理生成一个Action的代理对象。再由这个代理对象调用Action的execute()或指定的方法,并在struts.xml中查找与该Action对应的拦截器。拦截器与常用标签实现拦截器原理如果有对应的拦截器,就在Action的方法执行前(后)调用这些拦截器;如果没有对应的拦截器则执行Action的方法。其中系统对于拦截器的调用,是通过ActionInvocation来实现的。核心代码如下:拦截器与常用标签实现拦截器原理Interceptor的接口定义没有什么特别的地方,除了init和destory方法以外,intercept方法是实现整个拦截器机制的核心方法。而它所依赖的参数ActionInvocation则是Action调度者。我们再来看看一个典型的Interceptor的抽象实现类:拦截器与常用标签实现拦截器原理在这个实现类中,实际上已经实现了最简单的拦截器的雏形。这里需要指出的是一个很重要的方法invocation.invoke()。这是ActionInvocation中的方法,而ActionInvocation是Action调度者,所以这个方法具备以下2层含义:如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。拦截器与常用标签实现拦截器原理invocation.invoke()这个方法其实是整个拦截器框架的实现核心。基于这样的实现机制,我们还可以得到下面2个非常重要的推论:如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。拦截器与常用标签拦截器功能Struts2(XWork)提供的拦截器的功能说明:拦截器与常用标签拦截器功能拦截器与常用标签拦截器功能拦截器与常用标签Struts2常用标签在JavaWeb中,Struts2标签库是一个比较完善,而且功能强大的标签库,它将所有标签都统一到一个标签库中,从而简化了标签的使用,它还提供主题和模板的支持,极大地简化了视图页面代码的编写,同时它还提供对Ajax的支持,大大的丰富了视图的表现效果。拦截器与常用标签Struts2常用标签Struts2默认提供了4种主题,分别为Simple、XHTML、Css_xhtml和Ajax。拦截器与常用标签Struts2常用标签Struts2框架的标签库可以分为以下两类:非用户界面标签(非UI标签):主要用于数据访问,逻辑控制。数据访问标签:主要包含用于输出值栈(ValueStack)中的值,完成国际化等功能的标签。流程控制标签:主要包含用于实现分支,循环等流程控制的标签。用户界面标签(UI标签):主要用来生成HTML元素的标签。表单标签:主要用于生成HTML页面的FORM元素,以及普通表单元素的标签。非表单标签:主要用于生成页面上的tree,Tab页等。Ajax标签:用于支持Ajax效果。拦截器与常用标签Struts2常用标签下面介绍几种主题:Simple主题:这是最简单的主题,使用该主题时,每个UI标签只生成最基本的HTML元素,没有任何附加功能。XHTML主题:这是Struts2的默认主题,它对Simple主题进行了扩展,提供了布局功能、Label显示名称、以及与验证框架和国际化框架的集成。Css_xhtml:该主题是XHTML的扩展,在对XHTML的基础之上添加对CSS的支持和控制。Ajax:继承自对XHTML,提供Ajax支持。拦截器与常用标签标签使用使用标签,需要引入Struts2核心jar包,我们可以在struts2-core-2.0.11.jar压缩文件的META-INF目录下找到struts-tags.tld文件,这个文件里定义了Struts2的标签。在JSP中使用Struts2的标志,先要指明标志的引入。通过JSP的代码的顶部加入以下的代码:<%@taglibprefix="s"uri="/struts-tags"%>拦截器与常用标签标签使用常用标签的应用如下所示:基础表单标签拦截器与常用标签标签使用常用标签的应用如下所示:迭代标签拦截器与常用标签标签使用常用标签的应用如下所示:单选按钮拦截器与常用标签标签使用常用标签的应用如下所示:复选框拦截器与常用标签标签使用常用标签的应用如下所示:下拉列表拦截器与常用标签标签使用常用标签的应用如下所示:多重迭代标签拦截器与常用标签标签使用常用标签的应用如下所示:多重迭代标签国际化国际化简介国际化配置5常用SQL语句MyEclipseMySQL国际化国际化简介国际化的英文为Internationalization,所以它又称为

温馨提示

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

评论

0/150

提交评论