Struts2笔记

1.在struts中定义bean时,通常有如下两个作用
(1)创建该bean的实例,将该实例作为struts2框架的核心组件使用
(2)bean包含的静态方法需要一个值注入
注:对于绝大部分struts2而言,我们无需重新定义struts2框架的核心组件,也就无需再struts.xml文件中定义bean了!
2.抽象包不能包含action定义
3.由于struts2的配置文件是从上到下处理的,所以父包应该是在子包前定义
4.使用重定向进行控制的时候注意参量的传递
例:
<result type="redirect">/edit.action?skillName=${currentSkill.name}</result>
5.考虑到在同一个web应用当中需要同名的的action,struts2以命名空间的方式来管理action,同一个命名空间里 不能有同名的action,不同的命名空间里可以有同名的action。struts2不支持位单独的action设置命名空间,而是通过为包指定namespace属性来位包下面的所有action指定共同的命名空间。
6.默认命名空间里的action可以处理任何模块下的action请求。命名空间只有一个级别,/bookservice/search和/bookget是同一个级别的。
7.包包含配置,分而治之思想的使用
例:
   
    <include file="struts-zdg.xml"/>
    <include file="struts-hqb.xml"/>
    <include file="struts-zlb.xml"/>
struts2框架自动加载struts.xml文件时,从而完成加载所有配置信息
8.拦截器其实就是aop(面向切面编程)的编程思想,拦截器也许在action处理之前,或者action处理结束之后,插入开发者自定义的代码。(一般使用在多个action中要使用到相同的操作)
一般而言可以实现以下功能:
(1)进行权限控制
(2)跟踪日志(记录每个浏览者所请求的每一个action)
(3)跟踪系统性能瓶颈(可以通过记录每个action开始处理时间和结束处理时间,从而取得耗时最长action)
9.struts拦截器配置范例:
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;


public class AuthorityInterceptor extends AbstractInterceptor{

public String intercept(ActionInvocation invocation) throws Exception
{
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
String user = (String)session.get(”user”);
if(user != null && user.equals(”scott”))
{
return invocation.invoke();//通过该对象的invoke方法,将控制权转给下一个拦截器或者转给Action                             的execute方法。

}
else
{
ctx.put(”tip”, ”您还没有登陆,请输入scott,tier登陆系统”);
return Action.LOGIN;
}

}
}


/*
配置权限近制拦截器
struts.xml

<interceptors>
<interceptor name=”authority” class=”AuthorityInterceptor”/>
</interceptors>

<action name=”viewBook”>
<result>/WEB-INF/jsp/viewBook.jsp</result>
<interceptor-ref name=”defaultStack”/>
<interceptor-ref name=”authority”/>
</action>

考虑到这个拦截器的重复使用,可能多个Action都需要跳转到login 逻辑视图,故将
login Result 定义成一个全局Result 下面是配置login Result 的配置版段:
<global-results>
<result name=”login”>/login.jsp</result>
</global-results>

定义成全局拦截器的方法:
<interceptors>
<interceptor name=”authority” class=”AuthorityInterceptor”/>
<interceptor-stack name=”mydefault”/>
<!--定义拦截器栈包含default-stack拦截器栈-->
<interceptor-ref name=”default-stack”/>
<interceptor-ref name=”authority”/>
</interceptor-stack>
</interceptors>

一旦定义了上面的mydefault拦截器栈,这个拦截器栈就包含了权限检查拦截器和系统默认的拦截器栈.
如果将这个拦截器栈定义成默认拦截器,则可以避免在每个Action中需要重复定义权限检查拦截器.
下面是定义默认拦截器的配置片段:
<package name=””>
<default-interceptor-ref name=”mydefault”/>
</packabe>
*/
10.如何构建自己的拦截器:
使用内置的时间拦截器:
以Struts2内置的timer拦截器为例,来学习如何在我们的应用中添加其他的拦截器。timer拦截器可以统计action执行的时间。我们可以修改package中默认的拦截器,那么将替换掉struts-default中配置的defaultStack拦截器栈,导致Struts2无法正常运行,比如无法获取表单的值等等。那么该如何正确的配置呢?可以在添加新的拦截器的基础上加入defaultStack拦截器栈,这样就可以保证defaultStack拦截器栈的存在。

<package name="myStruts" extends="struts-default">
 <interceptors>
  <interceptor-stack name="myInterceptor"> ①
   <interceptor-ref name="timer"/>
   <interceptor-ref name="defaultStack"/>
  </interceptor-stack>
 </interceptors>
 <default-interceptor-ref name="myInterceptor"/> ②
 <action name="userAction"
  class="com.kay.action.UserAction">
  <result name="success">suc.jsp</result>
  <result name="input">index.jsp</result>
  <result name="error">err.jsp</result>
 </action>
</package>
① 添加一个自定义的拦截器栈,并在其中包含time拦截器和defaultStack拦截器栈。

② 设置当前的package的默认拦截器栈为自定义的拦截器栈。

 

修改package的默认拦截器会应用的package中的所有Action中,如果只想给其中一个Action添加拦截器,则可以这样来做:

<package name="myStruts" extends="struts-default">
 <interceptors>
  <interceptor-stack name="myInterceptor">
   <interceptor-ref name="timer"/>
   <interceptor-ref name="defaultStack"/>
  </interceptor-stack>
 </interceptors>
 <action name="userAction"
  class="com.kay.action.UserAction">
  <interceptor-ref name="myInterceptor"/> ①
  <result name="success">suc.jsp</result>
  <result name="input">index.jsp</result>
  <result name="error">err.jsp</result>
 </action>
</package>


如果要创建自己的拦截器,只需要实现Interceptor接口,该接口中定义了以下三个方法:

void init():

在拦截器初始化之后,在执行拦截之前,系统调用该方法。对于一个拦截器而言,init方法只会被调用一次。

String intercept(ActionInvocation invocation) throws Exception:

该方法是拦截器的拦截方法,返回一个字符串,系统将会跳转到该字符串对应的视图资源。该方法的ActionInvocation参数包含了被拦截的Action的引用,可以通过该对象的invoke方法,将控制权转给下一个拦截器或者转给Action的execute方法。

void destroy():

该方法与init方法对应,在拦截器示例被销毁之前,系统将会调用该方法。

除了Interceptor接口外,Struts2中还提供了一个AbStractInterceptor类,该类提供了一个init和destroy方法的空实现。如果不需要就不用重写这两个方法,可见继承自AbstractInterceptor类可以让我们构建拦截器时变得简单。

下面我们构建自己的拦截器,实现timer拦截器的效果。

public class MyInterceptor extends AbstractInterceptor {
 public String intercept(ActionInvocation invocation) throws Exception {
  long startTime = System.currentTimeMillis(); ①
  String result = invocation.invoke(); ②
  long endTime = System.currentTimeMillis(); ③
  System.out.println("Action执行共需要" + (endTime - startTime) + "毫秒");
  return result;
 }
}① 获得Action执行的开始时间。

② 将控制权交给下一个拦截器,如果该拦截器是最后一个拦截器,则调用Action的execute方法。

③ 获得Action执行的结束时间。
在配置文件struts.xml中配置拦截器:

<package name="myStruts" extends="struts-default">
 <interceptors>
  <interceptor name="myTimer" class="com.kay.interceptor.MyInterceptor"></interceptor> ①
  <interceptor-stack name="myInterceptor">
   <interceptor-ref name="myTimer"/> ②
   <interceptor-ref name="defaultStack"/>
  </interceptor-stack>
 </interceptors>
 <action name="userAction"
  class="com.kay.action.UserAction">
  <interceptor-ref name="myInterceptor"/>
  <result name="success">suc.jsp</result>
  <result name="input">index.jsp</result>
  <result name="error">err.jsp</result>
 </action>
</package>

① 定义一个新的拦截器,name属性为拦截器的名字,class属性为拦截器的完全限定名。

② 在拦截器栈中加入新的拦截器。
从拦截器的运行原理上和我们以前学习的Servlet中的过滤器很相像!其实它们只有一个重要的区别,就是拦截器的工作是不依赖容器的,这会在进行单元测试时变得简单。

11.actionsupport类包括获取国际化信息的方法,数据校验的方法,默认的处理用户请求的方法等,实际上actionsupport类是struts2默认的action处理类,如果开发者的action类继承了actionsupport类,则会大大简化action的开发。

12.struts2中的action访问servletAPI
由于action并不直接与任何servlet API直接耦合,所以可以很容易的进行测试
struts2框架提供了一种更轻松的方式来访问servletAPI,web应用中通常需要访问servletAPI就是httpservletrequest,httpsession,servletcontext这三个类分别代表jsp内置对象的request,session,application.struts2提供了actioncontext类,可以通过该类访问servlet API.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值