系列文章目录
第一章 基础知识、数据类型学习
第二章 万年历项目
第三章 代码逻辑训练习题
第四章 方法、数组学习
第五章 图书管理系统项目
第六章 面向对象编程:封装、继承、多态学习
第七章 封装继承多态习题
第八章 常用类、包装类、异常处理机制学习
第九章 集合学习
第十章 IO流、多线程学习
第十一章 仓库管理系统项目
第十二章 员工管理系统、多表查询、反射实现DBHelper学习
第十三章 DML、DDL、数据库对象学习
第十四章 网络编程、各种标签、CSS学习
第十五章 ECMAScript、BOM学习
第十六章 DOM、jQuery学习
第十七章 Servlet、jsp、Cookie、Ajax学习
文章目录
- 系列文章目录
- 前言
- 一、Servlet
- 1. Servlet运行过程
- 2. Servlet与url对应
- 2.1 单个
- 2.2 多个
- 3. servlet的生命周期
- 3.1 创建
- 3.2 初始化
- 3.3 服务执行
- 3.4 销毁
- 4. Servlet的单例模式
- 5. Servlet简写
- 6. 请求和响应分解
- 7. 介绍请求对象HttpServletRequest
- 7.1 获得请求行信息
- 7.2 获取请求头信息
- 7.3 获取请求主体信息
- 8. 介绍响应对象HttpServletResponse
- 8.1 设置响应行
- 8.2 设置响应头
- 8.3 设置响应主体
- 9. 过滤器与监听器
- 9.1 过滤器Filter
- 9.1 监听器
- 二、jsp
- 2.1 jsp的运行过程
- 2.2 转发和重定向
- 2.2.1 转发
- 2.2.2 重定向
- 2.2.3 为什么会转发用request,重定向用response
- 2.2.4 转发与重定向区别:
- 2.3 作用域对象
- 2.3.1 pageContext
- 2.3.2 request
- 2.3.3 session
- 2.3.4 application
- 2.4 路径问题:
- 2.5 jsp语法
- 2.6 jsp九大内置对象(重点要记)
- 三、Cookie
- 1. CookieServlet类
- 2. empLogin.jsp文件
- 3. emok.jsp文件
- 四、Ajax
- 1. 同步请求和异步请求
- 2. Ajax优势劣势
- 3. Ajax常用方法
- 3.1 open(method, URL, async)
- 3.2 send(content)
- 3.3 setRequestHeader(header, value)
- 4. Ajax常用属性
- 5. Web与Ajax差异
- 6. Ajax工作流程
- 7. Ajax使用步骤
- 五、同步请求、异步请求具体区别
- 1. ajaxUser.jsp文件
- 2. AjaxServlet文件
- 总结
前言
本文我们将讲述:
Servlet:是在服务器端编程的技术
jsp:.jsp文件类似.html文件,里面都是前端页面代码,以后会用.jsp文件
Cookie:在客户端做数据存储
Ajax:异步请求
同步请求、异步请求具体区别:Ajax与Web对比
人类甄别计划完成了100%,但我觉得太没意思了就没执行,毕竟符合条件的就我一个外星移民,照理你们都得被毁灭光线“biubiu”死,但太没意思了嘛。我决定把这个杀手锏握在手里,让每个国家上交国家金库里的30%,不然我就针对性的把他们国家的人都“biubiu”死!呼哈哈哈哈哈哈哈哈!呼哈哈哈哈哈哈哈哈哈哈哈!
一、Servlet
服务器-Tomcat容器-web服务器-web容器-tomcat-servlet容器指的都是Servlet
Servlet是在服务器端编程的技术 哦,déjà-vu"
一个Servlet对象,负责一个或一组url
Servlet/jsp是一种在服务器端动态生成html/css/js页面的技术,可以在idea里动态生成页面的组件
1. Servlet运行过程
(发送)客户端浏览器发送请求到服务器(用到http协议)
(匹配)服务器根据请求信息的路径url,去调用响应的Servlet类(请求)
(处理)通过Servlet中的打印流对象将生成的html数据输出给服务器(响应)
(返回)服务器将servlet生成的数据在输出给客户端浏览器(用到http协议)
(查看)客户端接收到响应信息后,先解压,再交给浏览器解释执行,用户进行查看
2. Servlet与url对应
2.1 单个
一个Servlet对象,负责一个url
写法:
/aaa
2.2 多个
一个Servlet对象,负责一组url
写法有二:
/aaa/*
*.bbb
3. servlet的生命周期
3.1 创建
当客户端第一次发送请求到Servlet里,服务器才会创建该Servlet对象
3.2 初始化
创建时初始化
执行一次
3.3 服务执行
对请求进行分发,分发到对应的方法里进行处理
重复执行
3.4 销毁
关闭服务器时,当前服务器下所有Servlet对象都销毁
4. Servlet的单例模式
Servlet其实是伪单例:构造器可以共有
实现方式:
使用是map集合的方式,实现servlet对象单例
是key
是value
一般是懒汉式,饿汉式用1实现
5. Servlet简写
Servlet3.0版本支持注解方式来配置Servlet
一个注解@WebServlet替换两组对应标签
在Servlet类上写@WebServlet(“要链接的前端页面”)
6. 请求和响应分解
http协议:
单向性、长连接、无状态
规定的内容:
——请求的内容:
————1、一个请求行(请求方式,请求路径,协议名字,协议版本)
————2、多个请求头
————3、请求主体(请求的参数列表)
——响应的内容:
————1、一个响应行(协议名,协议版本,状态码,状态码描述)
————2、多个响应头
————3、响应主体
7. 介绍请求对象HttpServletRequest
7.1 获得请求行信息
请求方式:request.getMethod()
资源路径:request.getRequestURL()
资源路径:request.getRequestURI()
协议:request.getScheme()
协议版本号:request.getProtocol()
get方式的请求信息:request.getQueryString()
当前项目部署的名称:request.getContextPath()
7.2 获取请求头信息
单独获得:request.getHeader(“User-Agent”)
获得所有:
Enumeration 枚举的意思,getHeaderNames()返回枚举类型的数组
Enumeration<String> names=request.getHeaderNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
System.out.println(name + ":" + request.getHeader(name));
System.out.println();
}
7.3 获取请求主体信息
获得请求主题里的参数列表
String empno= request.getParameter(“empno”);//获得请求参数
String ename = request.getParameter(“ename”);
获得一组参数:
request.getParameterValues(“cait”);
8. 介绍响应对象HttpServletResponse
8.1 设置响应行
response.setStatus(Integer.parseInt(empno), ename);//设置一个状态,同时设置状态信息
8.2 设置响应头
//处理乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//简写response.setContentType("text/html;charset = utf-8");
response.setHeader("contentType", "text/html;charset = utf-8");
//完整版
8.3 设置响应主体
response.getWriter().println(ename + "登陆失败");
9. 过滤器与监听器
9.1 过滤器Filter
可以对web服务器管理的所有web资源进行拦截,在web返回servlet 和servlet返回web 都会进行拦截。
9.1 监听器
监听器用于监听web应用中的某些对象、信息的创建、销毁、增加、修改、删除等动作的发生,然后做出相应的相应处理。当范围对象的状态发生变化时,服务器自动调用监听器对象中的方法。可以做统计在线人数。
二、jsp
jsp就是Servlet:继承HttpJspBase继承Servlet
Servlet擅长做逻辑处理,不擅长做数据展示;
jsp擅长做数据展示,不擅长做逻辑处理
jsp本质上是Servlet,所以jsp也是java类
2.1 jsp的运行过程
客户端第一次发送请求,要访问jsp页面,
服务器接收到请求,获得请求路径,
将对应的jsp页面,翻译成java类
然后编译成字节码文件,
再使用虚拟机,解释成机器码,运行机器码
根据请求信息进行逻辑处理后,给出响应,以流方式输出给服务器,再输出到客户端
2.2 转发和重定向
(相当于return,后面的代码不会执行)
jsp-jsp
jsp-Servlet
Servlet-jsp
Servlet-Servlet
2.2.1 转发
转发代码:
request.setAttribute("emps", emps);
request.getRequestDispatcher("show.jsp").forward(request, response);
转发时,将本方法的request参数和response参数传给转发后的页面,所以能做到共享相同的请求对象和上下文数据。
转发是服务器内部的操作,客户端不会察觉到转发的过程,URL地址不会发生改变
2.2.2 重定向
重定向代码:
request.setAttribute("emps", emps);//把键值对存在request对象中
response.sendRedirect("show.jsp");
//如果想
因为重定向没法传入request、response,所以重定向没法获取数据,如果想获取数据,可以将第二行改为如下,将数据传入,但如果需要传大量数据,本方法会显得非常臃肿。
response.sendRedirect("show.jsp?emps=", emps);
重定向的本质:服务器发送一个特殊的响应给客户端,告诉客户端它请求的资源在另一个URL上,客户端根据新的URL发起一个新的请求,服务器会处理该请求并返回相应。
2.2.3 为什么会转发用request,重定向用response
转发代表服务器内一个页面转到另一个页面,是把客户端传给服务器的request传给另一个页面,客户端没做任何操作。
重定向代表服务器返回给客户端一个response,客户端再自动重新发起另一个请求request,访问另一个页面。
2.2.4 转发与重定向区别:
1、跳转效率的不同
转发:效率高
重定向:效率低
2、是否共用一个request
转发:原来页面与新页面共有同一个request
重定向:原来页面与新页面不共有一个request(可以用session扩大重定向的作用域来共享数据)
3、浏览器URL地址不同
转发:URL地址保持不变
重定向:URL地址为重定向后地址
4、“/”路径的含义不同
转发:代表当前项目的根目录
重定向:代表当前服务器的根目录
5、跳转范围不同
转发:只能转发到同一应用的URL
重定向:可以重定向任何服务器、任何应用的URL
6、刷新是否导致重复提交
转发:会导致重复提交
重定向:不会导致重复提交
7、是否经过过滤器
转发:不经过过滤器
重定向:经过过滤器
8、实现语句不通
转发:request.getRequestDispatcher().forward(request, response);
重定向:response.sendRedirect();
2.3 作用域对象
2.3.1 pageContext
当前页面内
2.3.2 request
一次请求只要给出相应,请求就算结束
(转发算一次请求内,重定义不算一次请求内)
既是请求参数
又是作用域对象
2.3.3 session
一次会话(建立连接到断开连接)
会话对象:
生命周期:
创建:建立连接
销毁:断开连接分为
客户端销毁:用户关闭浏览器:session丢失(30分钟活动时间后销毁)
服务器关闭:session销毁(所有对象销毁)
2.3.4 application
一个应用内(只要服务器不管就不算结束)一般不用
2.4 路径问题:
1、一个url/一组url对应一个servlet
2、“/”路径的含义不同
3、在开发过程中,不要写相对路径,要写绝对路径
jsp绝对路径
动态获得base标签
<%
String base = request.getContextPath() + "/";
System.out.println(base);
String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + base;
System.out.println(url);
%>
<base href="<%=url%>">
2.5 jsp语法
声明全局变量<%! %>
表达式<%= %>
java脚本段<% %>
指令@
2.6 jsp九大内置对象(重点要记)
1、request请求对象,作用域对象
2、response响应对象
3、pageContext页面上下文对象,作用域对象
4、session会话对象,作用域对象
5、application应用程序对象,作用域对象
6、out输出对象
7、config配置对象
8、page页面对象
9、exception对象:隐藏对象,在当前jsp页面中添加<%@ page isErrorPage=“true”%>,重新刷新页面,在tomcat的work包里的servlet文件中,会自动出现exception对象
三、Cookie
Cookie在客户端做数据存储,和session在服务端做数据存储类似
Cookie类继承Object类
可以同时建立多个Cookie
1. CookieServlet类
@WebServlet("/cs")
public class CookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理乱码
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset = utf-8");
String no = request.getParameter("empno");
String name = request.getParameter("ename");
if ("123".equals(no) && "admin".equals(name)){
Cookie cookie = new Cookie("login", name);
cookie.setMaxAge(60 * 60 * 24 * 7);//设置保存时间
response.addCookie(cookie);
response.sendRedirect(request.getContextPath() + "/empok.jsp");
}else {
response.getWriter().println("登录失败");
}
}
}
2. empLogin.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%
String base = request.getContextPath() + "/";
System.out.println(base);
String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + base;
System.out.println(url);
%>
<base href="<%=url%>">
<%-- <%
String base = request.getContextPath() + "/";
String url = request.getScheme():
%>--%>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null){
for (Cookie cookie :cookies) {
if (cookie.getName().equals("login")){
response.sendRedirect(request.getContextPath() + "/empok.jsp");
}
}
}
%>
<form action="cs" method="get">
员工编号<input type="text" name="empno"><br/>
员工姓名<input type="text" name="ename"><br/>
<input type="submit" name="提交">
</form>
<a href="emp/reg">点击跳转注册</a>
</body>
</html>
3. emok.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录成功!!</h1>
</body>
</html>
四、Ajax
Ajax = Asychronous + Javascript + And + Xml(JSON)
JSON(javascript的原生对象)Java
Script
Object
Notation
1. 同步请求和异步请求
同步请求(Web):页面跟着请求一起走,到服务器端需要对当前页面的所有数据集合,重新查询,在返回。
异步请求(Ajax):页面不跟请求走,只有局部区域的内容发生变化。
2. Ajax优势劣势
Ajax优势:异步请求、局部刷新
不刷新整个页面,只刷新局部;
页面不需要刷新,提供连续的用户体验;
“按需请求”,减少带宽的占用,响应速度快;
把一部分服务器的压力,转交给前端。
Ajax劣势:
如果一个页面大量使用ajax的话,那么该页面的搜索性能查
破坏了history历史记录的机制
3. Ajax常用方法
3.1 open(method, URL, async)
建立与服务器的连接
method指定请求的HTTP方法,一般为get或post
URL指定请求的地址
async指定是否使用异步请求,值为true或false,一般不写或写true
3.2 send(content)
发送请求
content指定请求的参数
3.3 setRequestHeader(header, value)
设置请求的头信息
4. Ajax常用属性
XMLHttpRequest的状态信息:readystate
就绪状态码 | 说明 |
---|---|
0 | XMLHttpRequest对象未完成初始化 |
1 | XMLHttpRequest对象开始发送请求 |
2 | XMLHttpRequest对象的请求发送完成 |
3 | XMLHttpRequest对象开始读取响应 |
4 | XMLHttpRequest对象读取响应结束 |
监听事件变化:Onreadystatechange
5. Web与Ajax差异
发送请求方式不同
Web:提交表单方式发送请求
Ajax:异步引擎对象发送请求
服务器响应不同
Web:相应内容是一个完整页面
Ajax:相应内容知识需要的数据
客户端处理方式不同
Web:需等待服务器响应完成并重新加载整个页面后用户才能进行操作
Ajax:可以动态更新页面中的部分内容,用户不需要等待请求的响应
6. Ajax工作流程
7. Ajax使用步骤
1、创建异步引擎对象XMLHttpRequest
2、设置一个请求:请求方式、请求路径、参数
3、发送请求
4、接收响应
五、同步请求、异步请求具体区别
1. ajaxUser.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="js/jquery-1.8.3 .js"></script>
<script type="text/javascript">
function demo1() {
//1、创建异步请求对象
var obj = new XMLHttpRequest();
//2、设置一个请求:请求方式、请求路径、参数
var str = document.myform.ename.value;
obj.open("get", "ajaxs?ename=" + str);
//3、发送请求
obj.send(null);//null请求的主体
//4、接收响应
obj.onreadystatechange = function () {
if (obj.readyState == 4 && obj.status == 200) {
document.getElementById("sid").innerText = obj.responseText;
}
}
}
function demo2() {
//1、创建异步请求对象
var req = new XMLHttpRequest();
//2、设置一个请求:请求方式、请求路径、参数
req.open("post", "ajaxs");
//3、发送请求
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
req.send("ename=" + document.myform2.ename2.value);
//4、接收响应
req.onreadystatechange = function () {
if (req.status == 200 && req.readyState == 4) {
document.getElementById("sid2").innerText = req.responseText;
}
}
}
function demo3() {
//1、创建异步请求对象
var obj = new XMLHttpRequest();
//2、设置一个请求:请求方式、请求路径、参数
var str = document.myform3.ename3.value;
obj.open("get", "ajaxs?ename=" + str);
//3、发送请求
obj.send(null);//null请求的主体
//4、接收响应
obj.onreadystatechange = function () {
if (obj.readyState == 4 && obj.status == 200) {
eval("var emp=" + obj.responseText);
document.getElementById("sid3").innerText = emp.empno + ";" + emp.ename + ";" + emp.job;
}
}
}
function demo4() {
//1、创建异步请求对象
var obj = new XMLHttpRequest();
//2、设置一个请求:请求方式、请求路径、参数
var str = document.myform4.ename4.value;
obj.open("get", "ajaxs?ename=" + str);
//3、发送请求
obj.send(null);//null请求的主体
//4、接收响应
obj.onreadystatechange = function () {
if (obj.readyState == 4 && obj.status == 200) {
eval("var emps=" + obj.responseText);
$("select").empty();
for (var i = 0; i < emps.length; i++) {
$("<option value='" +
emps[i].empno + "'>" +
emps[i].ename + "_" +
emps[i].job + "</option>").appendTo("[id='sel']");
}
}
}
}
//5、为txt5添加异步请求
$(document).ready(function () {
//为txt5文本框添加异步请求
$("[name='txt5']").blur(function () {
$.ajax({
type: "get",
url: "ajaxs?ename=" + $(this).val(),
success: function (str) {
JSON.stringify(str);
$("[name='txt5']").next().text(str.empno + ";" + str.ename + ";" + str.job);
}
});
});
//6、为txt6添加异步请求
$("[name='txt6']").blur(function () {
var ename = $("[name='txt6']").val();
alert(ename);
$.get("ajaxs", "ename=" + ename, function (emps) {
JSON.stringify(emps);
alert(emps);
$("#sel6").empty();
for (var i = 0; i < emps.length; i++) {
$("<option value='" +
emps[i].empno + "'>" +
emps[i].ename +
"</option>").appendTo("#sel6");
}
});
});
});
</script>
</head>
<body>
<table border="1px">
<tr>
<td style="height: 200px;width: 300px">
<form name="myform">
<input type="text" name="ename" onblur="demo1()"/><span id="sid"></span>
</form>
</td>
<td style="height: 200px;width: 300px">
<form name="myform2">
<input type="text" name="ename2" onblur="demo2()"/><span id="sid2"></span>
</form>
</td>
<td style="height: 200px;width: 300px">
<form name="myform3">
<input type="text" name="ename3" onblur="demo3()"/><span id="sid3"></span>
</form>
</td>
<td style="height: 200px;width: 300px">
<form name="myform4">
<input type="text" name="ename4" onblur="demo4()"/>
<select id="sel"></select>
</form>
</td>
</tr>
<tr>
<td style="height: 200px;width: 300px">
<input type="text" name="txt5"><span></span>
</td>
<td style="height: 200px;width: 300px">
<input type="text" name="txt6">
<select id="sel6"></select>
</td>
<td style="height: 200px;width: 300px"></td>
<td style="height: 200px;width: 300px"></td>
</tr>
</table>
</body>
</html>
2. AjaxServlet文件
package com.controller;
import com.google.gson.Gson;
import entry.Emp;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
@WebServlet("/ajaxs")
public class AjaxServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理乱码
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset = utf-8");
String ename = request.getParameter("ename");
if ("admin".equals(ename)){
response.getWriter().println("[]");
}else{
ArrayList<Emp> list = new ArrayList<>();
list.add(new Emp(1234, "alen", "job"));
list.add(new Emp(1214, "ellen", "jobes"));
Gson gson = new Gson();
response.getWriter().println(gson.toJson(list));
}
}
}
总结
本文我们讲述了:
Servlet和jsp是一对一、一对多的关系,一对多时,可以用反射简单实现
Cookie用来在客户端做数据存储,做了如何实现7天用户免登录
Ajax与Web对比:Ajax是局部刷新,而Web是全屏刷新
好没意思哦…地球人能不能搞出点新鲜玩应儿啊…