JavaWeb
一、基本概念
1.1 基本介绍
web开发:
- web -- 网页
- 静态web
- html,css
- 提供给所有人看,始终不会发生变化
- 动态web
- 淘宝
- 根据不同的人展示不同的效果
Java中,动态web资源开发的技术统称为JavaWeb
软件架构:
-
C/S:客户端/服务器端
-
B/S:浏览器/服务器端
资源分类:
-
静态资源:用户访问后一样(静态资源可以直接被浏览器解析)
html,css,JavaScript
-
动态资源:用户访问不一样(动态资源被访问后,需要转换为静态资源,再返回给浏览器)
servlet,jsp,php,asp
网络通信三要素:
IP:电子设备在网路中的唯一标识
端口:应用程序在计算机中的唯一标识符 0~65536
传输协议:规定了数据传输的规则(tcp:安全协议,三次握手,速度稍慢。udp:不安全协议,速度慢)
1.2 web应用程序
web应用程序:
- 可以提供浏览器访问的程序
- 一个web应用由多部份组成
- html,css,js
- jsp,servlet
- java程序
- jar包
- 配置文件(Properties)
- web应用程序填写完毕后,若想提供给外界访问:需要一个服务器来统一管理
1.3 静态Web
- *.html... 若服务器一直存在,则直接可以访问到
- 静态web存在的缺点
- web页面无法动态更新,所有用户看到的都是同一个页面
- 轮番图,点击特效:伪动态
- JavaScript
- VBScript
- 无法和数据库交互(数据无法持久化)
- web页面无法动态更新,所有用户看到的都是同一个页面
1.4 动态Web
- 页面可以动态展示:“Web的页面因人而异”
- 缺点
- 加入服务器的动态web资源出现了错误,我们需要重新编写后台程序,重新发布
- 停机维护
- 优点
- web页面无法动态更新,所有用户看到的都不是同一个页面
- 可以和数据库交互(数据可以持久化)
二、Web服务器
2.1 之前的技术
ASP
- 微软:国内最早运行
- HTML中嵌入了VB的脚本,ASP+COM
- 页面特别乱,维护困难
JSP/Servlet
- sun公司主推的B/S架构
- 基于Java语言
- 可以承载三高问题(高并发,高性能,高承载量)
- 语法像ASP,加强市场强度
PHP
- 开发速度快,功能强大、跨平台,代码简单
- 无法承担大访问量的情况(局限性)
2.2 Web服务器
服务器是一种被动的操作,用来处理用户的一些请求,和给用户一些响应信息
IIS
webLogic
webSphere
JBOSS
Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,是目前比较流行的Web 应用服务器。
三、Tomcat
https://how2j.cn/k/tomcat/tomcat-tutorial/541.html#nowhere
3.1 网站访问(面试)
- 输入域名,回车
- 检查本机hosts配置文件下有无域名映射
- 有,直接返回对应的ip地址
- 没有,去DNS服务器找,并返回结果
四、HTTP
4.1 什么是Http
HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。
- 文本:html,字符串,~,....
- 超文本:图片,音乐,视频定位,地图....
- 80
HTTPS:安全的
- 403
4.2 两个时代
- http 1.0
- HTTP/1.0:客户端可以与服务器连接后,只能获得一个web资源,断开连接。
- http 2.0
- HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。
4.3 HTTP请求
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get/post方法
Status Code: 200 OK 状态码
Remote Address: 127.0.0.1:7890 Remote:远程
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 语言
Cache-Control: max-age=0
Connection: keep-alive
1.请求行
- 请求行中的方式
- get(高效),一次请求,携带参数少,有限制
- post(安全)
2.消息头
Accept: 告诉浏览器,支持的数据类型
Accept-Encoding: 支持的编码格式
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 语言环境
Cache-Control: max-age=0 缓存控制
Connection: keep-alive 告诉浏览器,请求完成是断开还是保持连接
HOST 主机
GET 请求
- form 标签 method=get
- a 标签
- link 标签引入 css
- Script 标签引入 js 文件
- img 标签引入图片
- iframe 引入 html 页面
- 在浏览器地址栏中输入地址后敲回车
POST请求
- form 标签 method=post
4.4 HTTP响应
1.响应体
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Refrush:刷新告诉客户端多久刷新一次
Location:让网页重新定位
2.响应状态码
- 200:请求成功
- 3xx:请求重定向
- 重定向:重新找新位置
- 4xx:找不到资源 404
- 资源不存在
- 5xx:服务器代码错误
- 500
- 502 网关错误
五、Maven
六、XML
6.1 概念:
Extensible Markup Language 可扩展标记语言
可扩展:标签自定义
功能:存储数据
xml和html的区别:
- xml标签都是自定义的,html标签是预定义。
- xml的语法严格,html语法松散
- xml是存储数据的,html是展示数据
语法:
基本语法:
- xml文档的后缀名 .xml
- xml第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须使用引号(单双都可)引起来
- 标签必须正确关闭
- xml标签名称区分大小写
组成成分:
- 文档声明
- 指令
- 标签
- 属性
- 文本
约束:
- 框架使用者
- 分类
- DTD
- Schema
解析:
- 操作xml文档
- 解析
- 写入
- 解析xml的方式
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
- SAX:逐行读取,基于事件驱动的
- xml常见的解析器
- JAXP
- DOM4J
- Jsoup
- PULL
七、Servlet
7.1 Servlet简介
- Servlet是sun公司开发的一门动态web技术
- Servlet是JavaEE规范之一。规范就是接口
- Sun在这些API中提供了一个接口叫做:Servlet
- Servlet是一个运行在服务器上的一个java小程序
JavaWeb三大组件
- Servlet程序
- Filter过滤器
- Listener监听器
实现Servlet
- 想要开发Servlet程序只需
- 编写一个类,实现Servlet接口
- 把开发好的java类部署到web服务器中
把实现了Servlet接口的Java程序叫做,Servlet
7.2 Servlet执行原理
- 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否有对应的
标签体内容。 - 如果有,则在找到对应的
全类名 - tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
7.3 Servlet生命周期
-
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
-
init() 方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。
public void init() throws ServletException { // 初始化代码... }
-
service() 方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{ }
-
doget() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
-
dopost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
-
destroy() 方法
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
public void destroy() { // 终止化代码... }
7.4 Servlet体系结构
Servlet -- 接口
|
GenericServlet -- 抽象类
|
HttpServlet -- 抽象类
-
GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
- 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
-
HttpServlet:对http协议的一种封装,简化操作
- 定义类继承HttpServlet
- 复写doGet/doPost方法
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
7.5 ServletConfig类
Servlet 程序的配置信息类
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象
作用
- 可以获取 Servlet 程序的别名 servlet-name 的值
- 获取初始化参数 init-param
- 获取 ServletContext 对象
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- servlet标签: 给Tomcat配置servlet配置-->
<servlet>
<!-- servlet-name标签: Servlet 程序起一个别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!-- 一般为servlet程序的全类名-->
<servlet-class>cn.imut.controller.HelloServlet</servlet-class>
</servlet>
<!-- servlet-mapping: 给servlet程序配置访问地址-->
<servlet-mapping>
<!-- servlet-name: 告诉服务器,我当前配置的地址给哪个servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--
url-pattern 标签配置访问地址
/ 斜杠在服务器解析时,表示地址为:http://ip:port/工程路径
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
7.6 ServletContext类
介绍
-
ServletContext 是一个接口,它表示 Servlet 上下文对象
-
一个 web 工程,只有一个 ServletContext 对象实例。
-
ServletContext 对象是一个域对象。
-
ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁
域对象
是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个 web 工程。
作用
-
获取 web.xml 中配置的上下文参数 context-param
-
获取当前的工程路径,格式:/工程路径
-
获取工程部署后在服务器硬盘上的绝对路径
-
像 Map 一样存取数据
八、Request与Response
8.1 HttpServletRequest 类
作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的 信息。
常用方法
请求转发
请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
8.2 HttpServletResponse 类
作用
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。
HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
输出流
只能使用一个!
请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)。
8.3 Web中的路径
- 相对路径
- 绝对路径
在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。
九、JSP(略)
9.1 概念:
Java Server Pages: java服务器端页面
可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码用于简化书写!!!
9.2 原理
JSP本质上就是一个Servlet
9.3 JSP的脚本
JSP定义Java代码的方式
<% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
<%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
<%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
9.4 JSP的内置对象
在jsp页面中不需要获取和创建,可以直接使用的对象
jsp一共有9个内置对象。
学习3个:
request
response
out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
response.getWriter()和out.write()的区别:
在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
response.getWriter()数据输出永远在out.write()之前
十、EL表达式(略)
10.1 EL表达式介绍
EL 表达式的全称是:Expression Language。是表达式语言。
10.2 EL表达式作用
EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。
因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
<body>
<%
request.setAttribute("key","值");
%>
表达式脚本输出 key 的值是: <%=request.getAttribute("key1")==null?"": request.getAttribute("key1")%><br/>
EL 表达式输出 key 的值是:${key1}
</body>
-
EL 表达式的格式是:${表达式}
-
EL 表达式在输出 null 值的时候,输出的是空串。
-
jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串
10.3 EL表达式搜索域数据的顺序
EL 表达式主要是在 jsp 页面中输出数据。
主要是输出域对象中的数据。
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
十一、JSTL
11.1 介绍
JSTL 标签库 全称是指 JSPStandardTagLibrary JSP 标准标签库。是一个不断完善的开放源代码的 JSP 标 签库。
EL 表达式主要是为了替换 jsp 中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个 jsp 页面 变得更佳简洁
11.2 组成
....
注:前后端分离的时代,jsp了解即可,重在思想
十二、Cookie
12.1 介绍
- Cookie 翻译过来是饼干的意思
- Cookie 是服务器通知客户端保存键值对的一种技术
- 客户端有了 Cookie 后,每次请求都发送给服务器
- 每个 Cookie 的大小不能超过 4kb
12.2 创建
public void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 创建cookie对象
Cookie cookie = new Cookie("key1", "value1");
//2. 通知客户端保存cookie
response.addCookie(cookie);
response.getWriter().write("Cookie 创建成功");
}
12.3 服务器获取Cookie
Cookie工具类
package cn.imut.utils;
import javax.servlet.http.Cookie;
public class CookieUtils {
public static Cookie findCookie(String name, Cookie[] cookies) {
if(name == null || cookies == null || cookies.length == 0) {
return null;
}
for (Cookie cookie: cookies) {
if(name.equals(cookie.getName())){
return cookie;
}
}
return null;
}
}
public void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
// getName方法 返回 Cookie的 key(名)
// getValue方法 返回 Cookie的 value值
for (Cookie cookie : cookies) {
resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
}
Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
//如果不等于null,说明赋过值,也就是找到了需要的Cookie
if (iWantCookie != null) {
resp.getWriter().write("找到了需要的 Cookie");
}
}
12.4 Cookie值的修改
方案一、
- 创建一个要修改的同名(指的就是 key)的 Cookie 对象
- 在构造器,同时赋于新的 Cookie 值
- 调用 response.addCookie(Cookie)
方案二、
- 先查找到需要修改的 Cookie 对象
- 调用 setValue()方法赋于新的 Cookie 值
- 调用 response.addCookie()通知客户端保存修改
12.5 浏览器中查看Cookie
12.6 Cookie生命控制
Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
setMaxAge()
- 正数,表示在指定的秒数后过期
- 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
- 零,表示马上删除 Cookie
十三、Session会话
13.1 介绍
- Session 就一个接口(HttpSession)
- Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术
- 每个客户端都有自己的一个 Session 会话。
- Session 会话中,我们经常用来保存用户登录之后的信息。
13.2 创建Session和获取
request.getSession()
第一次调用是:创建 Session 会话
之后调用都是:获取前面创建好的 Session 会话对象。
isNew()判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
getId() 得到 Session 的会话 id 值。
13.3 Session域数据的存取
public void serAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().setAttribute("key1", "value1");
response.getWriter().write("向Session中保存了数据");
}
public void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object attribute = request.getSession().getAttribute("key1");
response.getWriter().write("从Session中获取出key1的数据是:", + attribute);
}
13.4 Session生命周期控制
publicvoidsetMaxInactiveInterval(intinterval)
设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。
- 值为正数的时候,设定 Session 的超时时长。
- 负数表示永不超时(极少使用)
publicintgetMaxInactiveInterval(): 获取 Session 的超时时间
publicvoidinvalidate() : 让当前 Session 会话马上超时无效。
Session 默认的超时时间长为 30 分钟。
因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session 超时配置默认时长为:30 分钟。
<session-config>
<session-timeout>30</session-timeout>
</session-config
十五、Listener监听器
事件监听机制
-
事件 :一件事情
-
事件源 :事件发生的地方
-
监听器 :一个对象
-
注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
十六、JSON
16.1 介绍
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
JSON 采用完全独立于语言的文本格式,而且很多语言都提供了对 json 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python 等)。这样就使得 JSON 成为理想的数据交换格式。
json 是一种轻量级的数据交换格式。
轻量级指的是跟 xml 做比较。
数据交换指的是客户端和服务器之间业务数据的传递格式。
16.2 JSON在JavaScript中的使用
定义
json 是由键值对组成,并且由花括号(大括号)包围。每个键由引号引起来,键和值之间使用冒号进行分隔, 多组键值对之间进行逗号进行分隔。
var jsonObj = {
"key1": 12,
"key2": "abc",
"key3": true,
"key4": [11, "arr", false],
"key5": {
"key5_1": 551,
"key5_2": "key5_2_value"
},
"key6": [
{
"key6_1_1": 6611,
"key6_1_2": "key6_1_2_value"
},
{
"key6_2_1": 6621,
"key6_2_2": "key6_2_2_value"
}
]
};
访问
- json 本身是一个对象。
- json 中的 key 我们可以理解为是对象中的一个属性。
- json 中的 key 访问就跟访问对象的属性一样: json 对象.key
alert(typeof(jsonObj)); // object json就是一个对象
alert(jsonObj.key1); //12
alert(jsonObj.key2); // abc
alert(jsonObj.key3); // true
alert(jsonObj.key4); // 得 到 数 组 [11,"arr",false] //
//json 中 数 组 值 的 遍 历
for(var i = 0; i < jsonObj.key4.length; i++) {
alert(jsonObj.key4[i]);
}
alert(jsonObj.key5.key5_1); //551
alert(jsonObj.key5.key5_2); //key5_2_value
alert( jsonObj.key6 ); // 得 到 json 数 组
//取 出 来 每 一 个 元 素 都 是json对 象
var jsonItem = jsonObj.key6[0];
alert( jsonItem.key6_1_1 ); //6611
alert( jsonItem.key6_1_2 ); //key6_1_2_value
常用方法
- 对象形式存在:json对象
- 字符串形式存在
一般我们要操作 json 中的数据的时候,需要 json 对象的格式。
一般我们要在客户端和服务器之间进行数据交换的时候,使用 json 字符串。
- JSON.stringify(): 把 json 对象转换成为 json 字符串
- JSON.parse() :把 json 字符串转换成为 json 对象
16.3 JSON在Java中的使用
javaBean和json的互转
public void test1() {
Student student = new Student(1,"磊爷");
Gson gson = new Gson();
//toJson方法 :将java对象转换为json字符串
String studentJsonString = gson.toJson(student);
System.out.println(studentJsonString);
//fromJson把json字符串转换回java对象(json字符串,Java对象类型)
Student student1 = gson.fromJson(studentJsonString,Student.class);
System.out.println(student1);
}
List与json的互转,map与json的互转同理
十七、AJAX请求
17.1 介绍
AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发 技术。
ajax 是一种浏览器通过 js 异步发起请求,局部更新页面的技术。
Ajax 请求的局部更新,浏览器地址栏不会发生变化
局部更新不会舍弃原来页面的内容