<!-- Basic stack --> <interceptor-stack name="basicStack"> <interceptor-ref name="exception"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> </interceptor-stack>
“basicStack”拦截器是Struts2的核心拦截器
这个叫做“拦截器栈”,在“拦截器栈”中包含着若干拦截器的引用。 如果“拦截器”比作文件,那么“拦截器”相当于文件夹。 在这个名为“basicStack”的“拦截器栈”中,包含了8种拦截器(这8种拦截器在文档上部定义过的)、
<!-- Basic stack -->
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
我们注意到在“拦截器栈”中,还有一个“拦截器栈”,那么可以说“拦截器栈”也可以当做“拦截器”来用
默认的拦截器:
<default-interceptor-ref name="defaultStack"/>
1) 在package 中定义拦截器 <interceptor name="" class="">
2) 在package 中定义拦截器栈
<interceptor-stack name=""> <interceptor-ref name=""> </interceptor-stack>
3) package中定义默认拦截器 <default-interceptor-ref name=""/>
4) action定义拦截器
<action name="" class=""> <!-- 表示访问该action前先调用这个拦截器-- > <interceptor-ref name=""> <param name=""></param> </interceptor-ref> </action>
自定义拦截器:
<struts>
<package name="action" extends="struts-default">
<interceptors>
<interceptor name="mylogger" class="com.interceptor.LoggerInterceptor"/>
<interceptor name="mylogin" class="com.interceptor.LoginInterceptor"/>
</interceptors>
<action name="list" class="com.action.ListAction">
<interceptor-ref name="mylogger"/>
<interceptor-ref name="defaultStack"/> //一定要加上默认的拦截器 如果不写会被覆盖的
<result name="success">/list.jsp</result>
</action>
<action name="user" class="com.action.UserAction">
<interceptor-ref name="mylogin">
<param name="includeMethods">add,delete,update</param>
</interceptor-ref>
<interceptor-ref name="mylogger"/>
<interceptor-ref name="defaultStack"/>
<!-- 查看 -->
<result name="look">/look.jsp</result>
<!-- 更新初始显示 -->
<result name="load">/updateEmp.jsp</result>
<!-- 添加、更新和删除 -->
<result name="list" type="redirectAction">
<param name="actionName">list</param>
<param name="namespace">/</param>
</result>
</action>
</package>
</struts>
自定义拦截器:
public class LoginInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
Map<String,Object> session = invocation.getInvocationContext().getSession();
Object user = (Object)session.get("user");
if(user == null){
return "login";
}
return invocation.invoke(); 调用后续的拦截器或者Action业务方法
}
}
ActionInvocation类封装了 Action调用过程中所需要的一切API。
3. 资源文件与国际化(i18n) *
之前我们学习了Struts2的五大组件(ValueStack、拦截器、Result、Action、标记库)。现在我
们开始关于返些组件的一些技巧的学习:国际化、错误处理、表单验证等等。
资源文件的国际化internationalization(又名i18n,来由是以i开头n结尾的中间共18个字母)。
国际化的核心:页面显示的文字是可配置的(如中文、英文、日文等,丌能写死在页面中)。
1) 资源文件
资源文件一般是属性文件*.properties
2) 对于中文
1MyEclipse8.5可以方便的得到unicode编码
2 使用JDK提供的命令工具native2ascii也可以
3) 资源文件的命名和位置(重要)
如果顷目非常大,所有资源文件放入同一个目录下是丌好的。资源文件需要分层和分类。
包级资源文件
表示某资源文件是被一个包中所有Action所使用的,
类级资源文件
表示某资源文件只能被指定类使用
4) Action必须继承ActionSupport
ActionSupport类中已经封装了对资源文件的访问。
如果在配置文件中action没有class 属性,则调用的就是
ActionSupport类。