• 【Java】Struts2中使用ServletAPI


    • ActionContext的方式

    登录的表单:

        <form action="login.action" method="post">
            name:<input type="text" name="username"><br>
            password:<input type="password" name="password"><br>
            <input type="submit" value="Submit">
        </form>

    登录的控制器:

    package com.action;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.pojo.User;
    
    public class Login extends ActionSupport implements ModelDriven<User>{
        private User user = new User();
        @Override
        public String execute() throws Exception {    
    //        通过Struts2提供的ActionContext类,访问ServletAPI
    //        Object get(Object key):此方法类似调用HttpServletRequest的getAttrbute(String name)
    //        Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例
    //        static ActionContext getContext():静态方法,返回系统的actionContext实例
    //        Map getParameters():获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap()方法
    //        Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例
    //        void setApplication(Map application):直接传入一个Maori实例,将该Map实例里面的Key-value转化为application中的键值对
    //        void setSession(Map Seesion):直接传入一个Map实例,将该Map实例的键值对转化为Session的键值对
            
            ActionContext ctx = ActionContext.getContext(); //静态方法获取实例
    //        通过ActionContext访问application范围的属性值
            Integer counter = (Integer) ctx.getApplication().get("counter");
            if (counter == null){
                counter = 1;
            }else{
                counter += 1;
            }
    //        通过ActionContext设置application范围的属性
            ctx.getApplication().put("counter", counter);
            
    //        通过ActionContext设置application范围的属性
            ctx.getSession().put("username", user.getUsername()); // session范围
            ctx.put("password", user.getPassword()); // requset范围
            return SUCCESS;
        }
        
        @Override
        public User getModel() {
            // TODO Auto-generated method stub
            return user;
        }
        
    }

    显示的JSP:

          <h1>这是第${applicationScope.counter } 次访问</h1>
        Username:<strong>${sessionScope.username }</strong>
        Password:<strong>${requestScope.password }</strong>
    • Action直接访问ServletAPI

    虽然Struts2提供了ActionContext来访问ServletAPI,但这种方式不是直接获得ServletAPI的实例。为了在Action中直接访问ServletAPI,Struts2还提供了如下几个接口:

    1. ServletRequestAware:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例
    2. ServletResponseAware:实现该接口的Action可以直接访问服务器响应的HttpServletResponse实例。
    3. ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例。

     这里在刚刚的代码的基础上,通过response添加一个Cookie。

    package com.action;
    
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.interceptor.ServletResponseAware;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.pojo.User;
    
    public class Login extends ActionSupport implements ModelDriven<User>,ServletResponseAware{
        private User user = new User();
        private HttpServletResponse response;
        @Override
        public String execute() throws Exception {
    //        通过Struts2提供的ActionContext类,访问ServletAPI
    //        Object get(Object key):此方法类似调用HttpServletRequest的getAttrbute(String name)
    //        Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例
    //        static ActionContext getContext():静态方法,返回系统的actionContext实例
    //        Map getParameters():获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap()方法
    //        Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例
    //        void setApplication(Map application):直接传入一个Maori实例,将该Map实例里面的Key-value转化为application中的键值对
    //        void setSession(Map Seesion):直接传入一个Map实例,将该Map实例的键值对转化为Session的键值对
            
            ActionContext ctx = ActionContext.getContext(); //静态方法获取实例
    //        通过ActionContext访问application范围的属性值
            Integer counter = (Integer) ctx.getApplication().get("counter");
            if (counter == null){
                counter = 1;
            }else{
                counter += 1;
            }
    //        通过ActionContext设置application范围的属性
            ctx.getApplication().put("counter", counter);
            
    //        通过ActionContext设置application范围的属性
            ctx.getSession().put("username", user.getUsername()); // session范围
            ctx.put("password", user.getPassword()); // requset范围
         Cookie c = new Cookie("user",user.getUsername());
            c.setMaxAge(60*60);
            response.addCookie(c);  // 用ServletAPI 添加一个Cookie
    return SUCCESS; } @Override public User getModel() { // TODO Auto-generated method stub return user; } @Override

       public void setServletResponse(HttpServletResponse response) {
            // TODO Auto-generated method stub
            this.response = response;
     } }
    • 使用ServletActionContext访问ServletAPI

    Struts2 提供了一个工具类,包含了几个静态的方法。

    1. static PageContext getPageContext() 取得Web应用的PageContext对象。
    2. static HttpServletRequest getRequest():取得Web应用的HttpServletRequest对象
    3. static HttpServletResponse getResponse():取得Web应用的HttpServletResponse对象
    4. static HttpServletContext getServletContext():取得Web应用的ServletContext对象

    借助ServletActionContext工具类的帮助,我们也能在Action中访问ServletAPI,并且可以避免Action类实现xxAware接口--虽然如此,但Action依然和ServletAPI直接耦合,不利于高层次的解耦。

    // 使用 ServletActionContext 增加一个Cookie
    ServletActionContext.getResponse().addCookie(c);
  • 相关阅读:
    direct path write 等待事件导致数据库hang
    Sql Server数据库视图的创建、修改
    MVC视图中Html.DropDownList()辅助方法的使用
    Ubuntu16.04下安装.NET Core
    Ubuntu16.04下部署golang开发环境
    win7环境下安装运行gotour【转载整理】
    一.Windows I/O模型之选择(select)模型
    Windos下的6种IO模型简要介绍
    编码介绍(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
    串口通信知识点详解
  • 原文地址:https://www.cnblogs.com/to-red/p/11152405.html
Copyright © 2020-2023  润新知