2

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

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

2 回答 2

7

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

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

当您位于 anInterceptor或 a中时,才使用 ActionContext 获取它们(包装器和底层 HTTP 对象)POJO

如果你在一个Action中,最好的做法是实现一个接口,它会自动填充你的 Action 对象:


要获取Request Map 包装器,请使用RequestAware

public class MyAction implements RequestAware {
    private Map<String,Object> request;

    public void setRequest(Map<String,Object> request){ 
        this.request = request;
    }
}

要获取Session Map 包装器,请使用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 页面和 Actions 或 Actions 和 Actions 之间的标准数据流是通过 Accessors / Mutators 获得的,也就是众所周知的 Getter 和 Setter。不要重新发明轮子。

于 2013-10-23T11:43:40.110 回答
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直接使用。:)

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

于 2013-10-23T11:38:49.450 回答