一、XML
1、什么是xml
xml文件通常作为配置文件来给服务器读取,里面的配置信息包括端口号,资源的地址,或者数据库的用户名密码等。
此外,xml文件由于可以自己定义一个元素标签,所以我们可以用xml文件存储复杂的数据关系。
xml文件以.xml结尾,我们在idea中可以使用new - File创建xml配置文件。
早期的QQ就是使用xml来作为存储数据的一种方式。
2、xml的语法
(1)文件声明
放在第一行,其中包括version 版本号,encoding 编码方式。
(2)元素
其中所有元素都要包含在根元素的内部,例如上面演示的<students></students>就是一个根元素。一个xml文件中有且仅有一个根元素。
在根元素之间,可以自己定义其他的子元素。
(元素也可以叫做标签、节点等)
元素标签的命名区分大小写,如<p>和<P>是不同的两个元素。
元素命名不可以包含空格,也不可以以数字开头。
可以使用下划线_来间隔单词。
(3)属性
在一个元素内部可以自定义一个属性,并使用=“【值】” 赋值。
其中一个元素可以有多个属性,属性的值不可以包含 & 这个字符。

如果属性的值有双引号,那么我们需要把双引号改为单引号。
(4)注释
注释的形式和html一样
(5)CDATA节
现在我们想要让xml文件的某些内容不要作为一个元素,而是作为一个文本直接在网页上显示,我们就可以把这段内容用CDATA节包含起来。
形式是这样的:
<![CDATA[ 【内容】 ]]>
(6)转义字符
对于某些单个字符我们想要显示出它的原本文本,并且是一个特殊字符,我们就需要使用转义字符,常见的转义符如下图展示:

3、DOM4j
现在设想一下:我们配置好了xml文件后,我们应该怎样来获取xml里的信息?我们还需要一种技术来获取xml的信息,并且来操作xml。
这个就是DOM4j,我们可以用java程序来获取xml信息。
(1)基本使用方法
首先,java开发者并没有设计一系列的api来帮助我们调用xml信息,我们需要在java工程项目中添加DOM4j的jar包,之后就可以用这里面的api来获取xml内容了。
之后,我们需要使用这个jar包中开发者们定义好的api。
用SAXReader()来获取一个SAXReader对象,并通过这个reader的read方法来获取一个document,这个document就是我们的xml文件。
在read()方法中要放入一个File对象,通过之前笔记讲过的IO流的方法来读取文件。
这个document表示的就是整个xml文档。
之后,我们要通过这个document对象来获取xml的根元素,获取到根元素后,使用elements方法可以得到一个List列表,通过List的get()方法可以获取根元素的子元素,这里我们get(0)就是获取第一个子元素。
获取到子元素student后,由于student还有子元素,我们还可以通过element()获取子元素,在括号中填入子元素的名称即可:
完整代码如下:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class Dom4j_Test {
public static void main(String[] args) throws DocumentException {
//创建SAXReader对象 并获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("web/WEB-INF/test1.xml"));
//获取xml文档的根元素
Element rootElement = document.getRootElement();
//通过根元素 获取子元素 使用elements这个方法获取的是一个元素的列表
List students = rootElement.elements("student");
//通过列表get其中某个子元素 注意要类型转换 因为列表中都是Object类型
Element stu1 = (Element) students.get(0);
//由于stu1这个子元素下还有子元素,所以我们再取出它的子元素,这次用element方法
Element name = stu1.element("name");
Element age = stu1.element("age");
System.out.println(name.content());//tom
System.out.println(age.content()); //18
}
}
(2)xml的增删改
在Web开发中,后端程序员的主要业务还是在于查xml中,增删改不常用,所以这里不介绍了。
二、Tomcat
1、什么是Tomcat?
Tomcat是一个Web服务器,提供支持servlet的服务,也是目前应用最广的Web服务器(免费)。
Tomcat的本质是一系列java程序,它可以处理http请求,返回http响应,并能管理软件开发者定义的servlet。
有了Tomcat,我们可以实现网页和服务器的通信,实现动态网页。同时我们的静态网页也可以放在Tomcat中,通过Tomcat就可以直接访问,也就是可以实现网页的远程访问,而不是本地访问。
2、Tomcat的部署安装
Tomcat 官方站点:http://tomcat.apache.org/
下载8.0.50版本比较稳定。
下载解压后即可使用。
3、Tomcat的基础使用方式和内部构造
(1)启动Tomcat
找到安装Tomcat的目录中的bin目录,这里有一个startup.bat文件,双击后会弹出命令行窗口
注意这个命令行窗口不要关闭,如果关闭窗口,那么Tomcat服务也会关闭。
然后我们在浏览器中输入 http://localhost:8080 (如果你的进程中有监听8080这个端口的,那么tomcat服务就会被占用,这需要我们修改tomcat的监听的端口号,这里我改为了9000)如果出现的是Tomcat的默认界面如下 ,这样就算启动成功了。
当然,tomcat本身是一个java程序,所以如果系统没有配置好jdk的环境变量的话,肯定也是无法启动的。
(2)Tomcat的目录结构
可以看到我们安装的tomcat的目录下有很多目录,那么这些目录都是做什么的,我们下面来讲解一下。
bin目录: 存放启动和关闭Tomcat的脚本文件(之前的startup.bat文件就是在这个目录)
conf目录:存放tomcat的各种配置文件
lib目录:存放各种jar包
logs目录:存放各种日志文件,可以看到用户使用tomcat的时间段
temp目录:产生的临时文件
webapps目录:这里是web应用所在的目录,我们把web资源放在这里(后面我再详细讲,大家先记住这个目录)
work目录:tomcat的工作目录
这里,我们打开conf目录,看一看这里的配置文件:
然后我们发现,这里有一个server.xml和web.xml,这两个文件也很重要,我们记住它。
server.xml:用来配置tomcat的端口号、主机等网络配置的,我们用记事本打开看一下。
可以看到,里面有很多的xml元素,而其中有一些的属性port值,这也就是我们tomcat监听的端口号,这里已经被我修改过了,默认的port值是8080,而我的8080已经被其他程序占用了,所以我们可以将8080全部替换为9000(或者没有被占用的端口),这样我们使用tomcat的时候监听的端口就是9000了。
web.xml文件用于指定tomcat运行时的配置。
(3)在Tomcat中部署web应用
web应用,就是多个web资源组成的集合。
web资源,就是互联网可以解析的各种文本、图像、视频、html页面、用户产生的信息等。
一个web应用包含html、css、js文件、java程序、jar包、配置文件等,每一种文件需要放在对应的文件夹下。
目录结构如下:

了解了以上内容后,我们来亲自操作一把。
首先,我们先写一个简单的html页面
把这个html文件复制一下,然后来到Tomcat目录下的webapp文件夹下,新建一个文件夹,我们随便取个名叫test
把我们刚刚复制的html文件放到test文件夹下
然后我们启动tomcat(如果没启动的话),
在网页上输入 http://localhost:【你的端口号】/test/test2.html
然后就可以看到我们刚刚写的页面出现在了浏览器中
以上的内容可以让大家体会tomcat在我们web开发中的作用,以及Tomcat的使用方法。
然而在我们实际开发中并不是用这种复制粘贴的方式,我们以上的这些操作在IDEA中可以自动帮我们完成,我们只需要写页面写java程序即可,请看后面的内容。
4、浏览器访问服务器的web文件的时序图(重要)
我们来一步步的讲解:
(1)浏览器输入网址
浏览器这一步会解析出网址中的主机名,也就是www.xxx.com这一部分。
(2)浏览器在系统中的Windows/System32/drives/etc/host文件查找主机名对应的ip地址
这一步如果没有找到这个主机名以及对应的ip,那么就会执行第(3)步;
如果找到了主机名和ip就跳过第(3)步。
(3)没有找到ip 到DNS中寻找ip
浏览器发现本地没有这个ip地址,所以去DNS(域名服务器)中找ip地址。
如果这一步依然没有找到ip地址,就会直接返回浏览器404,未找到资源。
找到了就执行下一步。
(4)浏览器发送http请求
浏览器根据获取到的ip地址发送一个http请求,向tomcat服务器索要web资源。
(5)tomcat服务器解析出http请求中浏览器想要获取的web资源名
(6)tomcat到放web资源的目录下获取资源
(7)tomcat以http响应的方式返回资源给浏览器
根据上面的演示返回的是html文件
(8)浏览器解析获取的资源,显示在浏览器上
5、在IDEA中部署tomcat
之前我们学过了使用原始的复制粘贴的方式来进行使用tomcat来显示我们的页面,接下来我教大家如何使用IDEA来部署tomcat,从而使用tomcat。
(1)操作步骤
新建一个工程,选择java工程。
之后一路点 next 并自己命名一下。
在工程窗口中我们右键点击工程总目录,并点击第二栏的这个选项
我们勾选上这个Web选项,然后直接点ok
然后我么会发现,工程目录下多了一些文件夹
我们说明一下这些目录分别存放什么样的文件:
src目录:存放java程序(这个我们是熟悉的)
web目录:存放html、css、js、图片等资源文件(这里不要放在WEB-INF文件夹下,就是直接放在web目录下就可以)
WEB-INF目录:这个目录受服务器保护,浏览器不能直接访问,我们用于放一些配置文件和jar包(我们可以在这里建一个lib目录专门用于放jar包)
之后我们需要点击右上角的Add Configuration(这里不要点旁边的小锤子,不然只会配置,不会添加)
然后点新窗口的左上角的加号(一定要点加号)
往下找,有个Tomcat Server选择local
然后会弹出这样一个界面,我们在这个界面修改一些参数
第一处我们要先添加Tomcat的文件夹,不然IDEA不知道你的Tomcat在哪里

第二处我们在第二个标签页面的右下角,点击加号
点Artifact
然后再下面修改网页目录
然后回到第一个标签页,把这两个选项都改成图的这个选项,这个是热加载,也就是如果我们更新了html文件,只需要刷新网页就可以更新,不需要重新启动Tomcat。
然后就点击ok,之后就完成部署了
(2)部署网页
我们之前把html文件放到Tomcat目录下的webapp目录下。这里我们在IDEA部署网页就只需要在web目录下放上我们的html文件等web资源即可。
(3)测试网页
我们现在把之前的放在Tomcat目录下的webapp目录下的html文件删掉,并把之前的Tomcat服务命令行窗口关闭,从而关闭Tomcat服务。
之后我们点击右上角的run按钮,启动Tomcat。启动完成后会出现如下的网页
然后我们在浏览器中输入http://localhost:8080/tomcatTest/test/test2.html 看看是否成功显示。
这里我们localhost:8080/后面跟的这个名就是我们之前在配置tomcat的时候自己取的名:
三、Servlet
1、为什么需要Servlet
通过上面的学习我们已经可以将一个静态页面通过浏览器和Tomcat进行远程访问。
现在有这么一个需求,我们希望用户可以在网页中留言并让其他的用户看到这个网页上的留言,并且发布这个留言的用户还可以修改自己的留言,也就是实现一个动态网站,我们目前能不能做到呢?
显然我们现在的技术力还不够,因为我们没有办法实现浏览器网页和服务器的交流,只能由浏览器单方面的获取服务器的资源。
要想实现这样的动态网页,我们需要打通浏览器和服务器之间的信息交流,这就需要我们学习Servlet技术。
2、到底什么是Servlet?
Servlet本身是Java语言编写的一系列Java类,它可以让开发者进行调用,从而完成浏览器和服务器的信息交流。
Servlet是由Tomcat调用和执行的。Tomcat中有一个HashMap表,这个HashMap专门用于存放Servlet,当Tomcat需要调用某一个Servlet时,会根据web.xml配置,找到相应的Servlet从而执行相应的操作。
当某一个Java类实现了Servlet的接口或者继承了Servlet的某个类时,我们把这个Java类也叫做一个Servlet,我们在这个Java类中可以重写Servlet接口/父类的方法,我们在这些方法中就可以进行数据的处理,从而实现相关的功能,如保存留言、计算数据等。
3、动手开发一个Servlet
我们这里简单的实现一个Servlet,来让大家对Servlet有更具体的印象。
我们在之前已经配置好了Tomcat的相关配置,我们接着在这个工程项目中开发Servlet。
首先引入Servlet的jar包。因为Servlet是jdk中没有的一系列Java类,所以我们需要引入Servlet的jar包才能调用Servlet的Java类。
在Tomcat的目录中的lib目录下,就有Servlet的jar包,我们复制一下。
拷贝到工程目录中的WEB-INF目录下的lib目录(自己建一个lib目录)。
然后右键Servlet jar包,点击Add as Library
之后点OK,点完之后发现jar包下出现一些目录,说明添加成功了
然后我们编写一个Java类,并让这个Java类实现Servlet接口。
在src目录中新建Java类(Java程序都是放在src目录的,以后不再重复),并让其实现Servlet接口。
这里会发现报错,因为在Java基础里我们讲过,实现一个接口就要重写这个接口中定义的所有抽象方法,所以这里我们直接Alt + Shift + Enter 引入所有的方法。
可以看到这里我们已经实现了Servlet接口中的所有方法。(方法之间的横线是可以自己设置的)
接下来我们先来认识一些主要方法,然后再继续进行下一步。
init方法:初始化时被调用
service方法:处理数据的主要调用的方法
我们可以看到service方法中有两个传入参数,一个是ServletRequest,一个是ServletResponse,这两个参数分别是服务器接收到的数据,和服务器想要发送出去的数据。
通过这两个参数,我们就可以控制服务器和浏览器之间的交流方式。
destroy方法:
现在各位已经对Servlet的一些主要方法有了一些认识,
接下来我们来配置web.xml文件
打开文件看到里面默认是这样的
我们需要在两个<web-app >根元素之间配置信息。
首先写一个<servlet>标签然后在这个标签中添加两个子元素<servlet-name>和<servlet-class>,里面的内容写上自己实现了Servlet接口的Java程序(以后简称我们写的Servlet)的名字。
然后再在<servlet>标签外平行创建一个<servlet-mapping>标签,然后配置以下信息:
这里的url-pattern里的内容可以自己定义,但注意一定要是 / 开头的,这里的url-pattern决定我们之后在浏览器中需要输入的网址(资源)的内容。
这里我先不讲这些标签的含义和作用,我们先继续往下做。
配置好了以后我们回到我们写的TestServlet中,在service方法中添加以下语句,并写一个doGet()和doPost()方法。
这样我们进行了一个简单的业务处理,获取到http请求的方式是get还是post(当然,也可能是其他的,所以这里要写为else if不能写成else),然后调用相应的方式。
然后在init方法中添加一个输出:
然后我们写一个html页面来从而可以调用到这个servlet资源:
这里写了一个表单的页面,只有一个按钮,显示出来是这样的:
我在<form>标签中添加了action属性 = http://localhost:9000/tomcatTest/test 还记得这个/test吗? 就是我们在web.xml文件中配置的url-pattern。(而这里的tomcatTest则是我们在配置tomcat是设置的,具体的内容看之前的tomcat回顾一下) 这将会导致我们按下按钮时,向Tomcat请求一个servlet资源 /test,然后Tomcat就会调用这个servlet资源的service方法,(这里我们没有在service方法中写返回新页面的代码,所以这里会返回一个空页面)。当Tomcat调用这个资源时,我们回到控制台上看看会发生什麽。
我们按下按钮后,控制台上会显示两个信息,一个是init方法被调用、一个是收到post请求。这表明我们servlet资源被网页成功的请求到了。
而如果我们再按一次按钮,这时候就不会调用init方法,因为这个servlet资源已经被初始化过了,所以不会再一次调用init方法。
而由于我们的表单提交中的Method属性是post,所以会调用servlet资源中的post的处理方法。
如果改为get,那么输出也会相应变化,大家可以试一试。
以上我们只是简单的演示servlet的运作,但是应该可以让大家比较清楚的认识servlet。
4、浏览器调用如何调用servlet + 图解
在看图解之前,我们需要先认识一下web.xml文件中的我们配置的各个标签的含义。
(1) <servlet-name>:给Servlet取的一个别名,用于给tomcat识别
(2)<servlet-class>:我们编写的TestServlet类的全类名,这里由于没有多级目录,所以就写了一个TestServlet
(3)<servlet - mapping>:建立一个映射关系,让servlet-name 和 url-pattern可以关联起来
(4)<servlet-name>:这里的servlet-name 和之前的不同,这里的是为了告诉tomcat,我们的url是分配给那个servlet使用
(5)<url-pattern>:这里就是当浏览器发出请求后,如果有请求的是url-pattern里对应的资源,那么就可以继续进行,如果url-pattern中没有对应的资源,就返回404.
然后我们梳理一下整个流程:
首先,浏览器想要访问http://localhost:9000/tomcatTest/test ,会给服务器发送一个http请求,这个请求中包含着/test这个信息。
1、tomcat服务器接收到这个http请求后,会把/test这个资源解析出来(即拆解出来)。
2、然后tomcat会在web.xml文件中查找url-pattern,看看有没有这个/test。
3、如果没有就会直接返回404,如果有就会找到这个url-pattern对应的servlet-name。
4、根据得到的servlet-name tomcat会获取到web.xml文件中对应的servlet-class tomcat会在自己内部的HashMap中 以id 为键,查找对应的Servlet值。
5、如果已经有了对应的Servlet,那么就不需要创建,直接运行Servlet的service() 方法
如果没有对应的Servlet,那么就调用Servlet的init()方法初始化一个Servlet并放入HashMap中。然后调用Servlet的service()方法。
(可见,如果一个servlet已经被初始化过,那么第二次使用这个servlet的时候就不会调用init()方法初始化)
5、servlet生命周期图

6、自动装载
如果我们希望一个servlet在我们tomcat服务器启动的时候就进行初始化,我们可以设置这样一个标签:<load-on-startup>1<load-on-startup>
这里的数字1表示在tomcat启动时第一个将其初始化,如果是2就是第二个初始化,也就是代表了顺序。
7、通过HttpServlet开发Servlet
之前我们通过实现Servlet接口来开发一个Servlet类,接下来我们通过继承HttpServlet类来开发一个Servlet类。

我们可以看到,HttpServlet类通过继承GenericServlet实现了Servlet接口,所以刚才的service()方法,init()方法,destroy()方法也就都包含在内。
开发方式大同小异,我们只需要把实现Servlet接口改为继承HttpServlet类就可以。
直接上代码:
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//这里不同的一点在于,不用类型转换了 req本身就是HttpServletRequest类型
String method = req.getMethod();
if("GET".equals(method)){
doGet();
}else if("POST".equals(method)){
doPost();
}
}
public void doGet(){
System.out.println("收到一个GET请求···");
}
public void doPost(){
System.out.println("收到一个POST请求···");
}
}
web.xml文件的配置方法一样。
这里需要注意一下,我们修改了java文件后,需要对tomcat重新部署,不然我们的修改不会生效。
(但是如果修改的是html页面文件,我们直接刷新页面就可以看到修改,不用重新部署tomcat)
我们重新部署tomcat,并对我们编写的servlet进行测试即可。
8、IDEA自动配置Servlet
IDEA有自动配置Servlet的功能,可以帮助我们节省一部分工作,我们来看一下。
(1)在创建Java类时我们新建一个Servlet
(2)然后配置信息,这里配置的信息会自动的添加到web.xml文件中
点击ok后,发现web.xml文件中多了几行配置:
并且这个新建的类也会自动编写doPost和doGet方法
(3)配置<servlet-mapping>
虽然<servlet>已经由IDEA配置完成,但是我们还需要手动添加其映射 即 <servlet-mapping>。
之后的步骤与之前一致
9、Servlet的内部细节
(1)Servlet是基于Java程序的,本质是一些Java类,需要Java的运行环境
(2)当浏览器发出多起http请求 请求同一个Servlet时,tomcat只会创建一个Servlet实例对象,而一旦Servlet实例对象被创建以后,就会在内存中留存,为后续的请求进行服务,直到tomcat关闭。
(3)init方法只会调用一次,就是在创建Servlet实例时。
(4)每次访问请求,Servlet都会创建一个HttpRequest对象和HttpResponse对象。然后将这两个对象传递给service()方法的两个参数。
10、使用注解方式开发Servlet
(1)开发方法
除了通过web.xml配置Servlet的url等信息外,我们还可以通过注解来配置Servlet。
如果你对注解和反射的内容有缺失,可以看我的Java笔记,这里注解和反射的详细笔记。
Java面向对象(高级)图解笔记整理/0基础快速入门(四)-优快云博客
Java 网络编程、反射合集 图解笔记整理/0基础快速入门(七)-优快云博客
我们编写一个HelloServlet.java来演示如何通过注解开发Servlet。
这里我们先继承HttpServlet并重写service方法和doGet和doPost方法,跟之前一样。
然后我们配置注解,@WebServlet()并在里面配置urlPattern
使用注解进行配置以后,我们就可以不用再web.xml文件中配置了。
也就是说,使用注解配置就相当于配置了web.xml文件中的<servlet> 和<servlet-mapping>两个配置。
然后我们直接把之前写的页面修改一下,修改请求servlet资源/test3,这里的test3与我们配置的注解的urlPattern相对应一致。
我们重新部署tomcat,并对我们编写的servlet进行测试。
输出信息:说明servlet请求成功
(2)urlPattern使用细节
urlPattern有几种使用方法,可以写全url名,也可以有模糊匹配的方法。
精准匹配:
写出servlet的url的全名,这样就会匹配到这个特定的servlet 这也是我们之前一直在用的方法。
目录匹配:
目录匹配可以匹配到这个目录下的资源。
如:/abc/*
这里我们在后面添加一个/* 也就是告诉程序,这个可以匹配到/abc目录下的 所有servlet资源。
扩展名匹配:
可以匹配到有指定扩展名的资源
*.action
这里就会匹配到所有后缀是.action的资源。注意,这里不需要在前面添加 / .
任意匹配:
可以匹配到所有请求的资源(仅特殊情况使用,一般情况不用)。
/ 或 /*
如果我们使用注解方式配置了这个任意匹配,那么就会将所有的请求全部调用这一个web资源而降其他的资源覆盖掉。所以一般不要使用这个方式。
建议使用一律使用精准匹配来配置url。
下一篇整理HTTP协议的详细内容,求关注。
祝大家五一假期快乐!(*^▽^*)