struts2的特点:
基于filter.
采用分离关注(类似于aop思想),把众多的任务分别交给不同的组件各自完成.
没有formbean,直接用实体携带数据.
action是原型的.它是线程本地化的(threadlocal),
action是pojo,不需要和servlet api和struts2 api进行耦合.
注意点:
在struts2中action属于模型层
复制struts2解压目录/apps/struts2-blank-2.1.8.1.war/WEB-INF/lib/*.jar到工程下
2.在web.xml中配置struts2的Filter
<filter>
<filter-name>action</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>action</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.写一个自已的action类,不用继承任意struts的类,方法名要为execute,返回要为字符串
真实开发中自已的action类必须继承com.opensymphony.xwork2.ActionSupport类
4.在src下新建struts.xml文件,并配置
(1)导入dtd约束及配MyEclipse的自动提示
复制struts2-core-2.1.8.1.jar/struts-2.1.7.dtd/约束定义到自已的struts.xml文件中
(2)配置xml文件
<struts>
<constant name="struts.action.extension" value="扩展名"/> //改变请求的扩展名,可不设
<constant name="struts.devMode" value="true"/> //设置开发模式,用于自动加载struts.xml与国际化资源文件,上线运行时删除此模式
<package name="任意名称空间名" namespace="/名称空间" extends="struts-default"> //名称空间可以没有
<!--配默认的action类,可不配-->
<default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>
<!--配默认的action访问引用,可不配 -->
<default-action-ref name=""/>
<action name="访问类别名" class="自已的action类全名" method="action中方法名">
<resulte name="action方法返回名" type="dispatcher">/要转向的jsp页</resulte> //name与type属性可以没有
</action>
<action name="访问类别名">
<resulte>/要转向的jsp页</resulte>
</action>
<!--配动态action,实际开发中常用的-->
<action name="访问类别名_*" class="自已的action类全名" method="{0}"> //0对应前面*,*指jsp页中超链接传过来的参数:访问类别名_action中的方法名
<resulte name="action方法返回名" type="dispatcher">/要转向的jsp页</resulte> //name与type属性可以没有
</action>
</package>
<!--将其他配置的xml引入此xml中-->
<include file="xml文件名"/>
</struts>
5.配置jsp页中的访问链接
/名称空间/访问类别名
或
1.让自已的action类继承ActionSupport类,并加上validate方法
public void validate(){
判断代码;
//将错误信息存入ActionSupport类中一集合属性中
addFieldError("错误键名","错误信息"); //1.属性错误,在jsp页中不用加错误显示标签
addFieldError("错误键名",getText("资源文件中键名"));
addActionError("错误信息"); //2.其他错误,要在jsp而中加入显示出错信息的标签:
addActionError(getText("资源文件中键名"));
}
2.在struts.xml中配错误跳转页
<result name="input">/显示错误的jsp页面</result> //放在该类action内
注意:3和4只选其中一个就可
3.在要进行验证的方法前加上注解:
@SkipValidation
4.在validate方法后面加上Do方法名:
public void validateDo方法名(){} //方法名首字母要大写,指调用该方法时调用验证
或
public void validate方法名(){} //方法名首字母要大写,指调用该方法时调用验证
5.排除不用验证的方法:
在struts.xml中配置:
<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">方法名1,方法名2</param>
1.form表单:
<s:form action="action类别名" method="post" namespace="/该action所在的空间名"> //空间名为空时可不设
2.文本框:
<s:textfield name="bean类别名.属性名" label="文本框前的显示名"/> //如果action类实现了ModelDriven类,则不用加bean类前缀
3.submit按钮:
<s:submit>显示名</s:submit>
<s:submit value="显示名"/>
4.debug超链接,查看过程用
<s:debug />
5.数据回显
<s:property value="属性名" default="默认值" escape="true或false"/> //escape设定该属性名对应的特殊值输出时是否进行转义
6.文件上传
<s:file name="属性名" label="任意文本" />
7.设置属性值到指定域中
<s:set var="" value=""/>
8.将指定值放在顶
<s:push value=""/>
9.javabean使用
<s:bean name="javabean类全名" var="给外部引用的名">
<s:param name="参数名" value="值"/>
<s:property value="参数名"/>
</s:bean>
10.循环标签iterator
<s:iterator value="集合名" var="集合中类别名" status="别名"> //status指定集合中可以被访问到数
<s:property value="#集合中类别名.类中属性名"/>
<s:property value="#别名."/>
</s:iterator>
11.if-else标签
<s:if test="#">
12.url标签,跟在<a>标签href属性中使用
<s:url action="action类_方法名" namespace="/此action所在的空间名">
<s:param name="属性名" value="属性值"/> //在超链接后跟上参数
</s:url>
13.i18n标签
<s:i18n name="包名.资源文件名"> //没有扩展名
<s:text name="资源文件中的key"/> //将key对应的值显示在jsp页
</s:i18n>
或者
<s:text name=""资源文件中的key/> //按当前系统语言选择相应资源文件,必须要从action中跳转到jsp页
14.复选框
15.下接选框
<s:select list="存了对象的List集合" listKey="id属性" listValue="name属性"/>
<s:select list="存了对象的Map集合" listKey="key" listValue="value"/>
16.单选
<s:radio name="属性名" list="Map集合/> //list属性一般不用
17.双级联动
<s:doubleselect name="省类别名" list="装着省对象的List集合" listKey="id属性" listValue="name属性"
doubleList="装着市类的List集合" listKey="id属性" listValue="name属性" doubleName=""/>
<form enctype="multipart/form-data"> //表单头
<s:file name="属性名" label="任意文本" /> //上传组件
2.自已的action类中
定义一个File类型的属性
定义几个属性用来存放文件名及文件扩展名,如果上传多个,要将这些属性都设成数组
3.配置上传类型限制
在action标签下加上
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedExtensions">.扩展名1,.扩展名2</param>
<param name="fileUpload.allowedTypes">text/html,text/plain,image/pjpeg</param> //允许上传的文件类型
<param name="fileUpload.maximumSize">允许上传的文件最大的字节数值</param>
<resoult name="" type="stream">
<param name=""></param>
<param name=""></param>
</result>
(1)在action节点中加入
<interceptor-ref name="token">
<param name="excludeMethods">方法名</param>
</interceptor>
(2)在jsp页中生成令牌
<s:token/>
2.请求耗时拦截器,在网页出结果前显示等待页面
(1)在action节点中配拦截器
<interceptor-ref name="execAndWait"/>
(2)在action之外配全局的跳转页
<global-results>
<result name="wait">/要显示的等待页面</result>
</global-results>
(3)要jsp页中配头
<meta http-equiv="refresh" content="2;url=<s:url/>"/>
3.注册自定义拦截器
<interceptors>
<interceptor name="类别名" class="自定义拦截器类全名"/>
<s:iterator name="">
<>
</s:iterator>
3.Map集合属性:
<s:textfield name="map["key名"].值"/> //jsp页中
12.主题
基本名_en_US.properties
基本名_zh_CN.properties //zh为语言解码,CN为国家或地区解码
基本名_ja_JP.properties
基本名_zh_TW.properties
2.在struts.xml中配全局的n18l拦截器
<constant name="struts.custom.i18n.resources" value="gloabl-message" />
3.在jsp页中
<s:textfield key="国际化资源文件中的key名"> //会根据操作系统自动选择资源文件
<s:select name="request_local"
list="#{
@java.util.Locale@CHINA:@java.util.Locale@CHINA.getDisplayName(@java.util.Locale@CHINA), //返回该语言的英文简写,如zh_CN:返回该项语言的显示名称,如中文
@java.util.Locale@TAIWAN:@java.util.Locale@TAIWAN.getDisplayName(@java.util.Locale@TAIWAN),
@java.util.Locale@US:@java.util.Locale@US.getDisplayName(@java.util.Locale@US),
@java.util.Locale@JAPAN:@java.util.Locale@JAPAN.getDisplayName(@java.util.Locale@JAPAN)
}"
label="选择语言"
value=""
复制命名空间,加入如下验证
<validators>
//显示错误
<field name="属性名"> //此属性名为表单中要验证的属性名
<field-validator type="requiredstring">
<message>显示的错误信息</message> //不用国际化资源文件时
<message key="资源文件中的key"/> //用国际化资源文件时
</field-validator>
</field>
//配置表单输入的长度验证
<field-validator type="stringlength">
<param name="minLength">5</param>
<param name="maxLength">8</param>
<message key="资源文件中的key" />
</field-validator>
//配置表单密码框中两次输入是否一样验证
<validator type="expression">
<param name="expression">属性1 == 属性2</param> //此属性名为表单中要验证的属性名
<message>错误消息</message>
</validator>
</validators>
2.在struts.xml中action节点中配上出错时转向的页面
<action name="" class="" method="">
<result>/验证成功转向的jsp页</result>
<result name="input">/验证失败时转向的jsp页</result>
</action>
十、struts2与spring集成
1.加入jar包:
spring.jar、commons-logging.jar、struts2-spring-plugin-2.1.8.1.jar + struts2一些必须jar包
2.在spring配置文件中
<bean id="类别名" class="action类全名" scope="prototype"> //必须要有prototype
</bean>
3.在struts配置文件中
<action name="" class="类别名"> //这里的类别名要和srping配置文件中的别名一样
4.在web.xml中配置,保证web服务器启动时,直接完成spring容器的初始化.
<!-- 通过上下文参数指定spring的配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring配置文件名/param-value>
</context-param>
<!-- 保证web服务器启动时,直接完成spring容器的初始化. -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
基于filter.
采用分离关注(类似于aop思想),把众多的任务分别交给不同的组件各自完成.
没有formbean,直接用实体携带数据.
action是原型的.它是线程本地化的(threadlocal),
action是pojo,不需要和servlet api和struts2 api进行耦合.
注意点:
在struts2中action属于模型层
没有FormBean类
一、struts2开发步骤:
复制struts2解压目录/apps/struts2-blank-2.1.8.1.war/WEB-INF/lib/*.jar到工程下
2.在web.xml中配置struts2的Filter
<filter>
<filter-name>action</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>action</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.写一个自已的action类,不用继承任意struts的类,方法名要为execute,返回要为字符串
真实开发中自已的action类必须继承com.opensymphony.xwork2.ActionSupport类
4.在src下新建struts.xml文件,并配置
(1)导入dtd约束及配MyEclipse的自动提示
复制struts2-core-2.1.8.1.jar/struts-2.1.7.dtd/约束定义到自已的struts.xml文件中
(2)配置xml文件
<struts>
<constant name="struts.action.extension" value="扩展名"/> //改变请求的扩展名,可不设
<constant name="struts.devMode" value="true"/> //设置开发模式,用于自动加载struts.xml与国际化资源文件,上线运行时删除此模式
<package name="任意名称空间名" namespace="/名称空间" extends="struts-default"> //名称空间可以没有
<!--配默认的action类,可不配-->
<default-class-ref class="com.opensymphony.xwork2.ActionSupport"/>
<!--配默认的action访问引用,可不配 -->
<default-action-ref name=""/>
<action name="访问类别名" class="自已的action类全名" method="action中方法名">
<resulte name="action方法返回名" type="dispatcher">/要转向的jsp页</resulte> //name与type属性可以没有
</action>
<action name="访问类别名">
<resulte>/要转向的jsp页</resulte>
</action>
<!--配动态action,实际开发中常用的-->
<action name="访问类别名_*" class="自已的action类全名" method="{0}"> //0对应前面*,*指jsp页中超链接传过来的参数:访问类别名_action中的方法名
<resulte name="action方法返回名" type="dispatcher">/要转向的jsp页</resulte> //name与type属性可以没有
</action>
</package>
<!--将其他配置的xml引入此xml中-->
<include file="xml文件名"/>
</struts>
5.配置jsp页中的访问链接
/名称空间/访问类别名
或
/名称空间/访问类别名.action
二、校验
可以使用外部资源文件的方法,资源文件名必须要与类名一样,且在同一包下1.让自已的action类继承ActionSupport类,并加上validate方法
public void validate(){
判断代码;
//将错误信息存入ActionSupport类中一集合属性中
addFieldError("错误键名","错误信息"); //1.属性错误,在jsp页中不用加错误显示标签
addFieldError("错误键名",getText("资源文件中键名"));
addActionError("错误信息"); //2.其他错误,要在jsp而中加入显示出错信息的标签:
addActionError(getText("资源文件中键名"));
}
2.在struts.xml中配错误跳转页
<result name="input">/显示错误的jsp页面</result> //放在该类action内
注意:3和4只选其中一个就可
3.在要进行验证的方法前加上注解:
@SkipValidation
4.在validate方法后面加上Do方法名:
public void validateDo方法名(){} //方法名首字母要大写,指调用该方法时调用验证
或
public void validate方法名(){} //方法名首字母要大写,指调用该方法时调用验证
5.排除不用验证的方法:
在struts.xml中配置:
<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">方法名1,方法名2</param>
</interceptor-ref>
三、struts2标签
<%@taglib prefix="s" uri="/struts-tags"%>1.form表单:
<s:form action="action类别名" method="post" namespace="/该action所在的空间名"> //空间名为空时可不设
2.文本框:
<s:textfield name="bean类别名.属性名" label="文本框前的显示名"/> //如果action类实现了ModelDriven类,则不用加bean类前缀
3.submit按钮:
<s:submit>显示名</s:submit>
<s:submit value="显示名"/>
4.debug超链接,查看过程用
<s:debug />
5.数据回显
<s:property value="属性名" default="默认值" escape="true或false"/> //escape设定该属性名对应的特殊值输出时是否进行转义
6.文件上传
<s:file name="属性名" label="任意文本" />
7.设置属性值到指定域中
<s:set var="" value=""/>
8.将指定值放在顶
<s:push value=""/>
9.javabean使用
<s:bean name="javabean类全名" var="给外部引用的名">
<s:param name="参数名" value="值"/>
<s:property value="参数名"/>
</s:bean>
10.循环标签iterator
<s:iterator value="集合名" var="集合中类别名" status="别名"> //status指定集合中可以被访问到数
<s:property value="#集合中类别名.类中属性名"/>
<s:property value="#别名."/>
</s:iterator>
11.if-else标签
<s:if test="#">
12.url标签,跟在<a>标签href属性中使用
<s:url action="action类_方法名" namespace="/此action所在的空间名">
<s:param name="属性名" value="属性值"/> //在超链接后跟上参数
</s:url>
13.i18n标签
<s:i18n name="包名.资源文件名"> //没有扩展名
<s:text name="资源文件中的key"/> //将key对应的值显示在jsp页
</s:i18n>
或者
<s:text name=""资源文件中的key/> //按当前系统语言选择相应资源文件,必须要从action中跳转到jsp页
14.复选框
15.下接选框
<s:select list="存了对象的List集合" listKey="id属性" listValue="name属性"/>
<s:select list="存了对象的Map集合" listKey="key" listValue="value"/>
16.单选
<s:radio name="属性名" list="Map集合/> //list属性一般不用
17.双级联动
<s:doubleselect name="省类别名" list="装着省对象的List集合" listKey="id属性" listValue="name属性"
doubleList="装着市类的List集合" listKey="id属性" listValue="name属性" doubleName=""/>
18.格式化标签
四、文件上传:
1.jsp页面中设置表单头,并添加一个上传组件<form enctype="multipart/form-data"> //表单头
<s:file name="属性名" label="任意文本" /> //上传组件
2.自已的action类中
定义一个File类型的属性
定义几个属性用来存放文件名及文件扩展名,如果上传多个,要将这些属性都设成数组
3.配置上传类型限制
在action标签下加上
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedExtensions">.扩展名1,.扩展名2</param>
<param name="fileUpload.allowedTypes">text/html,text/plain,image/pjpeg</param> //允许上传的文件类型
<param name="fileUpload.maximumSize">允许上传的文件最大的字节数值</param>
</interceptor-ref>
五、文件下载
1.在struts.xml文件中加入流拦截器:<resoult name="" type="stream">
<param name=""></param>
<param name=""></param>
</result>
2.
六、配拦截器
1.令牌拦截器,防止表单重复提交:(1)在action节点中加入
<interceptor-ref name="token">
<param name="excludeMethods">方法名</param>
</interceptor>
(2)在jsp页中生成令牌
<s:token/>
2.请求耗时拦截器,在网页出结果前显示等待页面
(1)在action节点中配拦截器
<interceptor-ref name="execAndWait"/>
(2)在action之外配全局的跳转页
<global-results>
<result name="wait">/要显示的等待页面</result>
</global-results>
(3)要jsp页中配头
<meta http-equiv="refresh" content="2;url=<s:url/>"/>
3.注册自定义拦截器
<interceptors>
<interceptor name="类别名" class="自定义拦截器类全名"/>
</interceptors>
七、OGNL表达式语言
集合的投影与过滤:<s:iterator name="">
<>
</s:iterator>
3.Map集合属性:
<s:textfield name="map["key名"].值"/> //jsp页中
12.主题
<constrol />
八、国际化
1.准备国际化资源文件,放在action类同包下基本名_en_US.properties
基本名_zh_CN.properties //zh为语言解码,CN为国家或地区解码
基本名_ja_JP.properties
基本名_zh_TW.properties
2.在struts.xml中配全局的n18l拦截器
<constant name="struts.custom.i18n.resources" value="gloabl-message" />
3.在jsp页中
<s:textfield key="国际化资源文件中的key名"> //会根据操作系统自动选择资源文件
<s:select name="request_local"
list="#{
@java.util.Locale@CHINA:@java.util.Locale@CHINA.getDisplayName(@java.util.Locale@CHINA), //返回该语言的英文简写,如zh_CN:返回该项语言的显示名称,如中文
@java.util.Locale@TAIWAN:@java.util.Locale@TAIWAN.getDisplayName(@java.util.Locale@TAIWAN),
@java.util.Locale@US:@java.util.Locale@US.getDisplayName(@java.util.Locale@US),
@java.util.Locale@JAPAN:@java.util.Locale@JAPAN.getDisplayName(@java.util.Locale@JAPAN)
}"
label="选择语言"
value=""
/>
九、validate验证框架
1.写一个ValidateAction-validate.xml:复制命名空间,加入如下验证
<validators>
//显示错误
<field name="属性名"> //此属性名为表单中要验证的属性名
<field-validator type="requiredstring">
<message>显示的错误信息</message> //不用国际化资源文件时
<message key="资源文件中的key"/> //用国际化资源文件时
</field-validator>
</field>
//配置表单输入的长度验证
<field-validator type="stringlength">
<param name="minLength">5</param>
<param name="maxLength">8</param>
<message key="资源文件中的key" />
</field-validator>
//配置表单密码框中两次输入是否一样验证
<validator type="expression">
<param name="expression">属性1 == 属性2</param> //此属性名为表单中要验证的属性名
<message>错误消息</message>
</validator>
</validators>
2.在struts.xml中action节点中配上出错时转向的页面
<action name="" class="" method="">
<result>/验证成功转向的jsp页</result>
<result name="input">/验证失败时转向的jsp页</result>
</action>
十、struts2与spring集成
1.加入jar包:
spring.jar、commons-logging.jar、struts2-spring-plugin-2.1.8.1.jar + struts2一些必须jar包
2.在spring配置文件中
<bean id="类别名" class="action类全名" scope="prototype"> //必须要有prototype
</bean>
3.在struts配置文件中
<action name="" class="类别名"> //这里的类别名要和srping配置文件中的别名一样
4.在web.xml中配置,保证web服务器启动时,直接完成spring容器的初始化.
<!-- 通过上下文参数指定spring的配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring配置文件名/param-value>
</context-param>
<!-- 保证web服务器启动时,直接完成spring容器的初始化. -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>