zoukankan      html  css  js  c++  java
  • Struts2在Action中访问WEB资源

    什么是WEB资源?

       这里所说的WEB资源是指:HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API。

    为什么需要访问WEB资源?

      B/S 的应用的 Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie等等操作均需要用到上述原生的ServletAPI

    访问方法

     和 Servlet API 解耦的方式:

       只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效...).

        > 使用 ActionContext

    使用示例:

    public class ActionTest {
    
    	@SuppressWarnings("unchecked")
    	public String execute() {
    		// 0、获取ActionContext对象
    		// ActionContext是Action的上下文,可以从中获取到当前Action需要的相关信息
    		ActionContext context = ActionContext.getContext();
    
    		// 1、获取application域对应的Map对象
    		// 通过调用上下文对象context的getApplication()方法获取
    		Map<String, Object> applicationMap = context.getApplication();
    		applicationMap.put("applicationKey", "applicationValue");
    
    		// 2、session
    		Map<String, Object> sessionMap = context.getSession();
    		sessionMap.put("sessionKey", "sessionValue");
    
    		// 3、request
    		// ActionContext中并没有提供获取getRequest方法来获取requestMap的方法
    		// 而是需要调用get方法,并且传入‘request’字符串作为参数来获取
    		Map<String, Object> requestMap = (Map<String, Object>) context.get("request");
    		requestMap.put("requestKey", "requestValue");
    
    		// 4、获取请求参数对应的map
    		// 键:请求参数名,值:请求参数的值对应的字符串数组
    		Map<String, Object> parameters = context.getParameters();
    		System.out.println(((String[]) parameters.get("name"))[0]);
    		return null;
    	}
    
    }   
    

        > 实现 XxxAware 接口   

    使用示例:

    public class ActionAwareTest implements ApplicationAware, SessionAware, RequestAware, ParameterAware {
    
    	private Map<String, Object> applicationMap;
    
    	private Map<String, Object> sessionMap;
    
    	private Map<String, Object> requestMap;
    
    	private Map<String, String[]> parameters;
    
    	@Override
    	public void setApplication(Map<String, Object> map) {
    		this.applicationMap = map;
    	}
    
    	@Override
    	public void setSession(Map<String, Object> map) {
    		this.sessionMap = map;
    	}
    
    	@Override
    	public void setRequest(Map<String, Object> map) {
    		this.requestMap = map;
    
    	}
    
    	@Override
    	public void setParameters(Map<String, String[]> map) {
    		this.parameters = map;
    
    	}
    
    	public String execute() {
    		return null;
    
    	}
    
    }

        > 选用的建议:

          若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用 Aware 接口的方式
        
         session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!

    和 Servlet API 耦合的方式:

       可以访问更多的 Servlet API 对象, 且可以调用其原生的方法. 

        > 使用 ServletActionContext

     获取方法:

    /**
     * ServletActionContext 可以从中获取到一切Servlet API相关的方法
     * @author Administrator
     *
     */
    public class ServletActionContextTest {
        
    	public String execute(){
    		//获取原生request对象
    		HttpServletRequest request=ServletActionContext.getRequest();
    		//获取原生session对象
    		HttpSession session=request.getSession();
    		//获取原生application对象
    		ServletContext  application=ServletActionContext.getServletContext();
    	
    		return null;
    	}
    }

        > 实现 ServletXxxAware 接口.

    获取方法:

    /**
     * 通过实现ServletXxxAware接口的方式由Struts2负责注入相关对象
     * ServletRequestAware:用来注入request对象
     * ServletContextAware:用来注入application对象
     * @author Administrator
     *
     */
    public class ServletAwareActionTest implements ServletRequestAware, ServletContextAware {
    
    	private HttpServletRequest request;
    
    	private ServletContext application;
    
    	private HttpSession session;
    
    	@Override
    	public void setServletContext(ServletContext servletContext) {
    		this.application = servletContext;
    
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    		this.session = request.getSession();
    	}
    
    }


  • 相关阅读:
    tar.xz文件格式的压缩与解压
    touch命令创建文件
    ls命令
    redis中键空间通知
    socket.io笔记三之子命名空间的socket连接
    Java内部类的使用小结
    如何禁用Chrome浏览器的Flash
    Hibernate Tools插件的安装和使用
    JDBC DataSource
    Tomcat中用JNDI方式加载JDBC DataSource以连接数据库
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293747.html
Copyright © 2011-2022 走看看