• Action访问ServletAPI的三种方式


    一、前言

    Struts是一种基于MVC设计模式的web应用框架,主要担任C的角色,用于分离页面显示和业务逻辑处理,那其实在我们学习jsp的时候学过一个具有类似功能的东西——servlet。其实Struts本质上相当于servlet,可以理解Struts是对servlet的进一步封装和抽象。那么在servlet里面使用的对象,在Struts里面同样也是可以使用的,这也是这一章的主要内容。

    二、传统的Web程序和Web容器传递数据的方法

    1. HttpServletRequest的getParameter(String name)方法
    2. HttpSession的getAttribute(String Object)方法

    三、Action为什么需要调用Servlet API?

    1. Action需要存取request、session、application数据区中数据
    2. 例如:在Action中将用户数据保存到Session中
    3. 例如:跟踪用户的状态,例如购物车功能

    四、Action访问servlet API的方式

    1. 提供了ServletActionContext类完成直接访问HttpServletRequest,HttpServletResponse,ServletContext 对象

       缺点:Action组件和这些ServletAPI耦合在一起,不利于软件维护。

    //第一种方式:ServletActionContext类,直接访问servletAPI对象
    
    HttpServletRequest request=ServletActionContext.getRequest();
    
    HttpSession session=request.getSession();
    
    ServletContext application=ServletActionContext.getServletContext(); 
    
    //      request.setAttribute("user",uname);//将user对象放到request作用域中
    
    //      session. setAttribute("user",uname);//将user对象放到session作用域中
    
    //      application. setAttribute("user",uname);//将user对象放到application作用域中
    
     
    
    if("ross".equals(this.uname) && "111".equals(this.upass)){
    
        request.setAttribute("user",uname);//将user对象放到request作用域中
    
        return "success";
    
    }else{
    
        request.setAttribute("msg","用户名或密码错误");//将user对象放到request作用域中
    
        return "error";
    
    }

    1. 提供ActionContext类

      特点:Struts2将ServletAPI(HttpServletRequest,HttpSession,ServletContext)分别封装在Map中,完成了Action组件和ServletAPI的解耦。

             所以如果ActionContext能实现我们的功能就不要去使用ServletActionContext,让我们的action尽量不要去直接访问servlet的相关对象,更符合面向对象编程的思想。

      注意:不要在构造函数当中使用ActionContext,因为此时ActionContext里面的值也许还没有设置。同理,ServletActionContext也一样不要在构造函数当中使用。这就有了我们的第三种访问方式。

    //第二种方式:actioncontext类
    
    ActionContext context=ActionContext.getContext();
    
    Map<String,String> request=(Map<String,String>)context.get("request");//获得request对象 Map<String,Object> session=(Map<String,Object>)context.getSession();
    
    Map<String,Object> application=(Map<String,Object>)context.getApplication();
    
    request.put("user",uname);//将user对象放到request作用域中
    
    if("ross".equals(this.uname) && "111".equals(this.upass)){
    
                  request.put("user",uname);//将user对象放到request作用域中
    
                  return "success";
    
             }else{
    
                  request.put("msg","用户名或密码错误");//将user对象放到request作用域中
    
                  return "error";
    
             }
    1. 实现RequestAware,SessionAware,ApplicationAware接口。【推荐使用】

      特点:装配request,session,application对象的时机早,在检测Action组件的实现接口时就完成了装配。

    private Map<String, Object> request;
    
         private Map<String, Object> session;
    
         private Map<String, Object> application;
    
         @Override
    
         public void setApplication(Map<String, Object> arg0) {
    
             this.application=arg0;
    
         }
    
         @Override
    
         public void setSession(Map<String, Object> arg0) {
    
             this.session=arg0;
    
         }
    
         @Override
    
         public void setRequest(Map<String, Object> arg0) {
    
             this.request=arg0;
    
         }
    
         /**
    
          * 处理用户登录请求
    
          */
    
         public String execute() {
    
             // 模拟用户登录处理(登录正确)
    
             if ("ross".equals(uname) && "111".equals(upass)) {
    
                  session.put("uname", uname);
    
                  // 返回逻辑视图名
    
                  return SUCCESS;
    
                  // 登录失败
    
             } else {
    
                  request.put("loginError", "登录名称或者密码错误");
    
                  // 返回逻辑视图名
    
                  return ERROR;
    
             }
    
         }


    页面上使用el表达式${ loginError}获取即可。

  • 相关阅读:
    [System.currentTimeMillis]/[Calendar.getInstance().getTimeInMillis()]/[new Date().getTime()]
    [Maven]告警[WARNING] Unable to create Maven project from repository.
    通过设置JDK解决存在多个Gradle后台进程的问题
    使用OpenSSL实现X25519秘钥协商功能
    C++代码质量度量工具大阅兵
    Java代码质量度量工具大阅兵
    计算两个时间的时间差(天、小时、分钟、秒数)
    上传文件进度条 (已上传大小、总大小、速度、剩余时间、已用时间)
    table 表格自适应
    谷歌浏览器input框添加了黄色 背景色
  • 原文地址:https://www.cnblogs.com/zhouyeqin/p/7172015.html
Copyright © 2020-2023  润新知