Struts2自学
一.环境搭建
首先在web.xml配置文件里面进行如下配置:
<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>
</filter-mapping>
然后,导入相应的Struts2相应的包,在src目录下面新建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>
<package name="default" namespace="/" extends="struts-default">
<action name="helloworld" class="com.action.HelloWorldAct">
<result >/result.jsp</result>
</action>
</package>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>
DynamicMethodInvocation是异步调用,用于感叹号调用Jsp页面
二.动态方法调用
动态方法调用
动态方法调用是为了解决一个Action对应多个请求的处理,以免Action太多。
三种方式:指定method属性、感叹号方式、通配符方式
1. <action name="addAction" method="add" class="com.imooc.action.HelloWorldAction">
http://localhost:8080/HelloWorld/addAction.action
2. <constant name="struts.enable.DynamicMethodInvocation" value="true"> </constant>
<action name="helloworld" class="com.imooc.action.HelloWorldAction">
<result >/result.jsp</result>
<result name="add">/add.jsp</result>
<result name="update">/update.jsp</result>
</action>
http://localhost:8080/HelloWorld/helloworld!add.action
3. <action name="*_*" method="{2}" class="com.imooc.action.{1}Action">
<result >/result.jsp</result>
<result name="add">/{2}.jsp</result>
<result name="update">/{2}.jsp</result>
</action>
http://localhost:8080/HelloWorld/HelloWorld_update.action
三.Struts后缀
struts2后缀:
三种方式:
1.struts.properties中:struts.action.extension=action,do,struts2
2.xml中增加常量constant:
<constant name="struts.action.extension" value="action,do,struts2"></constant>
3.在过滤器中配置intt-param参数:
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>do,action,strtus2</param-value>
</init-param>
四.接收参数
接收参数
1,使用Action的属性接受参数,在Action中定义需要接受的属性,并写它的set/get方法。
2,使用DomainModel接受参数,创建实体类定义需要接受的属性,并set/get方法,在Action中创建实体类名属性。并在界面进行指定。
3,使用ModelDriver接受参数,在Action中实现ModelDriver<实体类名>接口,并实现方法返回当前需要转换的对象,删除set/get方法,并对 对象 进行实例化,并取消指定。
4,request
5,获取List集合中的参数。获取多个参数。
第一种接收参数的方法:直接在action类中创建相应的属性和getter和setter,和前端的name名字相同。eg:前端的username,在action类中就要建立一个private String username; Struts会自动映射为这个属性赋值
第二种接受参数的方法:使用DomainModel,将username 和password两个属性封装为一个类User(必须是标准的JavaBean),在action中声明这个属性:private User user; 同时为user设置getter和setter;在前端中的name需要设置为user.name和user.password,才能映射成功
第三种接收参数的方法:使用ModelDriven<T>接口,这个action必须实现这个接口的public T getModel()方法。此时声明的属性必须实例化,eg: private User user = new User(); 同时不需要getter和setter。前端的name也只需要写username和password就可以,不需要再加域了。这种方法时最推荐的方法,因为可以减少前后端的耦合
五.拦截器的应用
1.定义拦截器
1.1.创建一个拦截器类继承自AbstractInterceptor类
1.2.实现intercept方法
eg:
public String intercept(ActionInvocation invocation) throws Exception {
//1.执行action之前
long start=System.currentTimeMillis();
//2.执行下一个拦截器,如果是最后一个拦截器,则执行目标action
String result=invocation.invoke();
//3.执行action之后
long end=System.currentTimeMillis();
//4.花费的时间
long time=end-start;
System.out.println("执行花费的时间: "+time+" ms");
return result;
}
2.配置拦截器
<interceptors>
<interceptor name="timeinterceptor" class="com.imooc.interceptor.TimerInterceptor"></interceptor>
<interceptor-stack name="myStack">(一般与默认的拦截器栈组成拦截器栈)
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="auth"></interceptor-ref>
</interceptor-stack>
</interceptors>
3.引用拦截器
<interceptor-ref name="timeinterceptor"></interceptor-ref>