第一章 何为Tomcat?
Tomcat概述
- 简而言之,Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器。
- 通过Tomcat可以使别人访问到自己的网页的一个程序
Tomcat目录解读
- 各个文件的解读
- bin:启动和关闭tomcat的bat文件
- conf:配置文件
- server.xml该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host)
- web.xml文件配置与web应用(web应用相当于一个web站点)
- tomcat-user.xml配置用户名密码和相关权限.
- lib:该目录放置运行tomcat运行需要的jar包
- logs:存放日志,当我们需要查看日志的时候,可以查询信息
- webapps:放置我们的web应用
- work工作目录:该目录用于存放jsp被访问后生成对应的server文件和.class文件
第二章 Servlet
简述 java servlet
Servlet本质上就是一个java接口,在该接口中包含五个方法,分别是:
- 初始化
- 获取配置
- 服务
- 获取信息
销毁
public interface Servlet { public void init(ServletConfig config) throws ServletException; public ServletConfig getServletConfig(); public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; public String getServletInfo(); public void destroy(); }
Servlet有什么作用
- 在网上实现聊天、发帖等交互功能
浅谈HTTP协议
何为HTTP协议
- 超文本传输协议(HTTP,HyperText Transfer Protocol) ~~~~是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。它是TCP/IP协议的一个应用层协议
- 简单来说,HTTP协议就是客户端和服务器交互的一种通迅的格式。
HTTP请求
浏览器向服务器请求某个web资源时,称之为浏览器向服务器发送了一个http请求。
一个完整http请求应该包含三个部分:
- 请求行——-描述客户端client的请求方式、请求资源名称以及HTTP版本号
- 多个消息头——-描述客户端请求哪台主机、以及客户端的环境信息
- 一个空行
请求行
- 请求行中的GET称之为请求方式,请求方式有:
POST,GET,HEAD,OPTIONS,DELETE,TRACE,PUT
- 常用的方法:POST、GET
一般来说,当我们点击超链接,通过地址栏访问都是get请求方式。通过表单提交的数据一般是post方式。
可以简单理解GET方式用来查询数据,POST方式用来提交数据,get的提交速度比post快
GET方式:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
POST方式:可以在请求的实体内容中向服务器发送数据,传送的数据量无限制。
- 请求行中的GET称之为请求方式,请求方式有:
HTTP响应
一个HTTP响应代表着服务器向浏览器回送数据
一个完整的HTTP响应应该包含四个部分:
- 一个状态行
- 多个消息头
- 一个空行
- 实体内容
状态行
- 格式:HTTP版本号 状态码 原因叙述
- 状态行:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类
JavaWeb目录
- WEB-INF目录下的资源是不能直接被浏览器访问的
- web.xml文件是web程序的主要配置文件
- 所有的classes文件都放在classes目录下
- jar文件放在lib目录下
Servlet生命周期
- 加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
- 初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
- 处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
- 销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
- 卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。
- 总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。
destroy()只有在Tomcat关闭的时候才会被调用。
编写一个简单的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;
import java.io.PrintWriter;
@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
super.doPost(request,response);
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("hello world,servlet");
out.close();
}
}
Servlet的调用图
Servlet细节
- 一个已经注册的Servlet可以被多次映射
- 同一个Servlet可以被映射到多个URL中
- Servlet映射的URL可以使用通配符
- 通配符的两种格式
- *.扩展名
- 正斜杠/开头并以/*结尾
- 其中*.扩展名的优先级最低
- 通配符的两种格式
Servlet是单例的
为什么Servlet是单例的?
- 浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建类,就会驻留在内存中,后续的请求做服务,直到服务器关闭
每次访问请求对象和响应对象都是新的
- 对于每次访问要求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再跟进请求方式分别调用doXxx方法
线程安全问题
当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程,当多个用户并发Servlet共享资源的时候就会出现线程安全问题
如果一个变量需要多个用户分享,则应当在访问该变量的时候,加入同步机制:
synchronized(对象名){ }
- 如果一个变量不需要共享,则直接在
doGet()
或者doPost()
定义,这样不会存在线程安全问题
ServletConfig对象
何为ServletConfig对象
> 通过此对象可以读取Web.xml中配置的初始化参数
- 作用:
- 大大提高程序的灵活性
- 当需要修改时,只需更改配置文件Web.xml即可
ServletContext对象
何为ServletContext对象
> 当Tomcat启动的时候,就会创建一个ServletContext对象,它代表着当前Web站点
- 作用:
- ServletContext代表当前Web站点,那么所有Servlet都共享一个ServletContext对象,因此Servlet之间可以通过ServletContext实现通讯
- ServletConfig获取的是配置单个Servlet的参数信息,ServletContext可以获取的是配置整个Web站点的参数信息
- 利用ServletContext读取web站点的资源文件
- 实现Servlet转发
第三章 request和response
request、response对象
> Tomcat收到客户端的HTTP请求,会针对每一次请求,分别创建一个代表请求的**request对象和代表响应的response对象
- 我们在获取浏览器传输过来的数据时,通过使用request对象即可
- 如果要向浏览器输出数据,则需要使用response对象
什么是HttpServletResponse对象?
- HTTP响应由状态行、实体内容、消息头和一个空行组成。HttpServletResponse对象就封装了HTTP响应的信息
调用getOutputStream()方法向浏览器输出数据
代码:
//获取ServletOutputStream对象 ServletOutputStream ServletOutputStream= response。getOutputStream(); //使用meta标签和http消息头,告诉浏览器回送数据的编码和格式 servletOutputStream.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes()); servletOutputStream.write("我是吴亦凡".getBytes("UTF-8"));
调用getWriter()方法向浏览器输出数据
代码:
//设置浏览器用UTF-8编码显示数据 response.setContentType("text/html;charset=UTF-8"); //获取到printwriter对象 PrintWriter printwriter =response.getWriter(); printWriter.write("完成finish");