在这段代码中,我使用ActionContext从Request对象获取Session和ServletActionContext。我觉得这是不好的做法,因为必须只对Request对象使用ActionContext。
ActionContext的Request对象是否等同于Servlets中的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); 发布于 2013-10-23 19:43:40
在Struts2中,会话映射和请求映射是底层HttpServletRequest和会话对象的包装器。
如果您只需要访问属性,请使用包装器。
如果您在Interceptor或POJO中,请使用ActionContext获取它们(包装器和底层HTTP对象)。
如果您在Action中,最佳实践是实现一个接口,该接口将自动填充操作的对象:
要获取请求映射包装器,请使用use RequestAware
public class MyAction implements RequestAware {
private Map<String,Object> request;
public void setRequest(Map<String,Object> request){
this.request = request;
}
}要获取会话映射包装器,请使用use SessionAware
public class MyAction implements SessionAware {
private Map<String,Object> session;
public void setSession(Map<String,Object> session){
this.session = session;
}
}若要获取基础HttpServletRequest和HttpSession对象,请使用use 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页面和动作或动作和动作之间的标准数据流是通过访问器/变更器(更为人所知的是better和better)获得的。不要重复发明轮子。
发布于 2013-10-23 19:38:49
First
ActionContext's Request object is equivalent to the Request object in Servlets第二个
如果你使用的是像struts这样的框架。这是一种糟糕的做法。获取请求参数不需要从ServletActionContext创建HttpServletRequest对象。只需在操作类中声明请求参数,并为它们编写getter和setter就可以在其中获取值。
更新
如果你想让你的请求参数出现在action类中,你可以这样做:
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类中实现SessionAware更合理,因为我可以直接访问会话对象,如@Andrea所提到的..所以现在我可以直接使用session.put("OperatorId", operatorId);和session.put("AnalysisNames",analysisNames);了
https://stackoverflow.com/questions/19538970
复制相似问题