01WEB开发Servlet

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01WEB开发Servlet相关的知识,希望对你有一定的参考价值。


文章目录

  • ​​01【WEB开发、Servlet】​​
  • ​​一、WEB开发简介​​
  • ​​1.1 什么是WEB开发​​
  • ​​1.2 软件的架构​​
  • ​​1.2.1 BS和CS概述​​
  • ​​1.2.2 WEB资源的类别​​
  • ​​1)静态网站的特点:​​
  • ​​2)动态网站的特点:​​
  • ​​1.3 Web服务器​​
  • ​​1.3.1 什么是服务器(硬件)​​
  • ​​1.3.2 什么是Web服务器(软件)​​
  • ​​1)JavaEE的规范​​
  • ​​2)常见的Web服务器​​
  • ​​二、Tomcat的使用​​
  • ​​2.1 Tomcat的入门​​
  • ​​2.1.1 下载​​
  • ​​2.1.2 Tomcat环境变量配置​​
  • ​​2.2 Tomcat目录结构​​
  • ​​2.3 启动与关闭​​
  • ​​2.4 Tomcat项目的发布方式​​
  • ​​2.4.1 方式1:webapps​​
  • ​​2.4.2 方式2:虚拟目录​​
  • ​​2.5 修改Tomcat端口​​
  • ​​三、Servlet快速入门​​
  • ​​3.1 什么是Servlet​​
  • ​​3.2 Servlet基于xml配置​​
  • ​​3.3 在idea中运行Servlet​​
  • ​​3.3.1 idea中配置tomcat​​
  • ​​3.3.2 在idea中启动服务器​​
  • ​​3.4 Servlet基于注解配置​​
  • ​​四、Servlet的学习​​
  • ​​4.1 Servlet 生命周期​​
  • ​​4.1.1 Servlet 接口中生命周期方法​​
  • ​​4.1.2 Servlet的运行过程​​
  • ​​4.1.3 案例:​​
  • ​​4.2 Servlet的执行过程​​
  • ​​4.2.2 Servlet继承体系​​
  • ​​4.2.3 GenericServlet类的概述​​
  • ​​4.2.4 分析HttpServlet的功能​​

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 客户端-服务器模式。用户需要在本地电脑上安装客户端软件,再来访问服务器。

01【WEB开发、Servlet】_java

CS的特点:

  1. 必须在本地电脑安装客户端软件
  2. 如果服务器升级,客户端一般来说要伴随着要升级。客户端还会经常进行升级并且安装。

BS的特点:

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

01【WEB开发、Servlet】_servlet_02

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容器;

01【WEB开发、Servlet】_java_03

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

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

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

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

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

01【WEB开发、Servlet】_java_04

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

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

01【WEB开发、Servlet】_servlet_05

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应用服务器。

01【WEB开发、Servlet】_Web_06

2)WebSphere:

01【WEB开发、Servlet】_前端_07

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

3)其它:

名称

种类

公司

是否开源

Glass Fish

中型服务器

Oracle

开源

JBoss

中型服务器

JBoss

开源

Resin

小型服务器

Caucho公司

开源

Jetty

内置式服务器

Jetty/eclipse

开源

4)Tomcat服务器

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

01【WEB开发、Servlet】_servlet_08

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

二、Tomcat的使用

2.1 Tomcat的入门

2.1.1 下载

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

01【WEB开发、Servlet】_前端_09

2.1.2 Tomcat环境变量配置

  1. 设置环境变量

新建​​CATALINA_HOME​

01【WEB开发、Servlet】_servlet_10

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

01【WEB开发、Servlet】_java_11

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 启动与关闭

01【WEB开发、Servlet】_前端_12

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

01【WEB开发、Servlet】_java_13

2.4 Tomcat项目的发布方式

2.4.1 方式1:webapps

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

01【WEB开发、Servlet】_java_14

重启服务器

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

01【WEB开发、Servlet】_Web_15

2.4.2 方式2:虚拟目录

在conf/server.xml文件的host元素中配置Context(上下文)标签

path属性

虚拟访问目录的名称

docBase属性

Web应用所在目录

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

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

01【WEB开发、Servlet】_服务器_16

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

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

如图所示:

01【WEB开发、Servlet】_Web_17

在浏览器上测试:

01【WEB开发、Servlet】_Web_18

2.5 修改Tomcat端口

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

如图所示:

01【WEB开发、Servlet】_servlet_19

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

01【WEB开发、Servlet】_Web_20

三、Servlet快速入门

3.1 什么是Servlet

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

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

3.2 Servlet基于xml配置

  • 1)创建web工程/模块

01【WEB开发、Servlet】_前端_21

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

01【WEB开发、Servlet】_服务器_22

  • 3)为项目添加tomcat库

01【WEB开发、Servlet】_服务器_23

查看模块依赖:

01【WEB开发、Servlet】_java_24

  • 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)编辑运行配置

01【WEB开发、Servlet】_Web_25

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

01【WEB开发、Servlet】_Web_26

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

01【WEB开发、Servlet】_java_27

  • 4)发布项目

01【WEB开发、Servlet】_java_28

3.3.2 在idea中启动服务器

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

01【WEB开发、Servlet】_前端_29

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

01【WEB开发、Servlet】_服务器_30

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

01【WEB开发、Servlet】_servlet_31

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

01【WEB开发、Servlet】_java_32

四、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的运行过程

01【WEB开发、Servlet】_java_33

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的执行过程

01【WEB开发、Servlet】_Web_34

  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继承结构:

01【WEB开发、Servlet】_java_35

4.2.3 GenericServlet类的概述

01【WEB开发、Servlet】_servlet_36

默认实现了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方法

01【WEB开发、Servlet】_servlet_37

需要注意的是:如果表单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中。


以上是关于01WEB开发Servlet的主要内容,如果未能解决你的问题,请参考以下文章

web.xml 文件配置01

用框架名唬人谁都会

Spring MVC程序

Servelt动态Web资源开发技术(java程序运行在服务器端)

Servlet的用法

Spring学习之第一个Spring MVC程序(IDEA开发环境)