自学服务器与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服务器的工作: 连接过程、请求过程、应答过程以及关闭连接

  1. 连接过程就是Web服务器和其浏览器之间所建立起来的一种连接
  2. 请求过程就是Web的浏览器运用socket这个文件向其服务器而提出各种请求(客户端向服务器端发送的各种请求)
  3. 应答过程就是运用HTTP协议把在请求过程中所提出来的请求传输到Web的服务器,进而实施任务处理,然后运用HTTP协议把任务处理的结果传输到Web的浏览器,同时在Web的浏览器上面展示上述所请求之界面。
  4. 闭连接就是当上一个步骤--应答过程完成以后,Web服务器和其浏览器之间断开连接之过程。

主要讲的是Tomcat服务器:

(二)Tomcat服务器介绍

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

Tomcat服务器实际上是JSP 页面和Servlet的容器,主要用来部署和运行Web应用。另外,Tomcat也具有处理HTML页面的功能。

 

(三)Tomcat使用步骤

1、下载官网地址:https://tomcat.apache.org

可以选择不同的版本下载使用,目前最新版本是9.0.36

 

解压后的目录:

 

Tomcat分为安装版和压缩版:

使用压缩版;

  1. Tomcat的启动和停止

Tomcat目录下找里边找bin目录

 

访问: http://localhost:8080/

http: 协议名

Localhost:地址

8080: 端口号

当出现下边界面, 证明启动成功;

 

关闭:

关闭方式有两种:

  1. 点击这个脚本关闭
  2. 点击红叉直接关闭

注意:如果在双击startup.bat文件或shutdown.bat文件开启和关闭Tomcat服务器时出现闪退情况,可以通过任何编辑工具将文件打开,在文件的开头加上下面两行语句:

SET JAVA_HOME=D:DevelopJDKjdk1.8 JDK安装目录)
SET TOMCAT_HOME=D:DevelopTomcatapache-tomcat-8.5.51 (解压后的tomcat文件目录)

 

问题:

端口号被占用问题

解决: 修改端口号  或者  把之前启动的tomcat关闭

 

(四)TomcatEclipse集成

显示Servers服务器

 

配置tomcat服务器

 

 

 

 

 

 

 

 

 

 

整合完成测试启动:

 

启动成功:

 

关闭:

 

(五)创建web工程

创建web工程

 

或者

 

 

 

 

 

注意:

WEB-INF: 存放是整个web工程的核心配置信息, 并且这个文件是受保护的文件, 该目录不能存放任何文件, 否则无法访问;

web.xml:是整个项目的核心控制文件, 赋负责连接Java以及配置重要的启动配置信息;

(六)部署并运行web工程

将项目发布到服务器运行

 

 

 

 

 

启动:

 

浏览器端:http://localhost:8080/day10_servlet/hello.html

协议名://地址:端口号/项目名/访问的地址(页面)

显示成功的页面:

 

Tomcatwebapps, 存放着发布的项目

 

三、Servlet入门

(一)Servlet简介

 

Servlet是运行在服务器端的Java小程序

目的: 用来处理客户端发出的请求, 服务端作出相应给浏览器的动态的web资源;

 

Servlet就是实现前台后后台交互的中间件;

(二)Servlet快速入门

1、准备工作

需求一个HTML页面将一个表单中的账号和密码传递到java类中并打印输出到控制台

 

2、编写步骤

编写步骤:

  1. 创建HTML页面

 

  1. 创建一个普通类, 继承HttpServlet的抽象类

 

  1. 重新servlet的方法service方法

 

  1. web.xml文件注册servlet

 

  1. 修改HTML页面的访问路径

 

  1. 测试

输入地址:

 

结果:

 

(三)Servlet的执行流程详解

问题: 为什么访问http://localhost:8080/day10_servlet/login.html就可以执行LoginServlet中的service方法?

 

(四)Servlet的发展史

Servlet也是由复杂难用、功能单一,逐步发展到目前的操作简单功能强大的

Servlet的发展史完全就是一部人类由猿人的进化史

发展史:

 

 

 

 

体系结构:

 

(五)GetPost请求

1、doGetdoPost方法与Service方法的关系

HttpServletAPI中,我们发现新增了两个特殊的方法doGetdoPost,这两个方法是对service方法的拆分,目的是希望不同的请求方式使用不同的方法处理。这让大家联想到表单的两种常用提交方式getpost,如果是get提交方式则使用doGet方法处理,如果是post提交方式则使用doPost方法处理。而service方法可以处理任何类型的请求,当我们去查看HttpServletservice方法的源码,不难发现内部也是通过对method请求方式做了验证后决定调用doGetdoPost方法.

源码分析:

 

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);

        }

    }

注意:

doGetdoPost不能与service方法同时使用;

2、GetPost请求的区别(高频面试题)

区别:

  1. 地址栏展示不同(get展示在地址栏, post展示在请求体)
  2. 安全性问题(get请求不安全, post请求相对安全)
  3. 提交的数据量大小(get请求有限制, post请求无限制)
  4. 信息缓存(get请求有缓存机制, post请求没有)
  5. 编码问题

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-6KBPost无限制。

Get缓存数据会直接将参数缓,保留在浏览器历史记录中,不安全。Post缓存时不缓存参数,不保留在浏览器记录中

Get只能有一个种编码方式,转码的时候使用字符串转字节的方式,Post支持多种编码方式,转码直接使用setCharacterEconding()即可。

由于Get具有缓存功能,一般用来直接获取数据,提高查询速度; Post是发送数据到服务器作存储,适合于增删改操作

(六)Servlet生命周期(面试题)

生命周期: 就是指一个对象从创建到销毁的过程

Servlet生命周期: 从创建到销毁的过程, 分为三个阶段:

  1. 初始化阶段: 默认第一次访问servlet时进行执行初始化方法 init()方法
  2. 使用阶段: 每次请求该servlet都会执行service方法
  3. 销毁阶段: 当服务器重新加载时或者服务器正常关闭的情况下执行销毁方法

 

 

 

 

 

问题: 用户第一次访问servlet时就进行初始化, 然后执行service方法, 为了服务器启动时就将servlet进行初始化好, 每次访问servlet,只执行service方法即可(改变servlet的创建时机)

 

(七)url-pattern

问题: 一个servlet中是否可以配置多个url-pattern访问路径?    可以

2.X版本的配置三种:

  1. 完全路径匹配    / 开头

例如: /test   /demo   /login

  1. 目录匹配   /开头 ,*结尾

例如: /aaa/test   /aaa/bbb/demo    /aaa/bbb/*

  1. 扩展名匹配   不能以 / 开头  以* 开头   错误写法: /*.do

例如: *.do   *.action

  1. 缺省匹配  /

通常情况下访问时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)

);

 

原文地址:https://www.cnblogs.com/masterhxh/p/13692205.html