zoukankan      html  css  js  c++  java
  • mzy,struts学习(三):action中获得servlet中三域一参的三种方法

    package com.mzy.servlet;
    
    import java.util.Arrays;
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionContext;
    /**
     * 获得原生Servlet对象的测试!
     * @author mzy
     *
     */
    public class Demo01Action implements Action {
    	/*
    	 * 所谓POJO,就是一个普通的java类!
    	 */
    	@Override
    	public String execute() throws Exception {
    		/* ActionContext 解耦的,提供三大域和参数!
    		 * 
    		 * 如何在Action中获得三大域和参数?
    		 * struts的数据中心:ActionContext! getContext,取得上下文之后,获得被解析的三大域(Map)!
    		 * 
    		 * 这样做作用是降低耦合!避免直接使用原生的servlet!就使用Map技术,不用了解Servlet-API!
    		 * 做到解耦更合理!但是熟悉servlet-API也可以使用原生的!
    		 */
    		// 获得requestScope的map表示
    		Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
    		// 获得session域的map表示
    		Map<String, Object> sessionScope = ActionContext.getContext().getSession();
    		// 获得application(ServletContext)的map表示
    		Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
    		// 获得参数
    		Map<String, Object> params = ActionContext.getContext().getParameters();
    		
    		requestScope.put("name", "requestScopeValue");
    		sessionScope.put("name", "sessionScopeValue");
    		applicationScope.put("name", "applicationScopeValue");
    		
    		/*
    		 * ServletActionContext 耦合的!提供原生的servlet对象
    		 */
    		// 为了检验从ActionContext中getContext().getParameters()的结果,直接使用URL传值测试!
    		// ?name=aaa&name=bbb&name=ccc
    		// http://localhost:8080/Struts_Day01/servlet/Demo01Action?name=aaa&name=bbb&name=ccc
    		String[] names = (String[]) params.get("name"); // 同servlet中的map,实际上是一个数组
    		System.out.println(Arrays.toString(names));
    		
    		// ServletActionContext获得原生的Servlet对象:我最爱的方式!
    		// struts为了方便一部分开发人员使用原生的servlet对象,把servlet中的原生对象封装到了ServletActionContext中
    		// 但是struts官方推荐文档中,不推荐直接使用servlet的原生对象!
    		/*
    		HttpServletRequest request = ServletActionContext.getRequest();
    		HttpServletResponse response = ServletActionContext.getResponse(); 
    		ServletContext servletContext = ServletActionContext.getServletContext();
    		HttpSession session = request.getSession(false);
    		*/
    		return SUCCESS;
    	}
    	
    	public String add() throws Exception {
    		// 测试动态方法调用的逻辑!
    		return SUCCESS;
    	}
    }
    
    package com.mzy.servlet;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.interceptor.ApplicationAware;
    import org.apache.struts2.interceptor.ParameterAware;
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    import org.apache.struts2.interceptor.SessionAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    /**
     * 之前讲了在action中获得servlet三大域对象和参数的方式:
     * 	 	第一种是通过ActionContext.getConext:get("request")、getSession()、getApplication()和getParameters()
     * 		得到Map<String, Object>的解耦一类的低耦合对象!
     * 
     * 		第二种是通过ServletActionContext:getRequest、getResponse、getServletContext、request.getSession和
     * 		request.getParameterMap原生servlet对象来操作,但是这样高耦合不推荐!
     * 
     * 		第三种实现接口来实现:今天要介绍的!
     * @author mzy
     *
     */
    public class Demo01Action extends ActionSupport implements ServletRequestAware, 
    		ServletResponseAware, SessionAware, ParameterAware, ApplicationAware {
    	
    	private static final long serialVersionUID = -8005627219142113283L;
    	private HttpServletRequest request;
    	private HttpServletResponse response;
    	private Map<String, Object> session;
    	private Map<String, Object> application;
    	private Map<String, String[]> params;
    	
    	@Override
    	public String execute() throws Exception {
    		System.out.println(request);
    		System.out.println(response);
    		System.out.println(session);
    		System.out.println(application);
    		System.out.println(params);
    		/*
    		 * 输出发现这些对象都是包装过的;并且application、session和parameters
    		 * 都以及解析成为了Map键值对了!
    		 * 担心是否功能会发生变化?
    		 * 回想起之前动态代理做包装一类的案例:
    		 * 一个良好的包装,是在不改变使用习惯的前提下,完成了功能的增强!
    		 * 例如连接池中,获得连接池对象之后,动态代理把原本的close方法替换成了,放回连接池的操作!
    		 * 
    		 * 进一步查看源码发现:
    		 * 		ServletRequestAware这一系列所谓的接口,其实也是通过ActionContext进行获取,
    		 * 		然后包装起来传入的,我感觉没有必要再通过实现接口这样去获得这一类Servlet中的对象。
    		 * 
    		 * 直接通过ActionContext就是最好的办法!
    		 * 而且实现接口之后,有代码入侵性的危险;不安全。可以查到我的实现接口,能不用最好不用。
    		 */
    		
    		return SUCCESS;
    	}
    
    	@Override
    	public void setApplication(Map<String, Object> application) {
    		this.application = application;
    	}
    
    	@Override
    	public void setParameters(Map<String, String[]> params) {
    		this.params = params;
    	}
    
    	@Override
    	public void setSession(Map<String, Object> session) {
    		this.session = session;
    	}
    
    	@Override
    	public void setServletResponse(HttpServletResponse response) {
    		this.response = response;
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    	}
    }
    



  • 相关阅读:
    SPOJ VJudge QTREE
    LCA 在线倍增法 求最近公共祖先
    Codevs 2370 小机房的树
    51Nod-1632-B君的连通
    51Nod--1100-斜率最大
    51Nod-1276-岛屿的数量
    51Nod-1270-数组的最大代价
    poj
    hihocoder Week136 -- 优化延迟
    poj-1035-Spell Checker
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053402.html
Copyright © 2011-2022 走看看