Struts2知识点整理.docx
- 文档编号:3484096
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:17
- 大小:71.03KB
Struts2知识点整理.docx
《Struts2知识点整理.docx》由会员分享,可在线阅读,更多相关《Struts2知识点整理.docx(17页珍藏版)》请在冰豆网上搜索。
Struts2知识点整理
Struts2
一、struts入门
Struts2是基于Struts1和Webwork,以Webwork(支持更多表现层)为核心的。
Struts1:
只支持jsp表现层,不支持Freemarker和velocity;与servletAPI耦合严重;属于侵入式设计。
Struts2鼓励基于M2模式(MVC设计模式)来开发程序--Web应用程序中通过前端控制器来实现MVC应用程序的模型。
它是框架的表现层,是对MVC构架的具体实现:
1,视图层(V)2,控制层(C)3,模型层(M):
P5原理图
运行环境:
下载Struts2框架,解压,找到lib文件夹:
存放Struts2核心库和第三方插件库
核心JAR包:
struts2-core-2.1.6.jarxwork-2.1.2.jarongl-2.6.11.jarfreemarker-2.3.13.jar
commons-logging-1.0.4.jarcommons-fileupload-1.2.1.jar
struts基本运行机制(Example1):
web.xml:
配置struts2的核心控制器FilterDispatcher,FilterDispatcher用来拦截客户端请求并把请求转发到相应的Action类来处理。
(只要web应用加载了FilterDispatcher就可以获得整个struts2框架所提供的服务)。
struts.xml:
struts2框架的配置文件,主要用于配置业务逻辑控制器Action以及Action中result的定义、Bean配置、常量配置、包配置和拦截器配置。
result的name属性值与Action的返回值相对应。
(也可用struts.properties)
login.jsp部分代码
formaction="checkLogin"namespace="/login"> textfieldname="username"style="font-size: 12px;width: 120px;"label="登录名称"/> passwordname="password"style="font-size: 12px;width: 120px;"label="登录密码"/> submitvalue="登录"/> web.xml代码如下: xmlversion="1.0"encoding="UTF-8"? > 注: 当它的子元素 struts.xml配置如下: 包含配置: struts2自身的拦截器、类型转换、数据校验。 常量配置: 它指定struts2框架的属性,通过constant元素,如: name: 指定常量名字 指定其他视图配置: 包配置: 对某包中所有Action的统一管理。 name属性指定包名,extends指定该包继承其他的包,它的值是另一个包的name;namespace定义了命名空间。 二、拦截器 拦截器是struts2的基石。 原理: 拦截器都是通过代理的方式调用的。 请求到达servletDispatcher时,struts会查找配置文件并根据配置文件实例化相对的拦截器对象,将这些对象串成一个List,最后逐个调用列表中的拦截器。 每个action请求都包装在拦截器内部。 servletDispatcher是webHttp请求的调度器,所有对Action的请求都将通过servletDispatcher调用。 配置: 配置拦截器: 可参考struts-default.xml中的拦截器 配置拦截器栈: 默认拦截器要放在自定义拦截器之上,否则会将自定义拦截器覆盖 使用拦截器(栈): 如果使用了另外的拦截器(栈),需添加 如果Action需要哪种功能,只需要在struts.xml中指定拦截器即可,这种插拔式的动态插入避免了方法的高度耦合和提高了Action的复用性。 在执行Action的execute()方法之前,struts会首先执行在struts.xml中引用的拦截器。 开发中只需要提供拦截器的实现类,并将其配置在struts.xml中。 配置默认拦截器(栈): Name必须是属性必须是存在的拦截器名字 自定义拦截器: 一个java类继承AbstractInterceptor类,重写intercept()方法 intercept(): 是需要实现的拦截动作,返回一个字符串的逻辑视图; 包含一个ActionInvocation对象,它是通过框架传递过来的,通过该参数开发者可以得到相关联的session对象,还有Action对象等。 invoke(): 将控制权交给下一个拦截器,或转给Action的execute()方法。 程序例子 用户登录拦截器代码: publicclassLoginInterceptorextendsAbstractInterceptor{ publicStringintercept(ActionInvocationai)throwsException{ Mapsession=ai.getInvocationContext().getSession();//获取session对象 Stringusername=(String)session.get("user"); if(username! =null&&username.length()>0){ returnai.invoke(); }else{ ActionContextac=ai.getInvocationContext(); ac.put("popedom","您还没有登录,请登录! "); returnAction.LOGIN; }}} struts.xml中拦截器的配置和使用代码: (1)使用 (2)通过 登录请求Action部分代码: publicclassDefaultActionextendsActionSupport{ publicStringexecute(){ returnSUCCESS;}} 登录jsp页面部分代码: propertyvalue="popedom"/> form> textfieldlabel="用户名"name="username"> textfield> passwordlabel="密码"name="password"> password> submitvalue="提交"> submit> form> 拦截器方法过滤: 继承MethodFiledInterceptor类,重写doIntercept(ActionInvocationinvocation) 在struts.xml中指定方法过滤拦截器: 拦截器拦截顺序: 在execute()方法执行前,配置在前的拦截器先起作用;在execute()方法执行之后,后配置的拦截器将先起作用。 拦截结果监听: 一个类实现PreResultListener接口,并将该类手动注册到拦截器内。 实现PreResultListener接口时必须要实现beforeResult()方法,该方法中有参数result,这个参数是被拦截Action中的execute()方法的返回值。 程序例子: 拦截器监听类代码: publicclassMyPreResultListenerimplementsPreResultListener{ //实现抽象方法,定义处理Result结果之前的行为 PublicvoidbeforeResult(ActionInvocationai,Stringresult){System.out.println("拦截结果监听器执行: 返回视图结果: "+result); }} 拦截器部分代码: publicStringintercept(ActionInvocationai)throwsException{ ai.addPreResultListener(newtmq.util.MyPreResultListener());//注册监听器 System.out.println("execute方法执行之前..."); Stringresult=ai.invoke(); System.out.println("execute方法执行之后..."); returnresult; } 在struts.xml中配置: 三、Action和类型转换 Action是应用核心,称为业务控制器 Http请求参数通常直接封装在Action中,把这些请求参数作为Action的属性,并实现getXxx()/setXxx()方法。 setXxx(): Action把Http请求中的参数值赋给与之同名的属性; getXxx(): 将Action中的属性值输出。 ActionSupport: 是一个工具类,实现了Action接口,还实现了Validatable接口。 Validatable接口: 定义了validata()方法,在Action中重写该方法,在该方法中若校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式输出错误信息。 ActionContext: Struts2与ServletAPI完全分离,但是实现业务逻辑时,经常需要访问Servlet中的对象如: session、request、application等,Struts2提供一个名为ActionContext的类,在Action中通过该类获得ServletAPI。 Action运行期间所用到的数据都保存在ActionContext中。 创建和使用ActionContext: ActionContextac=ActionContext.getContext(); ActionContext类的常用方法: 方法名称 方法描述 Objectget(Objectkey) 通过参数key来查找当前ActionContext中的值 MapgetApplication() 返回一个application级的Map对象 StaticActionContextgetContext() 获得当前线程的ActionContext对象 MapgetParameters() 返回一个包含所有HttpServletRequest参数信息的Map对象 MapgetSession() 返回一个Map类型的HttpSession对象 voidput(Objectkey,Objectvalue) 向当前ActionContext对象中存入名值对信息 voidsetApplication(Mapapplication) 设置application上下文 voidsetSession(Mapsession) 设置一个Map类型的session值 程序例子: 演示ActionContext如何访问ServletAPI Action的部分代码: publicclassLoginActionextendsActionSupport{ privateStringname; privateStringpwd; 省略get和set方法 publicStringcheckLogin(){ ActionContextac=ActionContext.getContext();//获得ActionContext Mapapp=ac.getApplication(); ac.getSession().put("login",this.name);//把登录名放入session中 ac.getApplication().put("login",this.name);//把登录名放入application中 returnSUCCESS; }} 配置struts.xml 登录页面和显示页面(部分代码如下): 读取session中的信息: 欢迎 propertyvalue="#session.login"/>! 读取application中的信息: 欢迎 propertyvalue="#application.login"/>! 以上例子是通过ActionContext来访问ServletAPI,是Struts2中Action间接访问ServletAPI的方式,即间接访问方式。 Action直接访问ServletAPI方式: 直接访问方式(IOC和非IOC)。 非IOC方式: struts2提供名为ServletActionContext的辅助类来获得ServletAPI。 其静态方法有: getPageContext()、getRequest()、getResponse()、getServletContext() 如: HttpServletRequestrequest=ServletActionContext.getRequest(); HttpServletResponseresponse=ServletActionContext.getResponse(); request.getSession().setAttribute(“username”,”admin”); request.setAttribute(“password”,”1234”); 更改上个程序例子: 非IOC方式访问ServletAPI Action部分代码: publicclassNoIoCActionextendsActionSupport{ privateStringname; privateStringpwd; 省略get和set方法 publicStringcheckLogin(){ HttpServletRequestrequest=ServletActionContext.getRequest(); HttpSessionsession=request.getSession(); session.setAttribute("login",this.name); returnSUCCESS; } } Action配置: 全局结果对所有action均有效: 重定向: Struts2类型转换: Struts2的内建类型转换器可以自动完成数据类型转换。 四、Struts2标签库 Struts2提供了高扩展性的标签库,满足web页面复杂性和多变性需求,提供主题和模板支持,支持Ajax。 Struts2标签库支持JSTL和OGNL(对象导航语言)。 jsp中使用标签库: 在jsp页面中通过<%@taglibprefix="s"uri="/struts-tags"%>导入标签库 Struts2标签库分类(三大类): 一、非UI标签: a.数据标签: 进行数据存储和处理 action: bean: debug: i18n: include: param: property: set: text: url: data: b.逻辑控制标签: 用于条件和循环等流程控制 if、elseif、else: 通常一起使用,必须指定test属性,该属性用来获得逻辑表达式返回的真假值,并且该属性要和set标签的name属性值保持一致。 setname=”dengji”value=”85”/> iftest=”#dengji>=90”>优秀 if> elseiftest=”#dengji>=80”>良好 elseif> else>不合格 append: 将多个集合合并成一个集合 merger: 将多个集合合并成一个集合 generator: 将一个字符串解析成一个集合 sort: 对集合进行排序 subset: 用于截取集合的一部分 iterator: 将集合进行循环输出 二、支持Ajax标签: 三、UI标签: 主要用于生成HTML页面元素 a.表单标签: 用于生成HTML中的表单 b.非标单标签: 包含一些常用的功能标签 五、Struts2校验 Struts2内建输入校验,无须书写任何输入代码即可实现大部分输入校验并可实现客户端校验和服务器端校验。 Struts2允许重写validata()方法和自定义校验器实现对数据更有效控制。 从客户端输入数据,在服务器端使用数据数据要经过两道工序: 数据转换-------数据校验 在一切输入校验之前进行类型转换,转换不成功的情况下再做数据校验也无意义 输入校验主要用于过滤异常数据。 校验分类: 客户端校验: 可以利用JavaScript脚本对用户输入进行基本校验,但是以这种形式被发送到客户端,说到底就是一些静态代码,可以查看更改源码,容易绕过客户端校验。 服务器端校验: 例如可以在Action的execute()方法中添加数据校验代码: publicStringexecute(){ if(telephone.length! =8){ returnINPUT; }else{returnSUCCESS;}} execute()方法是专门用于调用业务组件和返回逻辑视图的,不建议用来进行数据校验 类型转换也是基本的服务器端校验,但通过类型转换的数据不一定是合法数据 如: age为200不符合常理。 重写validata()方法: 在struts中专门用于校验数据的方法是validata()方法。 Validata(): 在execute()前执行,validata()方法中发现有不合法输入时,会调用其父类的addFieldError()方法记录一个fieldError错误。 开发者可以通过继承ActionSupport类,重写validata()方法来完成输入校验。 例子如下: publicclassValidateActionextendsActionSupport{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts2 知识点 整理