Day46 Tomcat、Servlet
- WEB流程
1.1 软件架构
B/S : 浏览器/服务端
基于浏览器,比如网页版百度,网页版淘宝等,只要有浏览器,通过地址 就可以访问
C/S : 客户端/服务端
有指定的客户端.比如PC端淘宝APP,或者手机端淘宝APP,或者QQ的APP等,需要依赖一个特定的客户端来访问
1.2 资源分类
静态资源 : 可以称为静态页面,所有用户访问后,得到的结果是一致的,该资源可以直接被浏览器解析,比如 : html/css/js等 内容都是在页面中写死的,想要更改,一般要改源代码
动态资源 : 每个用户登陆后,访问的数据可能是不同的,动态资源被访问的时候也会先转换为静态资源,然后返回给浏览器解析显示,
比如 : 登陆QQ之后,大家登陆之后,看到的联系人列表可能相同,也可能不同
登陆淘宝之后,我们的购物车/历史订单等,也可能相同,也可以不同
这些数据.一般不是在页面写死的,都是根据登陆的用户,在数据仓库中,查询到该用户匹配的信息,并返回给页面进行动态渲染
这种 一般称为动态资源/动态页面
注意 : 区别静态和动态的,一般就看是否采用数据库开发模式,并不是根据页面有动画效果,或者有gif动图
1.3 网络通信三要素
IP : IP是电脑在网络中的唯一标识,通过IP/域名可以找到某一个电脑服务器
端口 : 是应用程序(软件)在计算机中的唯一标识,0~65536,比如 MySQL 3306
传输协议 : 规定了数据传输的规则
TCP : 安全协议,三次握手,速度稍微慢一些 类似于打电话
UDP : 不安全协议.速度快,类似于发短信/发快递
1.4 请求流程
1.前端发送请求,根据路径信息,访问后台接口。
请求路径中,包含 协议、ip地址、端口号、路径
通过ip地址找到服务器
通过端口号,找到web服务器程序
通过具体路径,找到执行的代码
2.后端接收到请求后,进行处理,处理完成后,向前端返回响应。
3.后端处理时,会通过和数据库交互,完成数据的操作。
2. WEB服务器软件
2.1 概述
服务器:安装了服务器软件的计算机。
服务器软件:接收用户的请求,处理请求,做出响应。
web服务器软件:接收用户的请求,处理请求,做出响应。
在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目,实际上可以理解为web容器。
2.2 WEB应用服务器
1.webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。 2.webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
3.JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
4.Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范 servlet/jsp。开源的,免费的。
Jetty
2.3 Tomcat
- 介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
- 下载安装与卸载
官网下载:http://tomcat.apache.org/
安装:解压压缩包即可- 注意:安装目录建议不要有中文和空格
卸载:删除目录就行了
- 注意:安装目录建议不要有中文和空格
参考安装文档
- Servlet
3.1 概述
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet 理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用 来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
3.2 环境配置
详情 请参考文档
3.2.1 创建项目
稍后会有弹框,提醒你,因为我们之前是JavaSE视图,而现在创建的是WEB项目,所以询问你是否需要切换到JavaEE视图,点是 就跳转到JavaEE视图,点否 就不跳转
如果打钩,就是以后创建WEB项目不再提醒该弹框
3.2.2 目录结构
Src 源码包,我们的java编码都在这里面
WebContent 是我们web应用程序的根目录
WEB-INF
Web.xml 当前项目的配置文件
Lib : 第三方依赖包
Web.xml
设置首页,就是访问该项目的时候,默认显示那个页面
可以写多个,但是只会有一个有用,从上往下,先找到谁 就用谁,谁就是首页
3.2.3 创建首页
在WebContent下 创建一个jsp
3.2.4 设置JSP默认编码
3.2.5 运行
3.2.5.1 手动部署运行
我们需要把项目 转换为war包,然后放到tomcat中 运行,自动解析
然后运行tomcat
运行后自动解析war包
在这里插入图片描述
3.2.5.2 自动部署运行
3.2.5.2.1 设置部署位置
设置Eclipse的自动部署位置(不设置也可以)
在这里插入图片描述
3.2.5.2.2 运行项目
运行项目
3.2.5.2.3 设置默认浏览器
需要设置浏览器打开,默认是内置的,内置IE
设置完之后,再次打开,就用指定浏览器打开了
3.2.5.3 运行流程
当tomcat启动之后 即可使用浏览器访问
http://127.0.0.1:8080/WEBTest/
当请求127.0.0.1的时候 是找到了当前电脑
8080 是找到了tomcat(webapps)
然后再通过 / WEBTest 找到了对应的某个项目
然后执行该项目的web.xml 由于我们在web.xml定义了首页,所以自动打开index.jsp
3.2.6 端口占用问题
端口冲突问题
这个错误说明端口被占用了,8080 / 8005
如果是tomcat启动了多次,导致端口被占用,需要把原来的tomcat关闭,再重新启动即可
如果是其他软件占用了8080的话 可以更改tomcat的端口,也可以把其他软件关闭
右键结束任务即可
netstat -ano|findstr 端口号
3.3 Servlet环境搭建
3.3.1 创建项目
同上,但是创建Tomcat 新增JDK,更改字符编码等操作 都不用了,
就不用new Runtime 了 因为第一次搭建的时候,就已经添加过了
3.3.2 Servlet创建
Sevlet是java为了能够进行web服务器端编程而设置的一系列标准
我们自定义的java类,只要实现了对应的标准,就可以称作servlet
标准 : javax.servlet.Servlet接口
Servlet运行于支持java的应用服务器中,也就是说servlet的运行需要依赖于容器,而我们安装的tomcat 就是这个容易
从原理上来讲,servlet可以响应任何类型的请求,但是绝大多数的情况下servlet只用来扩展基于HTTP协议的web服务器
所以,我们的servlet实现类,也可以继承HttpServlet
HttpServlet是基于HTTP协议开发的servlet标准,该类也实现了servlet接口
1 创建项目
2 创建class
3 实现 servlet接口
4 覆写对应的方法
5 注册和映射
6 请求/响应
**
**
3.3.3 Servlet注册和映射
Java代码已经有了,那么请求什么的时候,执行这个java代码呢?
1 XML配置
Web.xml中进行注册和映射
2 注解配置
使用注解方式的话,web.xml中就不用写注册和映射了
3.3.4 请求执行java代码
http://localhost:8080/Servlet_01/hello
Localhost 是当前电脑
8080 是tomcat容器,定位到webapps
/项目名/url 找到某个项目中的某个请求对应的java程序并执行
3.3.5 响应结果
3.3.6 执行流程
当我们发生请求的时候,先执行web.xml 匹配路由(映射 url-pattern),未匹配成功 报错 404
如果匹配成功,就执行对应的servlet类中的java代码
先执行init,并且只执行一次
然后执行service方法,每次请求都会执行
当关闭tomcat服务的时候,destory才会执行,并且只执行一次
3.3.7 生命周期
Servlet生命周期就是从创建Servlet对象开始一直到死亡的一个执行过程
1 先执行构造方法,用于创建Servlet对象
2 执行init()方法做初始化操作
3 执行service()/doGet()/doPost()方法处理真正的逻辑操作和数据交互
4 执行destroy()方法进行资源释放和销毁
默认是第一次请求的时候,创建对象调用init
但是 也可以指定,项目运行就立刻创建对象并初始化
3.4 HttpServlet
1 把request和response对象进行了类型转换
2 请求转发到doGet/doPost方法中
所以 我们再使用HttpServlet的时候,要根据请求的方式进行方法覆写
如果是get请求 就要使用doGet方法
如果是post请求 就要使用 doPost方法
3.5 Request
3.5.1 HTTP请求消息
-
格式:
POST /login.html HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
(空行)
username=zhangsan1)请求行 请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1 HTTP协议有7中请求方式,常用的有2种 * GET: 1. 请求参数在请求行中,在url后。 2. 请求的url长度有限制的 3. 不太安全 * POST: 1. 请求参数在请求体中 2. 请求的url长度没有限制的 3. 相对安全 2)请求头:客户端浏览器告诉服务器一些信息 格式 请求头名称: 请求头值 * 常见的请求头: 1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息 * 可以在服务器端获取该头的信息,解决浏览器的兼容性问题 2. Referer:http://localhost/login.html * 告诉服务器,我(当前请求)从哪里来? * 作用: 1. 防盗链 2. 统计工作 3)请求空行 :空行,就是用于分割POST请求的请求头和请求体的。 4)请求体(正文):* 封装POST请求消息的请求参数
3.5.2 Request对象
1.) request对象和response对象的原理
1. request和response对象是由服务器创建的。我们来使用它们
2. request对象是来获取请求消息,response对象是来设置响应消息
2.)HttpServletRequest对象,继承ServletRequest接口,封装HTTP请求消息
3.5.3 Request功能
1) 获取请求消息数据
1. 获取请求行数据
* GET /day14/demo1?name=zhangsan HTTP/1.1
* 方法:
1. 获取请求方式 :GET
* String getMethod()
2. ()获取虚拟目录:/day14
* String getContextPath()
3. 获取Servlet路径: /demo1
* String getServletPath()
4. 获取get方式请求参数:name=zhangsan
* String getQueryString()
5. ()获取请求URI:/day14/demo1
* String getRequestURI()
* StringBuffer getRequestURL()
6. 获取协议及版本:HTTP/1.1
* String getProtocol()
7. 获取客户机的IP地址:
* String getRemoteAddr()
2. 获取请求头数据
* 方法:
* (*)String getHeader(String name):通过请求头的名称获取请求头的值 * Enumeration<String> getHeaderNames():获取所有的请求头名称
3. 获取请求体数据:
* 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
* 步骤:
1. 获取流对象
* BufferedReader getReader():获取字符输入流,只能操作字符数据
* ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
2. 再从流对象中拿数据
2)其他功能:
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
String getParameter(String name):根据参数名称获取参数值 例如获取参数:username=zs&password=123
String[] getParameterValues(String name):根据参数名称获取参数值的数组 例如获取参数: hobby=xx&hobby=game
Enumeration<String> getParameterNames():获取所有请求的参数名称
Map<String,String[]> getParameterMap():获取所有参数的map集合
2. 请求转发:一种在服务器内部的资源跳转方式
*步骤:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
*特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求
3. 共享数据:
* 域对象:一个有作用范围的对象,可以在范围内共享数据
* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
* 方法:
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
4. 获取ServletContext:
* ServletContext getServletContext()