<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");
?? //這里簡(jiǎn)單設(shè)置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>
整個(gè)登陸頁(yè)面的過(guò)程是這樣的:
(1)獲得用戶的登陸信息
(2)連接數(shù)據(jù)庫(kù)進(jìn)行權(quán)限驗(yàn)證
(3)如果通過(guò)驗(yàn)證,那么讀取用戶的注冊(cè)信息
(4)把用戶的注冊(cè)信息保存到一個(gè)userSession對(duì)象中
(5)把userSession對(duì)象保存到Session內(nèi)建對(duì)象中
(6)把視圖派發(fā)到下一個(gè)顯示頁(yè)面
注意:session.setAttribute("userSession",user)把userSession的一個(gè)對(duì)象設(shè)置到Session中,Session只能保存對(duì)象,不能保存原始的數(shù)據(jù)類型,比如:
session.setAttribute("count",10)
是非法的語(yǔ)句,如果要把值為10的整數(shù)保存到Session中,需要使用以下的方法:
session.setAttribute("count",new Integer(10));
然后在另一個(gè)頁(yè)面使用
(Integer)session.getAttribute("count");
把這個(gè)整數(shù)讀出來(lái).
我們用如下方法在另一個(gè)頁(yè)面中把userSesseion對(duì)象讀取出來(lái):
<%@page contentType="text/html;charset=gb2312" language="java"
?import="java.sql.*,dory.*" errorPage=""%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "<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>
可以看出,通過(guò)UserSession user=(UserSession)session.getAttribute("userSession");代碼來(lái)讀取在前一個(gè)頁(yè)面中設(shè)置的對(duì)象,然后再?gòu)倪@個(gè)對(duì)象讀取一些相關(guān)值.當(dāng)然我們也可以用JavaBean的形式來(lái)讀取.
2.使用隱含菜單
這種方式通過(guò)隱含菜單的形式把數(shù)據(jù)傳遞到下一個(gè)頁(yè)面,它有兩個(gè)局限性:
.只能在相鄰的兩個(gè)頁(yè)面之間傳遞數(shù)據(jù)
.客戶端可以使用查看網(wǎng)頁(yè)源代碼的方式獲得表單中的數(shù)據(jù),安全性不好
它的實(shí)現(xiàn)很簡(jiǎn)單:
<form action="target.jsp">
<input type="hidden" name="test" value="abc">
<input type="hidden" name="test2" value="def">
</form>
在另外一個(gè)頁(yè)面中,通過(guò)這樣來(lái)獲得數(shù)據(jù):
String test=request.getParameter("test");
String test2=request.getParameter("test2");
3.使用Cookie
和Session不同,Cookie是放在客戶端的,由于客戶考慮到安全應(yīng)素可能會(huì)禁用cookie,這樣在使用cookie就會(huì)遇到麻煩了.
b.在不同的用戶之間共享數(shù)據(jù)
在不同的在不同的用戶之間共享數(shù)據(jù)最常見的方法是使用ServletContext和application對(duì)象,通過(guò)在一個(gè)用戶那里設(shè)置屬性在另一個(gè)用戶那里獲得這個(gè)屬性.
1.使用ServletContext
在JSP頁(yè)面中可以通過(guò)getServletContext()方法獲得ServletContext對(duì)象.在這種情況下不同的用戶通過(guò)它來(lái)工享數(shù)據(jù),看下面的實(shí)現(xiàn)代碼:
<%@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"
?? "<%
?? 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對(duì)象
application對(duì)象對(duì)應(yīng)于每個(gè)web應(yīng)用來(lái)說(shuō)只有一個(gè),它使用和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"
?? "<%
?? 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的實(shí)現(xiàn)機(jī)制基本上一致.