http、Tomcat、servlet
http
http特点
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型的:一次请求对应一次响应
- HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
缺点:多次请求间不能共享数据。
优点:速度快
http请求数据格式
请求行
请求的第一行,其中
-
GET:请求方式
-
/:请求资源路径
-
HTTP/1.1:协议版本
请求头
请求的第二行开始,以键值对的格式出现,其中
-
host:请求的主机号
-
user-agent:浏览器版本
-
accept:表示浏览器能接收的资源类型
-
accept-language:浏览器偏好的语言
-
accept-encoding:浏览器可以支持的压缩类型
请求体
请求的最后一部分,存放请求参数
get和post的区别
- get请求参数在请求行,没有请求体
post请求参数在请求体中 - get请求参数有大小限制,2-8k
post参数没有大小限制 - 浏览器访问后台全是get请求,
get请求会显示在浏览器地址栏,post不会 - 请求刷新时post会重新提交数据
- get请求会缓存,post不会
- get的请求更快,因为直接走的缓存
- 每次必须请求后台,必须是新请求,不要走缓存,用post
- get请求只能进行URL编码(get请求必须是字符串),post请求所有格式(文件图片视频都可以)
http响应数据格式
响应行
响应的第一行,其中
-
HTTP/1.1:协议版本
-
200:响应状态码,状态响应码重点如下
-
1xx:响应中
-
2xx:成功
-
3xx:重定向
-
4xx:客户端错误
-
5xx:服务器端错误
-
-
OK:状态码描述
响应头
从响应的第二行开始,格式为key:value
响应体
响应的最后一行,存放响应数据
Tomcat
web访问后台需要一个容器,这个容器就是Tomcat。
Tomcat是Apache 软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。
Tomcat 也被称为 Web容器、Servlet容器。Servlet 需要依赖于 Tomcat才能运行
web服务器
Web服务器是一个应用程序(软件),对 HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”
如何启动Tomcat以验证安装完成
首先,下载Tomcat的时候需要注意版本问题,并且安装Tomcat之前需要先安装jdk。
此外,不建议下载压缩版,建议直接下载安装版。压缩版需要配置环境变量,而安装版不需要。
安装好Tomcat之后,右键计算机,在管理----服务之中找到Apache Tomcat 9.0 Tomcat9,启动服务在浏览器访问localhost:8080
如果可以正常访问,则说明安装成功。
创建javaweb项目
- 直接创建一个Maven项目
- 添加web服务支持。右键项目,打开框架支持,只用勾选第一个即可。完成后项目会多出一个web目录。里面存放前端页面,而src里面的main目录是最后的成品,test目录是用来专门做测试的,再往下的java目录存放java文件,resource则用于存放各种资源文件。
- 添加Tomcat。右上角添加,找到Tomcat Service(不是TomcatEE),点击local,找到自己的Tomcat文件夹,ok之后点击fix,将Application context里面只留下/,然后ok,完成操作。
- 右上角debug启动项目,访问的是web下面的index.jsp页面
为什么能够直接访问到index.jsp
这是Tomcat的conf文件夹下面的web.xml所决定的
先找index.html找不到再找index.htm再找不到则寻找index.jsp
如果想要默认打开界面是自己的选择的,则修改web.xml文件,不过一般不修改Tomcat的,修改自己项目里面的web.xml
修改之后建议重启服务器,或者刷新项目
如果运行的时候控制台有乱码,可能是中文的问题,在Tomcat的conf目录下找到logging.properties,将里面的UTF-8全部修改为GBK,重新启动服务后中文即可正常显示
servlet
Servlet 是 Java提供的一门动态web资源开发技术。
Servlet 是JavaEE 规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet。
servlet使用
- 使用servlet需要在pom.xml里面导入servlet的jar包。
依赖从哪儿来呢?可以直接百度Maven Servlet依赖,也可以搜索search.maven.org搜索servlet/javax.servlet找到想要的版本的依赖。 - 创建:定义一个类,实现 Servlet接口,并重写接口中所有方法,并在 service方法中输入一句话,这里是输出"Servlet service"
package com.wanxi.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/index")
public class IndexServlet 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("Servlet service");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- 配置:在类上使用@WebServlet 注解,配置该 Servlet的访问路径。
- 访问:启动 Tomcat,浏览器输入URL 访问该Servlet。如果地址所表示的页面没有写,那么浏览器会是一片空白,但是控制台会输出对应的信息。
- 此外,还可以继承HttpServlet类,只需要重写doGet和doPost方法。
package com.wanxi.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/home")
public class HomeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServlet doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServlet doPost");
}
}
WebServlet里面的地址唯一,且以“/”开头
查询用get,更新(增加、删除、修改)用post;涉及到密码等敏感信息以及IO流,用post
servlet生命周期
Servlet由web服务器创建,由web服务器调用方法Servlet方法
-
- 加载和实例化 当Servlet第一次被访问时,由容器创建Servlet对象
-
- 初始化 调用init()方法,只调用一次
-
- 请求处理 调用service()方法
-
- 服务终止 销毁,调用destory()方法
urlPattern配置规则
-
一个servlet可以配置多个地址
-
精确匹配 @WebServlet("/user/select") 访问准确的地址
-
目录匹配 @WebServlet("/user/*") 当前目录下都可以访问
-
拓展名匹配 @WebServlet("*.do") 拓展名为do的所有页面
-
任意匹配 @WebServlet("/")或者@WebServlet("/*")任意路径都能访问
“/”和“/*”的区别
简单的说就是使用“/*”的话,如果地址错误将会在浏览器报错,显示404。如果使用的是“/”,那么地址输入错误将会指向一个默认的页面,不会在浏览器显示404,但是控制台还是会输出对应的信息(如果写了的话)。比如:
package com.wanxi.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/")
public class DefaultServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ERRO");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
浏览器是空白,但是控制台却输出了信息