如果要在底层获取session,比如逻辑层,或者持久层,能想到的只有传参,或者给调用session的类再写一个构造函数 class A { public void B(HttpServletRequest request) { ... } } class A { HttpServletRequest request = null; public A(HttpServletRequest request) { this.request = request; } public void B() { ... } } 出现这种情况,在设计上是否已经出现了弊端?
1)你的Z类到底处于系统的哪一层?也就是MVC的哪一个模块,相信不是M就是C了,不可能是V。
2)如果是M层,那你的系统设计就有问题。因为Session这些元素是属于v/c层面的,你却渗透的M层来了,设计不合理。
3)如果是C层的,既然是C层,那为何Z类没有来自前台的HTTP请求参变量?(比如Http请求,http响应)。没有这些东西,你的前后台如何通信?你的系统设计依然有问题。综合起来,出现这种情况,只能说你的系统设计不合理,至少类的框架设计模糊,而且已经出现了耦合。
同样session也应该不能传递了。
如果是一个普通的java类中,而不是一个servlet的话,就只能通过参数传递了。而又不能传递参数,我想这样没有办法获取到了。
如果LZ是想获取session中的值,你可以在C类中,自定一个一个方法。
让B传递你想要的值给自定义方法,然后在Z方法中获取这个值。
即使能够获得Session,还有意义吗,
Session中能取到什么?数据不是保存在请求中了吗?
同样session也应该不能传递了。
如果是一个普通的java类中,而不是一个servlet的话,就只能通过参数传递了。而又不能传递参数,我想这样没有办法获取到了。
如果LZ是想获取session中的值,你可以在C类中,自定一个一个方法。
让B传递你想要的值给自定义方法,然后在Z方法中获取这个值。
session.setAttribute("s1",value);
session.getAttribute("s1");
方法一:通过 ServletActionContext 对象获取
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
HttpSession session=request.getSession();
ServletContext applicaton=ServletActionContext.getServletContext();
方法二:实现指定接口,由struts框架运行时注入
public class HelloWorldAction implements ServletRequestAware, ServletResponseAware, ServletContextAware{
private HttpServletRequest request;
private ServletContext servletContext;
private HttpServletResponse response;
public void setServletRequest(HttpServletRequest req) {
this.request=req;
}
public void setServletResponse(HttpServletResponse res) {
this.response=res;
}
public void setServletContext(ServletContext ser) {
this.servletContext=ser;
}
}
class A
{
public void B(HttpServletRequest request)
{
...
}
}
class A
{
HttpServletRequest request = null;
public A(HttpServletRequest request)
{
this.request = request;
}
public void B()
{
...
}
}
出现这种情况,在设计上是否已经出现了弊端?
如果楼主用了struts2那么就是:ActionContext.getContext().getSession()
如果楼主用了dwr框架,那也可以,这个框架里面也提供了直接那出session的方法,我记不清了,如果需要我可以帮你翻一下api。
既然这两个框架都能做到,自己手工代码也一定能实现。
HttpServletRequest reque如果是普通类就得传值了
然后将这个bean传给z
HttpSession session = ServletActionContext.getRequest().getSession();
ActionContext.getContext().getSession()这个取到的是一个MAP,不知道具体行不
request.getSession().setAtrribute("");
实际上session也是一个对象,你可以通过请求的action获取session对象然后将session封装到一个对象里面在传到这个方法中去
session.setAttribute("s1",value);
code]
.............................
[code=Java]session.getAttribute("s1");[/
有A方法中调用 ThreadLocal 的set(你的session)方法
在B ,C,Z方法用可用ThreadLocal 的get方法得到你的session
能否在ABC.......直到Z类中private一个session对象
并提供get/set方法
然后逐层set进去
HttpSession session = new HttpSession();
session.setAttribute().......session.getAttribute()这样不就可以吗
session是域对象,只要在用户的浏览器不关闭,走在一个进程内都有效的啊~~~~
request是只在一次请求内有效的
如果还是不行你可以选择用pageContext来解决