01【WEB开发、Servlet】

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 01【WEB开发、Servlet】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

01【WEB开发、Servlet】

一、WEB开发简介

1.1 什么是WEB开发

  • WEB(World Wide Web):即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。我们通过浏览器访问的网站简称为Web网站;

很多的编程语言都可以开发Web网站,而JavaWeb就是采用Java技术栈来开发的Web网站,而我们接下来的时间都是学习JavaWeb中的技术栈;

1.2 软件的架构

1.2.1 BS和CS概述

  • BS:Browser Server 浏览器-服务器模式。客户端使用浏览器来访问服务器。
  • CS:Client Server 客户端-服务器模式。用户需要在本地电脑上安装客户端软件,再来访问服务器。

在这里插入图片描述

CS的特点:

  1. 必须在本地电脑安装客户端软件

  2. 如果服务器升级,客户端一般来说要伴随着要升级。客户端还会经常进行升级并且安装。

BS的特点:

  1. 客户端使用的是浏览器,只要有浏览器就可以执行我们程序。
  2. 服务器升级,客户端可以无缝升级,就可以直接使用最新的功能。

在这里插入图片描述

1.2.2 WEB资源的类别

分类:静态资源(网站)和动态资源(网站)

1)静态网站的特点:

静态网页是相对于动态网页而言,是指没有后台数据库、不含程序和一些不可交互的网页。你编的是什么它显示的就是什么、不会有任何改变。

使用的技术有:HTML,CSS,JS等

2)动态网站的特点:

  1. 动态网页以数据库技术为基础,可以大大减少降低网站维护的工作量;

  2. 采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、用户管理、订单管理等等;

  3. 动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页;(网页是程序在运行过程中动态生成的)

使用的技术:JSP、Servlet,C#,PHP,Python

如果要学习动态网页的技术首先要用静态网页的基础

1.3 Web服务器

当我们在浏览器(客户端)通过互联网访问到一个Web网站时,那么Web网站将会把我们需要的资源响应给我们。所以这些Web网站需要提前将程序运行起来,而且由于用户访问时间的不确定性,因此Web网站一般不会关闭(永久运行下去);

我们使用JavaWeb技术栈编写好的程序(能够处理来自浏览器的访问的程序)需要部署到服务器上才能运行;

服务器一般指两个层面,一个是硬件层面,另一个是软件层面;

1.3.1 什么是服务器(硬件)

一般来说,我们平常所说的服务器其实就是一台计算机,只不过由于服务器需要处理大量的客户端请求,因此一般服务器的配置都比较好,性能高;

服务器上装的软件都是可以处理客户端请求的一些服务器软件,也叫Web服务器、Web容器;

在这里插入图片描述

1.3.2 什么是Web服务器(软件)

有了硬件层面的服务器,只是能确保这台电脑在互联网中能被其他的设备访问到(前提是大家都连接了互联网);

例如在浏览器的地址栏输入:http://12.19.128.177:881

上述的一个地址,可以使一台设备在互联网中通过IP寻找到这台服务器,并且通过881端口找到这台服务器上对应的应用程序。

但是,如何解析浏览器携带过来的数据呢?应用程序该如何响应数据到对方呢?数据格式应该为什么样子才能被浏览器所解析呢?这一系列的问题都比较麻烦;

在这里插入图片描述

因此,我们将上述这些不属于业务核心的功能交给其他工具做,这个工具就是Web服务器(软件层面),也叫Web容器;也就是说我们以后使用JavaWeb编写好的软件,需要部署到Web服务器中;

我们程序员写的Java程序运行在Web容器中,也称为Web服务器。JavaEE中Web容器也是用Java语言写的,由第三方厂商来写,Web容器运行Java虚拟机上。

在这里插入图片描述

1)JavaEE的规范

在Java中所有的服务器要实现一组Oracle公司规定的接口,这些接口称为JavaEE规范。不同厂商的JavaWeb服务器都实现了这些接口。在JavaEE中一共有13种规范。

常见的JavaEE规范有: JSP、Servlet、JDBC、XML、EJB、JMS、JTA、JavaMail、JNDI等

2)常见的Web服务器

1)WebLogic:WebLogic是Oracle公司的产品,收费;是目前应用最广泛的Web服务器,支持J2EE规范。WebLogic最早由WebLogic Inc. 开发,后并入BEA 公司,最终BEA公司又并入 Oracle公司。BEA WebLogic是用于开发、集成、集群、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。

在这里插入图片描述

2)WebSphere:

在这里插入图片描述

另一个常用的Web服务器是IBM公司的WebSphere,支持JavaEE规范。

3)其它:

名称 种类 公司 是否开源
Glass Fish 中型服务器 Oracle 开源
JBoss 中型服务器 JBoss 开源
Resin 小型服务器 Caucho公司 开源
Jetty 内置式服务器 Jetty/eclipse 开源

4)Tomcat服务器

在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器:Tomcat

在这里插入图片描述

支持的规范:该服务器支持全部JSP以及Servlet规范

二、Tomcat的使用

2.1 Tomcat的入门

2.1.1 下载

  • apache官网:www.apache.org

  • tomcat的产品页面: http://tomcat.apache.org/

在这里插入图片描述

2.1.2 Tomcat环境变量配置

  1. 设置环境变量

新建CATALINA_HOME

在这里插入图片描述

  1. 设置访问路径,可以在命令行的任何一个目录下访问bin目录下的可执行文件。

在这里插入图片描述

Tips:一定要配置JAVA_HOME环境变量

2.2 Tomcat目录结构

目录名 作用
bin 启动和关闭tomcat可执行文件
conf 配置文件夹,有些重要配置文件在这下面。如:server.xml, web.xml等 不建议乱修改,可能导致tomcat不能启动
lib tomcat使用时依赖的一些第三方jar包
logs 日志记录文件,记录服务器运行过程中一些事件。包括运行过程中出现异常
temp 临时文件夹,保存服务器运行过程中生成的一些垃圾文件
webapps 我们做好的项目发布的目录,可以通过浏览器来直接访问
ROOT目录:在浏览器上看到的欢迎页面,在这个目录下
work tomcat工作目录,所有已经发布项目,在这里生成中间文件执行

2.3 启动与关闭

在这里插入图片描述

在浏览器上访问:http://localhost:8080

在这里插入图片描述

2.4 Tomcat项目的发布方式

2.4.1 方式1:webapps

在webapps目录下创建一个文件夹demo,在文本夹下面有一个hello.html

在这里插入图片描述

重启服务器

访问:http://localhost:8080/demo/hello.html

在这里插入图片描述

2.4.2 方式2:虚拟目录

在conf/server.xml文件的host元素中配置Context(上下文)标签
path属性 虚拟访问目录的名称
docBase属性 Web应用所在目录

好处:项目不需要发布在webapps下,因为webapps项目越多,导致tomcat启动越慢。

案例:发布项目到d:/000目录下

在这里插入图片描述

找到server.xml文件中143行,host元素,写下面的代码:

<Context path="abc" docBase="d:/000"/>

如图所示:

在这里插入图片描述

在浏览器上测试:

在这里插入图片描述

2.5 修改Tomcat端口

默认情况下,Tomcat端口为8080,如果想要修改Tomcat的访问端口,可以打开Tomcat的配置文件:conf/server.xml

如图所示:

在这里插入图片描述

打开浏览器,访问:http://localhost:9090/abc/hello.html

在这里插入图片描述

三、Servlet快速入门

3.1 什么是Servlet

是一个Java写的小应用程序,运行在Web容器中,用于处理用户的请求,并且做出响应。

  • Servlet与普通的Java程序的区别:
    • 1)普通的Java程序由main函数调用,而Servlet由Web容器,Tomcat来调用。
    • 2)Servlet是运行在Web容器中
    • 3)对浏览器发送过来的请求做出响应

3.2 Servlet基于xml配置

  • 1)创建web工程/模块

在这里插入图片描述

  • 2)创建好的Web结构如下:

在这里插入图片描述

  • 3)为项目添加tomcat库

在这里插入图片描述

查看模块依赖:

在这里插入图片描述

  • 4)创建一个类HelloServlet继承于HttpServlet类,并重写doGet()方法。在浏览器上使用打印流输出Hello Servlet!
package com.dfbz.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 编写一个类继承HttpServlet
 */
public class HelloServlet extends HttpServlet {

    /**
     * 重写service方法
     *
     * @param request:  对请求数据进行封装
     * @param response: 对响应数据进行封装
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //得到一个打印流对象
        PrintWriter out = response.getWriter();
        //打印到浏览器上
        out.print("<h1>Hello Tomcat</h1>");
    }
}
  • 5)编辑web.xml中配置servlet,设置访问地址为/hello
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--servlet基本配置-->
    <servlet>
        <!--servlet名字(随意)-->
        <servlet-name>helloServlet</servlet-name>
        <!--Java类全名-->
        <servlet-class>com.dfbz.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--访问地址配置-->
    <servlet-mapping>
        <!--servlet的名字,与上面的名字相同-->
        <servlet-name>helloServlet</servlet-name>
        <!--浏览器访问地址,要以/开头 -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>

3.3 在idea中运行Servlet

3.3.1 idea中配置tomcat

我们要将idea和tomcat集成到一起,可以通过idea就控制tomcat的启动和关闭:

  • 1)编辑运行配置

在这里插入图片描述

  • 2)添加Tomcat的配置服务器信息

在这里插入图片描述

  • 3)配置服务器的详细信息

在这里插入图片描述

  • 4)发布项目

在这里插入图片描述

3.3.2 在idea中启动服务器

点右上角的启动图标,启动Tomcat服务器

在这里插入图片描述

开发时发布的工程在这个目录

在这里插入图片描述

浏览器测试访问:http://localhost:8080//hello

在这里插入图片描述

3.4 Servlet基于注解配置

使用注解@WebServlet,指定name和urlPatterns属性

@WebServlet注解属性 说明
name = “HelloServlet” Servlet名字,类似于<servlet-name>one</servlet-name>
urlPatterns = “/hello” 访问地址,可以指定多个地址<url-pattern>/hello</url-pattern>
value=“/hello” 如果其它属性都不写,可以省略urlPatterns,只写访问地址即可。不能与urlPatterns同时指定
  • 注解开发servlet代码,继承于HttpServlet,重写service方法:
package com.dfbz.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;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@WebServlet(name = "hello02Servlet",urlPatterns = "/hello")
public class Hello02Servlet extends HttpServlet {

    /**
     * 重写service方法
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型
        response.setContentType("text/html;charset=utf-8");
        //得到打印流
        PrintWriter out = response.getWriter();
        //在浏览器打印输出
        out.print("<h2>Hello02Servlet</h2>");
    }
}

重启Tomcat,访问浏览器:http://localhost:8080/hello02

在这里插入图片描述

四、Servlet的学习

4.1 Servlet 生命周期

4.1.1 Servlet 接口中生命周期方法

什么时候创建:默认第一次请求创建

什么时候销毁:服务器关闭销毁

方法 作用 运行次数
构造方法 在对象实例化的时候执行 1次
void init(ServletConfig config) 在初始化的时候执行 1次
void service(ServletRequest req, ServletResponse res) 每次请求都会执行 n次
void destroy() 在服务器关闭的时候 1次

4.1.2 Servlet的运行过程

在这里插入图片描述

4.1.3 案例:

package com.dfbz.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * 实现Servlet接口
 */
@WebServlet("/demo01")
public class Demo01Servlet implements Servlet {

    //构造方法
    public Demo01Servlet() {
        System.out.println("Demo01被实例化");
    }

    //初始化的方法
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init方法被执行");
    }

    //得到一个配置对象,不属于生命周期的方法
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //请求处理方法,每次请求都会调用
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service方法被调用");
    }

    //不属于生命周期的方法,得到一个字符串
    @Override
    public String getServletInfo() {
        return null;
    }

    //销毁方法:服务器关闭时候执行一次
    @Override
    public void destroy() {
        System.out.println("destroy方法被执行");
    }
}
  • 问:一个Servlet在Tomcat中会生成几个对象?

一个Servlet类在Tomcat中只会生成一个对象,不同的浏览器是不同的用户,每个用户是一个线程。

  • 问:在service方法中输出request和response对象,这两个对象从哪里来的?

这两个对象是tomcat创建,并且通过service方法传递进来,我们可以直接使用这两个对象。

4.2 Servlet的执行过程

在这里插入图片描述

  1. 浏览器发送请求,tomcat接收到请求的地址。通过请求地址找到访问哪个项目,通过最后/hello,找项目中所有的Servlet

  2. 通过反射读取每个Servlet中的注解值,匹配到/hello,找到了需要访问的servlet。

  3. 通过反射实例化这个Servlet对象

  4. 创建request和response对象

  5. 并且调用service方法,将request和response对象传递进来。

  6. 执行servlet中的代码

  7. 将响应的信息封装成response对象返回到浏览器,在浏览器上显示出来。

4.2.2 Servlet继承体系

  1. Servlet对象由Tomcat通过反射创建
  2. request与response对象由tomcat创建,并且传递给servlet中service方法。
  3. request对象封装所有浏览器发送的对象
  4. response对象封装所有的服务器响应返回给浏览器
  5. Servlet的实现类

Servlet继承结构:

在这里插入图片描述

4.2.3 GenericServlet类的概述

在这里插入图片描述

默认实现了Servlet和ServletConfig这两个接口,并且有默认的实现,它的子类是HttpServlet,为了简化HttpServlet编写。如果我们写的Servlet使用的是Http协议,建议继承于HttpServlet。现在所有的浏览器都是使用http协议,所以我们以后都是继承于HttpServelt类就可以了。

  • 源代码:
package com.dfbz.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 通过继承于GenericServlet来写一个Servlet
 */
@WebServlet("/demo4")
public class Demo4Servlet extends GenericServlet {
    //只需要重写service方法即可
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        //设置响应的类型:为html,编码:utf-8
        response.setContentType("text/html;charset=utf-8");
        //得到打印流
        PrintWriter out = response.getWriter();
        out.print("我是GenericServlet的子类");
    }
}

4.2.4 分析HttpServlet的功能

  • 查看HttpServlet类的部分源码:
public abstract class HttpServlet extends GenericServlet {
    //定义了一些常量
    private static final String METHOD_GET = "GET";
    private static final String METHOD_POST = "POST";

    public HttpServlet() {
    }

	//自己的doGet方法
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }

	//自己的doPost方法
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }

	//自己的service方法
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	    //得到请求的方法:返回GET或POST
        String method = req.getMethod();
		//如果是GET请求,调用doGet
        if (method.equals("GET")) {
              this.doGet(req, resp);
	    //如果是POST请求,调用POST方法
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else {
		    //如果所有的都不匹配,发送一个错误
            resp.sendError(501, errMsg);   //发送一个错误信息
        }
    }

	//Servlet接口中定义的方法
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;   //请求子接口
        HttpServletResponse response;   //响应子接口
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException("non-HTTP request or response");
        }
		//调用自己的service
        this.service(request, response);
    }
}

在Servlet规范中,只有有请求达到了Servlet,那么必将执行Servlet的service方法,而在HttpServlet的service方法中做了如下功能:

  • 1)对原有的ServletRequest、ServletResponse进行了增强,替换为了HttpServletRequest、HttpServletRequest
  • 2)调用了HttpServlet自己的service方法(重载),并且能够根据前端的提交方式不同来选择执行不同的方法
    • 如前端提交方式为get,那么则执行doGet方法,如提交方式为post,则执行doPost方法

在这里插入图片描述

需要注意的是:如果表单form method=”post”提交使用的是post方法,我们servlet中就要重写doPost方法,除此之外全部使用doGet方法。

我们在前端提交时经常会发现如下提交类型:

  • Query String Parameters:当发起一次GET请求时,参数会以url string的形式进行传递。即?后的字符串则为其请求参数,并以&作为分隔符。
  • Form Data:当发起一次POST请求时,若未指定content-type,则默认content-type为application/x-www-form-urlencoded。即参数会以Form Data的形式进行传递,不会显式出现在请求url中。
  • Request Payload:当发起一次POST请求时,若content-type为application/json,则参数会以Request Payload的形式进行传递(显然的,数据格式为JSON),不会显式出现在请求url中。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131644.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!