深入理解分页和cookie

1 篇文章 0 订阅
第一节 分页概述

​ 分页是web应用程序非常重要的一个技术。数据库中的数据可能是成千上万的,不可能把这么多的数据一次显示在浏览器上面。一般根据每行数据在页面上所占的空间每页显示若干行,比如一般20行是一个比较理想的显示状态。

1.1 分页实现思路

分页的思路

对于海量的数据查询,需要多少就取多少,显然是最佳的解决方法,假如某个表中有200万条记录,第一页取前20条,第二页取21~40条记录。

select * from 表名 order by id limit 0,20 ;

select * from 表名 order by id limit 20,20;

select * from 表名 order by id limit 40,20;

pageSize每页显示多少条记录

pageIndex 当前页数

*limit((pageIndex-1)pageSize,pageSize)

1.2 分页代码实现

总结:

分页的重难点是查询之后再带着分页功能
1.默认当用户第一次进来时,就去执行模糊查询,“%%2.一定要想办法去解决查询之后条件的展示查询条件
第二节:乱码问题的处理
如何处理中文参数
2.1 为什么表单中会产生中文乱码
产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收

2.2 GET中文乱码
在Tomcat7及以下
客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
name=new String(name.getBytes("ISO-8859-1"),"UTF-8");

Tomcat8的版本中GET基本就不会乱码了,因为服务器对url的编码格式可以进行自动转换

解决get中文乱码的代码:

/**
 * Servlet implementation class HelloServlet
 * 演示Servlet的GET请求,中文乱码的问题
 * 
 */
@WebServlet("/GETServlet")
public class GetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取表单提交的姓名
		String name=request.getParameter("name");
		name=new String(name.getBytes("ISO-8859-1"),"UTF-8");
		//获取年龄
		String age=request.getParameter("age");
		//服务端输出打印
		System.out.println(request.getRemoteAddr()+"发来信息:姓名:"+name+"---->年龄:"+age);
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}
2.3 POST乱码
由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收,要想完成此操作,服务器可以直接使用从ServletRequest接口继承而来的"setCharacterEncoding(charset)"方法进行统一的编码设置。

解决POST中文乱码代码如下:

/**
 * Servlet implementation class HelloServlet
 * 演示Servlet的GET请求,中文乱码的问题
 * 
 */
@WebServlet("/GETServlet")
public class GetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置请求参数的编码格式--对GET无效
        request.setCharacterEncoding("UTF-8");
		//获取表单提交的信息
		String name=request.getParameter("msg");
		//服务端输出打印
		System.out.println("发来信息:"+msg);
	}
}
2.4 Servlet输出中文
2.4.1 页面返回乱码原因
浏览器识别不到返回的中文是什么编码格式,就会默认使用GB2312,如果返回的是UTF-8格式的那么在浏览器上就会显示乱码的问题

2.4.2 如何解决内容中的乱码
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");//输出一个完整的网页

总结起来:

遇到乱码问题时,你首先要确认是不是从数据库中读取,如果读取数据库时没有乱码,就可以确定是浏览器和服务器之间的传输出现乱码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

如果是数据库中读取出现乱码
确定数据库编码方式,然后在url?setCharacterEncoding=utf-8

如果是tomcat7出现get乱码,那就另说
name=new String(name.getBytes("ISO-8859-1"),"UTF-8");

第三节 状态管理-Cookie
3.1 状态管理概述
3.1.1 为什么需要状态管理
HTTP协议是无状态的,不能保存每次提交的信息,即当服务器返回与请求相对应的应答之后,这次事务的所有信息就丢掉了。 
  如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系。 
  对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就成问题了。
3.1.2 什么是状态管理
WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。
WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。
3.1.3 状态管理的两种常见模式
客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术。
服务器状态管理技术:将状态保存在服务器端。代表性的是session技术(服务器传递sessionID时需要使用Cookie的方式)。
3.2 Cookie应用
3.2.1 什么是Cookie(小曲奇)
	Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一小段数据,WEB服务器传送给各个客户端浏览器的数据是可以各不相同的。
	一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都应在HTTP请求头中将这个Cookie回传给WEB服务器。
	WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
	一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
	一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB

总结:

cookie是如何解决无状态性:
1.当浏览器第一次发送请求给服务器,服务器会生成一个密码在内存中保存,并且将密码通过response响应给浏览器
2.浏览器拿到这个密码之后,他会存储在浏览器内部(Ctrl+shift+del),这个叫cookie
3.当同一个浏览器去访问同一个服务器时,那么浏览器回去解读访问的url,会去本地找哪一个cookie中存储了url(项目名)
4.此时如果找到了,那么他会将cookie封装到这一次请求的request中去,服务器拿到了request就能拿到cookie,cookie中有密码,然后完成比对,得知这两次请求是同一个人

代码演示:

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%
    Cookie c=new Cookie("name","zhangsan");
    response.addCookie(c);
  %>
  </body>
</html>



<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    Cookie[] cookies = request.getCookies();
    for(Cookie c:cookies){
        if("name".equals(c.getName())){
            System.out.println("来了 "+c.getValue());
        }
    }
%>
</body>
</html>


cookie技术的应用:

1.登录的记住我
2.购物车
3.2.2 如何创建Cookie
		//创建Cookie
		Cookie ck=new Cookie("code", code);
		ck.setPath("/");//设置Cookie的路径,根路劲,一般情况下不去设置他
		ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储,默认-1
		//内存存储:当浏览器不占用cpu时,cookie就会被销毁
		response.addCookie(ck);//让浏览器添加Cookie

chrome浏览器查看cookie信息:chrome://settings/content/cookies

3.2.3 如何查询Cookie
//获取所有的Cookie
Cookie[] cks=request.getCookies();
		//遍历Cookie
		for(Cookie ck:cks){
          //检索出自己的Cookie
			if(ck.getName().equals("code"))
			{
              //记录Cookie的值
				code=ck.getValue();
				break;
			}
		}
3.2.4 如何修改Cookie

只需要保证Cookie的名和路径一致即可修改

		//创建Cookie
		Cookie ck=new Cookie("code", code);
		ck.setPath("/");//设置Cookie的路径
		ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
		response.addCookie(ck);//让浏览器添加Cookie
3.2.5 Cookie的生存时间
ck.setMaxAge(-1);设置生成时间,默认-1
取值说明:
>0有效期,单位秒
=0失效
<0内存存储,关闭浏览器就没有了
3.3 Cookie的路径问题
3.3.1 什么是Cookie的路径问题
cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie。在默认情况下,出于安全方面的考虑,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。那么此时如果希望其父级或者整个网页都能够使用cookie,就需要进行路径的设置。

cookie.setPath("/");
3.3.2 发送Cookie的条件
浏览器在发送请求之前,首先会根据请求url中的域名在cookie列表中找所有与当前域名一样的cookie,然后再根据指定的路径进行匹配,如果当前请求在域匹配的基础上还与路径匹配,那么就会将所有匹配的cookie发送给服务器。
3.3.3 如何设置Cookie的路径
通过Cookie的setPath方法设置路径
3.4 Cookie的特点

优点:

可配置到期规则:Cookie 可以在浏览器会话结束时到期,或者可以在客户端计算机上无限期存在,这取决于客户端的到期规则,不需要任何服务器资源,Cookie 存储在客户端并在发送后由服务器读取。
简单性:Cookie 是一种基于文本的轻量结构,包含简单的键值对。
数据持久性:虽然客户端计算机上 Cookie 的持续时间取决于客户端上的 Cookie 过期处理和用户干预,Cookie 通常是客户端上持续时间最长的数据保留形式

缺点:

大小受到限制:大多数浏览器对 Cookie 的大小有 4096 字节的限制,尽管在当今新的浏览器和客户端设备版本中,支持 8192 字节的 Cookie 大小已愈发常见。
用户配置为禁用:有些用户禁用了浏览器或客户端设备接收 Cookie 的能力,因此限制了这一功能。
潜在的安全风险:Cookie 可能会被篡改。用户可能会操纵其计算机上的 Cookie,这意味着会对安全性造成潜在风险或者导致依赖于Cookie 的应用程序失败。

记住我功能


<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    String username="";
    String password="";
    Cookie[] cookies = request.getCookies();
    //遍历cookie
   if(cookies.length!=0){
       for(int i=0;i<cookies.length;i++){
           //找键名为username
           if("username".equals(cookies[i].getName())){
               username=cookies[i].getValue();
           }
           if("password".equals(cookies[i].getName())){
               password=cookies[i].getValue();
           }
       }
   }
%>
<form action="login" method="post">
    用户名:<input type="text" name="username" value="<%=username %>"><br/>
    密码:<input type="text" name="password" value="<%=password %>"><br/>
    记住我:<input type="checkbox" name="rememberMe"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>





servlet:

package com.qf.cotroller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        String isRememberMe= request.getParameter("rememberMe");

        System.out.println(username+":"+password+":"+isRememberMe);

        //判断用户需不需要记住我
        if(isRememberMe!=null){
            Cookie c1=new Cookie("username",username);
            Cookie c2=new Cookie("password",password);
            c1.setMaxAge(10*60);//有效时长为10分钟
            c2.setMaxAge(10*60);
            response.addCookie(c1);
            response.addCookie(c2);
        }else{
            Cookie[] cookies = request.getCookies();
            //遍历cookie
            for(int i=0;i<cookies.length;i++){
                //找键名为username
                if("username".equals(cookies[i].getName())){
                    cookies[i].setMaxAge(0);
                }
                if("password".equals(cookies[i].getName())){
                    cookies[i].setMaxAge(0);
                }
                //设为0之后,一定要将两个cookie重新放到浏览器中,把原来的cookie覆盖
                response.addCookie(cookies[i]);
            }
        }
    }
}

总结:

1.无查询分页:pageIndex,pageSize,pageMax
2.模糊查询之后的分页:a.程序刚进来时执行的就是模糊查询 b.如何将查询条件进行保存
3.http协议的无状态性,如何解决无状态性
4.cookie的工作原理===》session的工作原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值