- 浏览: 4085 次
- 性别:
- 来自: 重庆
文章分类
最新评论
Struts2
一、入门
(一)认识Struts2
(二)搭建环境
(三)第一个Struts2例子
二、基础
(一)常量说明
<!-- 指定Web应用的默认编码集,相当于调用 HttpServletRequest的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!- 该 属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即 所有匹配*.action的请求都由Struts 2处理。如 果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开 -->
<constant name="struts.action.extension" value="do" />
<!-- 设 置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好 关闭 -->
<constant name="struts.serve.static.browserCache " value="false" />
<!-- 当 struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生 产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 开 发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 默 认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<!-- 该 属性指定Struts 2中的action由Spring容器创 建 -->
<constant name="struts.objectFactory" value="spring" />
(二)Resul视图配置的转发类型
<result name=”字符串” type=”redirect|chain|redirectAction|dispacher |json|stream”>
Redirect: 重写向页面
Chiain: 转发到请示
redirectAction:重定向到action
dispatcher:服务器转发
stream:用于文件下载
json:用于返回json字符串
文件路径
<result name=”字符串” type=”json”>
<params name=”root”>属性arams>
</result>
转到不同包下的action
<result type=”chain”>
<params name=”actionName”>actionName <params>
<params name=”namespace”>/otherpackage/action<params>
</result>
(三)Action配置的各项默认值
ACTION:
Name=””
Class :ActionSupport
Method:execute,{*}
Result:
Name:success
Type:dispatcher/redirect/json
(四)Action 属性值
原始的方式
] HttpServletRequest request=serrvletActionContext.getRequest();
String param=request.getParameter(“name”);
Getter Setter
声明一个属性:Private String name;
添加:gettter settter方法
OK :直接访问
页面的name必须和setName一致;
对象获取
声明一个对象
Private Object object;
添加:gettter settter方法
页面的name必须为:object.属性
(五)Struts请求流程
http:// localhost:8080/project name/namespace/action
协议 –主机:端口—项目Context Root—命名空间—action名
(六)Struts 指定多个配置文件
<inclide file=”url” />
(七)动态方法调用和使用通配符定义Action
1.动态方法调用
在请求url后面!指定的方法
例: struts2/test/action!method
2.通配符定义
<Action name=”*” class=”类路径” method=”{1}”>
<result type=”dispacher”>{1}.jsp</result>
<result type=”error”>error.jsp</result>
</Action>
使用前:struts.enable.DynamicMethodInvocation设置为true
(八)自定义类型转换器
1.局部类型转换器
新建一个类并继承DefaultTypeConverter
重写convertValue方法
在action所在的包下建ActionClassName-conversion.properties
(actionclassname:就是aciton的类名,后面的-conversion.properties是固定写法),
属性文件中的内容
属性名=类型转换器的类全路径
例:birthday=com.lsw.struts.converter.DateTypeConverter
2.全局类型转换器
前面的操作和局部类型转换器一致;
在WEB-INF/classes下放置xwork-conversion.properties
属性文件中的内容
属性名=类型转换器的类全路径
例:java.util.Date=com.lsw.struts.converter.DateTypeConverter
注:全局类型转换器使用的条件,所有的未转换前的属性的格式一致时,这种情况下才使用,否者使用局部类型转换器;
(九)访问或添加request等属性
1.添置作用域属性
获取上下文
ActionContext ctx=ActionContext.getContext();
Application 范围
ctx.getApplication.put(String key,Object value);
Session 范围
ctx.getSession.put(String key,Object value);
Request 范围
ctx..put(String key,Object value);
2.访问作用域的属性
a)使用el表达式访问
i.${application/session/requestScope.属性}
b)使用Struts标签访问
i.<s:property value=”#属性” />
注:# 是ognl表达式 对象图形导航语言(Object-Graph Navigation Language)
3.获取HttpServletRequest/HttpSession/ServeltContext/HttpServletResponse对象
a)通过ServletActionContext直接获取
HttpServletRequest request=ServletActionContext.getRequest();
ServletContext ctx=ServletActionContext.getServletContext();
HttpSession session=reuqest.getSession();
HttpServletResponse response=ServletActionContext.getResponse();
b)通过接口实现
i.ServletRequestAWare,ServletResopnseAware,ServletCotnextAware
(十)文件上传
1.Struts2文件必须的jar
Commons-fileupload-1.2.1.jar
Common-Io-1.3.1.jar
2.上传时须要给表单添加 entype=”multipart/form-data”
3.在Action添加以下属性,属性对应表单文件的属性
FIle file 表单上传的文件
String uploadContentType 文件类型
Stirng uploadFileName 文件名
开始上传:
String realPath=ServletActionContext.getServeltContext.getRealPath(“fileupload”);
File file==new File(realPath);
If(!file.exist)//当文件夹不存在时
File.mkdirs()//创建这个文件夹
FileUtils.copyFile(this.file,new(file,uploadfileName))
多文件上传
File[] uploadfiles;
Stirng[] uploadContextTypes;
Stirng[] uploadFileNames;
省略getter setter方法
开始上传
Stirng realPath=ServletAcitonContext.getServletcontext.getRealPath(“/fileupload”);
File file=new File(realPath);
If(!file.exist)
{
File.mkdires();
}
For(i=0;i<uploadfile.length;i++)
{
FileUtils.
copyFile(uploadfile[i],new File(file,uploadFileNames[i]));
}
注:当上传大文件时设置常量
<constant name=”struts.multipart.MaxSize” value=””> (单位b)
(十一)文件下载
(十二)自定义拦截器
Struts2拦截器类须要实现com.opensymphony.xwork2.interceptor.Interceptor 实现所有的方法
在 intercepter方法的写业务逻辑
注册拦截器
在Struts.xml中 Acation中注册拦截器
在package 节点下添加
<interceptors>
<interceptor name=”” class=”” />
<interceptor-stack name=”permissionStack”>
<interceptor-ref name=”defaultStack” />
<interceptor-ref name=”拦截器名” />
</interceptors>
配置默认拦截器栈
<default-interceptor-ref name="自定义拦截器栈" />
在Action节点下添加
<interceptor-ref name=”permissionStack” />
拦截指定方法
<param name="includeMethods">方法名</param>
不拦截指定的方法
<param name="excludeMethods">方法名</param>
注:因为Struts2中文件上传,数据验证,封装请求参数到action行等功能都是由系统的defaultStack中的默认拦截器拦截的,所以我们定义拦截器须要引用默认的defaultStack 这样才可以使用众多的功能。
如果希望所有的action都要使用自定义拦截器,可以通过
<default-interceptor-ref name=”拦截器名” /> 把拦截器设置为默认的拦截器。每个包只能指定一个拦截器,一旦我们指定的默认拦截器,系统的默认拦截器不再生效。
注册拦截器必须在package节点下
(十三)对Action所有方法进行输入校验
在Struts2中,我们可以实现对action的所有访求方法进行校验或者对action的指定方法进行校验。
1.采用手工编写代码实现
a)对action中所有方法进行校验
a.首先action要继承ActionSuport
b.在Action中重写validate()方法
c.在validate中写校验的逻辑
例:对手机号码进行校验
If(mobel==null || “ ”.equals(mobel))
{
this.addFiledError(“mobel”,”手机号码不能为空!”);
}else
{
If(pattern.compile(“^1[358]//d{9} ”).matcher(mobel).maches())
{
this.addFiledError(“mobel”,”手机号码格式不正确!”);
}
}
d.在jsp页面显示校验失败的信息
通过struts2标签库的<s:filederror/>
b)对action中指定方法进行校验
通过validateXxx()方法实现,validate只会校验方法名为Xxx的方法,其它的步骤和前面一样;
2.输入校验的流程
1、类型转换器对请求参数执行类型转换,并把值赋给action的属性
2、如果在执行类型转换过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到filedError里。不管类型转换是否会出现异常,都要会执行第三步。
3、再度调用action 中的validate()方法;
4、经过上面4步,如果系统中的fileErrors存在错误信息,系统自动将请求转发自名称为input 的视图中,如果没有系统将执行action中的处理方法。
3.基于xml配置方式实现
使用基于xml配置方式实现输入校验时,Action须要继承ActionSuport,并且提供校验文件和Action类放在同一个包下,文件的取名格式为
ActionName-validation.xml,其中ActionName为Action的简单名。
校验文件的模板:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<filed name=”属性名”>
<filed-validator type=”requiredstring>
<param name=”trim”>true</param>
<messge >不能为空!</message>
</filed-validator>
</filed>
</validators>
4.对Action指定的方法进行校验
ActionName-user-method-validation.xml
注:user是 struts.xml中 name=”user-*”
要对add()方法实施验证,校验文件的取名为: UserAction-user_add-validation.xml
要对update()方法实施验证,校验文件的取名为: UserAction-user_update-validation.xml
对action所有方法进行校验,就是ActionName-validation.xml
系统提供的校验器如下:
required (必填校验器,要求field的值不能为null)
requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)
stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)
url(网址校验器,要求如果field的值非空,则必须是合法的url地址)
date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)
conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)
expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)
国际化
准备资源文件,资源文件的命名格式如下:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如:
中国大陆: baseName_zh_CN.properties
美国: baseName_en_US.properties
现在为应用添加两个资源文件:
第一个存放中文:itcast_zh_CN.properties
内容为:welcome=欢迎来到传智播客
第二个存放英语(美国): itcast_en_US.properties
内容为: welcome=welcome to itcast
对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下:
native2ascii 源文件.properties 目标文件.properties
5.配置全局资源与输出国际化信息
当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:
<constant name="struts.custom.i18n.resources" value="itcast" />
itcast为资源文件的基本名。
后面我们就可以在页面或在action中访问国际化信息:
在JSP页面中使用<s:text name=“”/>标签输出国际化信息:
<s:text name=“user”/>,name为资源文件中的key
在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key。
在表单标签中,通过key属性指定资源文件中的key,如:
<s:textfield name="realname" key="user"/>
6.国际化—输出带占位符的国际化信息
资源文件中的内容如下:
welcome= {0},欢迎来到传智播客{1}
在jsp页面中输出带占位符的国际化信息
<s:text name="welcome">
<s:param><s:property value="realname"/></s:param>
<s:param>学习</s:param>
</s:text>
在Action类中获取带占位符的国际化信息,可以使用getText(String key, String[] args)或getText(String aTextName, List args)方法。
7.国际化—包范围资源文件
在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这个时候我们可以针对不同模块,使用包范围来组织国际化文件。
方法如下:
在 java的包下放置package_language_country.properties资源文件,package为固定 写法,处于该包及子包下的action都可以访问该资源。当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才 会从常量struts.custom.i18n.resources指定的资源文件中寻找。
8.国际化—Action范围资源文件
我们也可以为某个action单独指定资源文件,方法如下:
在Action类所在的路径,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的简单名称。
当 查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如 果没有找到对应的key,然后沿着当前包往上查找基本名为package 的资源文件,一直找到最顶层包。如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻 找
9.际化—JSP中直接访问某个资源文件
struts2为我们提供了<s:i18n>标签,使用<s:i18n>标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:
<s:i18n name="itcast">
<s:text name=“welcome”/>
</s:i18n>
Itcast为类路径下资源文件的基本名。
如果要访问的资源文件在类路径的某个包下,可以这样访问:
<s:i18n name=“cn/itcast/action/package">
<s:text name="welcome">
<s:param>小张</s:param>
</s:text>
</s:i18n>
上面访问cn.itcast.action包下基本名为package的资源文件。
(十四)OGNL表达式
OGNL对象图形导航语言
ognl表达式需要结合struts标签使用
(十五)struts2常用标签
使用前引入标签库:<%@ taglib prefix="s" uri="/struts-tags" %>
需要与ognl表达式结合使用
1.数据标签
<s:set></s:set>
Scope:action,page,request,session.application
<s:property/>
2.控制标签
<s:if test=””></s:if>
<s:elseif test=””>
<s:else></s:else>
3.迭代标签
<s:iterator value=”” var status=””>
<s:properties value=””>
</s:iterator>
例:
<s:iterator value="datas" id="v" status="status">
index[<s:property value="#status.index"/>]=<s:property/>
</s:iterator>
<s:iterator value="availableItems" status="status" id="v">
4.表单标签
(十六)Struts异常
因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理。
为了使用Struts2的异常处理机制,必须打开Struts2的异常映射功能,这需要exception拦截器。在struts-default.xml文件中已经开启了exception拦截器。
声明式异常捕捉
Struts2的异常处理机制是通过在struts.xml文件中配置<exception-mapping……/>元素完成的,配置该元素时,需要指定两个属性:
exception:指定该异常类型的完全限定名。
result:指定逻辑视图名。
根据<exception-mapping…../>元素出现位置的不同,异常映射又可分为两种:
局部异常映射:将<exception-mapping… />元素作为<action…/>元素的子元素配置;
全局异常映射:将<exception-mapping… />元素作为<global-exception-mappings… />元素的子元素配置;
全局异常映射对所有的Action都有效,但局部异常映射仅对该异常映射所在的Action有效。
如果局部异常映射和全局异常映射配置了同一个异常类型,在<action…./>元素内的局部异常映射将覆盖全局异常映射
(十七)使用标签防止表单重复提交
<s:token/> 结合token拦截器完成
<s:token/> 用于产生令牌码
Token是struts2内置拦截器
<s:token/> 放到表单中
<interceptor- ref name=”token”>只能放到action内]
需要指定全局重复提交跳转的页面
<global-results>
<result name=”invali.token”>path.jsp(提示重复页面) </result>
</globl-results>
三、深入
1.Struts2零配置
2.Ajax json
使用前先添加struts-json-plugin.jar 包
Page必须继承json-default
<result name=”str” type=”json”>
<param name=”root”>返回属性</param>
</result>
使用fastjson输出
四、集成Spring
在使用前先添加struts2-spring-plugin-2.3.20.jar包
<constant name="struts.objectFactory" value="spring" />
struts2.xml
模板:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
使用struts2框架步骤
1 添加java包
freemarker-2.3.13.jar 、
ognl-2.6.11.jar
struts2-core-2.1.6.jar 、
xwork-2.1.2.jar
commons-fileupload-1.2.1.jar
2 在web.xml 使用filter标签配置struts2的核心
3 写一个action类处理对应的请求
4 配置action,在src目录下写一个struts.xml文件来配置/*.action
重定向action
在result标签中<result type="redirectAction" >action</result>
一、入门
(一)认识Struts2
(二)搭建环境
(三)第一个Struts2例子
二、基础
(一)常量说明
<!-- 指定Web应用的默认编码集,相当于调用 HttpServletRequest的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!- 该 属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即 所有匹配*.action的请求都由Struts 2处理。如 果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开 -->
<constant name="struts.action.extension" value="do" />
<!-- 设 置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好 关闭 -->
<constant name="struts.serve.static.browserCache " value="false" />
<!-- 当 struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生 产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 开 发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 默 认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<!-- 该 属性指定Struts 2中的action由Spring容器创 建 -->
<constant name="struts.objectFactory" value="spring" />
(二)Resul视图配置的转发类型
<result name=”字符串” type=”redirect|chain|redirectAction|dispacher |json|stream”>
Redirect: 重写向页面
Chiain: 转发到请示
redirectAction:重定向到action
dispatcher:服务器转发
stream:用于文件下载
json:用于返回json字符串
文件路径
<result name=”字符串” type=”json”>
<params name=”root”>属性arams>
</result>
转到不同包下的action
<result type=”chain”>
<params name=”actionName”>actionName <params>
<params name=”namespace”>/otherpackage/action<params>
</result>
(三)Action配置的各项默认值
ACTION:
Name=””
Class :ActionSupport
Method:execute,{*}
Result:
Name:success
Type:dispatcher/redirect/json
(四)Action 属性值
原始的方式
] HttpServletRequest request=serrvletActionContext.getRequest();
String param=request.getParameter(“name”);
Getter Setter
声明一个属性:Private String name;
添加:gettter settter方法
OK :直接访问
页面的name必须和setName一致;
对象获取
声明一个对象
Private Object object;
添加:gettter settter方法
页面的name必须为:object.属性
(五)Struts请求流程
http:// localhost:8080/project name/namespace/action
协议 –主机:端口—项目Context Root—命名空间—action名
(六)Struts 指定多个配置文件
<inclide file=”url” />
(七)动态方法调用和使用通配符定义Action
1.动态方法调用
在请求url后面!指定的方法
例: struts2/test/action!method
2.通配符定义
<Action name=”*” class=”类路径” method=”{1}”>
<result type=”dispacher”>{1}.jsp</result>
<result type=”error”>error.jsp</result>
</Action>
使用前:struts.enable.DynamicMethodInvocation设置为true
(八)自定义类型转换器
1.局部类型转换器
新建一个类并继承DefaultTypeConverter
重写convertValue方法
在action所在的包下建ActionClassName-conversion.properties
(actionclassname:就是aciton的类名,后面的-conversion.properties是固定写法),
属性文件中的内容
属性名=类型转换器的类全路径
例:birthday=com.lsw.struts.converter.DateTypeConverter
2.全局类型转换器
前面的操作和局部类型转换器一致;
在WEB-INF/classes下放置xwork-conversion.properties
属性文件中的内容
属性名=类型转换器的类全路径
例:java.util.Date=com.lsw.struts.converter.DateTypeConverter
注:全局类型转换器使用的条件,所有的未转换前的属性的格式一致时,这种情况下才使用,否者使用局部类型转换器;
(九)访问或添加request等属性
1.添置作用域属性
获取上下文
ActionContext ctx=ActionContext.getContext();
Application 范围
ctx.getApplication.put(String key,Object value);
Session 范围
ctx.getSession.put(String key,Object value);
Request 范围
ctx..put(String key,Object value);
2.访问作用域的属性
a)使用el表达式访问
i.${application/session/requestScope.属性}
b)使用Struts标签访问
i.<s:property value=”#属性” />
注:# 是ognl表达式 对象图形导航语言(Object-Graph Navigation Language)
3.获取HttpServletRequest/HttpSession/ServeltContext/HttpServletResponse对象
a)通过ServletActionContext直接获取
HttpServletRequest request=ServletActionContext.getRequest();
ServletContext ctx=ServletActionContext.getServletContext();
HttpSession session=reuqest.getSession();
HttpServletResponse response=ServletActionContext.getResponse();
b)通过接口实现
i.ServletRequestAWare,ServletResopnseAware,ServletCotnextAware
(十)文件上传
1.Struts2文件必须的jar
Commons-fileupload-1.2.1.jar
Common-Io-1.3.1.jar
2.上传时须要给表单添加 entype=”multipart/form-data”
3.在Action添加以下属性,属性对应表单文件的属性
FIle file 表单上传的文件
String uploadContentType 文件类型
Stirng uploadFileName 文件名
开始上传:
String realPath=ServletActionContext.getServeltContext.getRealPath(“fileupload”);
File file==new File(realPath);
If(!file.exist)//当文件夹不存在时
File.mkdirs()//创建这个文件夹
FileUtils.copyFile(this.file,new(file,uploadfileName))
多文件上传
File[] uploadfiles;
Stirng[] uploadContextTypes;
Stirng[] uploadFileNames;
省略getter setter方法
开始上传
Stirng realPath=ServletAcitonContext.getServletcontext.getRealPath(“/fileupload”);
File file=new File(realPath);
If(!file.exist)
{
File.mkdires();
}
For(i=0;i<uploadfile.length;i++)
{
FileUtils.
copyFile(uploadfile[i],new File(file,uploadFileNames[i]));
}
注:当上传大文件时设置常量
<constant name=”struts.multipart.MaxSize” value=””> (单位b)
(十一)文件下载
(十二)自定义拦截器
Struts2拦截器类须要实现com.opensymphony.xwork2.interceptor.Interceptor 实现所有的方法
在 intercepter方法的写业务逻辑
注册拦截器
在Struts.xml中 Acation中注册拦截器
在package 节点下添加
<interceptors>
<interceptor name=”” class=”” />
<interceptor-stack name=”permissionStack”>
<interceptor-ref name=”defaultStack” />
<interceptor-ref name=”拦截器名” />
</interceptors>
配置默认拦截器栈
<default-interceptor-ref name="自定义拦截器栈" />
在Action节点下添加
<interceptor-ref name=”permissionStack” />
拦截指定方法
<param name="includeMethods">方法名</param>
不拦截指定的方法
<param name="excludeMethods">方法名</param>
注:因为Struts2中文件上传,数据验证,封装请求参数到action行等功能都是由系统的defaultStack中的默认拦截器拦截的,所以我们定义拦截器须要引用默认的defaultStack 这样才可以使用众多的功能。
如果希望所有的action都要使用自定义拦截器,可以通过
<default-interceptor-ref name=”拦截器名” /> 把拦截器设置为默认的拦截器。每个包只能指定一个拦截器,一旦我们指定的默认拦截器,系统的默认拦截器不再生效。
注册拦截器必须在package节点下
(十三)对Action所有方法进行输入校验
在Struts2中,我们可以实现对action的所有访求方法进行校验或者对action的指定方法进行校验。
1.采用手工编写代码实现
a)对action中所有方法进行校验
a.首先action要继承ActionSuport
b.在Action中重写validate()方法
c.在validate中写校验的逻辑
例:对手机号码进行校验
If(mobel==null || “ ”.equals(mobel))
{
this.addFiledError(“mobel”,”手机号码不能为空!”);
}else
{
If(pattern.compile(“^1[358]//d{9} ”).matcher(mobel).maches())
{
this.addFiledError(“mobel”,”手机号码格式不正确!”);
}
}
d.在jsp页面显示校验失败的信息
通过struts2标签库的<s:filederror/>
b)对action中指定方法进行校验
通过validateXxx()方法实现,validate只会校验方法名为Xxx的方法,其它的步骤和前面一样;
2.输入校验的流程
1、类型转换器对请求参数执行类型转换,并把值赋给action的属性
2、如果在执行类型转换过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到filedError里。不管类型转换是否会出现异常,都要会执行第三步。
3、再度调用action 中的validate()方法;
4、经过上面4步,如果系统中的fileErrors存在错误信息,系统自动将请求转发自名称为input 的视图中,如果没有系统将执行action中的处理方法。
3.基于xml配置方式实现
使用基于xml配置方式实现输入校验时,Action须要继承ActionSuport,并且提供校验文件和Action类放在同一个包下,文件的取名格式为
ActionName-validation.xml,其中ActionName为Action的简单名。
校验文件的模板:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<filed name=”属性名”>
<filed-validator type=”requiredstring>
<param name=”trim”>true</param>
<messge >不能为空!</message>
</filed-validator>
</filed>
</validators>
4.对Action指定的方法进行校验
ActionName-user-method-validation.xml
注:user是 struts.xml中 name=”user-*”
要对add()方法实施验证,校验文件的取名为: UserAction-user_add-validation.xml
要对update()方法实施验证,校验文件的取名为: UserAction-user_update-validation.xml
对action所有方法进行校验,就是ActionName-validation.xml
系统提供的校验器如下:
required (必填校验器,要求field的值不能为null)
requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)
stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)
url(网址校验器,要求如果field的值非空,则必须是合法的url地址)
date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)
conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)
expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)
国际化
准备资源文件,资源文件的命名格式如下:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如:
中国大陆: baseName_zh_CN.properties
美国: baseName_en_US.properties
现在为应用添加两个资源文件:
第一个存放中文:itcast_zh_CN.properties
内容为:welcome=欢迎来到传智播客
第二个存放英语(美国): itcast_en_US.properties
内容为: welcome=welcome to itcast
对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下:
native2ascii 源文件.properties 目标文件.properties
5.配置全局资源与输出国际化信息
当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:
<constant name="struts.custom.i18n.resources" value="itcast" />
itcast为资源文件的基本名。
后面我们就可以在页面或在action中访问国际化信息:
在JSP页面中使用<s:text name=“”/>标签输出国际化信息:
<s:text name=“user”/>,name为资源文件中的key
在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key。
在表单标签中,通过key属性指定资源文件中的key,如:
<s:textfield name="realname" key="user"/>
6.国际化—输出带占位符的国际化信息
资源文件中的内容如下:
welcome= {0},欢迎来到传智播客{1}
在jsp页面中输出带占位符的国际化信息
<s:text name="welcome">
<s:param><s:property value="realname"/></s:param>
<s:param>学习</s:param>
</s:text>
在Action类中获取带占位符的国际化信息,可以使用getText(String key, String[] args)或getText(String aTextName, List args)方法。
7.国际化—包范围资源文件
在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这个时候我们可以针对不同模块,使用包范围来组织国际化文件。
方法如下:
在 java的包下放置package_language_country.properties资源文件,package为固定 写法,处于该包及子包下的action都可以访问该资源。当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才 会从常量struts.custom.i18n.resources指定的资源文件中寻找。
8.国际化—Action范围资源文件
我们也可以为某个action单独指定资源文件,方法如下:
在Action类所在的路径,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的简单名称。
当 查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如 果没有找到对应的key,然后沿着当前包往上查找基本名为package 的资源文件,一直找到最顶层包。如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻 找
9.际化—JSP中直接访问某个资源文件
struts2为我们提供了<s:i18n>标签,使用<s:i18n>标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:
<s:i18n name="itcast">
<s:text name=“welcome”/>
</s:i18n>
Itcast为类路径下资源文件的基本名。
如果要访问的资源文件在类路径的某个包下,可以这样访问:
<s:i18n name=“cn/itcast/action/package">
<s:text name="welcome">
<s:param>小张</s:param>
</s:text>
</s:i18n>
上面访问cn.itcast.action包下基本名为package的资源文件。
(十四)OGNL表达式
OGNL对象图形导航语言
ognl表达式需要结合struts标签使用
(十五)struts2常用标签
使用前引入标签库:<%@ taglib prefix="s" uri="/struts-tags" %>
需要与ognl表达式结合使用
1.数据标签
<s:set></s:set>
Scope:action,page,request,session.application
<s:property/>
2.控制标签
<s:if test=””></s:if>
<s:elseif test=””>
<s:else></s:else>
3.迭代标签
<s:iterator value=”” var status=””>
<s:properties value=””>
</s:iterator>
例:
<s:iterator value="datas" id="v" status="status">
index[<s:property value="#status.index"/>]=<s:property/>
</s:iterator>
<s:iterator value="availableItems" status="status" id="v">
4.表单标签
(十六)Struts异常
因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理。
为了使用Struts2的异常处理机制,必须打开Struts2的异常映射功能,这需要exception拦截器。在struts-default.xml文件中已经开启了exception拦截器。
声明式异常捕捉
Struts2的异常处理机制是通过在struts.xml文件中配置<exception-mapping……/>元素完成的,配置该元素时,需要指定两个属性:
exception:指定该异常类型的完全限定名。
result:指定逻辑视图名。
根据<exception-mapping…../>元素出现位置的不同,异常映射又可分为两种:
局部异常映射:将<exception-mapping… />元素作为<action…/>元素的子元素配置;
全局异常映射:将<exception-mapping… />元素作为<global-exception-mappings… />元素的子元素配置;
全局异常映射对所有的Action都有效,但局部异常映射仅对该异常映射所在的Action有效。
如果局部异常映射和全局异常映射配置了同一个异常类型,在<action…./>元素内的局部异常映射将覆盖全局异常映射
(十七)使用标签防止表单重复提交
<s:token/> 结合token拦截器完成
<s:token/> 用于产生令牌码
Token是struts2内置拦截器
<s:token/> 放到表单中
<interceptor- ref name=”token”>只能放到action内]
需要指定全局重复提交跳转的页面
<global-results>
<result name=”invali.token”>path.jsp(提示重复页面) </result>
</globl-results>
三、深入
1.Struts2零配置
2.Ajax json
使用前先添加struts-json-plugin.jar 包
Page必须继承json-default
<result name=”str” type=”json”>
<param name=”root”>返回属性</param>
</result>
使用fastjson输出
四、集成Spring
在使用前先添加struts2-spring-plugin-2.3.20.jar包
<constant name="struts.objectFactory" value="spring" />
struts2.xml
模板:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
使用struts2框架步骤
1 添加java包
freemarker-2.3.13.jar 、
ognl-2.6.11.jar
struts2-core-2.1.6.jar 、
xwork-2.1.2.jar
commons-fileupload-1.2.1.jar
2 在web.xml 使用filter标签配置struts2的核心
3 写一个action类处理对应的请求
4 配置action,在src目录下写一个struts.xml文件来配置/*.action
重定向action
在result标签中<result type="redirectAction" >action</result>
相关推荐
Struts2是一款非常流行的Java Web框架,用于构建企业级应用。然而,随着时间的推移,Struts2在安全方面暴露出了一些重要的漏洞,这给使用该框架的系统带来了潜在的安全风险。"Struts2漏洞检查工具Struts2.2019.V2.3...
Struts2是一个强大的Java EE应用程序框架,主要用于构建企业级的Web应用。它的核心是MVC(Model-View-Controller)设计模式,可以帮助开发者组织代码,提高开发效率,并且提供了丰富的特性来支持表单验证、国际化、...
Struts2 项目开发 Struts2 是一个基于 Java Web 的框架,广泛应用于 Web 应用程序的开发。下面将从 Struts2 项目开发的角度,详细介绍 Struts2 框架的应用、开发流程、技术架构、实践经验等方面的知识点。 项目...
### Struts2核心知识点解析 #### 一、Struts2框架概述 - **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,...
struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
该工具的打开路径为:\Struts2VulsTools-2.3.20190927\Test\bin\Release\Text.exe 2019-09-25: 优化部分EXP在部分情况下被WAF拦截的问题,提高检测成功率,优化自定义上传路径exp,文件所在目录不存在时自动创建...
Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,旨在简化创建用户交互式、数据驱动的web应用的过程。这个“Struts2接口文档”是开发者的重要参考资料,提供了关于...
Struts2-showcase是一个用于演示和学习Apache Struts2框架功能的开源项目。这个压缩包“struts2-showcase.rar”包含了完整的源代码,旨在帮助开发者深入理解Struts2框架的工作原理及其各种特性。以下是对Struts2和...
从给定的文件信息来看,标题“struts2中文学习文档”和描述“struts2的根本webwork2”表明这是一份关于Struts2框架的学习资料,特别强调了Struts2与WebWork2的关系。Struts2是Apache Struts的一个版本,它是一个用于...
-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...
"struts2 jar"文件包含了Struts2框架的核心库,可能包括struts2-core、struts2-convention、struts2-json-plugin等依赖,这些是开发Struts2应用必不可少的组件。 "Struts2"可能是项目实例代码,包括Action类、视图...
Struts2是一个非常著名的Java Web开发框架,由Apache软件基金会维护。它基于MVC(Model-View-Controller)设计模式,极大地简化了构建基于Java EE的Web应用程序的过程。本资源包含"struts2所有jar包程序文件",是...
Struts2是一个强大的Java web开发框架,用于构建可维护、可扩展且结构良好的应用程序。它在MVC(Model-View-Controller)设计模式的基础上提供了一种实现方式,使得开发者能够更方便地处理用户请求,控制业务逻辑,...
Struts2是Apache软件基金会下的一个开源框架,主要用于构建企业级的Java web应用程序。张龙圣思园的Struts2学习笔记,无疑为Java开发者提供了一份宝贵的参考资料,它可能涵盖了Struts2的基础概念、核心组件、配置...
struts2 chm 程序包 org.apache.struts2 接口概要 接口 说明 StrutsStatics Constants used by Struts. 类概要 类 说明 RequestUtils Request handling utility class. ServletActionContext Web-specific ...
包含struts2-core-2.5.10.1.jar,struts2-jfreechart-plugin-2.5.10.1.jar,struts2-json-plugin-2.5.10.1.jar,struts2-junit-plugin-2.5.10.1.jar,struts2-bean-validation-plugin-2.5.10.1.jar,struts2-cdi-...
整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...
Struts 2是一款基于Java的开源MVC框架,它在Web应用开发中广泛使用,但同时也因其复杂的架构和历史遗留问题,成为了网络安全的焦点。这个标题提到的是一个全面的Struts 2漏洞检测工具,旨在帮助开发者和安全专家识别...
struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全...
Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试...