购买

¥30.0

加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 ok-Java高级框架应用开发案例教程(三)

ok-Java高级框架应用开发案例教程(三).ppt

ok-Java高级框架应用开发案例教程(三)

烟雨梦兮
2018-10-14 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《ok-Java高级框架应用开发案例教程(三)ppt》,可适用于IT/计算机领域

CONFIDENTIALwwwascenttechcomcnJava高级框架应用开发案例教程(三)Struts基础*北京亚思晟科技有限公司主要内容MVC模式概述MVC与Struts映射struts的工作流程和配置文件创建Controller组件创建Model组件创建View组件Struts开发步骤项目案例*北京亚思晟科技有限公司MVC模式概述我们在计算机软件工程领域常常提到设计模式(DesignPattern)了。那么什么是模式(Pattern)呢?一般说来模式是指一种从一个一再出现的问题背景中抽象出来的解决问题的固定方案而这个问题背景不应该是绝对的或者说是不固定的。很多时候看来不相关的问题会有相同的问题背景从而需要应用相同的模式来解决。设计模式指的是在软件的建模和设计过程中运用到的模式。设计模式中很多种方法其实很早就出现了并且应用得的也比较多。但是直到GoF的书出来之前并没有一种统一的认识。或者说那时候并没有对模式形成一个概念这些方法还仅仅是处在经验阶段并没有被系统地整理形成一种理论。每一个设计模式都系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。这样我们只要清楚这些设计模式就可以完全或者说很大程度上吸收了那些蕴含在模式中的宝贵经验对面向对象的系统能够有更为完善的了解。更为重要的是这些模式都可以直接用来指导面向对象系统中至关重要的对象建模问题。如果有相同的问题背景那么很简单直接套用这些模式就可以了这可以省去你很多的工作量。*北京亚思晟科技有限公司MVC模式概述MVC模式就是一种很常见的设计模式。所谓的MVC模式即模型视图控制器(modelviewcontroller)模式。其结构图如图所示Model端在MVC中模型是执行某些任务的代码而这部分代码并没有任何逻辑决定用户端的表示方法。Model只有纯粹的功能性接口也就是一系列的公共方法通过这些公共方法便可以取得模型端的所有功能。*北京亚思晟科技有限公司MVC模式概述View端在MVC模式里一个Model可以有几个View端而实际上多个View端是使用MVC的原始动机。使用MVC模式可以允许多于一个的View端存在并可以在需要的时候动态注册所需要的ViewController端MVC模式的视图端是与MVC的控制器结合使用的。当用户端与相应的视图发生交互时用户可以通过视窗更新模型的状态而这种更新是通过ion有效。局部结果是通过在<action…>元素中指定<result…>元素来配置的一个<action…>元素可以有多个<result…>元素这表示一个action可以对应多个结果。最典型的<result…>配置片段如下:<actionname="usrLoginAction"class="comascentactionUsrLoginAction"><result>indexhtml<result><resultname="success">productproductsjsp<result><resultname="error">productproductsjsp<result><resultname="input">productproductsjsp<result><action>*北京亚思晟科技有限公司STRUTS的工作流程和配置文件注:我们还可以使用<param…>子元素配置结果其中<param…>元素的name属性可以为如下两个值:location:该参数指定了该逻辑视图对应的实际视图资源。parse:该参数指定是否允许在实际视图名字中使用OGNL表达式该参数值默认为true。如果设置该参数值为false则不允许在实际视图名中使用表达式。通常无需修改该属性值。下面我们了解一下全局结果。struts的<result…>元素配置也可放在<globalresults…>元素中配置当在<globalresults…>元素中配置<result…>元素时该<result…>元素配置了一个全局结果全局结果的作用范围是对所有的Action都有效。 如果一个Action里包含了与全局结果里同名的结果则Action里的局部Action会覆盖全局Action。也就是说当Action处理用户请求结束后会首先在本Action里的局部结果里搜索逻辑视图对应的结果只有在Action里的局部结果里找不到逻辑视图对应的结果才会到全局结果里搜索。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件Struts支持的处理结果类型Struts支持使用多种视图技术例如JSP、Velocity和FreeMarker等。当一个Action处理用户请求结束后仅仅返回一个字符串这个字符串就是逻辑视图名但该逻辑视图并未与任何的视图技术及任何的视图资源关联。实际上结果类型决定了Action处理结束后下一步将执行哪种类型的动作。Struts的结果类型要求实现comopensymphonyxworkResult这个结果是所有Action执行结果的通用接口。如果我们需要自己的结果类型我们应该提供一个实现该接口的类并且在Strutsxml文件中配置该结果类型。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件Struts的Strutsdefaultxml和各个插件中Strutspluginxml文件中提供了一系列的结果类型如表所示列出来的就是Struts支持的结果类型:*北京亚思晟科技有限公司STRUTS的工作流程和配置文件上面一共列出了种类型其中dispatcher结果类型是默认的类型也就是说如果省略了type属性默认type属性为dispatcher它主要用于与JSP页面整合。下面将重点介绍plaintext、redirect和redirectaction三种结果类型。 plaintext结果类型这个结果类型并不常用因为它的作用太过局限:它主要用于显示实际视图资源的源代码。在Strutsxml文件中采用如下配置片段:<resulttype=”plaintext”>      <paramname=”location”>welcomejsp<param>      <!设置字符集编码>      <paramname=”charset”>gb<param><result>我们在这里使用了plainrext结果类型,系统将把视图资源的源代码呈现给用户。如果在welcomejsp页面的代码中包含了中文字符使用plainrext结果会将会看到乱码。为了解决这个问题struts通过<paramname=”charset”>gb<param>元素设置使用特定的编码解析页面代码。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件b)redirect结果类型这种结果类型与dispatcher结果类型相对dispatche结果类型是将请求forward(转发)到指定的jsp资源而redirect结果类型则意味着将请求redirect(重定向)到指定的视图资源。dispatcher结果类型与redirect结果类型的差别主要就是转发和重定向的差别重定向的效果就是重新产生一个请求因此所有的请求参数、请求属性、Action实例和Action中封装的属性全部丢失。完整地配置一个redirect的Result可以指定如下两个参数:location:该参数指定Action处理完用户请求后跳转的地址。parse:该参数指定是否允许在location参数值中使用表达式该参数默认为true。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件c)redirectaction结果类型当需要让一个Action处理结束后直接将请求重定向(是重定向不是转发)到另一个Action时我们应该使用这种结果类型。配置redirectaction结果类型时可以指定如下两个参数actionName:该参数指定重定向的Action名。namespace:该参数指定需要重定向的Action所在的命名空间。下面是一个使用redirectaction结果类型的配置实例:<resulttype=”redirectaction”>      <!指定action的命名空间>      <paramname=”namespace”>ss<param><!指定action的名字>      <paramname=”actionName”>login<param><result>*北京亚思晟科技有限公司STRUTS的工作流程和配置文件动态结果动态结果的意思是在指定实际视图资源时使用了表达式语法通过这种语法可以允许Action处理完用户请求后动态转入实际的视图资源。实际上Struts不仅允许在class属性、name属性中使用表达式还可以在<action…>元素的<result…>子元素中使用表达式。下面提供了一个通用Action该Action可以配置成如下形式:<actionname=”*”>            <result>{}jsp<result> <action>在上面的Action定义中Action的名字是一个*即它可以匹配任意的Action,即所有的用户请求都可通过该Action来处理。因为没有为该Action指定class属性即该Action使用ActionSupport来作为处理类而且因为该ActionSupport类的execute方法返回success的字符串即该Action总是直接返回result中指定的JSP资源JSP资源使用了表达式来生成资源名。上面Action定义的含义是:如果请求aaction则进入ajsp如果请求baction,则进入bjsp页面……依此类推。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件另外我们在配置<result…>元素时还允许使用OGNL表达式这种用法允许让请求参数来决定结果。在我们配置<result…>元素时不仅可以使用${}表达式形式来指定视图资源还可以使用${属性名}的方式来指定视图资源。在后面这种配置方式下${属性名}里的属性名就是对应Action实例里的属性。例如:<resulttype=”redirect”>editactionproductName=${myProductname}<result> 对于上面的表达式语法要求action中必须包含myProduct属性并且myProduct属性必须包含name属性否则${myProductname}表达式值为。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件include(包含)配置在大部分应用里随着应用规模的增加系统中Action数量也大量增加导致strutsxml配置文件变得非常臃肿。为了避免这种情况我们可以将一个strutsxml配置文件分解成多个配置文件然后在strutsxml文件中包含其他配置文件。通过这种方式Struts提供了一种模块化的方式来管理strutsxml配置文件体现了软件工程中“分而治之“的原则。Struts默认只加载WEBINFclass下的strutsxml文件所以我们就必须通过strutsxml文件来包含其他配置文件。在strutsxml文件中包含其他配置文件通过<include…>元素完成配置<include…>元素需要指定一个必需的属性该属性指定了被包含配置文件的文件名。被包含的struts配置文件也是标准的Struts配置文件一样包含了DTD信息、Struts配置文件的根元素等信息。通常将Struts的所有配置文件都放在web应用的WEBINFclasses路径下strustxml文件包含了其他的配置文件Struts框架自动加载strustxml文件时从而完成加载所有配置信息。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件Bean配置Struts框架是一个可扩展性的框架。对于框架的大部分核心组件Struts并不是直接以硬编码的方式写在代码中的而是以自己的IoC(控制反转)容器来管理框架的核心组件。关于IoC我们会在Spring概述一章详细讲解。Struts框架以可配置的方式来管理Struts的核心组件从而允许开发者可以很方便地扩展该框架的核心组件。当开发者需要扩展或者替换Struts的核心组件时只需提供自己的组件实现类并将该组件实现类部署在Struts的IoC容器中即可。我们使用<bean>元素在strutsxml文件中定义Beanbean元素有如下几个属性如表所示:*北京亚思晟科技有限公司STRUTS的工作流程和配置文件在strutsxml文件中定义Bean时通常有如下两个作用:()创建该Bean的实例将该实例作为Struts框架的核心组件使用。()Bean包含的静态方法需要一个值注入。在第一种用法下因为Bean实例往往是作为一个核心组件使用的因此需要告诉Struts容器该实例的作用就是该实例实现了哪个接口这个接口往往定义了该组件所必须遵守的规范。对于第二种用法则可以很方便地允许不创建某个类的实例却可以接受框架常量。在这种用法下通常需要设置static=“true”。注意对于绝大部分Struts应用而言我们无需重新定义Struts框架的核心组件也就无需在strutsxml文件中定义Bean*北京亚思晟科技有限公司STRUTS的工作流程和配置文件常量配置在strutsxml文件中配置常量是一种指定Struts属性的方式。我们稍后会介绍如何在strutsproperties文件中配置Struts属性这两种方式的作用基本相似。通常推荐在strutsxml文件中定义Struts属性而不是在strutsproperties文件中定义Struts属性的方式这主要是为了保持与WebWork的向后兼容性。另外我们还可以在webxml文件中配置Struts常量。通常Struts框架按如下搜索顺序加载Struts常量:strutsdefaultxml:该文件保存在strutsjar文件中。strutspluginxml:该文件保存在strutsxxxjar等Struts插件jar文件中strutsxml:该文件是Web应用默认的Struts配置文件。strutsproperties:该文件是Web应用默认的Struts配置文件。webxml:该文件是Web应用的配置文件。上面指定了Struts框架搜索Struts常量顺序如果在多个文件中配置了同一个Struts常量则后一个文件中配置的常量值会覆盖前面文件中配置常量值。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件在不同文件中配置常量的方式是不一样的但不管中哪个文件中配置Struts常量都需要指定两个属性:常量name和常量value。其中在strutsxml文件中通过元素constant来配置常量配置常量需要指定两个必填的属性:name:该属性指定了常量name。value:该属性指定了常量value。例如如果需要指定Struts的国际化资源文件的baseName为mess,则可以在strustxml文件中使用如下的代码片段:<xmlversion=””encoding=” 〞 >< !指定Struts的DTD信息><!DOCTYPEStrutsPUBLIC〝ApacheSoftwareFoundationDTDStrutsConfigurationEN〞〝http:strutsapacheorgdtdsstrutsdtd〞><struts><!通过constant元素配置Struts的属性><constantname="strutscustominresources"value="propertiesmyMessages">…<struts>*北京亚思晟科技有限公司STRUTS的工作流程和配置文件上面代码片段配置了一个常用属性:strutscustominresources该属性指定了应用所需的国际化资源文件的baseName为propertiesmyMessages。对于strutsproperties文件而言该文件的内容就是系列的keyvalue对其中每个key对应一个Struts常量name,而每个value对应一个Struts常量value关于strutsproperties配置文件我们稍后详细介绍。在webxml文件中配置了Struts常量可通过<filter>元素的<intparam>子元素指定每个<intparam>元素配置了一个Struts常量。在实际开发中不推荐将Struts常量配置在webxml文件中。毕竟采用这种配置方式来配置常量需要更多的代码量而且降低了文件的可读性。通常推荐将Struts常量集中在strustxml文件中进行集中管理。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件拦截器配置拦截器其实就是AOP(面向方面编程)的编程思想。关于面向方面编程我们会在SpringAOP一章详细讲解。拦截器允许在Action处理之前或者Action处理结束之后插入开发者自定义的代码。在很多情况下我们需要在多个Action进行相同的操作例如权限控制此处就可以使用拦截器来检查用户是否登录用户的权限是否足够(当然也可以借助Spring的AOP框架来完成)。通常使用拦截器可以完成如下操作:进行权限控制(检查浏览者是否是登录用户并且有足够的访问权限)。跟踪日志(记录每个浏览者所请求的每个Action)。跟踪系统的性能瓶颈(我们可以通过记录每个Action开始处理时间和结束时间从而取得耗时较长的Action)。Struts也允许将多个拦截器组合在一起形成一个拦截器栈。一个拦截器栈可以包含多个拦截器多个拦截器组成下一个拦截器栈。对于Struts系统而言多个拦截器组成的拦截器栈对外也表现成一个拦截器。*北京亚思晟科技有限公司STRUTS的工作流程和配置文件定义拦截器之前必须先定义组成拦截器栈的多个拦截器。Struts把拦截器栈当成拦截器处理因此拦截器和拦截器栈都放在<interceptors…>元素中定义。下面是拦截器的定义片段:<interceptors>   <interceptorname=“log”class=”ccdynasoftLogInterceptor”><interceptorname=“authority”class=”ccdynasoftAuthorityInterceptor”><interceptorname=“timer”class=”ccdynasoftTimerInterceptor”><interceptorstackname=”default”>   <interceptorrefname=”authority”><interceptorrefname=”timer”><interceptorstack>……<interceptors>一旦定义了拦截器和拦截器栈之后在Action中使用拦截器或拦截器栈的方式是相同的。<actionname=”login”class=”ccdynasoftLoginAction”>      ……      <interceptorrefname=”log”><action>*北京亚思晟科技有限公司STRUTS的工作流程和配置文件在我们的项目中配置了fileUpload拦截器如下所示:<actionname="*ProductManagerAction"class="comascentactionProductManagerAction"method="{}"><!配置fileUpload拦截器><interceptorrefname="fileUpload"><!设置上传文件类型><paramname="allowedTypes">imagebmp,imagepng,imagejpg,imagegif,applicationvndmsexcel<param><!设置上传文件大小><paramname="maximumSize"><param><interceptorref><!必须显示配置引用struts默认的拦截器栈:defaultStack><interceptorrefname="defaultStack"><interceptorref>……<action>*北京亚思晟科技有限公司STRUTS的工作流程和配置文件strutsproperties配置文件 除了strutsxml核心文件外Struts框架还包含一个strutsproperties文件该文件通过放在Web应用的WEBINFclasses路径下。它定义了Struts框架的大量属性开发者可以通过改变这些属性来满足个性化应用的需求。strutsproperties中定义的Struts属性参考书中表。*北京亚思晟科技有限公司创建CONTROLLER组件Struts的核心是Controller组件。它是连接Model和View组件的桥梁也是理解Struts架构的关键。正如前面提到的Struts的控制器由两个部分组成:FilterDispatcher和业务控制器Action。FilterDispatcher任何MVC框架都需要与web应用整合这就离不开webxml文件只有配置在webxml文件中Filterservlet才会被应用加载。对于Struts框架而言需要加载FilterDispatcher。因为Struts将核心控制器设计成filter而不是一个servlet。故为了让web应用加载FilterDispatcher需要在webxml文件中配置FilterDispatcher。*北京亚思晟科技有限公司创建CONTROLLER组件配置FilterDispatcher的代码片段如下:<!配置struts框架的核心Filter><filter><!配置struts核心Filter的名字><filtername>struts<filtername><!配置struts核心Filter的实现类><filterclass>orgapachestrutsdispatcherFilterDispatcher<filterclass><initparam><!配置struts框架默认加载的Action包结构><paramname>actionpackages<paramname><paramvalue>orgapachestrutsshowcaseperson<paramvalue><initparam><!配置struts框架的配置提供者类><initparam><paramname>configProviders<paramname><paramvalue>comascentMyConfigurationProvider<paramvalue><initparam><filter>*北京亚思晟科技有限公司创建CONTROLLER组件当配置Struts的FilterDispatcher类时可以指定一系列的初始化参数为该Filter配置初始化参数时其中有个初始化参数有特殊意义:()Config:该参数的值是一个英文逗号()隔开的字符串每个字符串豆油一个XML配置文件的位置。Struts框架将自动加载该属性指定的系列配置文件。()Actionpackages:该参数的值也是一个以英文逗号()各开的字符串每个字符串都是一个包空间Struts框架将扫描这些包空间下的Action类。()Configproviders:如果用户需要实现自己的Configurationprovider类用户可以提供一个或多个实现了Configurationprovider接口的类然后将这些类的类名设置成该属性的值多个类名之间以英文逗号()隔开。除此之外还可在此处配置Struts常量每个<initparam>元素配置一个Struts常量其中<paramname>子元素指定了常量name而<paramvalue>子元素指定了常量value*北京亚思晟科技有限公司创建CONTROLLER组件在webxml文件中配置了该Filter还需要配置该Filter拦截的URL。通常我们让该Filter拦截所有的用户请求因此使用通配符来配置该Filter拦截的URL。下面是配置该Filter拦截URL的配置片段:<!配置Filter拦截的URL><filtermapping><!配置struts的核心FilterDispatcher拦截所有用户请求><filtername>struts<filtername><urlpattern>*<urlpattern><filtermapping> 配置了Struts的核心FilterDispatcher后我们就基本完成了Struts在webxml文件中的配置*北京亚思晟科技有限公司创建CONTROLLER组件Action的开发对于Struts应用而言Action是应用系统的核心我们也称Action为业务控制器。开发者需要提供大量的Action类并在strustxml文件配置Action。实现Action类相对于strust而言Struts采用了低侵入式的设计Struts的Action类是一个普通的POJO(通常应该包含一个无参数的execute方法)从而带来很好的代码复用性。 为了让用户开发的Action类更规范Struts提供了一个Action接口这个接口定义了Struts的Action处理类应该实现的规范。它的里面只定义了一个execute方法该接口的规范规定了Action类应该包含这样一个方法该方法返回了一个字符串。除此之外该接口还定义了个字符串常量分别是error、input、login、none和success它们的作用是统一execute方法的返回值。例如当Action类处理用户请求成功后有人喜欢返回welcome字符串有人喜欢返回success字符串,这样不利于项目的统一管理。Struts的Action定义上面的个字符串分别代表了统一的特定含义。另外Struts还提供了Action类的一个实现类:ActionSupport该Action是一个默认的Action类该类里已经提供了许多默认方法这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等。实际上ActionSupport类是Struts默认的Action处理类如果让开发者的Action类继承该Action类则会大大简化Action的开发。*北京亚思晟科技有限公司创建CONTROLLER组件Action访问ServletAPIStruts的Action并未直接与任何ServletAPI耦合这是Struts的一个改进之处因为这样的Action类具有更好的重用性并且能更轻松地测试该Action。然而对于web应用的控制器而言不访问ServletAPI几乎是不可能的例如获得HTTPRequest参数、跟踪HTTPSession状态等。为此Struts提供了一个ActionContext类Struts的Action可以通过该类来访问ServletAPI包括HttpServletRequest、HttpSession和ServletContext这个类它们分别代表JSP内置对象中的request、session和appliaction。ActionContext类中包含的几个常用方法如表所示:*北京亚思晟科技有限公司创建CONTROLLER组件虽然Struts提供了ActionContext来访问ServletAPI但这种访问毕竟不能直接获取ServletAPI实例为了在Action中直接访问ServletAPI还提供了如下系列接口。如表所示*北京亚思晟科技有限公司创建CONTROLLER组件为了直接访问ServletAPI,Struts提供了一个ServletActioncontext类。借助于这个类的帮助开发者也能够在Action中直接访问ServletAPI却可以避免Action类需要实现上面的接口。这个类包含了如表所示几个静态方法*北京亚思晟科技有限公司创建CONTROLLER组件属性驱动和模型驱动熟悉Struts的读者知道Struts提供了ActionForm来专门封装用户请求这种方式在逻辑上显得更加清晰:Action只负责处理用户请求而ActionForm专门用于封装请求参数。如果Struts的开发者怀念这种开发方式则可以使用Struts提供的模型驱动模式这种模式也通过专门的JavaBean来封装请求参数。当Struts拦截到用户请求后Struts框架会负责将请求参数封装成ActionForm对象。这个对象的作用就是封装用户的请求参数并可以进行验证。至于处理这些请求参数的功能则有Action类负责。Struts则不同Struts的Action对象封装了更多的信息它不仅可以封装用户的请求参数还可以封装Action的处理结果。相比于Struts的Action类Struts的Action承担了太多责任:既用于封装来回请求的参数也保护了控制逻辑。相对而言这种模式确实不太清晰。出于结构清晰的考虑应该采用单独的Model实例来封装请求参数和处理结果这就是所谓的模型驱动。也就是使用单独的JavaBean实例来贯穿整个MVC流程与之对应的属性驱动模式则使用属性(Property)作为贯穿MVC流程的信息携带者。简单的说模型驱动使用单独的ValueObject(值对象)来封装请求参数和处理结果除了这个JavaBean之外还必须提供一个包含处理逻辑的Action类而属性驱动则使用Action实例来封装请求参数和处理结果。*北京亚思晟科技有限公司创建CONTROLLER组件对于采用模型驱动的Action而言该Action必须实现modelDriven接口实现该接口则必须实现getModel方法该方法用于把action和与之对应的Model实例关联起来。配置模型驱动的Action与配置属性驱动的Action没有任何区别Struts不要求配置模型对象即不需要配置UserBean实例。模型驱动和属性驱动各有利弊模型驱动结构清晰但编程烦琐(需要额外提供一个javaBean来作为模型)属性驱动则编程简洁但结构不够清晰。我们不推荐使用模型驱动属性驱动完全可以实现模型驱动的效果。毕竟大量定义javaBean是一件繁琐的事情。*北京亚思晟科技有限公司创建MODEL组件创建Model组件Struts中的Model指的是业务逻辑组件它可以使用JavaBean实现。通常说来Model组件的开发者侧重于创建支持所有功能需求的JavaBeans类。它们通常可以分成下面讨论的几种类型。然而首先对"范围"概念做一个简短的回顾是有用的因为它与beans有关。、JavaBeans和范围在一个基于web的应用程序中JavaBeans可以被保存在一些不同"属性"的集合中。每一个集合都有集合生存期和所保存的beans可见度的不同的规则。总的说来定义生存期和可见度的这些规则被叫做这些beans的范围。JSP规范中使用以下术语定义可选的范围(括号中定义的是servletAPI中的等价物):page:在一个单独的JSP页面中可见的Beans生存期限于当前请求。(service()方法中的局部变量)request:在一个单独的JSP页面中可见的Beans也包括所有包含于这个页面或从这个页面重定向到的页面或servlet。(Request属性)session:参与一个特定的用户session的所有的JSP和servlet都可见的Beans跨越一个或多个请求。(Session属性)application:一个web应用程序的所有JSP页面和servlet都可见的Beans。(Servletcontext属性)*北京亚思晟科技有限公司创建MODEL组件同一个web应用程序的JSP页面和servlets共享同样一组bean集合是很重要的。例如一个bean作为一个request属性保存在一个servlet中就象这样:MyCartmycart=newMyCart()requestsetAttribute("cart",mycart)将立即被这个servlet重定向到的一个JSP页面使用一个标准的行为标记看到就象这样:<jsp:useBeanid="cart"scope="request“class="commycompanyMyAppMyCart">*北京亚思晟科技有限公司创建MODEL组件、系统状态Beans系统的实际状态通常表示为一组一个或多个的JavaBeans类其属性定义当前状态。例如一个购物车系统包括一个表示购物车的bean这个bean为每个单独的购物者维护这个bean中包括一组购物者当前选择购买的商品。同时系统也包括保存用户信息(包括他们的信用卡和送货地址)、可提供商品的目录和它们当前库存水平的不同的beans。对于小规模的系统或者对于不需要长时间保存的状态信息一组系统状态beans可以包含所有系统曾经经历的特定细节的信息。或者系统状态beans表示永久保存在一些外部数据库中的信息(例如CustomerBean对象对应于表CUSTOMERS中的特定的一行)在需要时从服务器的内存中创建或清除。在大规模应用程序中EntityEJBs也用于这种用途。*北京亚思晟科技有限公司创建MODEL组件、商业逻辑Beans你应该把你的应用程序中的功能逻辑封装成为此目的设计的JavaBeans的方法调用。这些方法可以是用于系统状态beans的相同的类的一部分或者可以是在专门执行商业逻辑的独立的类中。在后一种情况下你通常需要将系统状态beans传递给这些方法作为参数处理。为了代码最大的可重用性商业逻辑beans应该被设计和实现为它们不知道自己被执行于web应用环境中。如果你发现在你的bean中必须import一个javaxservlet*类你就把这个商业逻辑捆绑在了web应用环境中。考虑重新组织事物使你的Action类把所有HTTP请求处理为对你的商业逻辑beans属性set方法调用的信息然后可以发出一个对execute()的调用。这样的一个商业逻辑类可以被重用在web应用程序以外的环境中。取决于你的应用程序的复杂度和范围商业逻辑beans可以是与作为参数传递的系统状态beans交互作用的普通的JavaBeans或者使用JDBC调用访问数据库的普通的JavaBeans。而对于较大的应用程序这些beans经常是有状态或无状态的EJBs。*北京亚思晟科技有限公司创建VIEW组件创建View组件这里我们侧重于创建应用程序中View组件主要是使用JSP技术建立当然Struts也支持其他View技术。在JSP中我们会大量使用标签。Strutsx将标志库按功能分成HTML、Tiles、Logic和Bean等几部分而Struts的标志库(TagLibrary)严格上来说没有分类所有标志都在URI为“strutstags”命名空间下不过我们可以从功能上将其分为两大类:一般标志和UI标志。如果Web应用使用了Servlet以前的规范Web应用不会自动加载标签文件因此必须在webxml文件中配置加载Struts标签库。配置加载Struts标签库的配置片段如下: <!–手动配置Struts的标签库><taglib><!配置Struts标签库的URI><tagliburi>s<tagliburi><!–指定Struts标签库定义文件的位置><tagliblocation>WEBINFstrutstagstld<tagliblocation><taglib>*北京亚思晟科技有限公司创建VIEW组件在上面配置片段中指定了Struts标签库配置文件物理位置:WEBINFstrutstagstld因此我们必须手动复制Struts的标签库定义文件将该文件放置在Web应用的WEBINF路径下。如果Web应用使用Servlet以上的规范则无需在webxml文件中配置标签库定义因为Servlet规范会自动加载标签库定义文件。加载strutstagtld标签库定义文件时该文件的开始部分包含如下代码片段:<taglib><!–定义标签库的版本><tlibversion><tlibversion><!–定义标签库所需的JSP版><jspversion><jspversion><shortname>s<shortname>*北京亚思晟科技有限公司创建VIEW组件<!–定义Struts标签库的URI><uri>sturtstags<uri>…<taglib>因为该文件中已经定义了该标签库的URI:strutstags这就避免了在webxml文件中从新定义Struts标签库文件的URI。要在JSP中使用Struts标志先要指明标志的引入。通过在JSP的代码的顶部加入以下代码可以做到这点<taglibprefix="s"uri="strutstags">*北京亚思晟科技有限公司STRUTS开发步骤Struts开发步骤接下来我们来使用Eclipse工具完成一个综合实例的开发。具体步骤如下:)下载和安装Struts框架在此我们下载strutsall完整包里面包括apps(示例)、docs(文档)、j(struts支持jdk的jar文件)、lib(核心类库及struts第三方插件类库)、src(源代码)。)创建web工程添加jar包选择FileNewProject,之后选择WebProject如图所示*北京亚思晟科技有限公司STRUTS开发步骤选择Next进入下一页在ProjectName中填写strutsdemo,其他保持默认如图所示*北京亚思晟科技有限公司STRUTS开发步骤点击Finish按钮创建Web工程结束接下来我们增加Struts的支持将struts的必需类库:strutscorejar、xworkjar、ognljar、freemarkerjar、commonsloggingjar复制到web应用的WEBINFlib路径下。当然如果你的web应用需要使用struts的更多特性则需要把其它相应jar包复制到WEBINFlib目录下。编辑webxml文件。在PackageExplorer中选择strutsdemo项目拉开其中的内容选择WebRoot目录中的WEBINF,编辑其中的webxml文件如图所示*北京亚思晟科技有限公司STRUTS开发步骤在webxml文件中配置struts的核心Filter代码如下:<xmlversion=""encoding=""><webappversion=""xmlns="http:javasuncomxmlnsjee"xmlns:xsi="http:wwwworgXMLSchemainstance"xsi:schemaLocation="http:javasuncomxmlnsjeehttp:javasuncomxmlnsjeewebappxsd"><displayname>Struts<displayname><filter><filtername>struts<filtername><filterclass>orgapachestrutsdispatcherFilterDispatcher<filterclass><filter>*北京亚思晟科技有限公司STRUTS开发步骤<filtermapping><filtername>struts<filtername><urlpattern>*<urlpattern><filtermapping><welcomefilelist><welcomefile>indexjsp<welcomefile><welcomefile>loginjsp<welcomefile><welcomefilelist><webapp>*北京亚思晟科技有限公司STRUTS开发步骤)写用户请求jsp。右击WebRoot选择New之后选择JSP(AdvancedTemplate),如图所示:*北京亚思晟科技有限公司STRUTS开发步骤JSP命名为loginjsp,代码如下:<pagelanguage="java"contentType="texthtmlcharset="><html><head><title>登录页面<title><head><body><h>用户登录<h><formaction="loginaction"method="post"> <table>*北京亚思晟科技有限公司STRUTS开发步骤<tralign="center"><td>用户名:<inputtype="text"name="username"><td><tr><tralign="center"><td>密码:<inputtype="password"name="password"><td><tr><tralign="center"><tdcolspan=""><inputtype="submit"value="提交"><inputtype="reset"value="重置"><td><tr><table><form><body><html>*北京亚思晟科技有限公司STRUTS开发步骤)编写Action类右击src选择New之后选择Package,如图所示:*北京亚思晟科技有限公司STRUTS开发步骤命名Package为comascentstrutsaction之后右击这个包选择New,之后选择Class如图所示:*北京亚思晟科技有限公司STRUTS开发步骤命名类为LoginAction代码如下:packagecomascentstrutsactionpublicclassLoginAction{privateStringusernameprivateStringpasswordpublicStringgetPassword(){returnpassword}*北京亚思晟科技有限公司STRUTS开发步骤publicvoidsetPassword(Stringpassword){thispassword=password}publicStringgetUsername(){returnusername}publicvoidsetUsername(Stringusername){thisusername=username}publicStringexecute(){if(getUsername()equals("liang")getPassword()equals("liang")){return"success"}return"error"}}*北京亚思晟科技有限公司STRUTS开发步骤编写strutsxml。右击src,选择New,之后选择XML(AdvancedTemplate),如图所示:*北京亚思晟科技有限公司STRUTS开发步骤strutsxml代码如下:<xmlversion=""encoding="GBK"><!DOCTYPEstrutsPUBLIC"ApacheSoftwareFoundationDTDStrutsConfigurationEN""http:strutsapacheorgdtdsstrutsdtd"> <struts><packagename="struts"extends="strutsdefault"><actionname="login"class="comascentstrutsactionLoginAction"><resultname="error">errorjsp<result><resultname="success">welcomejsp<result><action><package><struts>*北京亚思晟科技有限公司STRUTS开发步骤)添加errorjsp和welcomejsp代码如下errorjsp代码:<pagelanguage="java"import="javautil*"pageEncoding=""><Stringpath=requestgetContextPath()StringbasePath=requestgetScheme()":"requestgetServerName()":"requestgetServerPort()path""> <!DOCTYPEHTMLPUBLIC"WCDTDHTMLTransitionalEN"><html><head><basehref="<=basePath>">*北京亚思晟科技有限公司STRUTS开发步骤<title>MyJSP'errorjsp'startingpage<title><metahttpequiv="pragma"content="nocache"><metahttpequiv="cachecontrol"content="nocache"><metahttpequiv="expires"content=""><metahttpequiv="keywords"content="keyword,keyword,keyword"><metahttpequiv="description"content="Thisismypage"><!<linkrel="stylesheet"type="textcss"href="stylescss">><head><body>StrutsDemo<br>登录失败!<body><html>*北京亚思晟科技有限公司STRUTS开发步骤welcomejsp代码:<pagelanguage="java"import="javautil*"pageEncoding=""><Stringpath=requestgetContextPath()StringbasePath=requestgetScheme()":"requestgetServerName()":"requestgetServerPort()path""> <!DOCTYPEHTMLPUBLIC"WCDTDHTMLTransitionalEN"><html><head><basehref="<=basePath>">*北京亚思晟科技有限公司STRUTS开发步骤<title>MyJSP'welcomejsp'startingpage<title><metahttpequiv="pragma"content="nocache"><metahttpequiv="cachecontrol"content="nocache"><metahttpequiv="expires"content=""><metahttpequiv="keywords"content="keyword,keyword,keyword"><metahttpequiv="description"content="Thisismypage"><!<linkrel="stylesheet"type="textcss"href="stylescss">><head><body>StrutsDemo<br>欢迎您登陆成功!<body><html>*北京亚思晟科技有限公司STRUTS开发步骤)部署和启动进行测试。将开发的项目strutsdemo部署到tomcat服务器启动服务器后在浏览器地址栏输入如下地址:http:localhost:strutsdemologinjsp打开登录页面如图所示:*北京亚思晟科技有限公司STRUTS开发步骤输入用户名liang密码liang提交正确登录如图所示:*北京亚思晟科技有限公司STRUTS开发步骤任意输入其他用户名或密码提交登录登录失败页面如图所示:*北京亚思晟科技有限公司项目案例项目案例学习目标本章主要介绍了struts基础struts框架及MVC模式概述详细讲解了struts的工作流程和配置文件核心控制器FilterDispatcher的配置Action类开发及配置。案例描述用户登录模块是完成系统注册用户和管理员登录功能较系统全面的完成了项目从前台登录页面提交登录请求到action类的开发及配置并正确跳转完成struts框架的工作流程。案例要点本案例重点在于掌握struts框架的搭建流程正确开发Action类及配置struts配置文件实现登录流程熟练掌握struts工作原理。*北京亚思晟科技有限公

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/92

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利