1、Struts2知识点整理Struts2一、struts入门Struts2是基于Struts1和Webwork,以Webwork(支持更多表现层)为核心的。Struts1:只支持jsp表现层,不支持Freemarker和velocity;与servlet API耦合严重;属于侵入式设计。Struts2鼓励基于M2模式(MVC设计模式)来开发程序 - Web应用程序中通过前端控制器来实现MVC应用程序的模型。它是框架的表现层,是对MVC构架的具体实现:1, 视图层(V) 2, 控制层(C) 3, 模型层(M):P5 原理图运行环境:下载Struts2框架,解压,找到lib文件夹:存放Struts2
2、核心库和第三方插件库核心JAR包:struts2-core-2.1.6.jar xwork-2.1.2.jar ongl-2.6.11.jar freemarker-2.3.13.jar commons-logging-1.0.4.jar commons-fileupload-1.2.1.jarstruts基本运行机制(Example1):web.xml: 配置struts2的核心控制器FilterDispatcher,FilterDispatcher用来拦截客户端请求并把请求转发到相应的Action类来处理。(只要web应用加载了FilterDispatcher就可以获得整个struts2框
3、架所提供的服务)。struts.xml: struts2框架的配置文件,主要用于配置业务逻辑控制器Action以及Action中result的定义、Bean配置、常量配置、包配置和拦截器配置。result的name属性值与Action的返回值相对应。(也可用struts.properties) login.jsp部分代码 web.xml 代码如下: first Struts 2 Project struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* 注:元素用来指定要加载struts2框架的核心控制器FilterDis
4、patcher; 标签配置struts2核心Filter的实现类; 元素用来指定让struts2框架处理用户的哪些请求(URL),当它的子元素的值是*时表示用户的所有请求都使用此框架来处理。struts.xml配置如下: /index.jsp /login.jsp 包含配置:避免代码臃肿 是struts2默认的核心配置文件,它配置了struts2自身的拦截器、类型转换、数据校验。常量配置:它指定struts2框架的属性,通过constant元素,如: name:指定常量名字 指定其他视图配置: /XXX.ftl /XXX.vm 包配置:对某包中所有Action的统一管理。 name属性指定包名
5、,extends指定该包继承其他的包,它的值是另一个包的name;namespace定义了命名空间。二、拦截器拦截器是struts2的基石。原理:拦截器都是通过代理的方式调用的。请求到达servletDispatcher时,struts会查找配置文件并根据配置文件实例化相对的拦截器对象,将这些对象串成一个List,最后逐个调用列表中的拦截器。每个action请求都包装在拦截器内部。servletDispatcher是web Http请求的调度器,所有对Action的请求都将通过servletDispatcher调用。配置: 配置拦截器: 元素指定拦截器名和拦截器类: 参数指 可参考struts
6、-default.xml中的拦截器配置拦截器栈: 默认拦截器要放在自定义拦截器之上,否则会将自定义拦截器覆盖使用拦截器(栈): 如果使用了另外的拦截器(栈),需添加 如果Action需要哪种功能,只需要在struts.xml中指定拦截器即可,这种插拔式的动态插入避免了方法的高度耦合和提高了Action的复用性。 在执行Action的execute()方法之前,struts会首先执行在struts.xml中引用的拦截器。开发中只需要提供拦截器的实现类,并将其配置在struts.xml中。 配置默认拦截器(栈):Name必须是属性必须是存在的拦截器名字自定义拦截器: 一个java类继承Abstra
7、ctInterceptor类,重写intercept()方法 intercept(): 是需要实现的拦截动作,返回一个字符串的逻辑视图; 包含一个ActionInvocation对象,它是通过框架传递过来的,通过该参数开发者可以得到相关联的session对象,还有Action对象等。 invoke(): 将控制权交给下一个拦截器,或转给Action的execute()方法。程序例子用户登录拦截器代码:public class LoginInterceptor extends AbstractInterceptor public String intercept(ActionInvocation
8、 ai) throws Exception Map session = ai.getInvocationContext().getSession();/获取session对象 String username = (String) session.get(user); if (username != null & username.length() 0) return ai.invoke(); else ActionContext ac=ai.getInvocationContext(); ac.put(popedom, 您还没有登录,请登录!); return Action.LOGIN; st
9、ruts.xml中拦截器的配置和使用代码:(1) 使用元素定义拦截器(2) 通过元素使用拦截器 登录请求Action部分代码: public class DefaultAction extends ActionSupport public String execute() return SUCCESS; 登录jsp页面部分代码: 拦截器方法过滤: 继承MethodFiledInterceptor类,重写doIntercept(ActionInvocation invocation) 在struts.xml中指定方法过滤拦截器: 指定Action中不需被过滤的方法指定Action中需要被过滤的方
10、法 拦截器拦截顺序: 在execute()方法执行前,配置在前的拦截器先起作用;在execute()方法执行之后,后配置的拦截器将先起作用。 拦截结果监听: 一个类实现PreResultListener接口,并将该类手动注册到拦截器内。 实现PreResultListener接口时必须要实现beforeResult()方法,该方法中有参数result,这个参数是被拦截Action中的execute()方法的返回值。程序例子: 拦截器监听类代码: public class MyPreResultListener implements PreResultListener /实现抽象方法,定义处理R
11、esult结果之前的行为Public void beforeResult(ActionInvocation ai, String result) System.out.println(拦截结果监听器执行 : 返回视图结果:+result); 拦截器部分代码: public String intercept(ActionInvocation ai) throws Exception ai.addPreResultListener(new tmq.util.MyPreResultListener();/注册监听器 System.out.println(execute方法执行之前.); String
12、 result=ai.invoke(); System.out.println(execute方法执行之后.); return result; 在struts.xml中配置:三、Action和类型转换 Action是应用核心,称为业务控制器 Http请求参数通常直接封装在Action中,把这些请求参数作为Action的属性,并实现getXxx()/setXxx()方法。 setXxx():Action把Http请求中的参数值赋给与之同名的属性;getXxx():将Action中的属性值输出。 ActionSupport:是一个工具类,实现了Action接口,还实现了Validatable接口。
13、 Validatable接口:定义了validata()方法,在Action中重写该方法,在该方法中若校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式输出错误信息。 ActionContext: Struts2与Servlet API完全分离,但是实现业务逻辑时,经常需要访问Servlet中的对象如:session、request、application等,Struts2提供一个名为ActionContext的类,在Action中通过该类获得Servlet API。 Action运行期间所用到的数据都保存在ActionCon
14、text中。 创建和使用ActionContext: ActionContext ac = ActionContext.getContext();ActionContext类的常用方法: 方法名称方法描述Object get(Object key)通过参数key来查找当前ActionContext中的值Map getApplication()返回一个application级的Map对象Static ActionContext getContext()获得当前线程的ActionContext对象Map getParameters()返回一个包含所有HttpServletRequest参数信息的M
15、ap对象Map getSession()返回一个Map类型的HttpSession对象void put(Object key, Object value)向当前ActionContext对象中存入名值对信息void setApplication(Map application)设置application上下文void setSession(Map session)设置一个Map类型的session值程序例子:演示ActionContext如何访问Servlet APIAction的部分代码:public class LoginAction extends ActionSupport priva
16、te String name; private String pwd; 省略get和set方法 public String checkLogin() ActionContext ac=ActionContext.getContext(); /获得ActionContext Map app=ac.getApplication(); ac.getSession().put(login, this.name); /把登录名放入session中 ac.getApplication().put(login, this.name); /把登录名放入application中 return SUCCESS;
17、配置struts.xml登录页面和显示页面(部分代码如下): 读取session中的信息:欢迎!读取application中的信息:欢迎!以上例子是通过ActionContext来访问Servlet API,是Struts2中Action间接访问Servlet API的方式,即间接访问方式。 Action直接访问Servlet API方式:直接访问方式(IOC和非IOC)。 非IOC方式:struts2提供名为ServletActionContext的辅助类来获得Servlet API。 其静态方法有:getPageContext()、getRequest()、getResponse()、ge
18、tServletContext() 如: HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();request.getSession().setAttribute(“username”,”admin”);request.setAttribute(“password”,”1234”);更改上个程序例子:非IOC方式访问Servlet API Action部分代码: public class No
19、IoCAction extends ActionSupport private String name; private String pwd; 省略get和set方法 public String checkLogin() HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); session.setAttribute(login, this.name); return SUCCESS; Action配置: 全局结果对所有action均
20、有效: /XXX.jsp 重定向: /XXX.jsp Struts2类型转换: Struts2的内建类型转换器可以自动完成数据类型转换。四、Struts2标签库Struts2提供了高扩展性的标签库,满足web页面复杂性和多变性需求,提供主题和模板支持,支持Ajax。Struts2标签库支持JSTL和OGNL(对象导航语言)。jsp中使用标签库:在jsp页面中通过导入标签库Struts2标签库分类(三大类):一、 非UI标签: a. 数据标签:进行数据存储和处理action: bean: debug: i18n: include:param: property: set: text: url:
21、data:b. 逻辑控制标签:用于条件和循环等流程控制 if、elseif、else:通常一起使用,必须指定test属性,该属性用来获得逻辑表达式返回的真假值,并且该属性要和set标签的name属性值保持一致。 =90”优秀 =80”良好 不合格 append:将多个集合合并成一个集合 merger:将多个集合合并成一个集合 generator:将一个字符串解析成一个集合sort:对集合进行排序subset:用于截取集合的一部分 iterator:将集合进行循环输出二、 支持Ajax标签:三、 UI标签:主要用于生成HTML页面元素a 表单标签:用于生成HTML中的表单b 非标单标签:包含一些
22、常用的功能标签五、Struts2校验 Struts2内建输入校验,无须书写任何输入代码即可实现大部分输入校验并可实现客户端校验和服务器端校验。Struts2允许重写validata()方法和自定义校验器实现对数据更有效控制。 从客户端输入数据,在服务器端使用数据数据要经过两道工序: 数据转换-数据校验 在一切输入校验之前进行类型转换,转换不成功的情况下再做数据校验也无意义 输入校验主要用于过滤异常数据。 校验分类: 客户端校验:可以利用JavaScript脚本对用户输入进行基本校验,但是以这种形式被发送到客户端,说到底就是一些静态代码,可以查看更改源码,容易绕过客户端校验。 服务器端校验: 例
23、如可以在Action的execute()方法中添加数据校验代码: public String execute() if(telephone.length !=8)return INPUT;else return SUCCESS; execute()方法是专门用于调用业务组件和返回逻辑视图的,不建议用来进行数据校验类型转换也是基本的服务器端校验,但通过类型转换的数据不一定是合法数据 如:age为200 不符合常理。重写validata()方法: 在struts中专门用于校验数据的方法是validata()方法。Validata():在execute()前执行,validata()方法中发现有不合法输入时,会调用其父类的addFieldError()方法记录一个fieldError错误。开发者可以通过继承ActionSupport类,重写validata()方法来完成输入校验。 例子如下: public class ValidateAction extends ActionSupport
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1