如何使用ActionContext中的参数,请求和会话对象?
在此代码中,我使用ActionContext从Request对象获取Session和ServletActionContext。 我觉得这是不好的做法,因为必须使用ActionContext仅用于Request对象。
ActionContext的Request对象是否等同于Servlet中的Request对象? 如果是的话,如何获取使用它的请求参数?
Map session = (Map) ActionContext.getContext().getSession(); HttpServletRequest request = ServletActionContext.getRequest(); String operatorId = request.getParameter("operatorId"); session.put("OperatorId", operatorId); // getting hashmap from Bean analysisNames= slsLoginDetailsRemote.getAnalysisNamesIdMap(); // sending map for multiselect session.put("AnalysisNames",analysisNames);
在Struts2中,会话映射和请求映射是底层HttpServletRequest和Session对象的封装。
如果你只需要访问属性,使用包装。
只有在Interceptor
或POJO
使用ActionContext才能获得它们(包装器和基础HTTP对象)。
如果你在一个Action
,最好的做法是实现一个接口,它将自动填充你的Action的对象:
要获取请求映射包装器 ,请使用RequestAware
public class MyAction implements RequestAware { private Map<String,Object> request; public void setRequest(Map<String,Object> request){ this.request = request; } }
要获得会话映射包装器 ,请使用SessionAware
public class MyAction implements SessionAware { private Map<String,Object> session; public void setSession(Map<String,Object> session){ this.session = session; } }
要获得底层的HttpServletRequest和HttpSession对象,请使用ServletRequestAware
:
public class MyAction implements ServletRequestAware { private javax.servlet.http.HttpServletRequest request; public void setServletRequest(javax.servlet.http.HttpServletRequest request){ this.request = request; } public HttpSession getSession(){ return request.getSession(); } }
也就是说,JSP页面和动作之间或动作和动作之间的标准数据stream通过访问器/变异器(更好地称为获取器和设置器)来获得。 不要重新发明轮子。
第一
ActionContext's Request object is equivalent to the Request object in Servlets
第二
如果你正在使用像struts框架。 这是一个不好的做法。 您无需从ServletActionContext创buildHttpServletRequest对象来获取请求参数。 只要在动作类中声明请求参数 ,并为它们写getters和setter就可以得到你的值。
UPDATE
如果你想在动作类中的请求参数,你可以这样做:
public class MyAction extends ActionSupport implements SessionAware{ private String operatorId; private Map<String, Object> session; //Getter and setters public String getOperatorId() { return operatorId; } public void setOperatorId(String operatorId) { this.operatorId = operatorId; } @Override public void setSession(Map<String, Object> session) { this.session = session; } }
所以,现在如果我想在任何地方使用operatorId
我只需要getOperatorId()
或直接使用operatorId
。 🙂
如果在Action类中find实现SessionAware
的类比较合理,我可以直接访问会话对象,就像@Andrea所提到的那样。现在我可以直接使用session.put("OperatorId", operatorId);
和session.put("AnalysisNames",analysisNames);