火龙果?整理 uml.org.cn 确的查询\
//error.put(\你必须选择一种运输方式\ }
4.1.3 HTTP会话
HTTP是一个没有状态的协议。要建立一个有效的Web服务应用,你必须能够识别一个连续的来自远端的客户机的唯一的请求。随着时间的过去,发展了许多会话跟踪的技术,但是使用起来都比较麻烦。
Java Servlet API提供了一个简单的接口,通过这个接口,Servlet引擎可以有效地跟踪用户的会话。 4.1.4建立Session
因为HTTP是一个请求-响应协议,一个会话在客户机加入之前会被认为是一个新的会话。加入的意思是返回会话跟踪信息到服务器中,指出会话已被建立。在客户端加入之前,我们不能判断下一个客户端请求是目前会话的一部分。 在下面的情况下,Session会被认为是新的Session。
客户端的Session在此之前还不知道
端选择不加入Session,例如,如果客户端拒绝接收来自服务器的cookie 作为一个Servlet的开发者,你必须决定你的Web应用是否处理客户机不加入或不能加入Session。服务器会在Web服务器或Servlet规定的时间内维持一个Session对象。当Session终止时,服务器会释放Session对象以及所有绑定在Session上的对象。
绑定对象到Session中
如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到Session中,这时,你需要使用HttpSession对象。任何绑定到Session上的对象都可以被处理同一会话的Servlet调用。
有些对象可能需要你知道什么时候会被放置到Session中或从Session中移开。
return error;
火龙果?整理 uml.org.cn 你可以通过使用HttpSessionBindingListener接口获得这些信息。当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检查什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。
4.2注册登陆系统的设计和实现
在登陆页面(http://localhost:8080/Thesis/Login.jsp)提供两个文本框让用户填写自己所想要的用户名和密码,设计代码:
图2 用户登陆图
提供两个按钮让用户提交或者修改所填写信息,设计代码:
这些都放在form表单里,提交方式有两种:Get和Post,两种提交方式的区别在于以Get方式提交时在URL信息后会跟上提交的相关信息,而以Post方式提交则会隐藏,所以以Post方式提交更加安全。由于两种方式在Servlet中都有相对应的方法doGet和doPost做相应处理,所以必须必须把提交信息放在对应的Servlet中方式中处理。
在对相关信息处理后,由Servlet这个控制组件决定返回给客户端不同的页面。
Servlet被初始化之后,它已经可以处理来自客户端的请求,每一个来自客户端的请求都被描述成一个ServletRequest对象,Servlet的响应被描述成一个ServletResponse对象。
当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。 Servlet也可以执行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有权使用客户端发出的请求。Servlet可以通过ServletInputStream
火龙果?整理 uml.org.cn 对象读取请求信息。
ServletResponse接口允许Servlet建立响应头和状态代码。通过执行这个接口,Servlet有权使用ServletOutputStream类来向客户端返回数据。
首先必须拿到由客户端填写在form表单中的数据信息,我们可以用Java提供给我们的方法request.getParameter()来取得:
String userName = request.getParameter(\String passWord = request.getParameter(\
注意:trim()方式是用来忽略前导和后导空格。
这样我们就把客户端提供的用户名和密码分别放入了userName和passWord这两个String类型的对象中,之后我们就只要对这两个对象做处理就可以了。 在本系统中不允许用户名和密码为空,所以本系统在把数据做后台数据库处理前先做了一下前台处理。
如果发现其中任何一项为空那么就不用做后台处理而直接返回给客户端原先的登陆页面并把相关出错信息作为HashMap中的属性Attribute值写入HashMap中。实现方法可以实现封装一个类,在类里的方法判断如果为空就写入的错误信息到对应的方法中,如果调用相关方式得到数据那么说明出错。 如果通过前台验证就转为后台数据库处理,要做数据库处理必须要连接数据库,本系统在这里调用了一个已经事先封装好了的类的方法来实现,然后通过查询数据库中相应用户名的信息,无论是对应密码错误还是数据库中根本不存在此用户名服务器端都将返回给客户端登陆页面并把错误信息作为HashMap中的属性Attribute值写入HashMap中,如果通过后台验证那么就可以让用户以注册用户身份登陆到系统主页面(http://localhost:8080/Thesis/Main.jsp)同时给用户一辆专用的购物车ShoppingCart(之前要先判断用户本身是不是已经存在了购物车),本系统为了达到操作过时管理可以在此设置Session的生命周期,这个生命周期是以两次用户操作间的时间来判断,只要用户两次操作的时间间隔不超过这个设置的时间那么就不会产生超时。具体实现代码:
Errors loginerror = new Errors(); //把封装了错误信息的类实例化 err = loginerror.errInform(userName, passWord);
if( err.get(\
火龙果?整理 uml.org.cn //这看的是不是有错误信息,有就是登陆失败 request.setAttribute(\
request.getRequestDispatcher(\response);
//用户名或密码为空,返回登陆页面 }
if( err.get(\try{
Database Db = new Database();//把封装了连接数据库方法的类实例化 ResultSet rs = Db.stmt.executeQuery( %username='\if(rs.next()){ rs.close(); Db.stmt.close();
//在Database这个class中没有关闭,所以在这要记得关闭 HttpSession session = request.getSession(true); session.setMaxInactiveInterval(60*3); //设置了session过期时间为60*3秒 ShoppingCart myShoppingCart =
(ShoppingCart)session.getAttribute(\if(myShoppingCart != null){
//sessionId没有过期,使用本身就留着的shoppingcart,开始购物
request.getRequestDispatcher(\}else{
//sessionId已经过期或第一登陆,使用新的shoppingcart,开始购物 ShoppingCart myNewShoppingCart = new ShoppingCart(); session.setAttribute(\session.setAttribute(\//是用户名也放在hashMap里,并且要在发送下面句前面
火龙果?整理 uml.org.cn request.getRequestDispatcher(\} } else{ rs.close(); Db.stmt.close();
request.setAttribute(\
request.getRequestDispatcher(\response);
//用户名或密码错误,返回到登陆页面 }
}catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } } }
既然根据Servlet组件判断出的不同错误信息服务器端发送不同的错误信息在登陆页面,那么登陆页面肯定是一个动态dynamic的页面,而这动态的又如何在一个登陆的Jsp文件中实现?
本系统在Jsp中写入了一写判断语句,根据从HashMap中的到不同的Attribute值显示不同的页面内容,这就是问题的答案。拿用户名为空错误做例子,实现代码: <%
HashMap errorNull = (HashMap)request.getAttribute(\ if(errorNull != null){
String usernameNull = (String)errorNull.get(\