Java 跨dao方法使用会话对象UserBean
我从会话中得到一个对象,比如UserBeanJava 跨dao方法使用会话对象UserBean,java,spring-mvc,Java,Spring Mvc,我从会话中得到一个对象,比如UserBean public class UserBean { private String username; private String userid; private String userType; public String getUsername() { return username; } public void setUsername(String username) {
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细节
我使用的是spring MVC 3DAO层不应该知道web会话。
在“上层”管理器或服务中实现会话相关逻辑。
在“重构”的情况下,除了良好的设计之外,它还可以作为Spring MVC层和DAO之间的适配器。您可以在DAO类中创建一个实例变量,并为此创建一个setter和getter
但是在调用任何DAO方法之前,您必须在该DAO中设置userBean,这也是不好的做法,但可能是解决方案之一。我认为在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>
org.springframework.web.context.request.RequestContextListener
您可以将UserBean定义为SpringBean并使用Spring的会话范围。例如:
在Spring文档中。您正在使用Hibernate吗?如果是这样,您可能会使用拦截器透明地添加此数据。假设DAO是singleton bean,这对并发请求不起作用。如果应用程序在Spring MVC上运行,则不需要在web.xml中添加Listner