一、配置struts2的过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>zjs_bos</display-name>
<!-- 创建struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<!--同时拦截转发数据和请求数据-->
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
二、Struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发者模式,在开发者模式中,
如果jsp发送的请求数据, 在action中没有给提供相应的get和set方法,会报错java.lang.NoSuchFieldException -->
<constant name="struts.devMode" value="fasle"></constant>
<!-- 配置struts国际化参数,设置编码区默认的编码格式 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 配置struts国际化参数,设置message.properties路径,文件后缀名可以省略不写 -->
<constant name="struts.custom.i18n.resources" value="message"></constant>
(备注,可以在action类中,通过this.getText("usernameOrPasswordError")来获取message.properties文件中usernameOrPasswordError对应的值)
<!-- 配置package -->
<!--
name属性, 理论上可以为任意值, 但是不同的package不能有相同的name属性;
extends属性, 为固定值struts-default;
namespace属性, 名称空间, 域action的标签的name属性一起构成action的访问路径
-->
<package name="basicstruts2" extends="struts-default" namespace="/">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="bosLoginInterceptor" class="cn.rodge.bos.web.interceptoer.BOSLoginInterceptor">
<param name="excludeMethods">login</param>
</interceptor>
<!-- 声明拦截器栈 -->
<interceptor-stack name="bos">
<!--自定义拦截器后, 默认的拦截器就不会执行了, 所以需要手动将默认拦截器栈添加上来-->
<interceptor-ref name="bosLoginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 将bos定义为默认拦截器栈 -->
<default-interceptor-ref name="bos"></default-interceptor-ref>
<!--声明全局结果变量,注意全局结果变量的声明是有顺序的,不能再拦截器前面声明,不然会报错-->
<global-results>
<result name="login">/login.jsp</result>
</global-results>
<!-- 配置通过action访问jsp的路径
class不配置的话,默认访问actionsupport(在struts的默认配置文件中有配置)
method不配置的话,默认访问execute方法
-->
<action name="page_*_*">
<!--
result标签中name不配置的话,默认访问SUCCESS对应的
type属性:dispatcher请求转发(默认)
redirect重定向
redirectAction重定向到action中
-->
<result type="dispatcher">/WEB-INF/pages/{1}/{2}.jsp</result>
</action>
<!-- 配置UserAction -->
<action name="user_*" class="userAction" method="{1}">
<result name="home">/WEB-INF/pages/common/index.jsp</result>
<result name="login">/login.jsp</result>
</action>
</package>
</struts>
三、struts2中Action类的编写域访问
3.2Action类创建的三种方式
3.1.1 直接编写一个java类,命名为***Action, 当然命名没有规定
创建一个类,不继承任何类,也不实现任何借口,在struts.xml中配置该Java类
public class UserAction {
......
}
3.1.2 实现Action接口
可以实现Action接口, 在Action接口中有一些常量,如SUCCESS, NONE等可供用户使用, 在配置文件中result没有指定name时,默认是success
public class UserAction implements Action {
......
}
3.1.3继承ActionSupport类(一般推荐使用该方法)
而Actionsupport这个工具类在实现了Action接口的基础上还定义了一个validate()方法,重写该方法,它会在execute()方法之前执行,如校验失败,会转入input处,必须在配置该 Action时配置input属性。 另外,Actionsupport还提供了一个getText(String key)方法还实现国际化,该方法从资源文件上获取国际化信息. 这样在自定义标签时可以定义一个变量为new actionsupport对象实现国际化。
ActionSupport类的作用:
struts2不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。
public class UserAction extends ActionSupport {
.....
}
3.2Action类中方法访问的三种方式
3.2.1通过在Action标签中配置method属性来实现
缺点: 每写一个方法都需要配置一个action标签, 当方法较多时, 配置比较繁琐
<action name="userAdd" class="cn.rodge.action.UserAction" method="add">
<result name="list">/jsp/common/userList.jsp</result>
</action>
3.2.2使用通配符*方法进行配置(常用)
在action标签的name属性中, 使用*代替具体的方法名, 在method属性同中国{1}、{2}、{3}。。。来获取name标签中第一个、第二个、第三个。。。*号代表的值
<action name="user_*" class="userAction" method="{1}">
<result name="list">/jsp/common/userList.jsp</result>
</action>
访问路径写法:http://localhost:8080/OA_pro/user_add.action
3.2.3使用动态访问的方式
1> 开启常量
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
2> 创建action, 创建多个方法
<package name="demo4" extends="struts-default" namespace="/">
<action name="user" class="com.rodge.struts2.demo.UserAction"></action>
</package>
3> 配置action, 在action标签中配置name和class属性
4> 访问方式
http://localhost:8080/OA_pro/user!add.action
Action类与Servlet的区别
1.Action是多实例的, 每次访问都会创建一个新的Action对象, 当返回结果调用return时action被销毁; 而Servlet是单实例的, 默认只在第一次访问时创建
2.Servlet中, 成员变量存在线程安全的问题