2013-10-23 28 views
2

在此代码中,我使用ActionContext从Request对象获取Session和ServletActionContext。我觉得这是不好的做法,因为只有Action对象只能用于Request对象。如何使用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); 
+0

use request.getParameter(“parameter_name”); –

回答

7

在Struts2,会话映射和请求地图是底层HttpServletRequest和Session对象的包装器。

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

如果您在InterceptorPOJO之内,请使用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页面和操作之间的标准数据流,或行动和行动,通过访问者/变异者获得,更好地被称为Getters和Sette RS。不要重新发明轮子。

1

首先

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

如果您使用的框架Struts等。这是一个不好的做法。您无需从ServletActionContext创建HttpServletRequest对象来获取请求参数。只需在action类中声明请求参数,并为它们写入getter和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类实现SessionAware更合理,因为我可以直接访问会话对象,如@Andrea提到..所以现在我可以直接使用session.put("OperatorId", operatorId);session.put("AnalysisNames",analysisNames);

+0

如果我实现如上面的答案中所示的RequestAware接口,我可以通过doung request.get(“paramName”)获取请求参数??? –

+1

是的,你可以..但是如果你正在编写你的逻辑到Action类中,你可以避免这个实现。您可以避免Action类的RequestAware接口...请参阅我的更新例如.. – DarkHorse

相关问题