自学服务器与Servlet入门
服务器与Servlet入门
一、软件架构
目前市场上有两种流行的软件架构:C/S客户端与服务器端 B/S浏览器端与服务器端
C/S架构:Client/Server 客户端/服务器。要求用户安装一个客户端程序(APP)。
主要特点:
交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是针对性开发,变更不够灵活,维护和管理的难度较大。
常见应用:
qq音乐、王者荣耀、网易云、消消乐
优点:
用户体验好,效果炫
对信息安全的控制较强
应用服务器运行数据负荷较轻,部分计算功能在客户端完成
缺点:
占用硬盘空间
维护麻烦
安装使用依赖其他条件
B/S架构:Browser/Server 浏览器/服务器 。通过浏览器与服务器交互,不需要安装其他程序
主要特点:
分布性强、维护方便、开发简单且共享性强、总体拥有成本低。但数据安全性问题、对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低。
常见应用:
12306、淘宝、京东
优点:
维护和升级简单,无缝升级。
不用必须安装程序,操作系统内置了浏览器。大大减少了使用成本
缺点:
动画效果受浏览器限制
对信息安全控制较差。例如:网银就需要使用U盾,在浏览器端加密。
应用服务器运行数据负荷较重。大部分计算都在服务器端,增加服务器压力。使用Ajax可以改善部分用户体验。
二、Tomcat服务器
(一)web服务器简介
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。
目前最主流的三个Web服务器是WebLogic、 Tomcat 、IIS。
WebLogic服务器: 是美国Oracle公司的产品, 主要用户开发, 集成, 部署和管理大型项目的web程序; 主要用于部署大型分布式项目的使用;
IIS服务器: web服务器组件, 主要部署.net项目;
WEB服务器的工作: 连接过程、请求过程、应答过程以及关闭连接
- 连接过程就是Web服务器和其浏览器之间所建立起来的一种连接
- 请求过程就是Web的浏览器运用socket这个文件向其服务器而提出各种请求(客户端向服务器端发送的各种请求)
- 应答过程就是运用HTTP协议把在请求过程中所提出来的请求传输到Web的服务器,进而实施任务处理,然后运用HTTP协议把任务处理的结果传输到Web的浏览器,同时在Web的浏览器上面展示上述所请求之界面。
- 闭连接就是当上一个步骤--应答过程完成以后,Web服务器和其浏览器之间断开连接之过程。
主要讲的是Tomcat服务器:
(二)Tomcat服务器介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Tomcat服务器实际上是JSP 页面和Servlet的容器,主要用来部署和运行Web应用。另外,Tomcat也具有处理HTML页面的功能。
(三)Tomcat使用步骤
1、下载官网地址:https://tomcat.apache.org
可以选择不同的版本下载使用,目前最新版本是9.0.36
解压后的目录:
Tomcat分为安装版和压缩版:
使用压缩版;
- Tomcat的启动和停止
Tomcat目录下找里边找bin目录
http: 协议名
Localhost:地址
8080: 端口号
当出现下边界面, 证明启动成功;
关闭:
关闭方式有两种:
- 点击这个脚本关闭
- 点击红叉直接关闭
注意:如果在双击startup.bat文件或shutdown.bat文件开启和关闭Tomcat服务器时出现闪退情况,可以通过任何编辑工具将文件打开,在文件的开头加上下面两行语句:
SET JAVA_HOME=D:\Develop\JDK\jdk1.8 (JDK安装目录)
SET TOMCAT_HOME=D:\Develop\Tomcat\apache-tomcat-8.5.51 (解压后的tomcat文件目录)
问题:
端口号被占用问题
解决: 修改端口号 或者 把之前启动的tomcat关闭
(四)Tomcat与Eclipse集成
显示Servers服务器
配置tomcat服务器
整合完成测试启动:
启动成功:
关闭:
(五)创建web工程
创建web工程
或者
注意:
WEB-INF: 存放是整个web工程的核心配置信息, 并且这个文件是受保护的文件, 该目录不能存放任何文件, 否则无法访问;
web.xml:是整个项目的核心控制文件, 赋负责连接Java以及配置重要的启动配置信息;
(六)部署并运行web工程
将项目发布到服务器运行
启动:
浏览器端:http://localhost:8080/day10_servlet/hello.html
协议名://地址:端口号/项目名/访问的地址(页面)
显示成功的页面:
Tomcat中webapps, 存放着发布的项目
三、Servlet入门
(一)Servlet简介
Servlet是运行在服务器端的Java小程序
目的: 用来处理客户端发出的请求, 服务端作出相应给浏览器的动态的web资源;
Servlet就是实现前台后后台交互的中间件;
(二)Servlet快速入门
1、准备工作
需求:写一个HTML页面将一个表单中的账号和密码传递到java类中并打印输出到控制台。
2、编写步骤
编写步骤:
- 创建HTML页面
- 创建一个普通类, 继承HttpServlet的抽象类
- 重新servlet的方法service方法
- 在web.xml文件注册servlet
- 修改HTML页面的访问路径
- 测试
输入地址:
结果:
(三)Servlet的执行流程详解
问题: 为什么访问http://localhost:8080/day10_servlet/login.html就可以执行LoginServlet中的service方法?
(四)Servlet的发展史
Servlet也是由复杂难用、功能单一,逐步发展到目前的操作简单,功能强大的。
Servlet的发展史,完全就是一部人类由猿人的进化史。
发展史:
体系结构:
(五)Get与Post请求
1、doGet、doPost方法与Service方法的关系
在HttpServlet的API中,我们发现新增了两个特殊的方法doGet和doPost,这两个方法是对service方法的拆分,目的是希望不同的请求方式使用不同的方法处理。这让大家联想到表单的两种常用提交方式get和post,如果是get提交方式则使用doGet方法处理,如果是post提交方式则使用doPost方法处理。而service方法可以处理任何类型的请求,当我们去查看HttpServlet中service方法的源码,不难发现内部也是通过对method请求方式做了验证后决定调用doGet或doPost方法.
源码分析:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();/获取请求方式
if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req);//缓存机制 if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince; try { ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); } catch (IllegalArgumentException iae) { // Invalid date header - proceed as if none was set ifModifiedSince = -1; } if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } }
} else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp);
} else if (method.equals(METHOD_POST)) { doPost(req, resp);
} else if (method.equals(METHOD_PUT)) { doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) { doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) { doTrace(req,resp);
} else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. //
String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } } |
注意:
doGet和doPost不能与service方法同时使用;
2、Get与Post请求的区别(高频面试题)
区别:
- 地址栏展示不同(get展示在地址栏, post展示在请求体)
- 安全性问题(get请求不安全, post请求相对安全)
- 提交的数据量大小(get请求有限制, post请求无限制)
- 信息缓存(get请求有缓存机制, post请求没有)
- 编码问题
Get请求: tomcat8.X版本之前默认编码是iso-8859-1
Tomcat8.x版本之后默认编码是utf-8
Tomcat7.x 需要对编码进行处理(百度)
Post请求: 需要对编码进行处理request.setCharacterEncoding("utf-8");
响应乱码问题:response.setContentType("text/html;charset=utf-8");
总结:
Get参数会直接显示到URL不安全,Post在请求主体中,比较安全。
Get传送数据量大小有限制,根据浏览器不同限制不同,一般为2KB-6KB。Post无限制。
Get缓存数据会直接将参数缓,保留在浏览器历史记录中,不安全。Post缓存时不缓存参数,不保留在浏览器记录中。
Get只能有一个种编码方式,转码的时候使用字符串转字节的方式,Post支持多种编码方式,转码直接使用setCharacterEconding()即可。
由于Get具有缓存功能,一般用来直接获取数据,提高查询速度; Post是发送数据到服务器作存储,适合于增删改操作。
(六)Servlet生命周期(面试题)
生命周期: 就是指一个对象从创建到销毁的过程
Servlet生命周期: 从创建到销毁的过程, 分为三个阶段:
- 初始化阶段: 默认第一次访问servlet时进行执行初始化方法 init()方法
- 使用阶段: 每次请求该servlet都会执行service方法
- 销毁阶段: 当服务器重新加载时或者服务器正常关闭的情况下执行销毁方法
问题: 用户第一次访问servlet时就进行初始化, 然后执行service方法, 为了服务器启动时就将servlet进行初始化好, 每次访问servlet时,只执行service方法即可(改变servlet的创建时机)
(七)url-pattern
问题: 一个servlet中是否可以配置多个url-pattern访问路径? 可以
2.X版本的配置三种:
- 完全路径匹配 以 / 开头
例如: /test /demo /login
- 目录匹配 以/开头 ,以*结尾
例如: /aaa/test /aaa/bbb/demo /aaa/bbb/*
- 扩展名匹配 不能以 / 开头 以* 开头 错误写法: /*.do
例如: *.do *.action
- 缺省匹配 /
通常情况下访问时HTML页面, 首先从当前web项目的web.xml文件中进行匹配
如果匹配不到, 再从tomcat的配置文件web.xml文件中进行匹配
优先级:
完全路径匹配 > 目录匹配 > 扩展名匹配 > 缺省匹配
四、案例:用户登录
技术需求:html + Servlet + jdbc + tomcat
功能描述:
验证登录的账号和密码是否正确,如果错误,跳转到登录页面重新登录
如果正确跳转到success.html。
代码准备:
创建数据表users并插入测试数据
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(40) UNIQUE,
PASSWORD VARCHAR(50)
);