Struts2Struts2与控制器Action1目标1.1Struts2介绍与环境搭建1.2StrutsPrepareAndExecuteFilter过滤器1.3Action,ActionSupport及配置1.4Action与请求参数1.5Action控制逻辑1.6Action与ServletAPI(ActionContext,ServletActionContext)2Struts介绍Struts是一个Web框架,他以一种更加优雅的方式来实现控制器,并提供如国际化,类型转换,数据验证,ajax等一系列的功能.Struts是在MVC架构模式的基础上构建的一种WEB解决方案.在Struts2中使用IOC和AOP最先进的设计思想,使得控制器与容器最大程度的解耦.3Struts2介绍Struts2是在xwork基础上发展进来的WEB框架,利用了xwork的先进解决方案,加上Struts长期聚积的名声和人气,合二为一,形成Struts2.4Struts2特点1.非侵入式的设计,无需与ServletAPI整合,更容易测试,2.优雅的请求参数封装3.灵活的视图技术4.丰富的表达式语言5.机动,灵活,简单的配置6.线程安全的控制器(Action)7.插件丰富5Struts2的体系结构6Struts版本两大版本◦1.X:出现最早,人气十足,但技术落后,廉颇老矣!◦2.X:大量使用IOC和AOP,并支持ajax.后来居上!当前最新版本:2.1.88环境搭建:基本jar包9struts2-core-2.×.×.jarstruts2框架核心类库xwork-2.×.×.jarXWork类库.ognl-2.6.×.jar对象图导航语言(读写对象属性)freemarker-2.3.×.×.jarUI标签模板语言commons-logging-1.0.4.jar日志支持(log4j)commons-fileupload-1.2.1.jar文件上传组件(2.1.6版本必须)环境搭建:配置DTD文件10环境搭建:web.xml配置Struts2Struts2通过StrutsPrepareAndExecuteFilter过滤器来启动,在web.xml文件中输入如下配置:filterfilter-namestruts2/filter-namefilter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class/filterfilter-mappingfilter-namestruts2/filter-nameurl-pattern/*/url-pattern/filter-mapping11控制器Struts2有两个重要的控制器:◦StrutsPrepareAndExecuteFilter:核心控制器,负责接收url-pattern指定的所有请求。◦请求经过过滤器处理后,后再经过一系列的拦截器操作,再到请求对应的Action进行处理,最后返回result进行视图展现来响应用户请求。◦Action:负责处理单个特定请求Struts2中应对用户的请求每次都会创建一个Action实例来接收用户的请求,是线程安全的。Action其实就是普通的类,不需要实现任何接口或继承任何类。12Action的基本结构13publicclassLoginServlet{publicStringexecute()throwsException{Stringpath=success;...returnpath;}}说明:◦无需实现任何接口或继承任何类,但有时为了简化某些功能必须继承ActionSupport类◦execute()方法会被自动调用,该方法用于处理用户请求,返回类型为String,是跳转路径的逻辑名称.向上抛出Exception表示能够处理所有异常.◦“path”是跳转路径的逻辑名称.Action的配置—struts.xmlAction必须配置在struts.xml文件中,该文件默认放在classpath下.strutspackagename=xdfnamespace=/demoextends=struts-defaultactionname=loginclass=action.LoginActionmethod=executeresultname=success/success.jsp/resultresultname=error/error.jsp/result/action/package/struts14struts.xml配置说明package:用于组织Action的一个逻辑概念,必须通过extends继承自struts-default包,struts-default包在struts-default.xml文件中定义,该文件配置了很多有用的功能.action:所有的Action都必须通过action标签配置◦name:访问action逻辑名称◦class:Action类的全限定名◦result子标签:定义跳转路径,execute()方法的返回值在此定义.默认情况下为转发,如果是重定向,必须按下面的格式:resulttype=redirectname=xx/xx.jsp/result15可以为package指定namespace,用于Action模块化管理◦在package中,不能有相同名称的action,但是不同的命名空间中允许有相同名称的action对于团队,建议根据功能模块进行划分,每个模块一个struts配置文件,使用includefile=“”/导入其他配置文件即可。命名规则一般建议如下:includefile=struts-user.xml/16访问Actionlogin.action是访问Action的实际路径.◦格式:action的逻辑名称+后缀◦后缀的默认名称为:.action在struts.properties文件中可以配置后缀,如下:struts.action.extension=action在struts.xml文件中的配置方式如下:constantname=struts.action.extensionvalue=“action,do!--是否需要打印详细调试信息--constantname=struts.devModevalue=true!--是否支持动态方法调用支持默认是true--constantname=struts.enable.DynamicMethodInvocationvalue=false17最简单配置actionactionname=loginresult/success.jsp/result/actionclass默认为ActionSupportmethod默认为execute()方法resultname默认为successAction接收请求参数(1)在Action中接收请求参数不需要使用request对象,在Action中定义与请求参数相同名称的属性,定义setter和getter方法,struts框架会自动将请求参数解析出来并为Action属性赋值。注意:◦这里的struts框架并不是根据属性名去给属性进行赋值的,而是通过反射调用属性相应的getter和setter方法进行属性赋值的。19Action接收请求参数(2)publicclassLoginAction{privateStringname;privateStringpassword;//如果前台需要给name赋值,就使用setName()。publicvoidsetName(Stringname)…//如果前台需要获得name属性的值,就使用getName()。publicStringgetName()……publicStringexecute()throwsException{System.out.println(用户名:+this.name+密码:+this.password);return“success;}}访问:/demo/login.action?name=admin&password=12320Action接收请求参数(3)还有两种方式获取请求参数(不推荐,但必须了解)方式1:直接通过request对象HttpServletRequestrequest=ServletActionContext.getRequest();System.out.println(request.getParameter(name));方式2:通过封装的Map对象Objecto=ActionContext.getContext().getParameters().get(name);System.out.println(((String[])o)[0]);21Struts2动态方法调用方式1:在Action中定义多个与execute签名相同的方法(方法名不同),可以通过如下方式访问:action名!方法名.action例如:login!logout.actionlogin是action名称logout是方法名称方式2:使用*达到通配效果actionname=“user_*class=com.UserActionmethod=“{1}/action例如:请求url为user_logout.action时,将调用到UserAction类的logout方法22继承ActionSupport为了更好的使用struts提供的内置功能,最好让Action继承ActionSupport类读取国际化信息处理验证错误处理类型转换错误23小结本章重点是理解Action在web中的作用,并掌握Action的定义,配置及访问方法.Action可以处理多个请求,注意Action的配置Struts2的优点1,非侵入式的设计不需要继承Action方法不需要依赖ServletAPI和StrutsAPI2,提供拦截器,可以进行AOP编程。3,提供类型转换器,将特殊的请求参数转换成需要的类型。struts1需要借助于BeanUtil类4,提供供多种V层面支持,jsp,velocity,freeMarker5,提供对指定方法进行验证6,国际化资源管理24