zoukankan      html  css  js  c++  java
  • Struts2中访问web元素

    有很多时候我们都需要访问web元素,比如说用户管理系统,用户登录成功了需要往session中放置一个值,然后要在前台拿到这个值,常用的web元素包括request、session和application等。

    Struts2中有四种方式可以访问到web元素:

    1、通过ActionContext来访问Map类型的request、session、application对象。

    2、通过实现RequestAware、SessionAware、ApplicationAware接口来访问Map类型的request、session、application对象(IoC方式)。(常用)

    3、通过ServletActionContext来访问Servlet API类型的HttpServletRequest、 HttpSession、 ServletContext对象(依赖于Servlet API 方式)。

    4、通过实现ServletRequestAware接口来访问Servlet API类型的HttpServletRequest、 HttpSession、 ServletContext对象(IoC方式)。

    一、ActionContext方式

    在计算机程序中,一般Context是指程序运行的环境,在Struts2的ActionContext中,包括我们需要的request、session、application等对象,所以我们可以在ActionContext中拿到这些对象,一般在Action类的构造方法,或execute()方法中获取。

    package com.chongqing.action;
    
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class LoginAction1 extends ActionSupport {
    	
    	private Map request;     //定义Map类型的request
    	private Map session;     //定义Map类型的session
    	private Map application;//定义Map类型的application
    	
    	//在构造方法中获取这些对象
    	public LoginAction1() {
    		request = (Map)ActionContext.getContext().get("request");
    		session = ActionContext.getContext().getSession();
    		application = ActionContext.getContext().getApplication();
    	}
    	
    	//利用键值存放数值到request,session,application 
    	public String execute() {
    		request.put("r1", "r1");
    		session.put("s1", "s1");
    		application.put("a1", "a1");
    		return SUCCESS; 
    	}	
    }
    

    然后在JSP页面中获取相关web元素:

    <body>
    	User Login Success!
    	<br />
    	<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
    	<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
    	<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
    	<s:debug></s:debug>
    	<br />
    </body>
    

    注意:在Action中我们定义的Map类型的request、session和application,而在JSP页面中却可以直接通过request.getAttribute("r")等方式直接拿到里面的值,这说明在Struts2的内部机制会将Action中Map类型的request、session和application里面的值依次放置到真实类型的request、session和application中。

    二、IoC(控制反转)

    这是最常用的方式。所谓控制反转(Inversion of Control),就是本来是由自己获取session的(自己控制),现在交给Struts2或容器来控制session(交给其他人控制),只要我们按照规定的格式来写就行。控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup),这里是依赖注入。

    让Action类实现RequestAware、SessionAware、ApplicationAware接口,然后重写他们的set方法即可。

    package com.chongqing.action;
    
    import java.util.Map;
    
    import org.apache.struts2.interceptor.ApplicationAware;
    import org.apache.struts2.interceptor.RequestAware;
    import org.apache.struts2.interceptor.SessionAware;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
    	
    	private Map<String, Object> request;
    	private Map<String, Object> session;
    	private Map<String, Object> application;
    	
    	//DI dependency injection
    	//IoC inverse of control
    	public String execute() {
    		request.put("r1", "r1");
    		session.put("s1", "s1");
    		application.put("a1", "a1");
    		return SUCCESS; 
    	}
    
    	@Override
    	public void setRequest(Map<String, Object> request) {
    		this.request = request;
    	}
    
    	@Override
    	public void setSession(Map<String, Object> session) {
    		this.session = session;
    	}
    
    	@Override
    	public void setApplication(Map<String, Object> application) {
    		this.application = application;
    	}
    	
    	
    }
    

     三、获取原类型(依赖于Servlet API 方式)

    这种方式与第一种方法相似,不过这里是获取Servlet API类型的HttpServletRequest、 HttpSession、 ServletContext对象,用的不多。

    package com.chongqing.action;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class LoginAction3 extends ActionSupport {
    	
    	private HttpServletRequest request;
    	private HttpSession session;
    	private ServletContext application;
    	
    	public LoginAction3() {
    		request = ServletActionContext.getRequest();
    		session = request.getSession();
    		application = session.getServletContext();
    	}
    	
    	public String execute() {
    		request.setAttribute("r1", "r1");
    		session.setAttribute("s1", "s1");
    		application.setAttribute("a1", "a1");
    		return SUCCESS; 
    	}
    	
    }
    

    四、原类型的IoC方式

    这种方式与第二种方式相似,不过这里是实现ServletRequestAware接口,用的不多。

    package com.chongqing.action;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.interceptor.ServletRequestAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class LoginAction4 extends ActionSupport implements ServletRequestAware {
    	
    	private HttpServletRequest request;
    	private HttpSession session;
    	private ServletContext application;
    	
    	
    	
    	public String execute() {
    		request.setAttribute("r1", "r1");
    		session.setAttribute("s1", "s1");
    		application.setAttribute("a1", "a1");
    		return SUCCESS; 
    	}
    
    
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    		this.session = request.getSession();
    		this.application = session.getServletContext();
    	}
    	
    }
    
  • 相关阅读:
    ArrayList用法
    MessageBox
    将文本文件导入Sql数据库
    在桌面和菜单中添加快捷方式
    泡沫排序
    Making use of localized variables in javascript.
    Remove double empty lines in Visual Studio 2012
    Using Operations Manager Connectors
    Clear SharePoint Designer cache
    Programmatically set navigation settings in SharePoint 2013
  • 原文地址:https://www.cnblogs.com/yzy-blogs/p/6703246.html
Copyright © 2011-2022 走看看