如何使用 ActionContext 中存在的参数、请求和会话对象



在此代码中,我使用ActionContext从Request对象获取Session和ServletActionContext。我觉得这是不好的做法,因为必须仅对请求对象使用ActionContext。

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 中,Session Map 和 Request Map 是底层 HttpServletRequest 和 Session 对象的包装器。

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

当您位于InterceptorPOJO内时,才使用 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;
    }
}

要获取底层的 HttpServletRequestHttpSession 对象,请使用 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 页面和操作(或操作和操作)之间的标准数据流是通过访问器/突变器(更广为人知的 Getters 和 Setters)获得的。不要重新发明轮子。

First

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

第二

如果您使用的是像支柱这样的框架。这是一种不好的做法。您不需要从 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:)

如果发现在操作类中实现SessionAware更合理,因为我可以直接访问@Andrea提到的会话对象。 所以现在我可以直接使用session.put("OperatorId", operatorId);session.put("AnalysisNames",analysisNames);

最新更新