JavaWeb后端
一、HTTP
1.1浏览器和服务器交互流程
1.1.1HTTP协议
HTTP 协议(Hypertext Transfer Protocol,超文本传输协议),是一个客户端请求和响应的标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。用户输入地址和端口号之后就可以从服务器上取得所需要的网页信息。
通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫"响应协议”
在浏览器中 F12可查看
1.1.2浏览器中的书写格式
服务器端资源需要通过浏览器进行,此时由浏览器将我们给出的请求解析为满足 HTTP 协议的格式并发出。我们发出的请求格式需要按照浏览器规定的格式来书写,在浏览器中书写格式如下:
当浏览器获取到信息以后,按照特定格式解析并发送即可。接收到服务器端给出的响应时,也按照 HTTP 协议进行解析获取到各个数据,最后按照特定格式展示给用户。
1.2HTTP协议的特点
- 1.支持客户/服务器模式。
- 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP 协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 3.灵活:HTTP 允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。
- 4.无连接:无连接是表示每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP1.1版本后支持可持续连接。通过这种连接,就有可能在建立一个 TCP 连接后,发送请求并得到回应,然后发送更多的请求并得到更多的回应.通过把建立和释放 TCP 连接的开销分摊到多个请求上,则对于每个请求而言,由于 TCP 而造成的相对开销被大大地降低了。而且,还可以发送流水线请求,也就是说在发送请求1之后的回应到来之前就可以发送请求 2.也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端。
- 5.无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送 的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
1.3HTTP之URL
~~~~~ HTTP(超文本传输协议)是一个基于请求与响应模式的、应用层的协议,常基于 TCP 的连接方式,绝大多数的 Web 开发,都是构建在 HTTP 协议之上的 Web 应用。
~~~~~ HTTP URL(URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的信息)的格式 如下:
http://host[:port]/[abc_path]
http://IP(主机名/域名):端口/访问资源的路径
- http 表示要通过 HTTP 协议来定位网络资源;
- host 表示合法的 Internet 主机域名或 者IP 地址,
- port 指定一个端口号,为空则使用缺省端口 80:
- abs_path 指定请求资源的 URI;如果 URL 中没有给出 abs_path,那么当它作为请求 URI时,必须以"/”"的形式给出,通常 这个工作浏览器自动帮我们完成。
1.4HTTP请求
HTTP 请求由三部分组成,分别是:请求行、请求头、请求正文。
通过chrome浏览器,F12 ->Network查看。
1.Get 请求(没有请求体)
请求行和请求头,GET请求没有请求正文
2.POST请求
格式
请求行
请求头1
请求头2
请求头3
...
请求空行
请求体
请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI和协议的版本
格式如下:
- Method Request-URIHTTP-Version CRLF
- Method 表示请求方法;
- Request-URl是一个统一资源标识符
- HTTP-Version 表示请 求的 HTTP 协议版本,
- CRLF 表示回车和换行;
1.5HTTP响应
在接收和解释请求消息后,服务器返回一个 HTTP 响应消息。HTTP 响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
格式
状态行
响应头1
响应头2
...
响应空行
响应体
1.6消息头
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。
每一个报头域都是由 名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。
请求头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
- Referer:该请求头指明请求从哪里来
如果是地址栏中输入地址访问的都没有该请求头 地址栏输入地址,通过请求可以看到,此时多了一个Referer 的请求头,并且后面的值 为该请求从哪里发出。比如:百度竟价,只能从百度来的才有效果,否则不算;通常用来做统计工作、防盗链。
响应头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对 Request-URl所标识的资源进行下一步访问的信息。
Location:
- Location响应报头域用于重定向接受者到一个新的位置,
- Location响应报头域,常用在更换域名的时候。
response.sendRedirect("http://www.baidu.com");
Refresh: 自动跳转(单位是秒),可以在页面通过meta标签实现,也可在后台实现。
<meta http-equiv="refresh" content="3;url=http://www.baidu.com">
二、tomcat服务器
2.1什么是tomcat
Tomcat 是一个符合JavaEE WEB 标准的最小的 WEB 容器,所有的JSP 程序一定要有 WEB 容器的支持才能运行,而且在给定的 WEB 容器里面都会支持事务处理操作。
Tomcat 是由 Apache 提供的(www.apache.org)提供的可以用安装版和解压版,安装版可以在服务中出现一个 Tomcat 的服务,免安装没有,开发中使用免安装版。Tomcat 简单的说就是一个运行Java 的网络服务器底层是 Socket 的一个程序,它也是JSP 和 Servlet的一个容器。Tomcat是Apache 软件基金会(ApacheSoftware Foundation)的Jakarta 项目中的一个核心项目,由 Apache、sun和其他一些公司及个人共同开发而成。
由于有了 Sun 的参与和支持,最新的 Servlet 和 SP 规范总是能在 Tomcat 中得到体现。因为 Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器, 在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 对于一个初学者来说,可以这样认为,当在一台机器上配置好 Apache 服务器,可利用它响应 HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上 Tomcat 部分是 Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为
一个与 Apache 独立的进程单独运行的。
当配置正确时,Apache为 HTML页面服务,而Tomcat 实际上是在运行JSP页面和 Servlet。另外,Tomcat和 llS 等 Web 服务器一样,具有处理 HTML页面的功能,另外它还是一个 Servlet和JSP 容器,独立的 Servlet容器是 Tomcat 的默认模式。不过,Tomcat 处理静态 HTML的能力不如 Apache 服务器。目前 Tomcat 最新版本为 9.0。
2.2Tomcat目录结构
- 1.bin:启动和关闭 tomcat 的 bat 文件
- 2.conf:配置文件server.xml 该文件用于配置 server 相关的信息,比如 tomcat 启动的端口号,配置主机(Host);web.xml文件配置与 web 应用(web 应用相当于一个 web站点):tomcat-user.xml 配置用户名密码和相关权限
- 3.lib:该目录放置运行 tomcat 运行需要的 iar 包
- 4.logs:存放日志,当我们需要查看日志的时候,可以查询信息
- 5.webapps:放置我们的 web 应用
- 6.work 工作目录:该目录用于存放 isp 被访问后生成对应的 server 文件和.class 文件
三、Servlet的实现
Servlet是 Server与 Applet 的缩写,是服务端小程序的意思。使用Java 语言编写的服务器端程序,可以像生成动态的 WEB 页,Servlet 主要运行在服务器端,并由服务器调用执行,是一种按照 Servlet 标准来开发的类。是 SUN 公司提供的一门用于开发动态 Web 资源的技术。(言外之意:要实现 web 开发,需要实现 Servlet 标准)
Servlet 本质上也是Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创建、使用、销毁都由Servlet 容器进行管理(如 Tomcat)。(言外之意:写自己的类,不用写 main 方法,别人自动调用)
Servlet 是和 HTTP 协议是紧密联系的,其可以处理 HTTP 协议相关的所有内容。这也是 Servlet 应用广泛的原因之一。
提供了 Servlet 功能的服务器,叫做 Servlet 容器,其常见容器有很多,如 Tomcat,Jetty,WebLogic ServerWebSphere,JBoss 等等。
3.1实现流程
实现servlet
- 1.创建普通]ava类
- 2.实现Servlet的规范,继承HttpServlet类
- 3.重写service方法,用来处理请求
- 4、设置注解,指定访问的路径
package com.project01.demo1;
import java.io.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
/**
* 实现servlet
* 1.创建普通]ava类
* 2.实现Servlet的规范,继承HttpServlet类
* 3.重写service方法,用来处理请求
* 4、设置注解,指定访问的路径
*/
@WebServlet("/ser01")
public class HelloServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//输出
System.out.println("Hello Servlet");
//输出到浏览器
resp.getWriter().write("Hello Servlet");
}
}
四、HTTPServletRequest对象
HtpServletRequest 对象:主要作用是用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是 HttpServletRequest 接口的实例化对象,表示该对象主要应用在山TTP 协议上,该对象是由 Tomcat 封装好传递过来。
HttpServletRequest是ServletRequest 的子接口,ServletRequest 只有一个子接口,就是HttpServletRequest。既然只有一个子接口为什么不将两个接口合并为一个?
从长远上讲:现在主要用的协议是 HTTP 协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要直接继承 ServletRequest 接口就行了。
在 HttpServletRequest 接口中,定义的方法很多,但都是围绕接收客户端参数的。但是怎么拿到该对象呢?
不需要,直接在 Service 方法中由容器传入过来,而我们需要做的就是取出对象中的数据,进行分析、处理。
4.1接受请求
4.1.1常用方法
方法:
示例:
@WebServlet("/s01")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 常用方法
*/
//获取请求时的完整路径(从http开始,到?结束)
String url = req.getRequestURI()+" ";
System.out.println("获取请求时的完整路径"+url);
//获取请求时的部分路径(从项目的站点名开始,到?结束)
String uri = req.getRequestURI();
System.out.println("获取请求时的部分路径"+uri);
//获取请求时的参数字符串(从?开始到最后的字符串)
String queryString = req.getQueryString();
System.out.println("获取请求时的参数字符串"+queryString);
//获取请求方式(GET和POST)
String method = req.getMethod();
System.out.println("获取请求方式(GET和POST)"+method);
//获取协议版本(HTTP/1.1)
String protocol = req.getProtocol();
System.out.println("版本"+protocol);
//获取项目的站点名(项目对外访问路径)
String webappPath = req.getContextPath();
System.out.println("获取项目的站点名"+webappPath);
}
}
4.2获取参数请求
示例:
// 获取指定名称的参数,返回字符串
String uname =request.getParameter("uname");
System.out.printin("uname的参数值:"+uname);
// 获取指定名称参数的所有参数值,返回数组
String[] hobbys =request.getParameterValues("hobby");
System.out.print1n("获取指定名称参数的所有参数值:”+ Arrays.tostring(hobbys));
4.2请求乱码问题
由于现在的 request 属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编码方式为 ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置 request 中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。