@MrXiao
2017-12-21T09:49:42.000000Z
字数 2547
阅读 922
Struts2
struts.xml中action的配置。
<package name="login" namespace="/" extends="struts-default">
<action name="loginTest" class="com.topvision.s2sm.login.action.LoginAction" method="loginTest">
<result>/WEB-INF/jsp/login/login.jsp</result>
</action>
</package>
如上会有一个缺点,就是每个方法都要在xml中配置一个action,较为麻烦。如何优化呢?有两个办法:动态方法调用和通配符。
通配符
通配符使用的比较多,是人为的设置编码规则,体现出约定大于编码的规范。即action.name可以使用通配符星号(*),在action.class、aciton.method、result.name处可以使用{n}方式匹配星号,举个例子就明白了。
<action name="*_*" class="{1}" method="{2}">
<result></result>
</action>
请求路径:..../userAction_add,{1}匹配第一个,为userAction, {2}匹配第二个,为add。
动态方法调用
在struts.xml中开启动态方法的使用。struts.enable.DynamicMethodInvocation = true。
<!-- 让struts2支持动态方法调用,可以使用通配符 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
那么就可以直接使用http://localhost:8080/xxx/xxxAction!add,直接调用xxxAction中的add方法了,并且在struts.xml中的action配置中,就不需要配置method属性的值了。这样做就解决了写死method值的问题
诞生:每次用户访问时。
活着:动作没有响应结束。
死亡:响应结束。
多例的;没有线程安全问题。(与struts1所不同的)。
因为动作类是一个非常普通的Java类,创建它需要消耗的资源可以省略不计。
实现xxxAware接口
ServletContextAware, ServletRequestAware,ServletResponseAware,SessionAware.
struts2提供了这四个Aware接口用于Action类的实现,从而注入对应的application、request、response,session,不过它们都是Map类型的。这和ActionContext一样是解耦的,即没有引入servlet相关的包,是在struts2内部的。
通过XxxAware接口的实现,可以方便的获取web资源。
public class BaseAction extends ActionSupport implements SessionAware,ServletRequestAware, ServletResponseAware, ServletContextAware {
private static final long serialVersionUID = -6318930077865937364L;
protected Logger logger = LoggerFactory.getLogger(getClass());
protected Map<String, Object> session;
protected HttpServletRequest request;
protected HttpServletResponse response;
protected ServletContext context;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public void setServletContext(ServletContext context) {
this.context = context;
}
}
直接耦合构造
ServletContext servletContext = ServletActionContext.getServletContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();