由于各种原因,一直是用的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???
谢谢
[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
你的第一种方法:肯定不行,因为你忽略了执行顺序,你页面中的
[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重新获取并更新到页面上
我怀疑不是执行顺序的问题:
首先你调用的方法名,JSP页面和后台的方法不一致。
checkUser(..)
User.checkAuthority(opId,psd,sGroupId,callback);
这可能是你写错了。另外你方法中的参数中已经有session了。为什么还要获得一个
session = ExecutionContext.get().getSession();
直接用不行吗?是不是你的session获得有问题,还是说dwr1.0不支持直接使用session?
试试这个吧还是:
dwr和session通讯的方式:
1. java类中把session作为参数,如:
public void makeChart(String chartType,HttpSession session)
2.页面中调用如下:
TestJFreeChartDwr.makeChart(type,show);
无需传递第一步中的session参数,dwr会自动填充到session里
还有这个,也是正解
[url]http://www.iteye.com/topic/33185[/url]
这个跟上面的一个意思:
[url]http://blog.donews.com/tohlzhu/articles/1224601.aspx[/url]
试试这个:
首先
[code="java"]import uk.ltd.getahead.dwr.WebContextFactory;[/code]
然后在你的JAVA中获取session用这个办法[code="java"]HttpSession session = WebContextFactory.get().getSession(); [/code]
试试吧
[quote]我做验证的时候是用的弹出小页面,所以又创建了一个新的session,当登录页面关掉后,session也就自动关掉了。所以原页面的session还是为null。 [/quote]
登录页面关掉后session拿不到,这个正常,不应该从程序API角度解决这个问题,你应该换一下实现这个功能的思路,BT,接你这个问题的分真的好难 :cry: 好难 :cry:
[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]
dwr请求也是交给DwrServlet的来处理,只不过封装了http协议,但是它也提供了获得web运行环境的接口.
不要使用window.showModalDialog,用widow.open试试,你这个window.showModalDialog在FF下根本不行