1、1.简介Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,2.Struts2处理流程用户请求根据请求的url找到actionAction业务处理,处理请求,返回处理结果前端控制器StrutsPreparedAndExecuteFilter拦截用户请求响应用户处理后的html结果数据传递给jspJsp页面渲染结果返回处理结果3.Struts2基础可以把struts配置分
2、为相应的struts.xml文件中的属性namespace可以把action分包,用来解决不同项目的同名action中的method属性决定action调用action业务类的那个方法,根据方法的返回值跳到名字队对应的result结果集中除了Metnod调用指定的方法为还有一种动态调用1.在请求的页面就指定调用的action名称及方法,语法:actionName!methodName.action,action可以省略,2.在使用通配符, .其名字可以自行定义,根据业务类返回的值,对应相应的result官方定义的有success,login,error,input等其中的type属性可以决定转
3、向类型,默认的是dispatcher(转发)其他的是redirect,请求重定向的指定的URL,redirectAction重定向到指定的Action,chain:将请求转发到指定的Action,json返回JSON对象如果result的内容不是一个具体的jsp页面而是$形式的这就是动态结果的配置,就是结果页面在配置是不能确定,需要在运行时才能确定,比如管理员和普通用户登录,详细的动态结果配置详见资料Action类实现的方法有三种1. 继承ActionSupport (常用)2.实现Action接口3.自己编写方法Action接收参数1属性方式接收参数,2Javabean方式接收参数(常用)3
4、.moderlDriven方式接收参数Struts2访问servletAPI的方法在jsp课程中,服务器保存数据的作用域通常有request,session,application,他们对应的servletAPI 分别是HttpServletRequest,HttpSession,servletContext,同样在struts2控制器(action)中也需要访问这些作用域,有三种方法1.使用ActionContext类提供的方法2. 以依然注入(IoC)方式访问,实现响应的接口即可3. 使用以耦合方式使用ServletActionContext类访问OGNL与struts标签引入的标签指令理
5、解值栈(存储属性的地方)和(存储,的地方)概念,并且使用:查看值栈访问的值访问集合知识点,不常用字符串转换OGNL表达式用户%相反的加单引号2标签可分为通用标签,控制标签,标签通用标签又分为数据标签和控制标签数据标签:和:控制标签:,:标签理解模板与主题,模板用于生成HTML代码,共同风格和观感的模板组织到一起就成了一个主题,内建的主题有simple,xhtml,css_xhtml(默认),css_xhtml,ajax主题的更改用标签属性theme=”simple”标签:下拉列框和联动列框属性及实现参观相关代码Ajax标签Datetimepicker是一个日历控件导入相应的包 引入指令在中添加
6、添加标签4.数据校验数据校验分为客户端验证和服务器端验证,sruts2对服务器端的验证有两种,1.使用actionsupport编码实现验证2.使用验证框架实现验证,使用actionsupport编码进行验证的方法有三种,1.直接在action类业务方法中验证,2.重写validate()方法实现验证,3.使用validateXXX()方法实现验证验证的关键点在于当用户名或密码没填写时添加addFieldError()方法,此方法处理与字段相关的错误,比如输入的年龄不合理,响应的jsp输出错误的标签是, addActionError()方法是用来添加与action所处理的业务相关的错误信息,在
7、JSP输出错误的标签是如果两种情况有任何一种错误(hasErrors()就return到INPUT结果集中(事先已经配置好)使用验证框架使用特定的配置框架即可,命名的前半部分是action 的名字,可对全局和局部进行验证!具体查看相关资料5.拦截器拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略谈到拦截器,还有一个词大家应该知道拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺
8、序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。struts2拦截器是action调用之前或之后调用的代码拦截器实现原理:大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器返回类型区别struts2中关于result的返回类型一般我们是转发到一个jsp页面或者是html页面等,但是struts2中的result的返回类型
9、还有redirect,redirectAction,chain。对于这三种返回类型之间肯定是有区别的,下面我们来看看关于redirect redirectAction chain这三种struts2的返回类型之间的区别。当使用type=“redirectAction” 或type=“redirect”提交到一个action并且需要传递一个参数时。这里是有区别的:使用type=“redirectAction”时,结果就只能写Action的配置名,不能带有后缀:“.action”拦截器的配置定义拦截器的标签定义拦截器栈的标签引用拦截器默认的拦截器自定义拦截器实现自定义拦截器类的方式有3种实现Int
10、erceptor接口继承AbstractInterceptor抽象类(常用)继承MethodFilterIntercePtor类具体用法参见帮助文档6.MVC的优缺点优点1各司其职,互不干涉2. 并行开发,提高效率3. 有利于组件的重用缺点1. 系统结构和实现比较复杂2. 视图与控制器过于紧密3. 不适用于小型甚至中等规模的应用程序7.Struts2注解必要的jar包commons-fileupload-1.2.1.jarcommons-io-1.4.jarcommons-logging-1.1.1.jarcommons-logging-api.jarfreemarker-2.3.15.jar
11、ognl-2.7.3.jarstruts2-core-2.1.8.1.jarxwork-core-2.1.6.jarstruts2-convention-plugin-2.1.8.1.jar其中struts2-convention-plugin-2.x.x.jar是用于支持注解的2.web.xml 的配置:htmlview plaincopyprint?1. 2. struts23. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter4. 5. actionPackages6. com.test.actio
12、n7. 8. 9. 10. 11. struts212. /*13. 3.struts.xml 的配置:htmlview plaincopyprint?1. 2. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. !-指定由spring负责action对象的创建18. 19. -20. 21. 22. 4.常用的注解如下:Namespace:指定命名空间。ParentPackage:指定父包。Result:提供了Action结果的映射。(一个结果的映射)Results:“Result”注解列表ResultPath:指定结果页面的基路径。Action:
13、指定Action的访问URL。Actions:“Action”注解列表。ExceptionMapping:指定异常映射。(映射一个声明异常)ExceptionMappings:一级声明异常的数组。InterceptorRef:拦截器引用。InterceptorRefs:拦截器引用组。5.示例代码如下:那些类会被作为Action,对于Convention插件而言,它会自动搜索位于action,actions,struts,struts2包下的所有java类,Convention插件会把如下两种java类当成Action处理类名以XXXAction命令。继承ActionSuppot。6.查看str
14、uts2配置为了看到struts2应用里的Action等各种资源的影射情况,struts2提供了Config Browser插件。使用方法:将struts2-config-browser-plugin-2.1.6.jar文件复制到struts2应用的WEB-INF/lib目录中。打开首页地址:http:/localhost:8080/应用名字/config-browser/actionNames.action 这里可以看到Config Browser插件的首页。7.详解1、Action级的注解 ParentPackage-父包 该注解相当于中的extends属性,例如:ParentPackag
15、e(value=struts-default) Namespace-命名空间 该注解相当于中的namespace属性,例如:Namespace(value=/longspace)Result-转向该注解相当于 /loginsuc.jsp中的 /loginsuc.jsp例如:Result(name=success,location=/loginsuc.jsp,type=redirect) !注意,在struts2.1.6中是location来转向页面,而在struts2.0.4是value属性 Results来配置多个转向 Results( Result(name=success,locatio
16、n=/usersuc.jsp), Result(name=error,location=/usererror.jsp) )以上是对struts2 注解简单的介绍,要想在Action上使用注解,还得修web.xml文件中的一些配置struts org.apache.struts2.dispatcher.FilterDispatcher actionPackagescom.struts2.action Results( Result(name=input value=/input.jsp type=NullResult.class), Reuslt(name=success value=/succ
17、ess.jsp type=NullResult.class), Result(name=error value=/error.jsp type=NullResult.class) 上面是一个典型的多Result配置,name属性指定返回的字符串,value指定要跳转的页面,type指定Result的类型,type是一个很重要的属性,他有一下几种情况:1)NullResult : 默认的可以省略2)ActionChainResult : 用于从一个Action跳转到另外一个Action。例如:Result(name = search,value= search,type=ActionChainR
18、esult.class, params=method,search) 这个配置是如果返回值为search就跳转掉SearchAction的search方法,如果不指定params就跳转到SearchAction的execute方法 3)StreamResult:用于文件下载。例如: Result(name=success,value=inputStream,type=StreamResult.class, params=bufferSize,FileConstant.DOWNLOAD_BUFFER_SIZE)案例1. packagecom.tjcyjd.web.action;2. 3. imp
19、ortorg.apache.struts2.convention.annotation.Action;4. importorg.apache.struts2.convention.annotation.ExceptionMapping;5. importorg.apache.struts2.convention.annotation.ExceptionMappings;6. importorg.apache.struts2.convention.annotation.Namespace;7. importorg.apache.struts2.convention.annotation.Pare
20、ntPackage;8. importorg.apache.struts2.convention.annotation.Result;9. importorg.apache.struts2.convention.annotation.Results;10. 11. importcom.opensymphony.xwork2.ActionSupport;12. 13. /*14. *Struts2基于注解的Action配置15. *16. */17. ParentPackage(struts-default)18. Namespace(/annotation_test)19. Results(R
21、esult(name=success,location=/main.jsp),20. Result(name=error,location=/error.jsp)21. ExceptionMappings(ExceptionMapping(exception=java.lange.RuntimeException,result=error)22. publicclassLoginActionextendsActionSupport23. privatestaticfinallongserialVersionUID=2730268055700929183L;24. privateStringlo
22、ginName;25. privateStringpassword;26. 27. Action(login)28. /或者写成Action(value=login)29. publicStringlogin()throwsException30. 31. if(yjd.equals(loginName)&yjd.equals(password)32. returnSUCCESS;33. else34. returnERROR;35. 36. 37. 38. Action(value=add,results=Result(name=success,location=/index.jsp)39.
23、 publicStringadd()throwsException40. returnSUCCESS;41. 42. 43. publicStringgetLoginName()44. returnloginName;45. 46. 47. publicvoidsetLoginName(StringloginName)48. this.loginName=loginName;49. 50. 51. publicStringgetPassword()52. returnpassword;53. 54. 55. publicvoidsetPassword(Stringpassword)56. this.password=password;57. 58.