Как использовать параметры, объекты запроса и сеанса, представленные в ActionContext?

Здесь, в этом коде, я использую ActionContext для получения Session и ServletActionContext из объекта Request. Я считаю, что это плохая практика, так как нужно использовать ActionContext только для объекта Request.

Является ли объект запроса ActionContext эквивалентным объекту запроса в сервлетах? Если да, как получить параметры запроса, используя его?

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 ответа

Решение

В Struts2 Session Map и Request Map являются оболочками для базовых объектов HttpServletRequest и Session.

Если вам нужен только доступ к атрибутам, используйте оболочки.

Используйте ActionContext, чтобы получить их (как оболочки, так и базовые объекты HTTP), только если вы находитесь внутри Interceptor или POJO,

Если вы находитесь внутри 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;
    }
}

Чтобы получить базовые объекты HttpServletRequest и HttpSession, используйте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 и Действиями, или Действиями и Действиями, получен через Accessors / Mutators, более известный как Getters and Setters. Не изобретай велосипед.

Первый

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

второй

Если вы используете рамки, как стойки. Это плохая практика. Вам не нужно создавать объекты HttpServletRequest из ServletActionContext для получения параметров запроса. Просто объявите параметры запроса в классе действия и напишите методы получения и установки для них, и вы получите значения в них.

ОБНОВИТЬ

Если вам нужен параметр запроса в классе действий, вы можете сделать это следующим образом:

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

Другие вопросы по тегам