Struts第四阶段

Struts2

拦截器的概述

什么是拦截器

拦截器是Struts2中的核心。其实就是一个类对Action的访问进行拦截。

拦截器与过滤器的区别:

  • 过滤器过滤的是从客户端向服务器发送的请求。过滤器是可以过滤Html, JSP…
  • 拦截器拦截的是从客户端向Action发送的请求。拦截器只能拦截Action,拦截器更细粒度的实施拦截。拦截到Action中具体的方法。

Struts2的执行流程:

  • 请求访问Action,请求首先到达核心过滤器,过滤器会调用Dispather中的ServiceAction的方法
  • 在这个方法内部,Struts2框架创建一个Action代理对象,执行代理对象中的execute方法,在execute内部方法调用Actioninvocatin中的invoke方法。
  • 在invoke方法内部,递归调用拦截器的拦截的方法,如果没有下一个拦截器,执行目标Actioin,根据Action返回Result进行页面跳转,由Response做出响应。

自定义拦截器

  1. 实现Interceptor接口或者继承AbstractInterceptor类
  2. 配置拦截器

编写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class InterceptorDemo1 extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("InterceptorDemo1执行了...");
        
        String s = invocation.invoke();
        
        System.out.println("InterceptorDemo1执行结束了...");
        
        return s;
    }
}

配置拦截器

  • 配置的时候会有顺序,默认的在前面,就先执行默认的,自己定义的在前面就先执行自己的
1
2
3
4
5
6
7
8
9
//在<package>标签中配置
<interceptors>
   <interceptor name="名字" class="拦截器路劲" ></interceptor>
</interceptors>
//**因为自定义之后默认的拦截器就不引用了,所以得引用一下默认的拦截器**
<interceptor-ref name="defaultStack">
//然后再<action> 标签中引用一下
<interceptor-ref name="拦截器名字" />

2.还可以定义一个拦截器栈,在一块引用

1
2
3
4
5
6
7
8
9
10
11
12
<interceptors>
   <interceptor name="interceptor01" class="路劲" />
   <interceptor name="interceptor02" class="路劲" />
   <interceptor-stack name="myStack">
      <interceptor-ref name="defaultStack"/>
      <interceptor-ref name="interceptor01"/>
      <interceptor-ref name="interceptor02"/>
   </interceptor-stack>
</interceptors>
//引用的时候只需要引用拦截器栈就可以了
<interceptor-ref name="myStack"/>

案例:登陆页面

错误信息

回显错误信息:转发到登陆页面,否则actionerror用不了
这里用到了actionerror

  • 把错误信息存到值栈中 this.addactionError("错误信息");
  • 在jsp中回显错误信息 <s:actionerror/>

登陆权限

  • 编写拦截器

注:拦截一个方法用的是MethodFilterInterceptor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PrivilegeInterceptor extends MethodFilterInterceptor{
   @override
   protected String doIntercept(ActionInvocation invocation){
      //获得已存在的用户信息
      User existUser = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
      if(exiteUser!=null){
         return invocation.invoke();
      }else{
         ActionSupport actionSupport=(ActionSupport)invocation.getAction();
         actionSupport.addActionError("您还没有登陆!您还没有访问权限!");
         return actionSupport.LOGIN;
      }
   }
}
  • 配置拦截器
1
2
3
4
5
6
7
8
9
10
//配置拦截器
<interceptors>
  <interceptor name="PrivilegeInterceptor" class="。。。 "/>
<interceptors>
//在`action`中引用拦截器
<interceptor-ref name="PrivilegeInterceptor">
   //因为在登陆的页面就不需要拦截了,所以可以加一个`param`来避免要拦截的页面
   <param name="excludeMethods">登陆时的方法名</param>
</interceptor-ref>
  • 还得配一个全局的login,就拦截的信息转到login,dtd规定全局配置必须在拦截器下边

  • 还有万一拦截之后发生错误,转到登陆页面,在登陆成功会发生嵌套效果,避免这种效果的方法是,在登陆的form标签上加一个target="_parent"

struts2的标签库

通用的标签库Generi Tags

  • 帮助文档中的Tag reference

  • 传参数:<s:param name="" value=""/>


  • 在遍历List集合的时候,放var里取出来时,可以加#,也可以不加,因为,他会在context中也放一个
1
2
3
<s:iterator value="{'a','b','c'}" var="i">
    <s:property value="i"/>---<s:property value="#i"/>
</s:iterator>
  • 遍历一些数,把其中3的倍数变红,每次加10
1
2
3
4
5
6
7
8
9
<h2>遍历</h2>
<s:iterator begin="10" end="300" step="10" var="i" status="sta">
    <s:if test="#sta.count % 3 == 0">
        <font color="red"><s:property value="i"/></font>
    </s:if>
    <s:else>
        <s:property value="i"/>
    </s:else>
</s:iterator>

UI标签库 UI Tags

  • 优势:点文字可以获得焦点,文本框会加一些基本的样式,例如换行啊。。。

  • 会提供一套默认的样式样式 xhtml
    • 可以不用,在表单上加一个theme="simple",或者在常量上改变,这样所有的就都不能用了

UI标签的数据回显:

优点:

  • 将查询到的数据显示到指定文本框
  • 数据校验或类型转换出错情况下

数据除了密码都会回显,并且会显示错误信息,密码也要回显添加一个showpassword=true

是在root区存着的。

Struts2的注解开发

  1. 引包 struts-convention-plugin
  2. 写好action之后加
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @ParentPackage("struts-default")
    @Namespace("/")
    public class HelloAction extends ActionSupport{
         @Action(value="访问路劲相当于action中的name",results="返回值")
         public String execute(){
            syso();
            return ...;
         }
    }
张冲 wechat
欢迎扫一扫上面的微信关注我,一起交流!
坚持原创技术分享,您的支持将鼓励我继续创,点击打赏!