sun201200204
2008-11-07 15:07
浏览 281
已采纳

dwr创建和获取session的问题

由于各种原因,一直是用的dwr1.0的版本。
一开始,我想在java类中创建一个session传到jsp中:
[code="java"]
public boolean checkUser(String operatorId, String password,
String groupId,HttpSession session) throws Exception {
boolean bValid = true;
try {
........//DAO
} catch (Exception e) {
........
}
session = ExecutionContext.get().getSession();
session.setAttribute("user", "daveli");
return bValid;
}
[/code]
[code="java"]
js:
function handleCheck()
{
User.checkAuthority(opId,psd,sGroupId,callback);
}
jsp:
<%=(String)session.getAttribute("user")%> //[color=red]得到的是空(null),不论怎么刷新[/color]
[/code]
这样不行,于是我换了一种方法,在页面中创建一个session,然后在java类中改变session的值:
[code="java"]
public boolean checkUser(String operatorId, String password,
String groupId,HttpSession session) throws Exception {
boolean bValid = true;
try {
........//DAO
} catch (Exception e) {
........
}
session = ExecutionContext.get().getSession();
String username = (String)session.getAttribute("user");
System.out.println(UserName); //打印出来为空,说明session没有传过来。
session.removeAttribute("user");
session.setAttribute("user", "java sun");
return bValid;
}
[/code]
[code="java"]
js:
function handleCheck()
{
User.checkAuthority(opId,psd,sGroupId,callback);
}
jsp:
<% session.setAttribute("user", "hello");%>

<%=(String)session.getAttribute("user")%> //[color=red]得到的永远是“hello”,不论怎么刷新,说明java类中的设置没传过来[/color]

请问:如何用DWR创建和调用session?
[/code]
[b]问题补充:[/b]
谢谢jones ,你的回答。
既然jsp页面中饿代码已经先于客户端执行的javascript执行,所以第二种方法中的java类中的
System.out.println(UserName);不可能打印出来的空值。我点到其他的jsp页面的话,也应该得到我在java类中设置的session值吧。
[b]问题补充:[/b]
谢谢,我发现问题了。我打印出jsp和java类的session_id。加不加
session = ExecutionContext.get().getSession();

都是不同的。

该怎么把jsp页面的这个session发送到java类呢?如何把java类的session传给jsp中呢?

[b]问题补充:[/b]

dwr和session通讯的方式:
1. java类中把session作为参数,如:
public void makeChart(String chartType,HttpSession session)

2.页面中调用如下:
TestJFreeChartDwr.makeChart(type,show);
无需传递第一步中的session参数,dwr会自动填充到session里

我也是这样做的啊。可是还是传不到java类中?
是不是dwr1.0不支持session呢?
[b]问题补充:[/b]
晓得原因了。
我做验证的时候是用的弹出小页面,所以又创建了一个新的session,当登录页面关掉后,session也就自动关掉了。所以原页面的session还是为null。

该怎么处理这个问题?
[b]问题补充:[/b]
我是这么做的:
A页面:要登录的页面,页面加载的时候加载js:
js:
function init() {
//authority check
var boolIsSupervisor = window.showModalDialog( "check_user.jsp", "", "dialogHeight:10; dialogWidth:22; status:no" );
if ( String( boolIsSupervisor ) == "undefined" || boolIsSupervisor == false ) {
alert ( "Supervisor authentication failed." );
window.location.href = "/mrs/mrsRightPage.do";
}
}
check_user.jsp是登录页面,要求输入用户名,密码,点提交调用js:
function handleCheck()
{

User.check(name,password,getAuth);
}
function getAuth(pass) {
window.returnValue=true;
window.close();
}
java类中:
public boolean checkUser(String name, String password,

HttpSession session){

boolean bValid = true;

//业务处理
session.setAttribute("user", "java sun");

return bValid;

}

我发现check_user.jsp中的session和也登录的页面不是一个session。这么才能让他们共用一个session???
谢谢

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

11条回答 默认 最新

  • iteye_521 2008-11-07 15:58
    已采纳

    [code="java"]# <% session.setAttribute("user", "hello");%>

    <%=(String)session.getAttribute("user")%> [/code]
    你第二中方法中页面上这两句是连着在服务端执行的,当然会永远都是hello了。
    顺便提醒一下,你的
    [code="java"] public boolean checkUser(String operatorId, String password,

    String groupId,HttpSession session) throws Exception {[/code]
    方法既然传递进来了session.为什么还要
    [code="java"]session = ExecutionContext.get().getSession();[/code]
    去重新获取一个session呢,这两个session可以通过打印sessionId看一下是不是同一个session

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • iteye_521 2008-11-07 15:16

    你的第一种方法:肯定不行,因为你忽略了执行顺序,你页面中的
    [code="java"]<%=(String)session.getAttribute("user")%>[/code]
    是JSP语句,在服务器端执行,执行完成后才会发送到客户端浏览器,然后你的handleCheck JavaScript才会在客户端执行,这个时候session中才会有数据,但是你页面已经到了客户端了。
    你的第二种方式:肯定也不行,原因同第一个,JAVA代码会在服务端比javaScript早执行。
    解决办法:

    [code="java"]<%=(String)session.getAttribute("user")%>[/code]
    放到一个div中,handleCheck()执行后用ajax再从服务器端的session中取数据并更新这个DIV,
    问题总结:一定要明白JAVA代码都是在服务端执行,都会比客户端执行的javascript要早执行,如果想获取javascript修改后的服务器端状态,必须通过ajax重新获取并更新到页面上

    评论
    解决 无用
    打赏 举报
  • xrb2008 2008-11-07 16:14

    我怀疑不是执行顺序的问题:
    首先你调用的方法名,JSP页面和后台的方法不一致。
    checkUser(..)
    User.checkAuthority(opId,psd,sGroupId,callback);

    这可能是你写错了。另外你方法中的参数中已经有session了。为什么还要获得一个
    session = ExecutionContext.get().getSession();

    直接用不行吗?是不是你的session获得有问题,还是说dwr1.0不支持直接使用session?

    评论
    解决 无用
    打赏 举报
  • iteye_521 2008-11-07 16:45

    试试这个吧还是:
    dwr和session通讯的方式:
    1. java类中把session作为参数,如:
    public void makeChart(String chartType,HttpSession session)

    2.页面中调用如下:
    TestJFreeChartDwr.makeChart(type,show);
    无需传递第一步中的session参数,dwr会自动填充到session里

    评论
    解决 无用
    打赏 举报
  • iteye_521 2008-11-07 16:47

    还有这个,也是正解
    [url]http://www.iteye.com/topic/33185[/url]

    评论
    解决 无用
    打赏 举报
  • iteye_521 2008-11-07 16:48

    这个跟上面的一个意思:
    [url]http://blog.donews.com/tohlzhu/articles/1224601.aspx[/url]

    评论
    解决 无用
    打赏 举报
  • iteye_521 2008-11-07 22:06

    试试这个:
    首先
    [code="java"]import uk.ltd.getahead.dwr.WebContextFactory;[/code]
    然后在你的JAVA中获取session用这个办法[code="java"]HttpSession session = WebContextFactory.get().getSession(); [/code]
    试试吧

    评论
    解决 无用
    打赏 举报
  • iteye_521 2008-11-10 10:43

    [quote]我做验证的时候是用的弹出小页面,所以又创建了一个新的session,当登录页面关掉后,session也就自动关掉了。所以原页面的session还是为null。 [/quote]
    登录页面关掉后session拿不到,这个正常,不应该从程序API角度解决这个问题,你应该换一下实现这个功能的思路,BT,接你这个问题的分真的好难 :cry: 好难 :cry:

    评论
    解决 无用
    打赏 举报
  • zhang26chao 2008-11-10 12:40

    [code="java"]在dwr中可以用以下方法访问servlet的上下文环境: HttpServletRequest request = WebContextFactory.get().getHttpServletRequest();
    HttpServletResponse res = WebContextFactory.get().getHttpServletResponse();
    HttpSession session = WebContextFactory.get().getSession();
    ServletConfig config = WebContextFactory.get().getServletConfig();
    ServletContext context = WebContextFactory.get().getServletContext();
    [/code]

    评论
    解决 无用
    打赏 举报
  • zhang26chao 2008-11-10 12:42

    dwr请求也是交给DwrServlet的来处理,只不过封装了http协议,但是它也提供了获得web运行环境的接口.

    评论
    解决 无用
    打赏 举报
  • iteye_521 2008-11-10 14:06

    不要使用window.showModalDialog,用widow.open试试,你这个window.showModalDialog在FF下根本不行

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题