servlet项目的一些问题

qiunet 2011-01-26 11:18:47
最近做一个项目:
经理要求 登陆的时候把存在 session的user信息,存放一份到一个静态的对象中~ 他们取的时候方便~不需要传request了
他们的要求是不需要任何 参数,但我想了很久,觉得不可能啊~
不知道各位大侠有没有好的建议啊~
...全文
76 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiunet 2011-02-24
  • 打赏
  • 举报
回复

package com.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class actioncontext implements java.io.Serializable {
static ThreadLocal<actioncontext> actionContext = new ThreadLocal<actioncontext>();
static Map<String, Object> context = new HashMap<String, Object>();
static actioncontext ac = new actioncontext();

public Object get(String key) {
return context.get(key);
}

public void put(String key, Object value) {
context.put(key, value);
}
public actioncontext getcontext(){
return (actioncontext)actionContext.get();
}
public void putcontext(actioncontext action){
actionContext.set(action);
}
public static actioncontext getInstance(){
if(ac == null ){
ac = new actioncontext();
}
return ac;
}
public void setRequest(HttpServletRequest request){
ac.put("request",request);
}
}


package com.util;

import javax.servlet.http.HttpServletRequest;

public class ReqUtil {
public static void setRequest(HttpServletRequest request) {
actioncontext ac = actioncontext.getInstance();
ac.setRequest(request);
ac.putcontext(ac);
}

public static HttpServletRequest getRequest(){
return (HttpServletRequest)actioncontext.getInstance().getcontext().get("request");
}
}



//测试
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ReqUtil.setRequest(request);

response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());

out.println(", using the GET method");
out.print(ReqUtil.getRequest().getParameter("ac"));
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}



原理是struts2的servletActionContext 一样
shine333 2011-01-26
  • 打赏
  • 举报
回复
勘误:
} finally {
// 移除当前线程本地内容
CurrentUser.setUser(null);
}
shine333 2011-01-26
  • 打赏
  • 举报
回复
用ThreadLocal。当前线程直接可以通过CurrentUser.getUser()获取。不过使用前,最好了解一下ThreadLocal,以及确认一下,你们的处理有没有多线程的地方。如果没有,就可以直接用了。

/**
* 获取和设置当前用户信息的工具类。
*/
public final class CurrentUser extends ThreadLocal<UserInfo> {

/**
* 单例
*/
private static final CurrentUser SINGLETON = new CurrentUser();

/**
* 不需要实例化
*/
private CurrentUser() {
}

/**
* 获取当前用户信息。
*
* @return 当前用户信息
*/
public static UserInfo getUser() {
return SINGLETON.get();
}

/**
* 设置当前用户信息
*
* @param user
* 当前用户信息
*/
public static void setUser(UserInfo user) {
SINGLETON.set(user);
}

}


/**
* 过滤器,用以将session中的UserInfo放入CurrentUser的ThreadLocal中。
*/
public class CurrentUserFilter implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {
}

public void destroy() {
}

public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
// 初始化当前线程本地内容
UserInfo userInfo = ((HttpServletRequest) request).getSession().getAttribute("userInfo");
CurrentUser.setUser(userInfo);

// 让过滤器链表中的其他过滤器继续处理
chain.doFilter(request, response);
} finally {
// 移除当前线程本地内容
CurrentUser.setUser(userInfo);
}
}
}
qiunet 2011-01-26
  • 打赏
  • 举报
回复
那我这样也行, 使用一个静态方法,让他们可以获取 到 session中的user对象.
关键 servlet中,有没有方法在不使用 request的情况下,得到session呢?
dhzhen2008 2011-01-26
  • 打赏
  • 举报
回复
你们经理的意思估计你搞错了!就像你说的:
“假如 是 存放到user对象 ,static是全局可以更改的, 他们取的时候,肯定是取到最后登录的那个人”
放到静态对象里 肯定不行。
取的时候时候不传request,那他怎么取session?
qiunet 2011-01-26
  • 打赏
  • 举报
回复
关键不能使用参数啊~就是request也不行~servlet好像没有别的方法得到session吧~
但是如果我存放一个静态对象的话

假如 是 存放到user对象 ,static是全局可以更改的, 他们取的时候,肯定是取到最后登录的那个人

如果 是存放list 里面 的话, 我没有参数,怎么取到list里面对应位置的 user 对象呢~
dhzhen2008 2011-01-26
  • 打赏
  • 举报
回复
放的时候request.getSession().setAttribute("user",user);
取的时候request.getSession().getAttribute("user");
dqsweet 2011-01-26
  • 打赏
  • 举报
回复
用static 类吧

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧