0

我从会话中得到一个对象说 UserBean 是这样的

public class UserBean {

    private String username;
    private String userid;
    private String userType;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getUserType() {
        return userType;
    }
    public void setUserType(String userType) {
        this.userType = userType;
    }

}

现在我想在我的许多 dao 方法中使用这个 bean。我面临的问题是我必须修改我的 dao 参数以包含这个 bean 信息,我认为这不是一个好的设计。

如何在不修改 DAO 方法的情况下包含 UserBean 详细信息?

我正在使用弹簧 MVC 3

4

4 回答 4

1

我认为在 DAO 中访问 Web 上下文类不是一个好主意,这将引入层之间的紧密耦合,并且更改表示层中的某些内容可能会影响您的 DAO 层对象。您可以将此信息作为方法参数传递给您的 DAO 类。

但是如果你真的想在你的 DAO 中访问会话属性,你可以RequestContextHolder这样做:

ServletRequestAttributes request = (ServletRequestAttributes) RequestContextHolder
            .currentRequestAttributes();
HttpSession session = request.getRequest().getSession();
UserBean UserBean = (UserBean)session.getAttribute("userBean");

当您指的是实际 Web 请求之外的请求属性时,您需要添加RequestContextListener到 web.xml 以公开当前请求:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener> 
于 2013-10-29T08:29:44.747 回答
0

您可以将 UserBean 定义为 Spring bean 并使用 Spring 的会话范围。例如:

<bean id="user" class="com.foo.UserBean" scope="session">
  <aop:scoped-proxy/>
</bean>

<bean id="userDao" class="com.foo.UserDao">
  <property name="user" ref="user"/>
</bean>

有关文档,请参阅Spring 文档中的3.5.4.5 Scoped beans as dependencies

于 2013-10-29T17:26:02.550 回答
0

DAO 层不应该知道 Web 会话。
在“上”层、管理器或服务中实现与会话相关的逻辑。
在您的“重构”情况下,除了作为良好的设计之外,它还具有充当 Spring MVC 层和 DAO 之间的适配器的额外好处。

于 2013-10-29T07:48:21.330 回答
0

您可以在 DAO 类中创建一个实例变量,并为此创建一个 setter 和 getter。

但是在调用任何 DAO 方法之前,您必须在该 DAO 中设置 userBean,这也是一种不好的做法,但可能是解决方案之一。

于 2013-10-29T07:49:25.020 回答