我从会话
获得一个Object说UserBeanpublic 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详细信息?
我正在使用spring MVC 3
答案 0 :(得分: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>
答案 1 :(得分:0)
DAO层不应该知道网络会话 在经理或服务的“上层”实施与会话相关的逻辑 在你的“重构”案例中,除了做好设计之外,它还可以作为Spring MVC层和DAO之间的适配器而具有额外的好处。
答案 2 :(得分:0)
您可以在DAO类中创建一个实例变量,并为此创建一个setter和getter。
但在调用任何DAO方法之前,你必须在该DAO中设置userBean,这也不是一个好习惯,但可能是解决方案之一。
答案 3 :(得分:0)
您可以将UserBean定义为Spring bean并使用Spring的会话范围。 E.g:
<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。