Struts2
拦截器的概述
什么是拦截器
拦截器是Struts2中的核心。其实就是一个类对Action的访问进行拦截。
拦截器与过滤器的区别:
- 过滤器过滤的是从客户端向服务器发送的请求。过滤器是可以过滤Html, JSP…
- 拦截器拦截的是从客户端向Action发送的请求。拦截器只能拦截Action,拦截器更细粒度的实施拦截。拦截到Action中具体的方法。
Struts2的执行流程:
- 请求访问Action,请求首先到达核心过滤器,过滤器会调用Dispather中的ServiceAction的方法
- 在这个方法内部,Struts2框架创建一个Action代理对象,执行代理对象中的execute方法,在execute内部方法调用Actioninvocatin中的invoke方法。
- 在invoke方法内部,递归调用拦截器的拦截的方法,如果没有下一个拦截器,执行目标Actioin,根据Action返回Result进行页面跳转,由Response做出响应。
自定义拦截器
- 实现Interceptor接口或者继承AbstractInterceptor类
- 配置拦截器
编写:
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
传参数:
<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
- 优势:点文字可以获得焦点,文本框会加一些基本的样式,例如换行啊。。。
- 会提供一套默认的样式样式
xhtml
- 可以不用,在表单上加一个
theme="simple"
,或者在常量上改变,这样所有的就都不能用了
- 可以不用,在表单上加一个
UI标签的数据回显:
优点:
- 将查询到的数据显示到指定文本框
- 数据校验或类型转换出错情况下
数据除了密码都会回显,并且会显示错误信息,密码也要回显添加一个showpassword=true
是在root区存着的。
Struts2的注解开发
- 引包
struts-convention-plugin
- 写好action之后加
@ParentPackage("struts-default")
@Namespace("/")
public class HelloAction extends ActionSupport{
@Action(value="访问路劲相当于action中的name",results="返回值")
public String execute(){
syso();
return ...;
}
}