[关闭]
@MrXiao 2017-12-21T01:49:42.000000Z 字数 2547 阅读 794

Struts2(3) - Action配置及访问方式

Struts2


1、如何编写动作类

  1. 普通POJO类做action(不推荐)
  2. 实现Action接口,重写excute方法(不推荐)
  3. 继承ActionSupport,写自己需要的方法。

2、如何访问动作类

struts.xml中action的配置。

  1. <package name="login" namespace="/" extends="struts-default">
  2. <action name="loginTest" class="com.topvision.s2sm.login.action.LoginAction" method="loginTest">
  3. <result>/WEB-INF/jsp/login/login.jsp</result>
  4. </action>
  5. </package>

如上会有一个缺点,就是每个方法都要在xml中配置一个action,较为麻烦。如何优化呢?有两个办法:动态方法调用和通配符。

  1. 通配符

    通配符使用的比较多,是人为的设置编码规则,体现出约定大于编码的规范。即action.name可以使用通配符星号(*),在action.class、aciton.method、result.name处可以使用{n}方式匹配星号,举个例子就明白了。

    1. <action name="*_*" class="{1}" method="{2}">
    2. <result></result>
    3. </action>

    请求路径:..../userAction_add,{1}匹配第一个,为userAction, {2}匹配第二个,为add。

  2. 动态方法调用

    在struts.xml中开启动态方法的使用。struts.enable.DynamicMethodInvocation = true。

    1. <!-- 让struts2支持动态方法调用,可以使用通配符 -->
    2. <constant name="struts.enable.DynamicMethodInvocation" value="true" />

    那么就可以直接使用http://localhost:8080/xxx/xxxAction!add,直接调用xxxAction中的add方法了,并且在struts.xml中的action配置中,就不需要配置method属性的值了。这样做就解决了写死method值的问题

3、动作类生命周期

诞生:每次用户访问时。
活着:动作没有响应结束。
死亡:响应结束。

多例的;没有线程安全问题。(与struts1所不同的)。
因为动作类是一个非常普通的Java类,创建它需要消耗的资源可以省略不计。

4、动作类访问Servlet的API

  1. 实现xxxAware接口

    ServletContextAware, ServletRequestAware,ServletResponseAware,SessionAware.

    struts2提供了这四个Aware接口用于Action类的实现,从而注入对应的application、request、response,session,不过它们都是Map类型的。这和ActionContext一样是解耦的,即没有引入servlet相关的包,是在struts2内部的。

    通过XxxAware接口的实现,可以方便的获取web资源。

    1. public class BaseAction extends ActionSupport implements SessionAware,ServletRequestAware, ServletResponseAware, ServletContextAware {
    2. private static final long serialVersionUID = -6318930077865937364L;
    3. protected Logger logger = LoggerFactory.getLogger(getClass());
    4. protected Map<String, Object> session;
    5. protected HttpServletRequest request;
    6. protected HttpServletResponse response;
    7. protected ServletContext context;
    8. @Override
    9. public void setSession(Map<String, Object> session) {
    10. this.session = session;
    11. }
    12. @Override
    13. public void setServletRequest(HttpServletRequest request) {
    14. this.request = request;
    15. }
    16. @Override
    17. public void setServletResponse(HttpServletResponse response) {
    18. this.response = response;
    19. }
    20. @Override
    21. public void setServletContext(ServletContext context) {
    22. this.context = context;
    23. }
    24. }
  2. 直接耦合构造

    1. ServletContext servletContext = ServletActionContext.getServletContext();
    2. HttpServletRequest request = ServletActionContext.getRequest();
    3. HttpSession session = request.getSession();
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注