@MrXiao
        
        2017-12-21T01:49:42.000000Z
        字数 2547
        阅读 1155
    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;@Overridepublic void setSession(Map<String, Object> session) {this.session = session;}@Overridepublic void setServletRequest(HttpServletRequest request) {this.request = request;}@Overridepublic void setServletResponse(HttpServletResponse response) {this.response = response;}@Overridepublic void setServletContext(ServletContext context) {this.context = context;}}
直接耦合构造
ServletContext servletContext = ServletActionContext.getServletContext();HttpServletRequest request = ServletActionContext.getRequest();HttpSession session = request.getSession();