第三讲 上
1.三个servlet怎么共享同一个数据,也就是c++里面的静态全局变量,但在servlet中如何实现。
共四种方法:
A)
B)
C)
D)
2.servlet如何操作数据库
3.用户登录系统的功能改进
======================================================================
1.共享数据
A)
服务器可以将提交的信息回写到浏览器,等需要的时候获取,这就是cookie
1保存用户密码,在一定时间不用重新登录
2记录用户访问网站的喜好,有无背景音乐,背景颜色等等
3网站的个性化,比如定制网站的服务,内容
暂时只是了解,下一讲详细讲解
B)sendRedirct()
通过该方法将信息传送给下一个页面,比如:
sendRedirect(“wellcome?uname=shunping”);
Wellcome
如果传递的是中文,将得到乱码,需要处理下
在需要得到变量的servlet页面使用方法:
String
传送信息速度快,但只能传送字符串,不能传送对象
例子:
登录处理页面的代码:
- String
u=req.getParameter("username"); - String
p=req.getParameter("passwd"); -
//
验证: - if(p.equals("123456")){
- //合法跳转
- res.sendRedirect("wellcome?uname="+u+"&passwd="+p);
-
//
写你要到的servlet的那个URL - }
- else{
- //不合法
- res.sendRedirect("login");
- }
信息接收页面的代码:
- //得到从logincl的用户名和密码
- String
u=req.getParameter("uname"); - String
p=req.getParameter("passwd"); - try{
- PrintWriter
pw=res.getWriter(); - String
b="你的密码:"; //这里的字符串显示的时候会出现乱码 - pw.println("wellcome,http,"+u+b+p);
- }
-
catch(Exception
ex) - {
- ex.printStackTrace();
- }
==================================================================
C)
这是最常见的一种方式,也是最简单的,但有时候这个技巧非常管用
- login>
使用hidden控件,在界面不显示,但又有名字,有值
当需要传递数据的时候,使用hidden来传递给login
Action
简而言之就是在一个页面中使用隐藏表单将值传递给另一个页面:
- pw.println("<form
action=logincl method=post>"); - pw.println("用户名:<input
type=text name=username><br>"); - pw.println("密码:<input
type=password name=passwd><br>"); - 隐藏表单->
pw.println("<input
type=hidden name=sex value="+sex+">"); - pw.println("<input
type=submit value=login><br>"); - pw.println("</form>");
D)
理解:
浏览器打开网站的时候,服务器就为这个浏览器开辟一个独占的空间,就是session空间,空间默认存在时间30min。可以修改。
用在哪:
1网站的购物车
2保存用户登录信息
3将数据放入session中
4防止用户非法登录
====
可以将session看做一张表,表有两列:名字和值,string和object,和json很像啊。。。。
每一行就是session的一个属性。
-----操作session-----
--得到session:
HttpSession
--向session添加属性:
hs.setAttribute(String
--从session得到某个属性:
String
--从session删除某个属性:
hs.removeAttribute(String
--清空session,
0为清空,-1为session永远不过期,其他大于0为以秒为单位的session存在时间
hs.setMaxInactiveInterval(0);
--可以得到session的ID:
Hs.getId();
========================================================
注意事项:
1.session
2.30min时间是指的用户没有操作session时间,不是累计时间
3.当某浏览器访问网站时,服务器给浏览器分配惟一的session
4.因为session的各个属性要占用服务器的内存,因此公司都是都是迫不得已才用session。
Web.xml
如下代码中改:
- <session-config>
- <session-timeout>30</session-timeout>
- </session-config>
=========================下面实现session========================
实现两个功能,保存用户信息
防止非法登录指的是当用户没有登录的时候,输入网址,没法转到相应页面。
当用户在login页面输入的数据经过比对,正确后,将用户的账户和密码存入session
这样,当用户在session时间段内的时候,访问该网页,则不需要输入账户密码,直接跳转到相应页面。
loginCL处理页面:
- String
u=req.getParameter("username");//从html获得数据 - String
p=req.getParameter("passwd"); - if(p.equals("123456")){
- //将验证成功的信息写入session
- //1.得到session,得到那张表
- HttpSession
hs=req.getSession(true); - //2.写数据进去
- hs.setAttribute("pass",p);
- hs.setAttribute("name",u);
- //3.修改session时间
- hs.setMaxInactiveInterval(20);//以秒计算
-
//4.在wellcome页面去读session空间
的数据 - //合法跳转
- res.sendRedirect("wellcome?uname="+u+"&passwd="+p);
-
//
写你要到的servlet的那个URL - }
Welcome处理界面:
- String
u=req.getParameter("uname"); - String
p=req.getParameter("passwd"); - //从session得到数据
- HttpSession
hs=req.getSession(true); - String
pass= (String)hs.getAttribute("pass"); - String
uname=(String)hs.getAttribute("name"); -
if(pass==null||uname==null){
//如果session为空,则跳转 -
try
{ - res.sendRedirect("login");//跳转到login
- }
catch (Exception e) { - e.printStackTrace();
- }
- }
- else{
- try{
- PrintWriter
pw=res.getWriter(); pw.println("wellcome,http,"+u+p+"session:"+uname+"_"+pass); - }
-
catch(Exception
ex) - {
- ex.printStackTrace();
- }
- }
当然实际上要做一个完整的session
这里只是将session中的数值操作,读取。
考虑到不让用户非法访问页面,我们使用后台的session来保存用户是否已经登录,每次用户登录成功,都在session中保存用户的信息,当session过期或者销毁或者session中没有用户信息,则不允许用户之间访问登陆后的页面。
2.servlet如何操作数据库
下一讲要讲数据库的东西,我决定先去学习下java的数据库,估计不难,毕竟我有过c#经验
3.用户登录系统的功能改进
后续。。。