七、Servlet
1、Servlet技术
1.1、什么是Servlet
1、Servlet 是JavaEE规范之一。规范就是接口
2、Servlet 是JavaWeb三大组件之一
3、JavaWeb三大组件就是:Servlet程序、Filter过滤器、Listener监听器
4、Servlet是运行在服务器上的员工java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
5、Servlet=Server+applet
6、Servlet:服务端的小程序
7、例子

❤️❤️❤️❤️8、过程

1.2、实现Servlet程序
1、步骤
1、编写一个类去实现Servlet接口
2、实现service方法,处理请求,并响应数据
3、到web.xml中去配置servlet程序的访问地址
2、例子
1、java代码(servlet)
package com.qtServlet;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet 被访问了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2、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>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.qtServlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
</web-app>
3、index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>w我是首页</title>
</head>
<body>
<h1>我是大刷个!!!</h1>
<a href="/06_servlet/helloServlet">进入servlet</a>
</body>
</html>
3、路径

1.3、Servlet地址如何定位到Servlet程序
1、图解

1.4、Servlet生命周期
1、方法顺序

1.5、GET和POST请求的分发处理
1、内容

1.6、通过继承HTTPServlet实现Servlelt程序
1、方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这里是Get方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这里是POST方法");
}
1.7、使用Idea创建Servlet
1、步骤
1、对src右键,New,Servlet
1.8、整个Servlet类的继承体系
1、继承体系图

2、ServletConfig类
1、是servlet程序的配置信息类
2、Servlet程序和ServletConfig对象都是Tomcat负责创建,我们负责使用
3、Servlet查询默认第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象
4、每个ServletConfig信息在每个Servlet是独立的
2.1、ServletConfig类的三大作用
1、可以获取Servlet程序的别名servlet-name的值
2、获取初始化参数init-param的值
3、获取去ServletContext对象
4、该类一般在 init中使用
5、重写init方法里面,一定要调用弗雷的init(ServletConfig)操作
3、ServletContext类
3.1、什么是ServletContext
1、ServletContext是一个接口,表示Servlet上下文
2、一个web工程,只有一个ServletC对象实例
3、ServletContext对象是一个域对象
4、ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁
1、什么是域对象
1、域对象,是可以像Map一样存取数据的对象,叫域对象
2、这里的域指的是存取数据的操作范围,整个web工程。
2、Map和域对象比较

3.2、ServletContext类的四个作用
1、内容
1、获取web.xml 中的配置上下文参数context-param
2、获取当前的工程路径,格式:/工程路径
3、获取工程部署后在服务器硬盘上的绝对路径
4、像Map 一样存取数据
2、例子
1、xml文件
<servlet>
<servlet-name>ContextServlet</servlet-name>
<servlet-class>com.qt.Servlets.ContextServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql:localhost:3306/test</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ContextServlet</servlet-name>
<url-pattern>/context2</url-pattern>
</servlet-mapping>
2、java文件
package com.qt.Servlets;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ContextServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException {
// super.init();
ServletContext context = getServletConfig().getServletContext();
// 获取初始化参数init-param
System.out.println("初始化参数username的值是:"+context.getInitParameter("username"));
System.out.println("初始化参数url的值是:"+context.getInitParameter("url"));
// 获取ServletContext对象
System.out.println(context);
System.out.println("当前工程路径"+context.getContextPath());
System.out.println("工程部署的路径:"+context.getRealPath("/"));
// System.out.println("工程下的css");
System.out.println("保存之前,获取Context的key1值是:"+context.getAttribute("key1"));
context.setAttribute("key1","value1");
System.out.println("获取Context的key1值"+context.getAttribute("key1"));
}
}
4、HTTP协议
4.1、什么是HTTP协议
1、内容
1、协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。
2、HTTP协议,是指客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议
3、HTTP协议中的数据也叫报文。
4.2、请求的HTTP协议的格式
1、客户端给服务器发送的数据叫请求
2、服务器给客户端回传数据叫响应
3、请求又分为GET请求和POST请求
1、GET请求内容格式
1、内容

2、图解

2、POST请求内容格式
1、内容

2、图解

3、常用的请求头说明
| 请求头 | 说明 |
|---|---|
| Accept | 表示客户端可以接受的数据类型 |
| Accept-Language | 表示客户端可以接收的语言类型 |
| User-Agent | 表示客户端浏览器的信息 |
| Host | 表示请求时的服务器ip和端口号 |
4、哪些是GET请求,哪些是POST请求
1、GET请求
| Get请求有: |
|---|
| form标签 method=get |
| a标签 |
| link标签引入css |
| Script标签引入js文件 |
| img标签引入图片 |
| iframe引入html页面 |
| 在浏览器地址栏中输入地址后回车 |
2、POST请求
| POST请求有: |
|---|
| form标签 method=post |
4.3、响应的HTTP协议格式
1、内容

2、图例

4.4、常用的响应码说明
| 响应码 | 说明 |
|---|---|
| 200 | 表示请求成功 |
| 302 | 表示请求重定向 |
| 404 | 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误) |
| 500 | 表示服务器已经收到请求,但服务器内部错误(代码错误) |
4.5、MIME类型说明
1、说明是MIME
1、MIME是HTTP协议中的数据类型
2、MIME的英文全称是“Multipurpose Internet Mail Extensions”多功能的Internet邮件扩充服务。
3、MIME类型的格式是"大类型/小类型",并与某一种文件的扩展名相对应
2、常见的MIME类型
| 文件 | 扩展名 | MIME类型 |
|---|---|---|
| 超文本标签语言文本 | .html,htm | text/html |
| 普通文本 | .txt | text/plain |
| RTF文本 | .rtf | application/rtf |
| GIF图形 | .gif | image/gif |
| JPEG图形 | .jpeg,.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文件 | ||
| GZIP文件 | ||
| TAR文件 |
3、谷歌如何查看HTTP协议
1、谷歌

5、HTTPServletRequest
5.1、HTTPServletRequest类有什么作用
1、内容
1、每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析封装到Request对象中。然后传递到servlet方法(doGet和doPost)中给我们使用,我们可以通过HTTPServletRequest对象,获取所有请求的信息
5.2、HTTPServletRequest类的常用方法
1、内容

2、例子
1、java代码
package com.qt.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的资源路径
System.out.println("URI=="+req.getRequestURI());
// 呼气请求的同意资源定位符(绝对路径)
System.out.println("URL=="+req.getRequestURL());
// 获取客户端的ip地址
System.out.println("地址ip:"+req.getRemoteHost());
// 获取请求头
System.out.println("请求头:"+req.getHeader("User-Agent"));
// 获取请求的方式get或者post
System.out.println("请求方式:"+req.getMethod());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
2、web.xml代码
<servlet>
<servlet-name>RequestAPIServlet</servlet-name>
<servlet-class>com.qt.servlet.RequestAPIServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestAPIServlet</servlet-name>
<url-pattern>/requestAPIServlet</url-pattern>
</servlet-mapping>
5.3、如何获取请求参数
1、例子
1、java代码
package com.qt.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码"+password);
System.out.println("兴趣爱好:"+ Arrays.asList(hobby));
}
}
2、html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="get" >
用户名:<input type="text" name="username"><br/>
密码:<input type="text" name="password"><br/>
兴趣爱好:<input type="checkbox" name="hobby" value="cpp">c++
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="js">JavaScript<br/>
<input type="submit" >
</form>
</body>
</html>
3、web.xml代码
<servlet>
<servlet-name>ParameterServlet</servlet-name>
<servlet-class>com.qt.servlet.ParameterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ParameterServlet</servlet-name>
<url-pattern>/parameterServlet</url-pattern>
</servlet-mapping>
2、doGet请求的中文乱码解决
1、内容

3、doPost请求的中文乱码解决
1、内容

2、注意:该方法要写在请求最前面,否则不管用
5.4、请求的转发
1、什么是请求转发
1、请求转发是指,服务器收到请求后,从一次资源跳到另一个资源的
2、请求转发的特点
1、浏览器地址栏没有变化
2、他们是一次请求
3、他们共享Request域中的数据
4、可以转发到WEB-INF目录下
5、不可以访问工程以外的资源
3、图解转发请求
1、内容

5.5、base标签的作用
1、base标签
1、\
2、格式:\
2、图解作用

5.6、Web中的相对路径和绝对路径
1、相对路径
1、

2、绝对路径
1、

3、实际开发中
1、绝对路径
2、base+相对路径
5.7、web中的 / 斜杠的不同含义
1、在web中
1、是一种绝对路径
2、在浏览器解析中
1、得到的地址是:http://ip:port/
2、\斜杠\
3、在服务器解析中
1、得到的地址是:http://ip/port/工程路径
2、

3、特殊情况:response.sendRediect("/"); 把斜杠发送给浏览器解析。得到的http://ip:port/
6、HTTPServletResponse类
6.1、HTTPServletResponse类的作用
1、HttpServletResponse类和HttpServletResquest类一样,每次请求进来,Tomcat都会创建一个Response对象传递给Servlet程序去使用。HttpServletResquest表示请求过来的信息,HttpS而vletResquest表示所有响应的信息。
2、如果我们需要设置返回给客户端的信息,都可以通过HTTPServletResponse对象来进行设置。
6.2、两个输出流说明
1、内容

2、注意
1、两个流同时只能使用一个
2、使用了字节流,就不能再使用字符流,反之亦然,否则就会报错
6.3、如何往客户端回传数据
1、例子

6.4、响应的乱码解决
1、方式一(不推荐使用)
1、设置服务器字符集为UTF-8
2、通过响应头,设置浏览器也使用UTF-8
3、例子

2、方式二(推荐使用)
1、同时设置客户端和服务器的字符集,还设置了响应头
2、该方法也必须在获取流对象之前使用
3、例子

6.5、请求重定向
1、什么是重定向
1、请求重定向,是指客户端给服务器发送请求,服务器接收到请求后,在给客户端发送一个地址,客户端去重新访问地址。叫重定向(因为客户端第一次访问的地址可能废弃了 )
2、重定向图解

3、重定向的特点
1、浏览器地址栏会发生变化
2、两次请求
3、不共享Request域中的数据
4、不能访问WEB-INF下的资源
5、可以访问工程以外的资源
4、重定向方法一
1、步骤
(1)设置响应状态码
(2)设置响应头,说明新的地址在哪
2、例子

5、重定向方法二(推荐使用)
1、使用sendRedirect方法
2、例子

7、JavaEE项目的三层架构
7.1、图示
1、内容

2、分层

7.2、补充:idea断点使用
1、Debug调试代码,两个元素:断点+Debug启动服务器

2、测试工具栏

3、窗口变量
1、介绍:可以查看当前方法范围内所有有效的变量。
2、图示

4、方法栈调用

5、其他相关按钮
