系列文章目录
第一章 JAVA集中学习第一周学习记录(一)
第二章 JAVA集中学习第一周项目实践
第三章 JAVA集中学习第一周学习记录(二)
第四章 JAVA集中学习第一周课后习题
第五章 JAVA集中学习第二周学习记录(一)
第六章 JAVA集中学习第二周项目实践
第七章 JAVA集中学习第二周学习记录(二)
第八章 JAVA集中学习第二周课后习题
第九章 JAVA集中学习第二周学习记录(三)
第十章 JAVA集中学习第二周学习记录(四)
第十一章 JAVA集中学习第三周学习记录(一)
第十二章 JAVA集中学习第三周小组项目开发
第十三章 JAVA集中学习第四周学习记录(一)
第十四章 JAVA集中学习第四周学习记录(二)
第十五章 JAVA集中学习第四周学习记录(三)
第十六章 JAVA集中学习第四周学习记录(四)
第十七章 JAVA集中学习第五周学习记录(一)
第十八章 JAVA集中学习第五周学习记录(二)
文章目录
- 系列文章目录
- 前言
- 一、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 设置响应主体
- 二、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 + "登陆失败");
二、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 {@Overrideprotected 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 {@Overrideprotected 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是全屏刷新
好没意思哦…地球人能不能搞出点新鲜玩应儿啊…