学习JavaWeb(三)——xml、Tomcat

学习JavaWeb(三)——xml、Tomcat

前言:

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

 

 

 

 


XML

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

什么是xml:

xml是可扩展性标记语言

xml作用

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

 

xml语法

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

  • 文档声明:<?xml version=”1.0″ encoding=”utf-8″ ?>
  • 元素(标签):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是可扩展的标记语言。

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

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

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

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

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

  • jdom:在dom的基础上进行了封装
  • dom4j:又对jdom进行了封装
  • pull:主要用在Android 手机开发,跟sax非常类似,都是事件机制

我们重点了解一下dom4j(这时第三方解析技术,我们需要使用第三方给我们提供好的类库才可以解析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(){

    }
}

 

这里记录一下 System.out.print 的快捷键 sout。

Ctrl+q 快速查看方法的返回值类型

 

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

    @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='<小明>'}

 


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 即可看到首页。

 

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

需要写配置文件

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

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

写入下面的内容:

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

其中, Context 表示一个工程上下文,
Path 表示工程的访问路径,
docBase 表示你的工程目录在哪里。

注意:xml文件名一定要与访问路径相同!例如此例,xml文件名则为 crazy

 

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

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

http://IP:port/

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

 

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

http://IP:port/工程名

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

 

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选项,本质的意思是一样的

 

 


这一部分先到这里了。

 

 

 

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

发表评论

是的,我就是计算机界的枭雄!