默认Action
在当你进行调用Action的时候,如果这个action不存在,默认Action就起到了作用,配置会调用默认的action! 在src文件夹内的struts.xml文件内,写入.
<default-action-ref name="defaultAction" />
<action name="defaulsuccesstAction" class="com.zking.dome.struts.DefaultAction"></action>
一些常量的设置
<!-- 指定由spring负责action对象的创建 -->
<constant name="struts.objectFactory" value="spring" />
<!-- 所有匹配*.action的请求都由struts2处理 -->
<constant name="struts.action.extension" value="action" />
<!-- 是否启用开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- struts配置文件改动后,是否重新加载 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 文件上传最大值 -->
<constant name="struts.multipart.maxSize" value="104857600" />
<!-- 让struts2支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- Action名称中是否还是用斜线 -->
<constant name="struts.enable.SlashesInActionNames" value="false" />
<!-- 允许标签中使用表达式语法 -->
<constant name="struts.tag.altSyntax" value="true" />
<!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
<constant name="struts.dispatcher.parametersWorkaround" value="false" />
拦截器
Result返回结果类型
- dispatcher(默认) 转发
- 底层使用RequestDispatcher转发请求
- redirect 重定向到Action
- 底层使用sendRedirect将请求重定向
- redirectAction action跳action
- 重定向到action
- chain type=”chain”表示请求转发至另一个action
- 举例:
<package name="default" extends="struts-default">
<!--第一个action-->
<action name="名字" class="com.zking.dome.sd">
<!-- 结果类型-->
<result name="succeed" type="redirectAction">
<!-- name不能改变 值,填写你需要跳转的Action的name-->
<param name="actionName">beibiao</param>
</result>
</action>
<!--被跳转的action-->
<action name="two名字" class="com.zking.dome.two">
<result name="succeed" type="dispatcher" >
test.html
</result>
</action>
</package>
拦截器
简介:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
拦截器栈(Interceptor Stack)
拦截器栈(Interceptor Stack)类似于过滤器链。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器栈的拦截器就会按其之前定义的顺序被调用。
也可以叫做拦截器链(Interceptor Stack),拦截器栈一词更明确的表名了连接器链的实现方式。
Struts2的拦截器和Filter类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。
当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器
区别
拦截器,它和过滤器,组成核心的组件,它与过滤器的区别,在于,过滤器,几乎过滤所有的,而它只专注于,action的拦截。
工作原理图
操作流程
- 第一种:实现Interceptor接口,然后重写
public class Test implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
//销毁 时触发
}
@Override
public void init() {
//建立时 触发
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// 编写 拦截 语句
//放行
return arg0.invoke(); ;
}
}
- 第二种: 继承AbstractInterceptor类,实现intercept()方法 推荐使用
public class Login_Interceptor extends AbstractInterceptor{
private static final long serialVersionUID = 1L;
@Override //拦截器
public String intercept(ActionInvocation arg0) throws Exception {
ActionConfig actionconfig=arg0.getProxy().getConfig();
Map<String, String> map=actionconfig.getParams();
if(session.get("user")!=null){//当是,登录的
return arg0.invoke(); 放行
}
//返回的字符串,和action 的映射值一样,取调用对应的结果
return "defeated";
}
}
在struts.xml配置引用拦截器
打开src文件夹内的struts.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 让struts2支持动态方法调用 附加 2.3.3 默认关闭 常量 修改-->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 通过 常量 修改编码 -->
<constant name="struts.custom.i18n.encoding" value="UTF-8"/>
<!-- 修改 常量 开发模式 及时反馈(更新 服务) -->
<constant name="struts.devMode" value="true"></constant>
<package name="default" extends="struts-default">
<!-- 拦截器 -->
<interceptors>
<!-- 单个拦截器 登录-->
<interceptor name="login_interceptor" class="com.interceptor.Login_Interceptor"></interceptor>
<!-- 单个拦截器 编码-->
<interceptor name="encoding_interceptor" class="com.interceptor.Encoding_Interceptor"></interceptor>
<!-- 拦截器 栈 -->
<interceptor-stack name="my_interceptor"> <!-- 加入拦截器栈 -->
<!-- 把 单个 拦截器 放入 栈中, 必须,先 放入 默认的 defaultStack 拦截器,否者,所有的action都无法进入 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="login_interceptor"></interceptor-ref>
<interceptor-ref name="encoding_interceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 设定,默认的拦截器,可以是 拦截器栈,也可以是单个, 触发,条件,当你的action没有配置,拦截器时,就会引用 -->
<!-- <default-interceptor-ref name="my_interceptor"></default-interceptor-ref> -->
<!-- 引入 拦截器栈 因为我的拦截器栈,已经引用了默认的拦截器,所以就不必,在action中引用,直接引用栈即可 -->
<action name="interceptor_inn" class="com.interceptor.inn">
<interceptor-ref name="my_interceptor"></interceptor-ref>
</action>
<!-- 引入 单个拦截器 -->
<!-- 如果是设定单个 拦截器,必须,先 放入 默认的 defaultStack 拦截器,否者,所有的action都无法进入。再放入再引入,自己的拦截器 -->
<action name="interceptor_inn" class="com.interceptor.inn">
<!--默认拦截器-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!--己身写的拦截器-->
<interceptor-ref name="my_interceptor"></interceptor-ref>
</action>
</package>
</struts>