zoukankan      html  css  js  c++  java
  • 自学服务器与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)

    );

     

  • 相关阅读:
    SNOI 2019 字符串
    1068: [SCOI2007]压缩
    POJ 1848 Tree 树形DP
    BZOJ bzoj1396 识别子串
    BZOJ 4503: 两个串
    BZOJ 2302: [HAOI2011]Problem c(数学+DP)
    BZOJ 3157: 国王奇遇记 (数学)
    CF_528D
    BZOJ 3000: Big Number (数学)
    新の开始
  • 原文地址:https://www.cnblogs.com/masterhxh/p/13692205.html
Copyright © 2011-2022 走看看