Struts2

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值