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;
    	}
    }
    



  • 相关阅读:
    Android开发之Sqlite的使用
    ZOJ 3607 Lazier Salesgirl
    ZOJ 3769 Diablo III
    ZOJ 2856 Happy Life
    Ural 1119 Metro
    Ural 1146 Maximum Sum
    HDU 1003 Max Sum
    HDU 1160 FatMouse's Speed
    Ural 1073 Square Country
    Ural 1260 Nudnik Photographer
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053402.html
Copyright © 2011-2022 走看看