URL拦截器
同SpringMVC需要配置DispatcherServlet一样,Struts2也需要在web.xml配置属于自己的”servlet”,只不过在struts2中这个”servlet”实际上是”filter”:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<utl-pattern>/*</url-pattern>
<filter-mapping>
不得不说上面的配置和SpringMVC如出一辙
加载国际化资源
全局国际化需要在struts.xml中添加:
<struts>
<constant name="struts.custom.i8ln.resources" value="国际化文件"/>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
</struts>
视图页面的国际化使用:
<!--获取国际化文件-->
<s:i18n name="XXX.baseName"/>
<!--输出国际化消息-->
<s:text name="对应的国际化消息">
配置Action
首先需要一个继承了ActionSupport的类:
public class LoginAction extends ActionSupport{
//一般会由Action的属性来对应HTTP中的请求参数
private XXX xxx;
//提供xxx对应的getter和setter方法
public String execute()throws Exception{
if(...){
return SUCCESS;//值为"sucess"
}
return ERROR;//值为"error"
}
}
之后还需要在struts.xml中进行Action的配置:
<struts>
<constant name="struts.devMode" value="true"/>
<package name="XXX" extends="struts-default">
<action name="想要处理的映射的URL" class="LoginAction"
namespace="类似于SpringMVC中类上的@RequestMapping注解">
<result name="error">/XXX.jsp/</result>
<result name="success">/XXX.jsp</result>
</action>
</package>
</struts>
在这里不得不吐槽一下,struts2中对于ajax的支持一塌糊涂,不仅需要导入一大堆jar包,还需要额外的配置,相比之下SpringMVC就做的很好
访问上下文
可以通过在Action中通过:
public class XXXAction extends ActionSupport{
...
public Stirng execute(){
ActionContext ctx = ActionContext.getContext();
//此时ctx就是application
}
}
如果想要访问其他的Servlet,可以通过实现接口,一共提供了三种接口:
1.servletContextAware:用于访问Web应用的ServletContext实例
2.ServletRequestAware:直接访问用户请求的HttpServletRequest实例
3.ServletResponseAware:直接访问HttpServeltResponse实例,可以通过Response实例添加Cookie
除了上面三个接口,还有一个更方便的方法就是借助于ServletActionContext类的帮助,它提供了四种方法:
1.getPageContext():获取Web应用的PageContext对象
2.getRequest():获取Web应用的HttpServletRequest对象
3.getResponse():获取HttpServletResponse对象
4.getServletContext():获取ServletContext对象
ps:我们可以发现,好像获取Session对象并不是那么方便,只能通过ActionContext.getContext().getSession()方法获得Session对象
指定调用方法
第一种在配置文件中指定
<action name="XXX" class="XXX" method="方法名">
...
</action>
第二种在form表单的action属性中进行指定:
<form action="actionName!methodName">
...
</form>
第三种是使用通配符:
<action name="*Action" method="{1}">
<result name="XXX">/XXX.jsp</result>
</action>
当然如果我们再做绝一点:
<action name="*_*" class="{1}Action" method="{2}">
...
<action>
说到这里,struts2不推荐直接链接到某个资源,而是将所有请求都发送给struts2框架,让框架去处理:
<action name="*">
<result>/xxx/xxx/xxx.jsp</result>
</action>
特别需要注意,当使用通配符时,action的调用与struts2,xml文件的配置顺序有关。
全局结果配置
<struts>
<package>
<global-results>
<result>/XXX/XXX/XXX.jsp</result>
</global-results>
</package>
</struts>
监听器
PreResultListener,是一个监听器接口,可以在Action完成之后,系统转入实际的物理视图之间被回调,需要在Action类的处理方法中进行添加:
public class XXXAction extends ActionSupport{
public String execute(){
ActionInvocation invocation = ActionContext.getContext().getActionInvocation();
invocation.addPreResultListener(new PreResultListener(){
//...
})
}
}
异常处理
struts-default.xml中已经默认开启了struts2的异常映射,所以我们可以直接配置全局异常处理:
<struts>
<package name="XX" extends="struts-default">
//全局结果映射
<global-results>
<result name="异常页面">/XXX/XXX/XXX.jsp</result>
</global-results>
<global-exception>
<exception-mapping exception="异常类型" result="异常页面"/>
</global-exception>
//Action配置
</package>
</struts>
Action内部的异常处理同全局映射一样,异常信息可以通过struts2自定义标签的property属性进行输出