文章目录
数据共享
针对同一用户不同页面之间
1. cookie
客户端保存用户的信息,比如登录名,密码等
- 保存用户名、密码,在一定时间不用重新登录
- 记录用户访问网站的喜好
- 网站个性化
2. sendRedrect()
将信息传送给下一个页面
格式:sendRedrect(“<?><传递变量名=变量值&传递变量名=…>”)
——url和变量之间有?;变量和变量之间有&;传递中文会得到乱码,需要处理;
3. 隐藏表单
不可见的< form … >< /form >
格式:
< form action=url >
< input type=hidden name=a value=b >
4. Session
存储特定用户会话所需的属性及配置信息,在一定时间内会一直存在
应用:
- 网页购物车
- 保存登录用户信息
- 将数据放入到session中供同一用户各个页面使用
- 防止非法登录
注意事项:
- 属性默认存在时间为30min
- 浏览器访问网站时服务器会给浏览器分配一个唯一的Session ID,区分不同的浏览器(客户端)
- 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:与数据库的连接
- 下载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
分页技术
分页:将多条数据分开显示
分页算法
四个变量:
- 每页显示有多少条记录——int pageSize
- 希望显示第几页——int pageNow
- 一共有多少页——int pageCount
- 一共有多少条记录——int rowCount
select top pageSize 字段名列表 from 表名 where id not in
(select top pageSize*(pageNow-1) id from 表名)
连接数据库的相关方法说明
Connection ct = null;
——与特定数据库的连接(会话)
Statement sm = null;
——执行静态SQL语句并返回其生成的结果的对象
PreparedStatement ps= null;
——预编译的SQL语句的对象,可以使用该对象多次有效地执行SQL语句
ResultSet rs = null;
——表示数据库结果集的数据表
翻页
要点:
- 自定义pageSize(每页显示几条记录)
- 连接数据库,初始化pageCount和rowCount(知道数据库里有多少记录,有多少页)
- 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目录下
应用
- 保存用户名、密码,在一定时间内不用重新登录
- 记录用户访问网站的喜好
- 网站个性化定制服务
使用
Cookie:两列,一列名字,一列值
- 创建Cookie(服务端创建)
Cookie c=new Cookie(String name,String val); - 将Cookie添加到客户端
respnse.addCookie©; - 读取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
- Cookie保存在客户端。Session保存在服务端
- Session的安全性高于Cookie
- Cookie通过网络在客户端与服务器端传输,Session保存在服务器端,无需传输
- Cookie的生命从创建开始,Session的生命从创建时以及访问时开始【创建之后在生命周期之内没有访问Session则其无效,但是如果在这期间访问了,生命周期会重新开始计算】
- 关机会造成Session生命周期结束,Cookie不受影响