Servlet/JSP(2)-数据共享(Cookie Session等),分页

本文介绍了Servlet/JSP中数据共享的方法,包括Cookie、sendRedirect、隐藏表单和Session,并详细讲解了Session的使用和注意事项。此外,还讨论了Servlet-JDBC与数据库的连接,以及分页技术,包括分页算法、翻页和效率问题。最后对比了Cookie和Session的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据共享

针对同一用户不同页面之间

1. cookie

客户端保存用户的信息,比如登录名,密码等

  1. 保存用户名、密码,在一定时间不用重新登录
  2. 记录用户访问网站的喜好
  3. 网站个性化

2. sendRedrect()

将信息传送给下一个页面
格式:sendRedrect(“<?><传递变量名=变量值&传递变量名=…>”)
——url和变量之间有?;变量和变量之间有&;传递中文会得到乱码,需要处理;

3. 隐藏表单

不可见的< form … >< /form >
格式:
< form action=url >
< input type=hidden name=a value=b >

4. Session

存储特定用户会话所需的属性及配置信息,在一定时间内会一直存在
应用:

  1. 网页购物车
  2. 保存登录用户信息
  3. 将数据放入到session中供同一用户各个页面使用
  4. 防止非法登录

注意事项:

  1. 属性默认存在时间为30min
  2. 浏览器访问网站时服务器会给浏览器分配一个唯一的Session ID,区分不同的浏览器(客户端)
  3. Session的各个属性会占用服务器的内存

程序

package com.yyxx.simpleone;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.*;

public class Login extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
//		super.doGet(req, resp);
		try {
			//中文显示
			resp.setContentType("text/html;charset=gbk");
			
			PrintWriter pw = resp.getWriter();

			pw.println("<html>");
			pw.println("<head>");
			pw.println("<meta http-equiv=Content-Type content=text/html; charset=UTF-8>");
			pw.println("<title>Insert title here</title>");
			pw.println("</head>");
			pw.println("<body>");
			pw.println("<h1><font size=12>");
			pw.println("登录界面");
			pw.println("</h1></font>");
			pw.println("<form action=logincl method=get>");
			pw.println("用户名:<input type=text name=username><br>");
			pw.println("密  码:<input type=password name=password><br>");
			pw.println("<input type=submit value=login><br>");
			pw.println("</form>");
			String info=req.getParameter("info");
			if(info!=null){
				pw.println("你的用户名或密码错误,请重新输入");
			}
			pw.println("</body>");
			pw.println("</html>");

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
//		super.doPost(req, resp);
	}

}

package com.yyxx.simpleone;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.*;

public class LoginCl extends HttpServlet {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
//		super.doGet(req, resp);
		try {
			//中文显示
			resp.setContentType("text/html;charset=gbk");
			
			PrintWriter pw = resp.getWriter();
			//接受用户名和密码
			String u=req.getParameter("username");
			String p=req.getParameter("password");
			
			//验证
			if(u.equals("yangxiao")&&p.equals("123456")) {
				//合法
				//将用户名和密码放入session中
				HttpSession hs=req.getSession(true);
				hs.setAttribute("uname", u);
				hs.setAttribute("pword", p);
				//设定储存时间
				hs.setMaxInactiveInterval(10);
				//显示通过,然后跳转到欢迎界面
				pw.println("<html>");
				pw.println("<head>");
				pw.println("<title>正在验证</title>");
				pw.println("</head>");
				pw.println("<body>");
				pw.println("<h1><font size=12>");
				pw.println("用户和密码正确——");
				pw.println("</h1></font>");
				pw.println("</body>");
				pw.println("</html>");
				resp.sendRedirect("wel?uname="+u+"&pword="+p);
			}
			else {
				//不合法
				//跳转到登录界面Login
				resp.sendRedirect("login?info=error");//内容为url
			}
			

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
//		super.doPost(req, resp);
	}

}
package com.yyxx.simpleone;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Wel extends HttpServlet{
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
//		super.doGet(req, resp);
		try {
			//从session中得到用户名和密码
			HttpSession hs=req.getSession(true);
			String u=(String) hs.getAttribute("uname");
			String p=(String) hs.getAttribute("pword");
			
			if(u==null||p==null) {
				//返回登录界面
				resp.sendRedirect("login");
				return;
			}
			//中文显示
			resp.setContentType("text/html;charset=gbk");
			
			PrintWriter pw = resp.getWriter();
//			String u=req.getParameter("uname");
//			String p=req.getParameter("pword");
			
			pw.println("<html>");
			pw.println("<head>");
			pw.println("<meta http-equiv=Content-Type content=text/html; charset=UTF-8>");
			pw.println("<title>Insert title here</title>");
			pw.println("</head>");
			pw.println("<body>");
			pw.println("<h1><font size=12>");
			pw.println("欢迎,"+u+",你的密码为:"+p);
			pw.println("</h1></font>");
			pw.println("</body>");
			pw.println("</html>");
			

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
//		super.doPost(req, resp);
	}
}

Servlet-JDBC:与数据库的连接

  1. 下载jar包
    对应的数据驱动可以到官网里面下载
    SQL Server 数据库驱动下载

要注意数据库驱动不能随便下,要根据你的jdk版本下

根据jdk版本下载对应的数据库驱动
大部分人下载的jdk应该都是1.8的,看下图(从上面的链接截来的图片), mssql-jdbc-7.4.1. jre8需要JRE1.8,好了没错了,我们要的就是它。
在这里插入图片描述
下载那个Microsoft JDBC Drivers 7.4…之后,我们会得到三个如上图所示的jar包,但是我们需要的是 mssql-jdbc-7.4.1. jre8,其他不要(为什么你们应该知道了)
2. 导入jar包
这里有两种导入方式,针对两种不同的开发方式
①Tomcat开发:不用编译器,直接编写.java文件编译生成class使用
复制mssql-jdbc-7.4.1. jre8.jar,粘贴到项目的WEB-INF目录下的lib中
或者也可以粘贴到Tomcat目录下的lib(这样所有项目都会用到,很有可能会发生冲突。因此最好不要这样)
②类似于JavaWeb的开发,eclipse为编译器
在工程目录上点击右键-Properties-Java Build Path-界面内Libraries-Add External JARS,找到mssql-jdbc-7.4.1. jre8
在这里插入图片描述
然后Apply ,Close

分页技术

分页:将多条数据分开显示

分页算法

四个变量:

  1. 每页显示有多少条记录——int pageSize
  2. 希望显示第几页——int pageNow
  3. 一共有多少页——int pageCount
  4. 一共有多少条记录——int rowCount
select top pageSize 字段名列表 from 表名 where id not inselect top pageSize*(pageNow-1) id from 表名)
连接数据库的相关方法说明
		Connection ct = null;
		——与特定数据库的连接(会话)
		Statement sm = null;
		——执行静态SQL语句并返回其生成的结果的对象
		PreparedStatement ps= null;
		——预编译的SQL语句的对象,可以使用该对象多次有效地执行SQL语句
		ResultSet rs = null;
		——表示数据库结果集的数据表

翻页

要点:

  1. 自定义pageSize(每页显示几条记录)
  2. 连接数据库,初始化pageCount和rowCount(知道数据库里有多少记录,有多少页)
  3. pageNow随着超链接(页数表示)变化而变化

效率

当数据库数据数量为百万级,翻页速度减慢
显示一定范围内页数选择
程序:wel.java

package com.yyxx.simpleone;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Wel extends HttpServlet{
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
//		super.doGet(req, resp);
		Connection ct = null;
		Statement sm = null;
		PreparedStatement ps= null;
		ResultSet rs = null;
		try {
			//从session中得到用户名和密码
			HttpSession hs=req.getSession(true);
			String u=(String) hs.getAttribute("uname");
			String p=(String) hs.getAttribute("pword");
			
			if(u==null||p==null) {
				//返回登录界面
				resp.sendRedirect("login");
				return;
			}
			//中文显示
			resp.setContentType("text/html;charset=gbk");
			PrintWriter pw = resp.getWriter();
			//分页变量
			int pageSize=2;//每页显示有多少条记录——**
			int pageNow=1;//2. 希望显示第几页——**
			int pageCount=0;//3. 一共有多少页——**
			int rowCount=0;//4. 一共有多少条记录——**
			//动态接受pageNow
			String sPageNow=req.getParameter("pageNowok");
			
			try {
				Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			// 得到连接-getConnection:建立到给定数据库 URL 的连接
			ct = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=spdb", "sa", "123456");
			// 创建Statement-将 SQL 语句发送到数据库
			//sm = ct.createStatement();
			ps = ct.prepareStatement("select count(*) from users");
			//rs = sm.executeQuery("select top 1 passwd from users where username='" + u + "'");
			rs = ps.executeQuery();
			if (rs.next()) {
				rowCount=rs.getInt(1);
			}
			if (rowCount%pageSize==0) {
				pageCount=rowCount/pageSize;
			}
			else {
				pageCount=rowCount/pageSize+1;
			}
			
			if (sPageNow!=null) {
				pageNow=Integer.parseInt(sPageNow);
			}
			
//			String u=req.getParameter("uname");
//			String p=req.getParameter("pword");
			
			pw.println("<html>");
			pw.println("<head>");
			pw.println("<meta http-equiv=Content-Type content=text/html; charset=UTF-8>");
			pw.println("<title>Insert title here</title>");
			pw.println("</head>");
			pw.println("<body>");
			pw.println("<img src=imgs/dog.gif><br>");
			pw.println("<h1><font size=12>");
			pw.println("欢迎,"+u+",你的密码为:"+p);
			pw.println("</h1></font>");
			//分页显示
			ps=ct.prepareStatement("select top "+pageSize+" * from users where userId not in (select top "+pageSize*(pageNow-1)+" userId from users)");
			rs=ps.executeQuery();
			pw.println("<font size=8 color=red>pageNow:"+pageNow+"</font>");
			pw.println("<table border=1 cellspacing=0>");
			pw.println("<tr><th>id</th><th>name</th><th>passwd</th><th>mail</th></tr>");
			while(rs.next()){
				pw.println("<tr>");
				pw.println("<td>"+rs.getInt(1)+"</td>");
				pw.println("<td>"+rs.getString(2)+"</td>");
				pw.println("<td>"+rs.getString(3)+"</td>");
				pw.println("<td>"+rs.getString(4)+"</td>");
				pw.println("</tr>");
			}
			pw.println("</table>");
			//实现翻页
			pw.println("<a href=wel?pageNowok="+((pageNow-1)>1?(pageNow-1):1)+">上一页  </a>");
			for (int i = (pageNow-5)>1?(pageNow-5):1; i <= ((pageNow+5)<pageCount?(pageNow+5):pageCount); i++) {
				pw.println("<a href=wel?pageNowok="+i+">"+i+"  </a>");
			}
			pw.println("<a href=wel?pageNowok="+((pageNow+1)<pageCount?(pageNow+1):pageCount)+">下一页  </a>");
			pw.println("</body>");
			pw.println("</html>");
			

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		finally {
			try { //先关rs再关ct
				if (rs!=null)
					rs.close();
				if (sm!=null) {
					sm.close();
				}
				if (ct!=null) {
					ct.close();
				}
				
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
//		super.doPost(req, resp);
	}
}

Cookie:储存在客户端上的数据

服务端在客户端保存用户的信息,比如登录名。密码等
一般保存在C:/Documents and Settings目录下

应用

  1. 保存用户名、密码,在一定时间内不用重新登录
  2. 记录用户访问网站的喜好
  3. 网站个性化定制服务

使用

Cookie:两列,一列名字,一列值

  1. 创建Cookie(服务端创建)
    Cookie c=new Cookie(String name,String val);
  2. 将Cookie添加到客户端
    respnse.addCookie©;
  3. 读取cookie(从客户端读取到服务器)
    request.getCookies();
    相关程序
public void doGet(HttpServervletRequest req,HttpServletResponse res){
	//程序
}
//步骤
//服务器端创建Cookie
Cookie myCookie=new Cookie("color1","red");

//设置Cookie存在时间(秒),如果不设置,Cookie不会保存
myCookie.setMaxAge(30);

//将Cookie写回到客户端
res.addCookie(myCookie);

/*------------------------------------*/
//从客户端得到Cookie信息
Cookie [] allCookies=req.getCookies();
int  i=0;
if(allCookies!=null){
	for(i=0;i<allCookies.length;i++){
		//依次取出Cookie
		Cookie temp=allCookies[i];;
		if(temp.getName().equals("color1")){
			//得到Cookie的值
			String val=temp.getValue();
			...
			break;
	}
}
if(allCookies.length==i){
	pw.println("cookie过期");
}

Cookie vs Session

  1. Cookie保存在客户端。Session保存在服务端
  2. Session的安全性高于Cookie
  3. Cookie通过网络在客户端与服务器端传输,Session保存在服务器端,无需传输
  4. Cookie的生命从创建开始,Session的生命从创建时以及访问时开始【创建之后在生命周期之内没有访问Session则其无效,但是如果在这期间访问了,生命周期会重新开始计算】
  5. 关机会造成Session生命周期结束,Cookie不受影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值