struts 2ページパラメータの取得方法


最近struts 2の知識を復習しています.実験中に「ページからactionに渡されるパラメータを取得する」という問題に遭遇し、GoogleやBaiduの後に解決を得て、以下のようにまとめ、自分や友人の皆さんに調べてもらうことにしました.
1.要求パラメータをフィールドに自動的に設定します.OGLLで完了できます.
struts 2はOGLLコンテキストの概念をさらに拡張し、struts 2ではOGLLコンテキストは通常以下のように示される.

                      |--request  
                      |  
                      |--application  
                      |  
        context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ]  
                      |  
                      |--session  
                      |  
                      |--attr  
                      |  
                      |--parameters  

2.Actionでリクエスト(Request)またはセッション(Session)の情報を直接取得します.Struts 2の開発では、要求パラメータを自動的にActionのフィールドに設定ことに加えて、Actionで要求(Request)やセッション(Session)の情報を直接取得する必要がある、サーブレットのHTTP要求(HttpサーブレットRequest)に直接応答(HttpサーブレットResponse)操作を行う必要もある.アクションでrequest要求パラメータ「username」の値を取得する必要があります.

//        action  
ActionContext actiobContext = ActionContext.getContext();
Map paramsMap = actiobContext.getParameters();
String[] attributes = (String[]) paramsMap.get("personId"); //         
......

上のコードでActionContext.getContext()メソッドの内部実装の詳細はjava.lang.ThreadLocalクラスによって実現される:

static ThreadLocal actionContext = new ThreadLocal();
......
public static ActionContext getContext() {
     return (ActionContext) actionContext.get();

     // Don't do lazy context creation, as it requires container; the creation of which may
     // precede the context creation
     //if (context == null) {
     //    ValueStack vs = ValueStackFactory.getFactory().createValueStack();
     //    context = new ActionContext(vs.getContext());
     //    setContext(context);
     //}

}

ActionContext(com.opensymphony.xwork.ActionContext)は、Actionの実行時のコンテキストであり、コンテキストは、Actionの実行時に使用するオブジェクトを格納するコンテナと見なすことができます(実際には、ここのコンテナはMapです).一般的に、ActionContextは次のとおりです.
ActionContext context = (ActionContext) actionContext.get();
で取得しました.ここのactionContextオブジェクトの作成を見てみましょう.
static ThreadLocal actionContext = new ActionContextThreadLocal();

ActionContextThreadLocalはThreadLocalを実現する内部クラスである.ThreadLocalは「スレッドローカル変数」と命名することができ、この変数を使用するスレッドごとに変数値のコピーを提供し、他のスレッドのコピーと衝突することなく、スレッドごとに独立して自分のコピーを変更することができる.これにより、ActionContextのプロパティは、対応する現在のリクエストスレッドにのみ表示され、スレッドが安全であることが保証されます.
ActionContextによりHttpSessionを取得する:
Map session = ActionContext.getContext().getSession();

3.comを通過する.opensymphony.webwork.サーブレットActionContextクラス
このクラスは、上記のActionContextを直接継承しています.サーブレット関連オブジェクトに直接アクセスする機能を提供しています.取得できるオブジェクトは次のとおりです.
  • javax.servlet.http.HttpServletRequest  //
  • javax.servlet.http.HttpServletResponse //
  • javax.servlet.サーブレットContext//Servletコンテキスト情報
  • javax.servlet.サーブレットコンフィギュレーションオブジェクト
  • javax.servlet.jsp.PageContext//HTTPページコンテキスト
  • サーブレットActionContextからサーブレットの関連オブジェクトを取得するには:
    a.HttpServertRequestオブジェクトの取得
    
    HttpServletRequest request = ServletActionContext.getRequest();
    

    b.HttpServeretResponseオブジェクトの取得
    
    HttpServletResponse response = ServletActionContext.getResponse();
    

    c.サーブレットContextオブジェクト略を取得する.
    d.サーブレットコンフィグオブジェクトを取得します.
    
    ServletConfig servletConfig = ServletActionContext.getPageContext().getServletConfig();
    

    e.PageContextオブジェクトを取得します.dを参照してください.
    サーブレットActionContextとActionContextの連絡
    サーブレットActionContextとActionContextにはいくつかの重複機能がありますが、私たちのActionでは、どのように選択すればいいのでしょうか.ActionContextが私たちの機能を実現できる場合は、サーブレットActionContextを使用しないほうがいいです.私たちのActionはできるだけサーブレットの関連オブジェクトに直接アクセスしないほうがいいです.ActionContextを使用する場合は、ActionのコンストラクタでActionContextを使用しないことに注意してください.getContext()は、この時点でActionContextの一部の値が設定されていない可能性があるため、ActionContextで取得した値はnullである可能性があります.同様に、HttpServiceRequest req=ServiceContext.getRequest()もコンストラクション関数に置かず、reqをクラス変数として直接付与しないでください.理由としては、前述したstatic ThreadLocal actionContext=new ActionContextThreadLocal()から、ActionContextはスレッドセキュリティであり、サーブレットActionContextはActionContextから継承されていることがわかりますので、サーブレットActionContextもスレッドセキュリティであり、スレッドセキュリティはスレッドごとに独立して行うことが求められます.したがってreqの作成も独立して行う必要があるため、サーブレットActionContext.getRequest()という言葉はコンストラクション関数にも直接クラスにも置かず、各具体的なメソッドボディ(eg:login()、queryAll()、insert()など)に置くべきで、オブジェクトが生成されるたびに独立してreqが確立されることを保証します.
    4.struts 2のactionでrequest、response、session、アプリケーションを取得
    非IoC方式
    方法1:orgを使用する.apache.struts2.ActionContextクラスは、現在のActionのコンテキストオブジェクトを静的メソッドgetContext()で取得します.次のコードはactionのメソッドにあります.
    
    ActionContext ctx = ActionContext.getContext();
    ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy");
    Map session = ctx.getSession(); //session
    
    HttpServletRequest request = (HttpServletRequest) ctx.get(StrutsStatics.HTTP_REQUEST);
    HttpServletResponse response = (HttpServletResponse) ctx.get(StrutsStatics.HTTP_RESPONSE);
    //   
    HttpServletRequest request = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST);
    HttpServletResponse response = (HttpServletResponse) ctx.get(ServletActionContext.HTTP_RESPONSE);
    // ServletActionContext.APPLICATION;
    // ServletActionContext.SESSION;
    // ServletActionContext.PAGE_CONTEXT; 
    
    //     (  )   
    Enumeration parameterNames = request.getParameterNames();
    while (parameterNames.hasMoreElements()) {
    	String parameterName = (String) parameterNames.nextElement();
    	System.out.println(" ---- " + parameterName);
    }
    
    ActionContext ctx = ActionContext.getContext();
    ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy");
    Map session = ctx.getSession(); //session
    

    ここでのセッションはMapオブジェクトである、Struts 2の下位層のセッションはいずれもMapタイプにカプセル化されている.このMapオブジェクトを直接操作することで、HttpSessionオブジェクトを直接操作することなく、sessionへの書き込みと読み出しを行うことができる.
    方法2:orgを使用する.apache.struts2.サーブレットActionContextクラス
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction extends ActionSupport {
    
    	private HttpServletRequest req; 
    	
    	//               ,                   。
    	// private HttpServletRequest req = ServletActionContext.getRequest(); 
    	
    	public String login() {
            req = ServletActionContext.getRequest(); //req              
            user = new User();
            user.setUserId(userId);
            user.setPassword(password);
            if (userDAO.isLogin(user)) {
                req.getSession().setAttribute("user", user);
                return SUCCESS;
            }
            return LOGIN;
        } 
    	
    	public String queryAll() {
            req = ServletActionContext.getRequest(); //req              
            userList = userDAO.queryAll();
            req.getSession().setAttribute("uList", userList);
            return SUCCESS;
        } 
    }
    

    方法3:
    
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class LoginAction extends ActionSupport {
    	private Map request;
    	private Map session;
    	private Map application;
    
    	public LoginAction() {
    		this.request = (Map) ActionContext.getContext().get("request");
    		this.session = ActionContext.getContext().getSession();
    		this.application = ActionContext.getContext().getApplication();
    	}
    
    	public String execute() {
    		this.request.put("r1", "r1");
    		this.session.put("s1", "s1");
    		this.application.put("a1", "a1");
    		
    		return SUCCESS;
    	}
    }
    

    方法4:
    
    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 LoginAction extends ActionSupport {
    	private HttpServletRequest request;
    	private HttpSession session;
    	private ServletContext application;
    
    	public LoginAction() {
    		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方式(すなわち、Struts 2 Awareブロッキングを使用)
    IoC方式を使用するには,まずStruts 2のIoCコンテナ(Container)があるオブジェクトを取得したいという意思を伝え,対応するインタフェースを実現することによってこれを行う.
    方法1:
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.interceptor.ApplicationAware;
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    import org.apache.struts2.interceptor.SessionAware;
    
    public class UserAction implements SessionAware, ServletRequestAware, ServletResponseAware, ApplicationAware {
    	
    	private HttpServletRequest request;
        private HttpServletResponse response;
        private HttpSession session;
        private Map<String, Object> application;
    		
    	@Override
    	public void setApplication(Map<String, Object> application) {
    		this.application = application;
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request; 
    	}
    
    	@Override
    	public void setServletResponse(HttpServletResponse response) {
    		this.response = response; 
    	} 
    	
    	@Override
    	public void setSession(Map<String, Object> session) {
    		/*this.session = (HttpSession) session;*/
    		this.session = request.getSession(); 
    	}
    	
    	public String login() {
    		//
    		//     request, response, session, application          
    		//
            
    		//     
        } 
    	
    }
    

    方法2:
    
    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.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    import org.apache.struts2.interceptor.SessionAware;
    
    public class UserAction implements ServletRequestAware, ServletResponseAware, SessionAware, ApplicationAware {
    	
    	private Map<String, Object> request;
    	private Map<String, Object> response;
    	private Map<String, Object> session;
    	private Map<String, Object> application;
    		
    	@Override
    	public void setApplication(Map<String, Object> application) {
    		this.application = application;
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = (Map<String, Object>) request; 
    	}
    
    	@Override
    	public void setServletResponse(HttpServletResponse response) {
    		this.response = (Map<String, Object>) response; 
    	} 
    	
    	@Override
    	public void setSession(Map<String, Object> session) {
    		/*this.session = (HttpSession) session;*/
    		this.session = session; 
    	}
    	
    	public String login() {
    		//
    		//     request, response, session, application          
    		//
            
    		//     
        } 
    	
    	public String execute() {
    		//
    		request.put("r1", "r1");
    		// 
    		session.put("s1", "s1");
    		//
    		application.put("a1", "a1");
    		
    		return SUCCESS;
    	}
    	
    }
    

    方法3:
    
    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 LoginAction extends ActionSupport implements ServletRequestAware {
    	private HttpServletRequest request;
    	private HttpSession session;
    	private ServletContext application;
    	
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    		this.session = request.getSession();
    		this.application = session.getServletContext();
    	}
    
    	public String execute() {
    		request.setAttribute("r1", "r1");
    		session.setAttribute("s1", "s1");
    		application.setAttribute("a1", "a1");
    		return SUCCESS;
    	}
    }