学习JavaWeb(三)——xml、Tomcat

前言:

承接前面的内容,继续来学习javaweb

 

 

 

 


XML

以前我写过一篇关于xml的简单了解,有兴趣的同学可以先去看看那个

什么是xml:

xml是可扩展性标记语言

xml的发展与html

html和xml都有一个共同的父亲——W3C(万维网联盟:World Wide Web Consortium)

早年期间,由于各个浏览器的恶性竞争(攀比着“解析错误html”的能力),导致HTML语法非常松散。

W3C组织觉得html语法过于松散,于是想要放弃html,于是发明出来了xml,用严格的语法取代html。

可惜大家都喜欢松散的语法,故xml没有竞争过html,xml于是就想去换发展方向。

于是就在“配置文件”的道路上发展了。

 是的,开始去针对properties了

xml作用

  • 保存数据,而且这些数据具有自我描述性
  • 作为项目或者模块的配置文件
  • 作为网络传输数据的格式(现在以json为主)

 

xml语法

我们新建一个项目——JavaWeb(后面就会一直用这个项目了),然后新建一个Java模块(不是static web了,注意),然后新建一个目录叫xml,用来存放一会用到的东西。再在xml目录下新建一个文件,我这里叫 books.xml

  • 文档声明:<?xml version=”1.0″ encoding=”utf-8″ ?>
    • 属性列表:
      • version:版本号
      • encoding:编码方式,告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
      • standalone:是否独立
        • yes:不依赖其他文件
        • no:依赖其他文件
  • 元素(标签):xml元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可以包含其他的元素(子元素)、文本或者两者的混合物,元素也可以拥有属性。关于xml元素的命名规则参考下面:
    • 名称可以含字母、数字以及其他的字符
    • 名称不能以数字或者标签符号开始
    • 名称不能以字符 “xml”(或者 XML、Xml)开始
    • 名称不能包含空格
  • xml注释:与html中一样,使用<!–内容–>来注释
  • 文本区域(CDATA区):<![CDATA[这里可以把你输入的字符原样显示,不会解析xml ]]>(不必专门使用字符实体啦!)

xml示例:

<?xml version="1.0" encoding="utf-8" ?> <!--xml的声明-->
<books>
    <book sn="SN123123123">
        <name>时间简史</name>
        <author>霍金</author>
        <price>55</price>
    </book>
    <book sn="SN123123124">
        <name>Java从入门到放弃</name>
        <author>小明</author>
        <price>47</price>
    </book>
    <book sn="SN123123125" name="吉他自弹300首" author="佚名" price="30"/>
</books>

xml的语法要求会比html严格很多,xml有很多编写要求,例如:

  1. 标签必须闭合
  2. 不可交叉嵌套
  3. 区分大小写
  4. 必须有跟标签
  5. 属性值必须加双引号
  6. 特殊字符要使用字符实体

一个xml文件示例

<?xml version="1.0" encoding="utf-8" ?> <!--xml的声明-->
<books>
    <book sn="SN123123123">
        <name>时间简史</name>
        <author>霍金</author>
        <price>55</price>
    </book>
    <book sn="SN123123124">
        <name>Java从入门到放弃</name>
        <author>&lt;小明&gt;</author>
        <price>47</price>
    </book>
</books>

XML约束

概念

很多时候,程序员需要通过修改xml文件来调整一些半成品软件的配置,即框架的配置。

但是程序员会很迷茫,不知道在配置文件中应该怎么去编写,故框架提供方会提供一个文档,即约束文档,来告诉程序员配置文件的编写规范。

分类

  1. DTD:一种简单的约束技术
  2. Schema:一种复杂的约束技术

DTD约束技术

在pers.luoluo.xml.dtd下有文件student.dtd:

//student.dtd
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>

解读约束文档:

  1. 元素students下有元素student*(student+0个或多个字符串)
  2. 元素student下有元素name、age、sex,且必须保持顺序
  3. name、age、sex的类型是字符串
  4. student有属性number,属性类型为ID(表示属性值必须唯一),且属性是必须出现的

引入dtd文档到xml文档中

  • 内部dtd:将约束规则定义在xml文档中
  • 外部dtd:将约束的规则定义在外部的dtd文件中
    • 本地:<!DOCTYPE    根标签名   SYSTEM   “dtd文件的位置”>
    • 网络:<!DOCTYPE    根标签名   PUBLIC   “dtd文件名字”     “dtd文件的位置URL”>

我们写一个students示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">

<students>
	<student number="s001">
		<name>Tom</name>
		<age>23</age>
		<sex>male</sex>
	</student>
	<student number="s002">
		<name>Tom</name>
		<age>23</age>
		<sex>male</sex>
	</student>
</students>

 

Schema约束技术

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
    <xsd:element name="students" type="studentsType"/>
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="heima_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema> 

有此我们可以编写xml文档:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 如何引入配置文档
	1.填写xml文档的根元素
	2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
	4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.itcast.cn/xml"
 -->
 <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 			 xmlns="http://www.itcast.cn/xml" 
 		   xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
 		    >
 	<student number="heima_0001">
 		<name>tom</name>
 		<age>18</age>
 		<sex>male</sex>
 	</student>
	<student number="heima_0002">
		<name>jack</name>
		<age>26</age>
		<sex>female</sex>
	</student>
 </students>

其中注意对约束文档的引入:

  • xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”:引入xsi前缀,固定写法
  • xsi:schemaLocation=”http://www.itcast.cn/xml     student.xsd”:文档命令空间,可以理解为student.xsd路径的命名空间为:http://www.itcast.cn/xml(可以理解为起了一个名字)。如此一来,下面的标签就都需要先写上命名空间再写标签了。
  • xmlns=”http://www.itcast.cn/xml”:意为给http://www.itcast.cn/xml声明一个前缀,为了简化书写,例如xmlns:a=“http://www.itcast.cn/xml”,故后面的标签就都需要先加上“a:”来引入,a则代表http://www.itcast.cn/xml该命名空间,如果什么也不写,直接写xmlns=“http://www.itcast.cn/xml”,则表示空前缀,下面的标签就不必都加前缀来使用了。

这个规则你可能不好理解,没关系,我们用mvc框架的配置文件的引入声明来距离:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

beans标签下定义了引入声明,可知:

  • http://www.springframework.org/schema/beans/spring-beans.xsd的命名空间为:http://www.springframework.org/schema/beans,使用该空间使用空前缀,即不用加前缀。
  • http://www.springframework.org/schema/context/spring-context.xsd的命名空间为:http://www.springframework.org/schema/context,使用该空间前缀是context
  • http://www.springframework.org/schema/mvc/spring-mvc.xsd的命名空间为:http://www.springframework.org/schema/mvc,使用该空间的前缀是mvc

 

 

XML的解析技术

xml是可扩展的标记语言。

操作xml文档:

  1. 解析(读取):将文档中的数据读取到内存中
  2. 写入:将内存中的数据保存到xml文档中,持久化的存储

不管是html文件还是xml文件他们都是标记型文档,都可以使用W3C组织制定的dom技术来解析。

DOM将xml文档定义为一个树状结构,而树叶被定义为节点。

document对象表示的是整个文档(可以是html,也可以是xml)

早期的时候,JDK为我们提供了两种解析技术:DOM和SAX,但是现在而言,这两已经过时。

  • DOM:将标记语言文档一次性加载进内存,然后形成一个DOM树。
    • 优点:操作方便,可以对文档进行CRUD(增查改删)的所有操作
    • 缺点:消耗内存
  • SAX:逐行读取,基于事件驱动。
    • 优点:占用很少内存(因为这种方式每次读取一行,都会将前一行释放掉,通过事件来监听)
    • 缺点:只能读取,不能增删改

现在我们主要使用的第三方解析:

  • jdom:在dom的基础上进行了封装
  • dom4j:又对jdom进行了封装
  • Jsoup:一款java的HTML解析器,可直接解析某个URL地址、HTML文本内容。他提供了一套非常省力的API。
  • pull:主要用在Android 手机开发,跟sax非常类似,都是事件机制

我们重点了解一下dom4j,Jsoup(这是第三方解析技术,我们需要使用第三方给我们提供好的类库才可以解析xml文件。)

 

DOM-four-j

DOM4j类库的使用

首先我们可以去官网下载dom4j

或者可以直接用我分享的点击这里,提取码:mcez

下载下来之后是一个压缩包,

解压出来大概是这些内容

  • docs目录下面,会有一个index.html文件,这个通过这个就可以打开这个dom4j的帮助手册。
  • lib目录存放了dom4j需要的包
  • src目录存放了dom4j的源码以及示例的代码。

下面我们来实际操作。

在刚才的模块下的src目录下新建一个包,然后新建一个java文件。

我们会通过Book.java来解析books.xml(books.xml的内容就是上面那个)

在Book.java中,我们简单写好(利用快捷键 Alt+Insert快速构造 ,巨爽的快捷键):

package com.ishashtest.xmlparsel;

public class Book {
    private String sn;
    private String name;
    private double price;
    private String author;

    public Book(String sn, String name, double price, String author) {
        this.sn = sn;
        this.name = name;
        this.price = price;
        this.author = author;
    }

    public Book() {

    }

    public String getSn() {
        return sn;
    }

    public void setSn(String sn) {
        this.sn = sn;
        
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "sn='" + sn + '\'' +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                '}';
    }   }
}

下面我们在该模块下新建一个目录lib,将dom4j下的那个dom4j-1.6.1 .jar 复制到lib下面。

然后在Idea中,右击这个jar文件,选择添加到库(add as library),这一步是将 jar包 添加到类路径

然后我们在刚才的包下面创建一个新的java类——Dom4jTest,写上test代码。

下面我们会使用Java中的单元测试,不了解的同学可以看这篇文章

然后,我们导入jUnit.jar。(提取码:qtte) ,将这两个文件添加到刚才的lib目录下,再将这两个文件添加到库。

好,到这里为止,配置问题就解决了。

接下来我们对Dom4jTest类的代码动手:

package com.ishashtest.xmlparsel;
import org.junit.Test;

public class Dom4jTest {
    @Test
    public void test1(){

    }
}

最终代码如下,请根据注解理解

    @Test
    public void test(){
        //读取books.xml文件,生成book类
        try{
            //创建一个saxReader输入流
            SAXReader reader=new SAXReader();
            //再Junit测试中,相对路径是从模块开始算
            Document document=reader.read("xml/books.xml");
            //通过Document对象获取根元素(books)
            Element rootElement=document.getRootElement();
            //通过根元素获取book标签对象
            List<Element> elems=rootElement.elements();
            elems.forEach(book->{
                  //asXML:把标签对象转换为标签字符串
                  System.out.println(book.asXML());
                  //得到book的子元素
                  Element nameElem=book.element("name");
                  System.out.println(nameElem.asXML());
            });
        }catch(Exception e){
            e.printStackTrace();
        }
    }
输出:
<book sn="SN123123123">
        <name>时间简史</name>
        <author>霍金</author>
        <price>55</price>
    </book>
<name>时间简史</name>
<book sn="SN123123124">
        <name>Java从入门到放弃</name>
        <author>&lt;小明&gt;</author>
        <price>47</price>
    </book>
<name>Java从入门到放弃</name>

这些字符串显然很难去利用,那我们应该怎么进一步得到书名文本内容呢?

            elems.forEach(book->{
                //得到book的子元素
                Element nameElem=book.element("name");
                String nameText=nameElem.getText();
                System.out.println(nameText);
            });
输出:
时间简史
Java从入门到放弃

另外还可以一步直接获取指定标签名的文本内容

            elems.forEach(book->{
                //直接获取指定标签名的文本内容
                String priceText=book.elementText("price");
                System.out.println(priceText);
            });
输出:
55
47

获取属性又应该怎么做呢?

            elems.forEach(book->{
                String snText=book.attributeValue("sn");
                System.out.println(snText);
            });
输出:
SN123123123
SN123123124

最后我们可以整合成一个对象(利用之前的Book.java)

package com.ishashtest.xmlparsel;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

public class Dom4jTest {
    @Test
    public void test(){
        //读取books.xml文件,生成book类
        try{
            //创建一个saxReader输入流
            SAXReader reader=new SAXReader();
            //再Junit测试中,相对路径是从模块开始算
            Document document=reader.read("xml/books.xml");
            //通过Document对象获取根元素(books)
            Element rootElement=document.getRootElement();
            //通过根元素获取book标签对象
            List<Element> elems=rootElement.elements();
            elems.forEach(book->{
                Element nameElem=book.element("name");
                String nameText=nameElem.getText();
                String priceText=book.elementText("price");
                String authorText=book.elementText("author");
                String snText=book.attributeValue("sn");
                System.out.println(new Book(snText,
                        nameText,
                        Double.parseDouble(priceText),
                        authorText));
            });
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
输出:
Book{sn='SN123123123', name='时间简史', price=55.0, author='霍金'}
Book{sn='SN123123124', name='Java从入门到放弃', price=47.0, author='<小明>'}

 

Jsoup

导入jar包

这里我分享一个jsoup包

链接:https://pan.baidu.com/s/19W0Fu1uRCDR2imZ6dF0F4g
提取码:2ue3

实操

student.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>

 <students>
 	<student number="01">
 		<name>tom</name>
 		<age>18</age>
 		<sex>male</sex>
 	</student>
	<student number="02">
		<name>jack</name>
		<age>19</age>
		<sex>male</sex>
	</student>
 </students>

java代码:

public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        //1.导入jar包
        //2.获取Document对象
        //2.1 获取student.xml的path
        String path=JsoupDemo1.class.getClassLoader() //类加载器
                .getResource("student.xml")
                .getPath();
        //url解码一下,避免中文路径
        path= URLDecoder.decode(path,"utf-8");
        //2.2 解析xml文档,即加载文档进入内存,获取dom树
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3. 获取元素对象
        Elements elements = document.getElementsByTag("name");
        //3.1 获取第一个name的Element对象
        Element element=elements.get(0);
        //3.2 获取数据
        String text = element.text();
        System.out.println(text);
    }
}

输出:tom,可见实验成功。

Jsoup对象

  • Jsoup:工具类,可以解析html或xml文档,返回Document对象
    • parse():解析文档,值得一提的是有一种重载就是parse​(URL url,int timeoutMillis),这种方式可以用来做爬虫系统,后面正好结合Xpath解析数据。
  • Document:文档对象。代表内存中的dom树
    • getElementByXXX():就像前端JavaScript中DOM的操作一样
  • Elements:元素Element对象的集合。可以当作ArrayList<Element>来说明
  • Element:元素对象
    • Element也有很多的getElementByXXX​()方法,但是这样的方法仅针对当前Element的子元素。
    • 获取属性值:attr​(String attributeKey),改方法继承自父类Node
    • 获取纯文本内容:text()(不同于html()方法,后者是获取innerHtml,即标签体所有内容包括子标签)
  • Node:节点对象

具体的对象的方法在我分享的目录jsoup-1.11.2-javadoc下会有说明,详情请参考那个。

快捷查询方式

  • selector选择器
    • 使用Document的方法:Elements   select(String  cssQuery)
    • 语法:参考Selector类中定义的语法(其实就是CSS选择的语法)
public static void main(String[] args) throws IOException {
        //1.导入jar包
        //2.获取Document对象
        //2.1 获取student.xml的path
        String path=JsoupDemo1.class.getClassLoader()
                .getResource("student.xml")
                .getPath();

        //url解码一下,避免中文路径
        path= URLDecoder.decode(path,"utf-8");
        //2.2 解析xml文档,即加载文档进入内存,获取dom树
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.  获取student标签,且number属性值为01的age子标签
        Elements elements=document.select("student[number='01'] age");
        String age=elements.get(0).text();
        System.out.println(age);
    }

输出:18

  • XPath:XML路径语言,这是老朋友了
    • 使用Jsoup的XPath,需要额外的jar包:JsoupXpath-0.3.2

给xml文件中的某个name标签添加id=”itcast”

   public static void main(String[] args) throws Exception{
        //1.导入jar包
        //2.获取Document对象
        //2.1 获取student.xml的path
        String path=JsoupDemo1.class.getClassLoader()
                .getResource("student.xml")
                .getPath();

        //url解码一下,避免中文路径
        path= URLDecoder.decode(path,"utf-8");
        //2.2 解析xml文档,即加载文档进入内存,获取dom树
        Document document = Jsoup.parse(new File(path), "utf-8");

        //3.根据document对象,创建JXDocument对象
        JXDocument jxDocument=new JXDocument(document);
        //4.利用XPath,查询student标签下带有id属性的name标签,且id属性值为itcast
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id='itcast']");
        for(JXNode jx:jxNodes2){
            System.out.println(jx);
        }
    }

输出:

<name id=”itcast”>
tom
</name>

 

 

 

 


Tomcat

久仰大名,今天终于来做了解了,默默问一下,你和 猫和老鼠 真的没关系吗?

什么是JavaWeb

JavaWeb是指所有通过Java语言编写的可以通过浏览器访问的程序的总称,叫做JavaWeb。

JavaWeb是基于请求响应来开发的。

  • 请求:请求是指客户端给服务器发送数据,叫请求
  • 响应:响应是指服务器给客户端回传数据,叫响应

请求和响应是成对出现的,有请求就有响应。

 

Web资源的分类

web资源按实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种。

  • 静态资源:html、css、js、txt、mp4(视频)、jpg(图片)
  • 动态资源:jsp页面、Servlet程序

常用的Web服务器

  • Tomcat:由Apache组织提供的一种Web服务器,提供对jsp和Servlet的支持。它是一种轻量级的javaWeb容器(服务器),也是当前应用最广的JavaWeb服务器
  • Jboss:是一个遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器,他支持所有的JavaEE规范
  • GlassFish、Resin、WebLogic等

Tomcat和Servlet版本对应关系

 

Tomcat安装与启动

我这里分享一个8.0版本的tomcat

链接:https://pan.baidu.com/s/1YxsqJae2YMpzldWq_oSDTw
提取码:013n

找到对应版本的Tomcat,解压到对应的文件夹。

目录介绍

  • bin:专门用来存放 tomcat 服务器的可执行程序(tomcat8.exe)
  • conf:专门用来存放 Tomcat 的配置文件
  • lib:专门用来存放 Tomcat 服务器的 jar 包
  • logs:专门用来存放 Tomcat服务器运行时输出的日记信息
  • temp:专门用来存放 Tomcat 运行时产生的临时数据
  • webapps:专门用来存放部署的Web工程
  • work:是Tomcat工作时的目录,用来存放 Tomcat 运行时jsp翻译为Servlet的源码,和session 钝化(序列化)的目录。

启动

1.startup.bat

找到Tomcat目录下的bin目录下的startup.bat文件,双击,就可以启动Tomcat服务器

如何测试Tomcat启动成功???

打开浏览器,访问:http://localhost:8080(http://127.0.0.1:8080)

如果出现这个丑陋的猫,恭喜你启动成功了!

常见启动失败的情况

双击startup.bat文件,就会出现一个小黑窗口一闪而过,这种情况失败原因多是因为没有配置好JAVA_HOME环境变量

2.命令行 catalina run

打开命令行

切换到Tomcat的bin目录下面,然后输入启动命令:

catalina run

也可以正常启动Tomcat

 

停止

  1. 关闭 Tomcat 服务器的窗口
  2.  Tomcat 服务器窗口下按住 Ctrl+C
  3. 找到 Tomcat 的 bin 目录下的 shutdown.bat 双击,就可以停止 Tomcat 服务

 

Tomcat的操作

如何修改 Tomcat 的端口号

Tomcat默认的端口号是 8080

找到 Tomcat 目录下的 conf 目录,找到 server.xml 配置文件

找到大概69行左右,修改这个port即可

    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

端口号范围(1-65535),另外,修改完配置文件之后,一定要重启才能生效

如何部署web工程到Tomcat中(第一种方式)

把web工程的目录拷贝到 Tomcat 的 webapps 目录下即可。

我就用上一篇文章里我们那个疯人院来示例了:

拷贝过来之后,访问本机地址加上 /crazy/index.html 即可看到首页。

简化部署:将项目打成一个war包,再将war包放置到webapps目录下,启动项目时war包会自动解压缩

 

 

 

如何部署web工程到Tomcat中(第二种方式)

需要写配置文件

在Tomcat的/conf/Catalina/localhost 下面新建一个xml文件。

一般一个xml文件就对应一个工程。

写入下面的内容:

<Context path="/crazy" docBase="E:\Tomcat\apache-tomcat-8.0.50\webapps\crazy" />

xml文件的名称就是你的项目虚拟目录,即web访问的目录。

 

如何部署web工程到Tomcat中(第三种方式)

配制conf/server.xml文件

在<Host>标签体中配置

<Context path="/crazy" docBase="E:\Tomcat\apache-tomcat-8.0.50\webapps\crazy" />

其中, Context 表示一个工程上下文,
Path 表示工程的访问路径,即虚拟目录,
docBase 表示你的工程目录在哪里,即项目存放的位置。

 

默认访问的工程和默认访问的资源

当我们在浏览器访问如下地址:

http://IP:port/

没有工程名的时候默认访问的是/webapps/ROOT 目录

 

当我们在浏览器访问如下地址:

http://IP:port/工程名

没有资源名的时候默认访问index.html页面

 

目录结构

在webapps中可以看到tomcat的项目目录结构

  • 静态目录
  • 动态目录(java为例)
    • 项目的根目录
      • jsp文件
      • WEB-INF目录
        • web.xml:web项目的核心配置文件
        • classes目录:放置字节码文件的目录
        • lib目录:放置依赖的jar包

这些内容就是将来IDEA中out目录下的东西。

 

IDEA与Tomcat服务器整合

整合服务器

打开IDEA,选择 文件=》设置=》构建、执行、部署=》Application Servers,然后新建一个 Tomcat服务器 即可

然后浏览填入你的Tomcat的目录即可

然后我们创建Java模块就会发现服务器的存在了(即整合成功)

 

IDEA创建动态的web工程

承接上面,我们创建一个JavaEE模块

注意勾选 Web Application

然后点击下一步,输入模块名即可。

到这里,我们就创建了一个动态Web工程

 

web工程目录介绍

首先我们在IDEA为我们创建的WEB-INF下面再创建一个 lib 目录(用来存放以后的jar包)

目录结构大概是这样:

  • src:存放自己编写的java源代码
  • web:存放web工程的资源文件(比如html页面、css文化部、js文件等)
  • WEB-INF:受服务器保护的目录。客户端浏览器无法直接访问到此目录的内容
  • lib:存放第三方的jar包(IDEA还需要自己配置导包)

文件:

  • web.xml:整个动态web工程的配置部署描述文件,可以在这里配置很多web工程的组件,比如:Servlet程序、Filter过滤器、Listener监听器、Session超时……

给Tomcat添加第三方jar包

第一种方式:

直接将你的jar包拷贝到WEB-INF的lib目录下面,然后右键选择,添加到库即可。

 

第二种方式:

选择文件=》项目结构=》Libraries

然后选择你要添加的那些jar包到对应模块。

然后在右边的Artifacts里,点击右边的fix,将类库添加到打包部署中。

 

不管哪种方式都要选择对应的模块。

 

在IDEA中部署工程到Tomcat上运行

首先,我们建议先修改过一下Web工程中对应的Tomcat运行实例

编辑配置就可以修改了。

另外,在编辑配置中的Deployment下面,注意将需要部署的web工程添加到Tomcat运行实例中。

下面的Application Context是工程路径(即对应访问地址,可以修改)。

另外在Server中我们还可以修改实例启动后默认访问地址等信息

回到主界面就可以正常启动了。

 

补充:IDEA服务器热部署

下面内容转载自这里

场景:一般服务器(比如tomcat,jboss等)启动以后,我们还需要进一步修改java代码,或者是jsp代码。一般来说,改完重启以后才会生效。但如果配置了服务器的热部署,就可以改完代码后立即生效,而不是重启服务器再生效。这样就会节省大量时间!

目前有两个选项:

On Update action : 顾名思义,当代码改变的时候,需要IDEA为你做什么;

On Frame deactivation : 当失去焦点(比如你最小化了IDEA窗口),需要IDEA为你做什么。

 

On Update action 里面有四个选项(一般选Update classes and resources):

-Update resources :如果发现有更新,而且更新的是资源文件(*.jsp,*.xml等,不包括java文件),就会立刻生效

-Update classes and resources : 如果发现有更新,这个是同时包含java文件和资源文件的,就会立刻生效

这里需要注意一下:在运行模式下,修改java文件时不会立刻生效的;而debug模式下,修改java文件时可以立刻生效的。当然,两种运行模式下,修改resources资源文件都是可以立刻生效的。

-Redploy : 重新部署,只是把原来的war删掉,不重启服务器

-Restart : 重启服务器

On Frame deactivation:

-Do nothing : 不做任何事 (一般推荐这个,因为失去焦点的几率太大)

-Update resources : 失去焦点后,修改的resources文件都会立刻生效

-Update classes and resources : 失去焦点后,修改的java ,resources文件都会立刻生效(与On update action中的Update classes and resources一样,也是运行模式修改的java文件不会生效,debug模式修改的java文件会立刻生效)

 

另外,如果Artifact是war包形式的话,On Update action与On frame deactivation中的选项也是不一样的:没有Update resources和 Update classes and resources这种选项,取而代之的是Hot Swap Classes选项,本质的意思是一样的

 

 


这一部分先到这里了。

 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

发表评论