一、详细学习内容
1、servlet技术
(1)什么是Servlet
- servlet是javaEE规范之一,其实就是一个接口
- Servlet是javaweb三大组件之一,三大组件分别是Servlet程序,Filter过滤器,Listen监听器
- Servlet是运行在服务器上的java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端
(2)写一个Servlet程序
1、编写一个类实现Servlet接口
2、实现service方法,处理请求,并响应数据
3、到web.xml中去配置servlet程序访问地址
-
创建项目
-
编写类实现接口
-
配置web.xml
-
结果
(3)理解登录流程
首先我们写了自己的web项目,就是有了一个helloServlet的程序,它就做为整个项目,然后它会发布到Tomcat作为服务器,然后你就可以访问了。
(4)Servlet生命周期
- 1、首先执行Servlet构造器方法
- 2、执行init初始化方法
- 3、执行service方法【每次访问都会调用】
- 4、执行destroy销毁方法
方法1,2是在第一次访问的时候访问。
(5)理解doGet和doPost方法
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class hello implements Servlet {
/**
* service 方法是专门用来处理请求和响应的
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws
ServletException, IOException {
System.out.println("3 service === Hello Servlet 被访问了");
// 类型转换(因为它有 getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = httpServletRequest.getMethod();
if ("GET".equals(method)) {
doGet();
} else if ("POST".equals(method)) {
doPost();
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
/**
* 做 get 请求的操作
*/
public void doGet(){
System.out.println("get 请求");
System.out.println("get 请求");
}
/**
* 做 post 请求的操作
*/
public void doPost(){
System.out.println("post 请求");
System.out.println("post 请求");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
(6)通过继承HTTPServlet实现Servlet
- 看一下继承关系
public class HelloServlet2 extends HttpServlet {
/**
* doGet()在 get 请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
System.out.println("doGet方法");
}
/**
* doPost()在 post 请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
System.out.println("doPost 方法");
}
}
- 同样的配置web.xml文件
(7)通过idea创建servlet
(8)Servlet类继承关系
2、ServletConfig类
- 是Servlet的配置类
- Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用
- Servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig
(1)ServletConfig类的三大作用
- 获取Servlet程序的别名servlet-name的值
- 获取初始化参数init-param
- 获取ServletContext对象
<servlet>
<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class 是 Servlet 程序的全类名-->
<servlet-class>cn.mldn.servlet2.servlet3.HelloServlet2</servlet-class>
<!--init-param 是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>username</param-name>
<!--是参数值-->
<param-value>root</param-value>
</init-param>
<!--init-param 是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>url</param-name>
<!--是参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<!--servlet-mapping 标签给 servlet 程序配置访问地址-->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- servlet标签给Tomcat配置Servlet程序
- servlet-mapping是配置访问的路径
- servlet-name是标签servlet程序起一个别名(一般是类名)
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init 初始化方法");
// 1、可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
// 2、获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
3、ServletContext类
(1)什么是ServletContext类
- ServletContext 是一个接口,它表示 Servlet 上下文对象
- 一个web工程,只是一个servletContex对象的实例
- servletContext对象时一个域对象
- servletContext是在web工程部署启动的时候创建,在web工程时候销毁
(2)什么是域对象
什么是域对象?域对象,是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个 web 工程。存数据就用put()方法,setAttribute(),而取对象则是get(),getAttribute()实现,然后可以删除数据remove(),removeAttribute()
- 其实这个很好理解,比如说我们把前端项目看成一个域对象,我后端给你一个cookie,然后你保存下来,存起来,全局整个前端都是共享这部分数据的。
(3)ServletContext类的作用
- 获取web.xml中配置的上下文参数context-param
- 获取当前的工程路径,格式:/工程路径
- 获取工程部署后再服务器硬盘上的绝对路径
- 想Map一样存数据
public class HelloServlet2 extends HttpServlet {
/**
* doGet()在 get 请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// 1、获取 web.xml 中配置的上下文参数 context-param
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context-param 参数 username 的值是:" + username);
System.out.println("context-param 参数 password 的值是:" +
context.getInitParameter("password"));
// 2、获取当前的工程路径,格式: /工程路径
System.out.println( "当前工程路径:" + context.getContextPath() );
// 3、获取工程部署后在服务器硬盘上的绝对路径
/**
* / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录<br/>
*/
System.out.println("工程部署的路径是:" + context.getRealPath("/"));
System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
}
/**
* doPost()在 post 请求的时候调用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
System.out.println("doPost 方法");
}
}
- 这个比较重要,到时候在开发中用比较多,到时候我们可以存在Redis里面,方便存取。
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
public class ContextServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// 获取 ServletContext 对象
ServletContext context = getServletContext();
System.out.println(context);
System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));
context.setAttribute("key1", "value1");
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
}
4、HTTP协议
http协议就是客户端和服务器之间通信时,发送数据需要遵守的规则。
(1)请求HTTP协议格式
- http://localhost:8083/helloservlet_war_exploded/hello
客户端发送消息叫请求
服务器回应消息叫回应
(2)请求的类型
HTTP拥有如下请求:GET POST HEAD PUT DELETE CONNECT TRACE OPTIONS
常用的请求如下请求:GET,POST请求
- Get请求:请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
- POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据
例子就是我们自己编写的表单。
因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
(3)常见的请求头
- Accept:表示客户端可以接受的数据类型
- Accept-Languege:表示客户端可以接受的语言类型
- User-Agent:表示客户端浏览器的信息
- Host:表示请求时的服务器ip地址
(4)响应的Http协议格式
- 响应行
(1) 响应的协议和版本号
(2) 响应状态码
(3) 响应状态描述符 - 响应头
(1) key : value 不同的响应头,有其不同含义
空行 - 响应体 ---->>> 就是回传给客户端的数
- 常见的响应码
- 200:请求成功
- 302:表示请求重定向
- 404:表示请求服务器已经收到了,但是你要的数据不存在
- 500:表示服务器已经收到请求,但是服务器内容错误。
(5)MIME类型说明
-
MIME:是HTTP协议中数据类型
-
MIMEden英文全称是Multipurpose Internet Mail Extension多功能Internet邮件扩充服务,MIME类型的格式是“大类型/类型”,并与某一种文件的扩展名相对应。
-
用浏览器查看一下
二、请求头和响应头总结
1、请求头
2、响应头
3、以请求哔站的是链接分析
- 响应头
三、HttpServletRequest和HttpServletResponse
1、HTTPServletRequest
(1)HTTPServletRequest的作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的
信息
(2)常用 的API
-
getRequestURI():获取请求的资源路径
-
getRequestURL():获取请求的统一资源定位符
-
getRemoteHost():获取客户端的ip地址
-
getHeader():获取请求头
-
getParameter():获取请求的参数
-
getParameterValues()获取请求的参数,多个值的时候用
-
getMethods():获取请求的方法get或者post
-
setAttribute(key,value):设置域数据
-
getAttribute(key):获取域数据
-
getRequestDispatcher():或者请求转发对象
-
案例分析
(3)获取请求的参数
(4)解决POST请求中文乱码问题
(5)请求转发
什么是请求转发?
请求就是请求,转发就是服务器接受到请求之后,从一次资源跳转到另一个资源的操作叫做请求转发。
(6)base标签作用
(7)web中/再用用
- 在web中/是一种绝对路径
- /如果被浏览器解析,得到的地址是会是:http://ip:端口号/工程路径
- /如果被服务器解析,得到的是:http://ip:duankouhao/工程路径
2、HTTPServletResponse
(1)HTTPServletResponse作用
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
(2)返回的方式
- 字符流:getOutputStream(),常用于下载(传递二进制数据)
- 字符流:getWriter(),常用于回传字符串
上面两同时只能用一个。
(3)如果给客户端返回数据
而且这个是java的里面的数据流的操作格式,最后要关闭流的传输。
(4)解决响应的乱码问题
// 设置服务器字符集为 UTF-8
- resp.setCharacterEncoding(“UTF-8”);
// 通过响应头,设置浏览器也使用 UTF-8 字符集
- resp.setHeader(“Content-Type”, “text/html; charset=UTF-8”
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
- resp.setContentType(“text/html; charset=UTF-8”);
(5)请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
- 视频学习地址:哔哩哔哩尚硅谷课程