Struts2 学习
1.strusts2概念
struts2是在webwork2基础上发展过来的。其优点:
① 在软件设计上Struts2没有像struts1那样跟Servlet API和Struts API有有着紧密的耦合,struts2的应用可以不依赖于servlet API和struts API.Struts2 这种设计属于无嵌入式设计,而Struts1这种设计属于嵌入式设计。
② Struts提供了拦截器,利用拦截器可以进行AOP编程,可以进行权限编程
③ Struts2提供了类型转换器,我么可以把特殊的请求参数转换成需要的类型
④ Struts2提供了多种表现层技术 如:jsp、freeMarke
⑤ Struts2的输入校验可以对指定方法进行校验,解决啦struts1的长久之痛
⑥ 提供了全局范围、包范围和action范围的国际化资源文件管理实现
2.搭建Struts2的开发环境
① 找到开发struts2应用需要使用到jar文件
② 编写struts2的配置文件(默认的配置文件struts.xml),改文件应放在WEB-INF/classes,开发中放在src文件夹里
③ 在web.xml中加入Struts2 MVC的框架启动配置(是通过filter启动的)如果struts2版本是2.1.3之前的则filter类是org.apache.struts2.dispatcher.FilterDispatcher,如果是往后的,则filter是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
3.struts2中配置Struts.xml配置的包介绍
在struts2框架中使用包来管理action,包的作用和java中的类包非常类似,主要用于管理一组业务功能相关的action.
配置包时必须指定name属性,改name属性值可以任意取名,但必须唯一,如果其它包要继承该包,必须通过该属性进行引用。包的namespace属性必须定义该包的命名空间,命名空间作为访问该包下action的路径的一部分,如访问上面的例子的Action,该访问路径为:/test/helloword.action.namespace属性可以不配置,如果不指定该属性,默认的命名空间是“”.
通常每个包都应该继承struts-default包,因为struts很多核心功能都是拦截器来实现。Struts-default包定义了这些拦截器和result类型。可以这么说,当包继承了struts-default才能使用struts2的核心功能。
4.Action名称的搜索顺序
默认的命名空间,就是属性里不配置namespace属性。
5.Action配置中的各项默认值
l 如果没有为action指定class,默认是Action Support
l 如果没有为action指定method,默认执行action中的execute()方法
l 如果没有指定result的name属性,默认值为success
6.Action中result的各种转发类型
在result配置类似于struts1中的forward,但struts2中提供了多种结果的类型,常用的类型有:type=”dispatcher”(内部转向)或者redirect(重定向)、redirectAction(Action)、 plainText(原代码呈现)。
在result中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。如下:
如果重定向的action在别的命名空间下:
//需要配置另一个包的名字和空间域
一个package中的全局results
为Action的属性注入值,在是在action中配置param如:
需要在action中写上属性xxx,并有getXxx()和setXxx方法();
7.struts2常用的常量
上传文件大小是指上传文件的总的大小,而不是单个的大小。
8.struts2的处理流程
用户请求
|
|||||
|
|||||
|
StrutsPrepareAndExecuteFilter是struts2 框架的核心控制器,负责拦截有
当用户请求到达时,该filter会过滤用户的请求。默认情况下,如果请求的路径不带后缀或者后缀以.action结尾,则请求将转入Struts 2框架处理,否则Struts2框架将略过请求的处理。与Struts1不同,Struts2对用户的每一次请求都会创建一个action,所以Struts2中的action是线程安全的。
9.为引用指定多个struts配置文件
我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其它配置文件,下面的struts.xml通过
10.动态方法调用和使用通配符
禁止动态方法调用方法(一般建议不适用动态方法):
使用通配符获取方法:例如:
11.接收请求参数
采用基本类型接收请求参数(get/post)
在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名属性。例如:
请求路径:http://locahost:8080/test/view.action?id=78
Public class ProductAction{
Private Integer id;
//get和set方法,不再具体写
Public void setId()
{
}
Public void getId()
{
}
}
采用复合类型接收请求参数
Struts2 首先通过反射技术调用类的默认构造器创建类对象,然后通过反射技术调用对象中与请求参数同名的属性的getter方法来获取请求参数的值。
注意:struts2.1.6的版本,会出现参数信息乱码问题,2.1.8以后的版本里已经解决了这个问题。解决参数乱码问题,需要在struts2的Filter之前在配置一个编码过滤器。
12.自定义类型转换器
Struts2有两种类型转换器:局部类型转换器和全部类型转换器
局部类型转换器:定义自己的转换器,继承DefaultTypeConverter父类,重写父类的ConvertValue(Map context,Object value,Class toType)方法
对类型转换器进行注册,在Action类的包下放置ActionClassName-conversion.properties文件,ActionClassName是action的类名。后面的conversion.properties是固定写法。
13.文件上传
Enctype=multipart/form-data(必须在上传文件中写)
解决大文件上传:
多文件上传,要写多个文件上传框,name属性的名字要一致,而且在Action中要定义一个与name属性名字相同属性数组。
14.自定义拦截器
要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口。
如果想要拦截器继续执行Action中的方法,则用invocation.invoke()这个方法。(下面添加的东西,都是struts2.xml中进行操作)
在Struts.xml中注册拦截器:
注册拦截器类(目的是让Action也可以使用默认的拦截器):
在特定的Action中使用拦截器:
为一个包指定默认的拦截器:
如果为某个action显示的指定了一个拦截器,则这个拦截器会替代默认的拦截器。如果还想用默认的拦截器,则应该也要显示的指定默认的拦截器(且放在另一个拦截器之前)。
15.输入校验
在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。
对于输入校验struts2提供了两种实现方法:
采用手工编写代码实现
对action中的所有方法进行校验:通过重写validate()方法实现,validate()方法会校验action中所有与execute方法签名相同的方法,当某个数据校验失败时,我们应该调用addFiledError()方法往系统的fieldErrors添加校验失败信息(为了使用addFiledError方法,action可以继承ActionSupport)如果系统的fieldErrors包含失败信息,struts2将会将请求转发到名为input的result.在input视图中可以通过
手机号的正则表达式:^1[358]\\d{9}$
对action中的指定的方法进行校验:是重写validateXXX()方法。Xxx是action中的方法,且第一个字母要大写。如:action中含有add()方法,如果是重写
validateAdd()方法,则只对add()方法进行校验。其余的过程和上述的相同。
基于xml配置方式实现
对action中的所有方法进行校验:使用基于xml配置方式实现输入校验时,action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml.ActionClassName为action的简单类名,-validation为固定写法。如果Action类的cn.itcast.UserAction,那么该文件的取名应为:UserAction-validation.xml。下面是校验文件的模板:
"-//ApacheStruts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
系统的提供校验器:
校验器例子:
其中的正则表达式校验器,在一些版本中:name=”expression”要写成name=”regex”
对action中的指定的方法进行校验:只需要改变校验文件的取名即可,改为:
ActionClassName-ActionName-validation.xml,其中,ActionName为struts.xml中的action名称。
基于XML校验的一些特点:
15.输入校验流程
Ø 类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性
Ø 如果在执行类型转换的过程中出现异常,系统将会将异常信息保存在ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都将会进入第三步
Ø 系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
Ø 再调用action中的validate()方法。
Ø 经过上面4步,如果系统中的fieldErrors存在错误信息,系统自动将请求转发至名称为input的视图。如果系统fieldErrors没有任何错误信息系统将执行action中的处理方法。
16.国际化
准备资源文件,资源文件的命名格式如下:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但是language和country必须是国家。如:
中国大陆:baseName_zh_CN.properties
美国:baseName_en_US.propertie
对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件,命令使用的使用方式如下:
Native2ascii 源文件。Properties目标文件.properties(一般的开发工具都支持这个转换)
l 配置全局资源与输出国际化信息:当准备好资源文件后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:
Itcast为资源文件的基本名
在页面或在action中访问国际化信息:
在jsp页面中使用
在表单标签中,通过key属性指定资源文件中的key,如:
在Action类中,我们可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key.第二个参数提供占位符的值。
l 包范围的资源文件
在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源。当查找指定的key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从
struts.custom.i18n.resources指定的资源文件中寻找。
l Action范围资源文件
在Action类所在的包下,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的不带后缀的名称
Package为包的baseName的名称
17.OGNL表达式(大部分用jstl和el表达式)
OGNL是Object Graphic NavigationLanguage(对象图导航语言)的缩写。
相对于EL表达式,它提供啦平时我们需要的一些功能,如:
l 支持对象方法的调用,如:xxx.sayHello
l 支持类静态方法的调用和值访问,表达式的格式为@[类全名(包含包路径)]@[方法名|值名],例如:@java.lang.String@format(‘foo%s’,’bar’)或者@cn.itcast.Constant@APP_NAME;
l 操作集合对象
Struts2 中的OGNL Context实现者为ActionContext,它结构示意图如下:
当Struts接受一个请求时,会迅速创建一个ActionContext,ValueStack,action,然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。
访问上下文中的对象需要使用#符号标准命名空间,如#application、#session
另外OGNL会设定一个跟对象(root对象),在struts2中跟对象就是ValueStack(值栈),访问其属性,不需要加 #命名空间。
在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,以此往下。
注意:struts2 中,OGNL表达式需要配合Struts标签才可以使用。如:
OGNL判断对象是否在集合中
OGNL的投影功能
18.Struts的标签
iterator标签:迭代器标签
If标签
Url标签:
Checkboxlist标签
单选框标签
19.防止表单重复提交