动作可以通过不同的方式相互通信以及它们在不同的线程中运行并且不共享动作上下文。最流行的方式是通过请求或在 URL 中传递参数,XWork 转换器将在 OGNL 的帮助下将它们转换为操作属性。
但我认为LoginAction 的目的是通过用户凭据(email, username, password) 对用户进行身份验证,并将此信息保存在会话映射中。它是可以在动作之间共享的公共资源。要获得可用于操作和其他操作的会话映射,他们应该实现SessionAware。它将帮助 Struts 将会话映射注入到 action 属性中。如果您想在应用程序的许多操作中使用会话,则不在每个操作中实现此接口,您可以创建一个基本操作。
public class BaseAction extends ActionSupport implements SessionAware {
private Map<String, Object> session;
public setSession(Map<String, Object> session){
this.session = session;
}
public Map<String, Object> getSession(){
return session;
}
}
然后操作将扩展基本操作以获得会话兼容性。
public class LoginAction extends BaseAction {
@Override
public String execute() throws Exception {
User user = getUserService().findBy(username, email, password);
getSession().put("user", user);
return SUCCESS;
}
}
现在用户在会话中,您可以从其他操作或 JSP 中获取会话,并从 session 映射中获取 user 对象。
public class InboxAction extends BaseAction {
@Override
public String execute() throws Exception {
User user = (User) getSession().get("user");
return SUCCESS;
}
}