# JavaWebServlet
**Repository Path**: fowner/java-web-servlet
## Basic Information
- **Project Name**: JavaWebServlet
- **Description**: 重新系统学习JavaWeb基础之Servlet
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2020-11-06
- **Last Updated**: 2022-06-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Servlet技术
## servlet概述
+ Servlet是javaEE规范(即接口)之一。
+ Servlet是JavaWeb三大组件之一。
+ Servlet是运行在服务器上的一个Java小程序。
## 如何手动实现Servlet程序
+ 编写一个类实现Servlet接口。
+ 实现service方法,处理请求,并响应数据。
+ 到web.xml中去配置Servlet程序的访问地址。
## Servlet生命周期
1. 执行Servlet构造器
第一次请求的时候,被执行。以后再次请求不执行。
2. 执行init初始化方法
第一次请求的时候,被执行。以后再次请求不执行。
3. 执行servlce方法
每次访问都会被执行。
4. 执行destroy方法
在Web工程停止的时候执行。
## Get请求方式和Post请求方式的分发处理(实现servlet接口情况下)
1. 将ServletRequest对象进行类型进行类型转换(HttpServletRequest)
2. 通过强转后的对象获取请求方式
3. 对请求方式进行判断分别处理即可。
## 通过继承HttpServlet类的方式实现Servlet程序
注意:
一般在开发中通常使用这种方式,去实现servlet程序。
1. 编写一个类继承HttpServlet类。
2. 根据业务需要重写doGet方法或者doPost方法。
3. 到web.xml中配置servlet程序访问地址。
## 也可以通过IDEA(非交流版)直接创建servlet(是以继承HttpServlet方式创建的)
## Servlet继承体系
详见servlet学习.drawio笔记
## ServletConfig类
```
ServletConfig类是servlet的配置信息。
servlet程序和servletConfig对象都是有tomcat服务器进行创建,我们负责使用。
Servlet程序默认是第一次访问的时候创建。servletConfig对象是每一个servlet程序创建的时候对应的一个配置文件。
```
### ServletConfig类三大作用
+ 可以获取Servlet程序别名,即servlet-name的值。
+ 获取初始化参数值,即init-param。
+ 获取ServletContext对象
```
注意:
1.只能获取当前servlet的以上信息,不能获取其他servlet的信息。
2.当对通过继承HttpServlet方法实现Servlet程序时,并对init方法进行了重写,那么在init方法必须调用super.init()方法。否则当想获取不到servletConfig信息。
```
## ServletContext类
### ServletContext概述
+ ServletContext是一个接口,它是上下文对象。
+ 一个web工程只有一个servletContxt对象实例。
+ servletContext是一个域对象。
+ ServletContext在Web工程启动的时候执行,工程停止的时候销毁。
```
补充:
1.什么是域对象?
域对象是一个可以像map一样存取数据的对象。
这里的域指存取数据的操作范围。范围是整个工程。
2.
```
Map和域对象操作方式一览
Map/域对象 | 存数据 | 取数据 | 删除数据
---|---|---|---
Map | put("") | get("") | remove("")
域对象 | setAttribute("") | getAttribute("") | removeAttribute("")
### ServletContext类的四个作用
+ 获取web.xml配置文件中上下文参数context-param
+ 获取当前工程路径。格式:/工程路径
+ 获取工程部署后在服务器硬盘的绝对路径。
+ 像map一样存取数据。
## Http协议
### Http协议概述
```
什么叫协议?
指双方或者多方需要遵守的规则,即协议。
什么是Http协议?
所谓的Http就是,客户端和服务端之间通信时,发送的数据需要遵守的规则。Http协议中的数据又叫报文。
```
### 请求的Http协议
```
客户端给服务端发送数据叫请求。
服务端给客户端发送数据叫响应。
请求又分为Get请求和Post请求。
```
#### Get请求
1. 请求行
+ 请求的方式
GET
+ 请求的资源路径[+?+请求参数]
注:[]部分是可选的
+ 请求协议版本
http/1.1
2. 请求头
key:value组成。不同的键值对表示不同的含义。
常用的请求头
Accept:告诉服务器,客户端可以接收口的数据类型。
Accept-Language:告诉服务器可以接受的语言类型。
User-Agent:浏览器信息。
Accept-Encoding:告诉服务器客户端可以接受的数据编码类型。
Host:表示请求的服务器iphe端口号。
Connection:告诉服务器请求连接如何处理。
Keep-Active:告诉服务器传回数据不立刻关闭。
Closed:马上关闭。
#### Post请求
1. 请求行
+ 请求的方式
POST
+ 请求的资源路径[+?+请求参数]
注:[]部分是可选的
+ 请求协议版本
http/1.1
2. 请求头
key:value组成。不同的键值对表示不同的含义。
3. 空行
4. 请求体
发送给服务器的数据。
Accept:告诉服务器,客户端可以接收口的数据类型。
Accept-Language:告诉服务器可以接受的语言类型。
User-Agent:浏览器信息。
Accept-Encoding:告诉服务器客户端可以接受的数据编码类型。
Host:表示请求的服务器iphe端口号。
Connection:告诉服务器请求连接如何处理。
Keep-Active:告诉服务器传回数据不立刻关闭。
Closed:马上关闭。
Referer:表示请求发起时,浏览器地址栏中的地址。
Content-Type:表示发送的数据类型。
application/x-www-form-urlencoded:表示提交的数据是:key1=value1&key2=value2,然后对其进行url编码。
url编码是指把非英文内容转换为:%xx%xx
multipart/form-data:表示已多端的形式提交给服务器。(以流的形式,用于上传)
Content-Length:表示发送数据的长度。
Cache-Control:表示如何控制缓存。
no-cache:表示不缓存。
#### 常用的请求头
Accept:告诉服务器,客户端可以接收口的数据类型。
Accept-Language:告诉服务器可以接受的语言类型。
User-Agent:浏览器信息。
Host:表示请求的服务器iphe端口号。
#### 哪些是Get请求,哪些是POST请求
+ Get请求有哪些?
+ form标签method=get
+ a标签
+ link标签引入css
+ Scrript标签引入js文件
+ img标签引入图片
+ iframe引入html页面
+ 在浏览器中输入地址后敲击回车
+ Post请求有哪些?
+ form标签method=post
### 响应Http协议格式
1. 响应行
+ 响应协议和版本号
+ 响应状态码
+ 响应状态描述符
2. 响应头
+ key:value 不同的响应头有不同的含义。
3. 空行
4. 响应体
+ 回传给客户端的数据
### 常用的响应码
+ 200 表示请求成功
+ 302 表示请求重定向
+ 404 表示请求服务器已经收到,但是数据不存在。(请求地址不存在)
+ 500 表示服务器已经收到请求,只是服务器代码或者内部错误。
### MIME类型说明
```
MIME是HTTP协议中数据类型。
全称是Multipurpose Internet Mail Extentions。多功能网络邮件扩充服务。
MIME类型的格式:
大类型/小类型 并与一种文件的扩展名对应。
```
常用的MIME类型
文件 | 文件扩展名 | MIME类型
---|---|---
超文本标记文本 | .html/.htm | text/html
普通文本 | .txt | text/plain
RTF文本 | .rtf | application/rtf
GIF图片 | .gif | image/gif
JEPG图片 | .jepg/.jpg | image/jpeg
au声音文件 | .au | audio/basic
MIDI音乐文件 | .mid/.midi | audio/midi,audio/x-midi
RealAudio音乐文件 | .ra/.ram | audio/x-pn-realaudio
MPEG文件 | .mpg/.mpeg | video/mpeg
AVI文件 | .avi | video/x-msvideo
GZIP文件 | .gz | application/x-gzip
TAR文件 | .tar | application/x-tar
## HttpServletRequest类
### HttpServletRequest类的作用
```
每次只要请求进入到服务器(Tomcat等),服务器就会把请求的信息封装到request中去,然后传递到service方法中去给我们使用。我们可以通过HttpServletRequest获取所有的请求信息。
```
### HttpServletRequest类的常用API方法
+ getRequestURI() 获取请求的资源路径
+ getRequestURL() 获取请求的统一资源定位符(绝对路径)
+ getRemoteHost() 获取客户端的ip地址
+ getHeader(key) 获取请求头
+ getParameter(key) 获取请求参数
+ getParameterValues(key) 获取请求参数的值
+ getMethod() 获取请求方法
+ setAttribute(key,value) 设置域数据
+ getAttribute(key) 获取域数据
+ getRequestDispatcher() 获取请求转发对象
### 请求转发
```
什么是请求转发?
请求转发是指当服务器收到请求后,从一个资源跳转到另一个资源的过程。
```
请求转发特点
+ 浏览器地址栏没有变化
+ 它们是一次请求
+ 它们可以共享域数据
+ 可以转发到web-inf目录下
+ 不可以访问到工程以外的目录
### Base标签的作用
```
base标签解决了,请求转发跳转后,返回请求转发之前页面的访问路径的问题。
```
### Web工程中的绝对路径和相对路径
+ 相对路径
+ .表示当前路径
+ ..表示上一级目录
+ 资源名 表示当前目录/资源名
+ 绝对路径
http://ip:port/工程路径/资源路径
### Web项目中 / 的不同意义
```
在web中是一种绝对路径,在不同的地方值不同。
```
+ 被浏览器解析
+ 表示
http://ip地址:端口号/
+ 例
```斜杠```
+ 被服务器解析
+ 表示
http://IP地址:端口号/工程路径/
+ 例
1. web.xml中servlet-mapping标签配置的url-pattern。
```
ForwardC
/forwardc
```
2. servletContext.getRealPath("/")
3. request.getRequestDispatcher("/")
+ 特殊情况
+ 表示
把斜杠转发给浏览器解析。
+ 例
response.sendRedirect("/")
## HttpServletResponse类
### HttpServletResponse类的作用
```
HttpServletResponse和HttpServletRequest一样,每次请求进来,服务器都会创建一个response对象传给servlet程序使用。只是HttpServletRequest表示请求来的信息,HttpServletResponse表示响应的信息。
```
### 两个输出流
+ 字节流
getOuputStream()
常用于下载,传递二进制文件。
+ 字符流
getWriter()
常用于回传字符串
```
两个流只能使用一个,使用了字节流,就不能使用字符流。反之亦然。否则报错。
```
### 往客户端回传数据
```
通过输出流进行数据的回传。
PrintWriter printWriter = resp.getWriter();
printWriter.println("this is OK!");
printWriter.println("测试中文乱码:我爱你中国!");
```
### 中文乱码解决
### 方案1
1. 设置服务端的字符集
resp.setCharacterEncoding("UTF-8");
2. 设置浏览器的字符集
resp.setHeader("Content-Type","text/html;charset=UTF-8");
### 方案2
同时设定服务端的字符集和客户端的字符集
resp.setContentType("text/html;charset=UTF-8");
### 请求重定向
```
当客户端向服务器进行请求的时候,服务器告诉客户端,自己的地址变更了。你去新地址进行访问。这就叫做重定向。
```
#### 请求重定向的两种方式
+ 方式1
+ 设定状态码为302
```
resp.setStatus(302);
```
+ 设定重定向的地址Location的值
```
resp.setHeader("Location","http://www.baidu.com");
```
+ 方式2
下面的代码
```
resp.sendRedirect("http://www.baidu.com");
```