JAVA教程之Jsp & Servlet 会话把持
J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看NetBeans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。js|servlet|把持Jsp&Servlet会话把持guipei
媒介
作为J2EE的主要构成部分的jsp和servlet标准中,会话(session)处置占据十分主要的地位。今朝,良多材料都十分具体的解说了会话跟踪怎样处置。可是,针对会话把持却很少有人触及,底本在servlet标准中,servlet供应了HttpSessionContext接口处置会话把持功效,可是,在ServletAPI2.1今后,这个功效被作废了,参考原文(AsofJava(tm)ServletAPI2.1forsecurityreasons,withnoreplacement.ThisinterfacewillberemovedinafutureversionofthisAPI.)。
在本文中,作者会给你先容一种会话把持的办法,接纳listener手艺,完成HttpSessionContext的功效交换。良多开辟职员城市在部分场所便利得利用到这个功效完成某些义务,比方:在耳目员信息检察,在耳目员把持等等功效。
剖析
本文彩用实例体例先容会话把持功效。利用多少jsp页面,和一个java类完成全部功效演示。详见下表:
组件
功效
Com.guipei.listener.SessionListener
监听组件,完成HttpSessionContext的功效
index.jsp
完成用户上岸,创立新的session
logout.jsp
完成用户加入,用户主动删除session
display.jsp
显现用户上岸信息,在用户上岸后主动转进
session.jsp
列出以后一切的session
kill.jsp
杀失落指定的会话,使这个用户毗连有效
完成
监听类com.guipei.listener.SessionListener完成webapplication的监听功效,它完成了HttpSessionListener接口,能够监听sessionCreated(HttpSessionEventse)和sessionDestroyed(HttpSessionEventse)办法,因而我们能够很简单的在session的创立和烧毁事务过程当中处置session的把持。
在此类中,我们创立一个静态实例变量Hashtableht,接纳Hashtable的一个优点是它是线程平安的汇合类,不必我们再多做线程处置。接纳这个collection类保留我们所要把持的session对象。在监听事务中简单的处置相干义务。
参看全体代码:
packagecom.guipei.listener;
importjava.util.Hashtable;
importjava.util.Iterator;
importjavax.servlet.http.HttpSession;
importjavax.servlet.http.HttpSessionEvent;
importjavax.servlet.http.HttpSessionListener;
publicclassSessionListenerimplementsHttpSessionListener{
//汇合对象,保留session对象的援用
staticHashtableht=newHashtable();
//完成HttpSessionListener接口,完成session创立事务把持
publicvoidsessionCreated(HttpSessionEventarg0){
HttpSessionsession=arg0.getSession();
ht.put(session.getId(),session);
System.out.println("createsession:"+session.getId());
}
//完成HttpSessionListener接口,完成session烧毁事务把持
publicvoidsessionDestroyed(HttpSessionEventarg0){
HttpSessionsession=arg0.getSession();
System.out.println("destorysession:"+session.getId());
ht.remove(session.getId());
}
//前往全体session对象汇合
staticpublicIteratorgetSet(){
returnht.values().iterator();
}
//根据sessionid前往指定的session对象
staticpublicHttpSessiongetSession(StringsessionId){
return(HttpSession)ht.get(sessionId);
}
}
页面index.jsp处置用户上岸,创立新的会话的功效。在完成考证后,跳转到display.jsp页面上。
<%@pagecontentType="text/html;charset=gb2312"%>
<!--Copyright(c)2002byObjectLearn.AllRightsReserved.-->
<%
StringstrName=null;
StringstrThing=null;
try{
strName=request.getParameter("name");
strThing=request.getParameter("thing");
if((strName==null)||(strName.length()==0)){
thrownewException("nullstrName");
}
if((strThing==null)||(strThing.length()==0))
thrownewException("nullstrThing");
//addsession
session.setAttribute("name",strName);
session.setAttribute("thing",strThing);
response.sendRedirect("display.jsp");
}catch(Exceptione){
}
%>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<center>Welcome</center>
<formmethod=post>
<tablealign=center>
<tr>
<td>name:</td>
<td><inputname=nametype=input/></td>
</tr>
<tr>
<td>thing:</td>
<td><inputname=thingtype=input/></td>
</tr>
<tr>
<tdalign=right></td>
<tdalign=right>
<buttontype=submit>submit</button>
<buttontype=reset>reset</button>
</td>
</tr>
</table>
</form>
</body>
</html>
页面display.jsp用于用户上岸后的显现功效,假如用户没有举行过上岸哀求,会主动转发到index.jsp页面,包管用户上岸。
<%@pagelanguage="java"pageEncoding="GB2312"%>
<!DOCTYPEHTMLPUBLIC"-//w3c//dtdhtml4.0transitional//en">
<html>
<head>
<title>LombozJSP</title>
</head>
<bodybgcolor="#FFFFFF">
<%
if(session.isNew()==true){
response.sendRedirect("index.jsp");
}
out.println("name:"+session.getAttribute("name")+"<br>");
out.println("thing:"+session.getAttribute("thing")+"<br>");
out.println("sessionid:"+session.getId()+"<br>");
out.println("createtime:"+session.getCreationTime());
%>
</body>
</html>
页面logout.jsp用于用户加入上岸,接纳自动体例烧毁session。
<%@pagelanguage="java"pageEncoding="GB2312"%>
<!DOCTYPEHTMLPUBLIC"-//w3c//dtdhtml4.0transitional//en">
<html>
<head>
<title>LombozJSP</title>
</head>
<bodybgcolor="#FFFFFF">
<%
if(session.isNew()!=true){
session.invalidate();
}
response.sendRedirect("index.jsp");
%>
</body>
</html>
页面session.jsp列出以后会话用户,并供应一个毗连到kill.jsp,能够用作烧毁指定的会话操纵。
<%@pagelanguage="java"pageEncoding="GB2312"%>
<%@pageimport=com.guipei.listener.*,java.util.*%>
<!DOCTYPEHTMLPUBLIC"-//w3c//dtdhtml4.0transitional//en">
<html>
<head>
<title>LombozJSP</title>
</head>
<bodybgcolor="#FFFFFF">
Listsessionobject
<br>
<tableborder=1>
<trbgcolor=yellow>
<td>sessionid</td>
<td>username</td>
<td>whatthing</td>
<td>createtime</td>
<td>operate</td>
</tr>
<%
Iteratoriterator=SessionListener.getSet();
while(iterator.hasNext()){
try{
HttpSessionsession1=(HttpSession)iterator.next();
out.println("<tr>");
out.println("<td>"+session1.getId()+"</td>");
out.println("<td>"+session1.getAttribute("name")+"</td>");
out.println("<td>"+session1.getAttribute("thing")+"</td>");
out.println("<td>"+session1.getCreationTime()+"</td>");
out.println("<td><ahref=kill.jsp?sessionid="+session1.getId()+
">kill</a></td>");
out.println("</tr>");
System.out.println("list"+session1.getId());
}catch(Exceptionex){
ex.printStackTrace();
return;
}
}
%>
</table>
</body>
</html>
页面kill.jsp完成烧毁指定会话的功效,吸收一个sessionid参数,从我们保留的session对象汇合中获得对应的session对象,挪用invalidate办法,烧毁对象。
<%@pagelanguage="java"pageEncoding="GB2312"%>
<%@pageimport="com.guipei.listener.*"%>
<!DOCTYPEHTMLPUBLIC"-//w3c//dtdhtml4.0transitional//en">
<html>
<head>
<title>LombozJSP</title>
</head>
<bodybgcolor="#FFFFFF">
<%
//killthesession
try{
StringstrSid=request.getParameter("sessionid");
HttpSessionsession1=SessionListener.getSession(strSid);
if(session1!=null){
session1.invalidate();
}
}catch(Exceptione){
e.printStackTrace();
}
response.sendRedirect("session.jsp");
%>
</body>
</html>
完成以上代码后,还必要在web.xml形貌中增加以下元素。使得SessionListener类能够发扬监听功效。
<listener>
<listener-class>
com.guipei.listener.SessionListener
</listener-class>
</listener>
总结
作者不是很分明,servlet标准为何要作废HttpSessionContext接口,只管它声了然作废的缘故原由,可是我们仍旧能够简单的经由过程HttpSessionListener接话柄现这个功效。
但愿本文能够供应一个新的办法,交换已被servlet标准取销的HttpSessionContext接口。让我们能够便利的举行会话操纵。
令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading) 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
页:
[1]