zoukankan      html  css  js  c++  java
  • struts2中Action訪问servlet的两种方式

    一、IoC方式

           
           在struts2框架中,能够通过IoC方式将servlet对象注入到Action中。通常须要Action实现下面接口:

           a. ServletRequestAware:

           实现该接口的Action能够直接訪问Request对象,该接口中提供void setServletRequest(HttpServletRequest request)
    方法,实现此接口的Action控制类通过setServletRequestHttpServlet(HttpServlet request)方法将request对象注入到Action中。

           b. ServletResponseAware:

           Action类通过实现ServletResponseAware接口能够直接訪问Response对象。与ServletRequestAware接口相似该接口通过提供void setServletResponse(HttpServlet resonse)将response对象注入到Action中。以便于能够直接使用。

           c. SessionAware:

           实现该接口的Action能够直接訪问session对象。该接口中提供void setSession(Map map)方法。注入原理与request和response原理同样。都是通过实现相应接口的set方法将session对象注入到Action中。

           实例:

    /**
     *  @author zx
     */
    package com.zhouxiang.action;
    
    import javax.servlet.ServletRequestAttributeListener;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.ServletActionContext;
    import org.apache.struts2.interceptor.ServletRequestAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * @author zx
     *
     */
    public class LoginAction1 extends ActionSupport implements ServletRequestAware{
    	
    	private String userName;
    	private String password;
    	private HttpServletRequest request;
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	
    	public HttpServletRequest getRequest() {
    		return request;
    	}
    	public void setRequest(HttpServletRequest request) {
    		this.request = request;
    	}
    	@Override
    	public void setServletRequest(HttpServletRequest arg0) {
    		// TODO Auto-generated method stub
    		this.request=arg0;
    	}
    	public  String validateUser()throws Exception
    	{
    		
    		if(getUserName().endsWith("QQ")&&getPassword().equals("123"))
    		{
    			//调用ServletActionContext的getRequest()方法获取request对象
    			HttpServletRequest request=ServletActionContext.getRequest();
    			//调用request对象的getSession()方法获取session对象
    			HttpSession session=request.getSession();
    			//调用session对象的方法设置数据
    			session.setAttribute("username",this.userName);
    			return SUCCESS;
    			
    		}
    		else
    		{
    			return INPUT;
    		}
    	}
    
    }

    二、非IoC方式


           在非IoC方式中,Struts2提供ServletActionContext类帮助获得Servlet。


    訪问request对象

          通过ServletActionContext中的静态方法 getRequest()获取web应用程序的request对象。

    訪问response对象

    通过ServletActionContext中的静态方法getResponse()获取web应用程序中的response对象。

           实例:
         
      /**
     *  @author zx
     */
    package com.zhouxiang.action;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * @author zx
     *
     */
    public class LoginAction1 extends ActionSupport {
    	private String userName;
    	private String password;
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	public  String validateUser()throws Exception
    	{
    		
    		if(getUserName().endsWith("QQ")&&getPassword().equals("123"))
    		{
    			//调用ServletActionContext的getRequest()方法获取request对象
    			HttpServletRequest request=ServletActionContext.getRequest();
    			//调用request对象的getSession()方法获取session对象
    			HttpSession session=request.getSession();
    			//调用session对象的方法设置数据
    			session.setAttribute("username",this.userName);
    			return SUCCESS;
    			
    		}
    		else
    		{
    			return INPUT;
    		}
    	}
    
    }

    三、总结

           struts2与struts1相比不能直接訪问HttpServetRequest 和 HttpServletResponse,这是进步呢还是后退呢?答案是众所周知的。

    struts2与struts1相比一个明显的特点就是struts1中的Action严重依赖于Servlet API ,由于当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。

    (依赖性太强,耦合度太高)。而Struts 2中 Action不依赖于容器,同意Action脱离容器单独被測试。

    假设须要,Struts2 Action仍然能够訪问初始的request和response。可是struts2消除了直接訪问HttpServetRequest 和 HttpServletResponse的必要性。

    因此struts2在此方面相对于struts1来说就是一种进步。正由于struts2摆脱了对servlet的依赖。才造成了在struts2中操作servlet要比struts1中操作servlet困难些。然而这样做的优点确实非常明显。解除了Action对servlet的依赖。减少了耦合。




  • 相关阅读:
    51Nod 1052/1053/1115 最大M子段和V1/V2/V3
    51Nod1207 内存管理
    51Nod1207 内存管理
    51Nod1444 破坏道路
    51Nod1444 破坏道路
    51Nod1349 最大值
    51Nod1349 最大值
    51nod1485 字母排序
    aspx页面中的html标签中的值传到aspx.cs文件中的方法
    C#属性的使用
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6756470.html
Copyright © 2011-2022 走看看