Struts第四阶段

Struts2

拦截器的概述

什么是拦截器

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

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

Struts2的执行流程:

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

01

自定义拦截器

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

编写:

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;
    }

}

配置拦截器
- 配置的时候会有顺序,默认的在前面,就先执行默认的,自己定义的在前面就先执行自己的

//在<package>标签中配置
<interceptors>
   <interceptor name="名字" class="拦截器路劲" ></interceptor>
</interceptors>

//**因为自定义之后默认的拦截器就不引用了,所以得引用一下默认的拦截器**
<interceptor-ref name="defaultStack">
//然后再<action> 标签中引用一下
<interceptor-ref name="拦截器名字" />

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

<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

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;
      }
   }
}
  • 配置拦截器
//配置拦截器
<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
    02

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


  • 在遍历List集合的时候,放var里取出来时,可以加#,也可以不加,因为,他会在context中也放一个
<s:iterator value="{'a','b','c'}" var="i">
    <s:property value="i"/>---<s:property value="#i"/>
</s:iterator>
  • 遍历一些数,把其中3的倍数变红,每次加10
<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

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

03

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

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

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

是在root区存着的。

Struts2的注解开发

  1. 引包 struts-convention-plugin
  2. 写好action之后加
@ParentPackage("struts-default")
@Namespace("/")
public class HelloAction extends ActionSupport{
     @Action(value="访问路劲相当于action中的name",results="返回值")
     public String execute(){
        syso();
        return ...;
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值