在JSP开发中我们常常会碰到以下的一些问题,其实都很有代表性.
在不同的页面或者用户之间共享数据
在JSP中共享数据,大体上可以分为两种情况,第一种是在同一个用户的不同也面之间共享数据,另一种是在不同用户之间共享数据.
对于同一个用户的会话,要想在不同的页面之间共享数据,可以有以下几种选择:
.把数据保存在Session中(最常见的方法)
.通过Cookie
.通过隐含表单提交到下一个页面
.通过ServletContext对象
.通过Application对象
.通过文件系统或者数据库
要在不同的用户之间共享数据,通常的方法是:
.通过ServletContext对象
.通过Application对象
.通过文件系统或者数据库
可见,对于不同用户之间共享数据的实现方法在同一个用户的不同也面之间也能实现数据共享.
a.在同一个用户的不同也面之间共享数据
1.使用session共享数据
用户在浏览网页时,由于HTTP协议是一种无状态协议,往往在不同的页面之间存在数据交换的问题,这就需要在这些不同的页面之间共享数据.在编程实现中我们常看到的方法是把共享数据保存在session中.这些共享数据可以是字符串或者与Java的原始数据类型相关的对象,也可以是一个Java对象.
exampl: 用户登录时,如果验证成功,就把信息保存到一个userSession的类中,在其他的页面可以读取这个值.
userSession.java
package dory;
import java.util.Date;
/**
*
* @author Dory Doo
*/
public class userSession {
private boolean isLogin=false;
private String userId;
private Date lastLoginTime;
private int logCount;
/** Creates a new instance of userSession */
public userSession() {
}
public void setIsLogin(boolean l)
{
this.isLogin=l;
}
public void setUserId(String userId)
{
this.userId=userId;
}
public void setLastLoginTime(Date l)
{
this.lastLoginTime=l;
}
public void setLogCount(int logCount)
{
this.logCount=logCount;
}
public boolean isLogin()
{
return this.isLogin;
}
public String getUserId()
{
return this.userId;
}
public Date getLastLoginTime()
{
return this.lastLoginTime;
}
public int getLogCount()
{
return this.logCount;
}
}
当然这个就比较简单的了,要的是整个思路.我们怎么来使用这个类,我们需要一个验证登陆的页login.jsp
<%@page contentType="text/html;charset=gb2312" language="java"
import="java.sql.*,dory.*" errorPage=""%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP Page</title>
</head>
<body>
<h1>Login Checking Page</h1>
<%
String name=request.getParameter("name");
String password=request.getParameter("password");
//Connection the Database,loading
//int logCount=resultSet.getInt("count");
//java.util.Date lastLoginTime=resultSet.getDate("LastLoginTime");
//这里简单设置logCount和lastLoginTime的值
UserSession user=new UserSeesion();
user.setUserId(name);
user.setIsLogin(true);
user.setLastLoginTime(new java.util.Date());
user.setLogCount(10);
session.setAttribute("userSession",user)
response.sendRedirect("welcome.jsp");
%>
</body>
</html>
整个登陆页面的过程是这样的:
(1)获得用户的登陆信息
(2)连接数据库进行权限验证
(3)如果通过验证,那么读取用户的注册信息
(4)把用户的注册信息保存到一个userSession对象中
(5)把userSession对象保存到Session内建对象中
(6)把视图派发到下一个显示页面
注意:session.setAttribute("userSession",user)把userSession的一个对象设置到Session中,Session只能保存对象,不能保存原始的数据类型,比如:
session.setAttribute("count",10)
是非法的语句,如果要把值为10的整数保存到Session中,需要使用以下的方法:
session.setAttribute("count",new Integer(10));
然后在另一个页面使用
(Integer)session.getAttribute("count");
把这个整数读出来.
我们用如下方法在另一个页面中把userSesseion对象读取出来:
<%@page contentType="text/html;charset=gb2312" language="java"
import="java.sql.*,dory.*" errorPage=""%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
UserSession user=(UserSession)session.getAttribute("userSession");
try
{
if(user.isLogin())
{
out.print("welcome,your login id is:"+user.getUserId());
out.print("your last login time is:"+user.getLastLoginTime());
out.print("now you are the:"+user.getLogCount()+"times logging this website");
}
else
{
response.sendRedirect("login.html");
}
}
catch(Exception e)
{
response.sendRedirect("login.html");
}
%>
</body>
</html>
可以看出,通过UserSession user=(UserSession)session.getAttribute("userSession");代码来读取在前一个页面中设置的对象,然后再从这个对象读取一些相关值.当然我们也可以用JavaBean的形式来读取.
2.使用隐含菜单
这种方式通过隐含菜单的形式把数据传递到下一个页面,它有两个局限性:
.只能在相邻的两个页面之间传递数据
.客户端可以使用查看网页源代码的方式获得表单中的数据,安全性不好
它的实现很简单:
<form action="target.jsp">
<input type="hidden" name="test" value="abc">
<input type="hidden" name="test2" value="def">
</form>
在另外一个页面中,通过这样来获得数据:
String test=request.getParameter("test");
String test2=request.getParameter("test2");
3.使用Cookie
和Session不同,Cookie是放在客户端的,由于客户考虑到安全应素可能会禁用cookie,这样在使用cookie就会遇到麻烦了.
b.在不同的用户之间共享数据
在不同的在不同的用户之间共享数据最常见的方法是使用ServletContext和application对象,通过在一个用户那里设置属性在另一个用户那里获得这个属性.
1.使用ServletContext
在JSP页面中可以通过getServletContext()方法获得ServletContext对象.在这种情况下不同的用户通过它来工享数据,看下面的实现代码:
<%@page contentType="text/html;charset=gb2312" language="java"
import="java.sql.*,javax.servlet.*,javax.servlet.http.*,dory.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%
request.setCharacterEncoding("gb2312");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP Page</title>
</head>
<body>
a simple chatting room
<br><hr><font color="red">
<%
String content=(String)getServletContext().getAttribute(new String("chatTopic_1"));
out.print(content);
getServletContext().setAttribute("chatTopic_1",content+(String)request.getParameter("content")
+"<br>");
%>
</font>
<hr>
<form accept="Servelt Context_chat.jsp">
<input type="text" name="content">
<input type="submit" value="speak">
</form>
</body>
</html>
2.application对象
application对象对应于每个web应用来说只有一个,它使用和ServletContext差不多.如下:
<%@page contentType="text/html;charset=gb2312" language="java"
import="java.sql.*,javax.servlet.*,javax.servlet.http.*,dory.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%
request.setCharacterEncoding("gb2312");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP Page</title>
</head>
<body>
a simple chatting room
<br><hr><font color="red">
<%
String content=(String)application.getAttribute(new String("chatTopic_1"));
out.print(content);
application.setAttribute("chatTopic_1",content+(String)request.getParameter("content")
+"<br>");
%>
</font>
<hr>
<form accept="Servelt Context_chat.jsp">
<input type="text" name="content">
<input type="submit" value="speak">
</form>
</body>
</html>
可以得到ServletContext和application的实现机制基本上一致.