如何使用ActionContext中的参数,请求和会话对象?

时间:2013-10-23 10:19:11

标签: java session struts2 request struts-action

在这段代码中,我使用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); 

2 个答案:

答案 0 :(得分:7)

在Struts2中,Session Map和Request Map是底层HttpServletRequest和Session对象的包装器。

如果您只需要访问属性,请使用包装器。

如果您在InterceptorPOJO内,请使用ActionContext来获取它们(包装器和底层HTTP对象)

如果您在Action内,最佳做法是实现一个自动填充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页面和Actions或Actions和Actions之间的标准数据流是通过Accessors / Mutators获得的,更好地称为Getters和Setters。不要重新发明轮子。

答案 1 :(得分:1)

<强>第一

ActionContext's Request object is equivalent to the Request object in Servlets

<强>第二

如果你使用像struts这样的框架。这是一个不好的做法。您无需从ServletActionContext创建HttpServletRequest对象来获取请求参数。只需在动作类中声明请求参数,并为它们编写getter和setter就可以获得它们中的值。

<强>更新

如果你想在动作类中使用你的请求参数,你可以这样做:

    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);