一、为什么要访问Servlet API ?

    Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试。但是对于Web控制器而言,不访问action是不行的,Struts提供了一种比较简单的方式来访问Servlet API 。

二、通常我们需要访问的Servlet API 是 HttpSession、HttpservletRequest、ServletContext,分别对应了JSP内置对象 session,request,application。

三、Action访问Servlet API的三种方法

      1、使用ActionContext类访问Servlet API。将HttpSession、HttpservletRequest、ServletContext封装成了Map,用put方法赋值,用EL表达式取。

    写在Action类中代码:

public String execute() throws Exception {
        ActionContext context=ActionContext.getContext();
        Map request = (Map)context.get("request");
        Map session = (Map)context.getSession();
        Map application = (Map)context.getApplication();
        
        if("admin".equals(username) && "123".equals(password)){
            request.put("uesrname",username);
            return SUCCESS;
        }
        else{
            session.put("username", username);
            session.put("errorMsg", "您的用户名或密码有误!");
            return ERROR;
        }
  }

写在success.jsp中代码:

<body>
    登陆成功!!!
    欢迎您! ${param.username}
    
  </body>

写在error.jsp中代码:

 <body>
   对不起, 登录失败!!!<br/>
   <font color="red">${sessionScope.errorMsg}</font>
  </body>

   2、ServletActionContext类提供了3个方法,可直接得到HttpSession、HttpservletRequest、ServletContext对象。

    写在Action类中代码:

public String execute() throws Exception {
        
        
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        
        
        if("admin".equals(username) && "123".equals(password)){
            request.setAttribute("username", username);
            return SUCCESS;
        }
        else{
            
            session.setAttribute("errorMsg", "您输错了用户名或密码!");
            return ERROR;
        }
  }

jsp文件中代码不变。

   3、实现***Aware接口直接访问Servlet API

    为了使Struts2能够直接访问到Servlet API的实例,Struts2提供了ServletContextAware接口、 ServletRequest接口、 ServletResponsetAware接口。