zoukankan      html  css  js  c++  java
  • JavaEE之servlet相关技术

    相关技术:为了灵活实现的不同路径(/hello)执行不同的资源( HeIIoMyServlet)我们需要使用XML进行配置;为了限定XML内容,我们需要使用xml约束(DTD或schema);为了获得xml的内容,我们需要使用dom4j进行解析。

    XML:XML称为Extensible Markup Language,意思是可扩展的标记语言。XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。

    应用:

    1.2.1.3 XML语法

    l  XML文档声明

    1.文档声明必须为<?xml开头,以?>结束;

    2.文档声明必须从文档的0行0列位置开始:

    3.文档声明只有属性:

    a)     versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;

    b)     encoding:指定当前文档的编码。可选属性,默认值是。utf-8:

    l  元素element

    1.元素是XML文档中最重要的组成部分,

    2.普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>

    3.元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a ></b>

    4.空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭介,例如:<c/>

    5.元素命名:

    a)     区分大小写

    b)     不能使用空格,不能使用冒号:

    c)      不建议以XML,  xml,  Xml开头

    6.格式化良好的XML文档,必须只有一个根元素。

    l  属性

      

    1.属性是元素的一部分,它必须出现在元素的开始标签中

    2.属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引

    3.一个元素可以有O ~ N个属性,但一个元素中不能出现同名属性

    4.属性名不能使用空格、冒号等特殊字符,且必须以字母开头

    l  注释

    XML的注释与HTML相同,即以“<!--”开始,以“-->”结束。注释内容会被XML解析器忽略!

    l  转义字符

    XML中的转义字符与HTML一样。

    因为很多符号己经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:"<"、”>”、” ’ ”、” ” ”、”&”。

    l  CDATA区

    <![CDATA[
        任意内容
    ]]>  

    当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。

    在CDATA段中出现的“<”、“>’,、“””、“‘”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。

          在CDATA段中不能包含“]]>”,即CDATA段的结束定界符。

    什么是DTD

        DTD (Document Type Definition ),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。

    DTD重点要求

    开发中,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2,  hibernate等。

    通过提供的DTD"web-app_2_3.dtd "编写XML

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    	模拟servlet2.3规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
    	格式如下:
    	<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
    -->
    <!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
    <!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
    <!ELEMENT servlet-mapping (servlet-name,url-pattern+) >
    <!ELEMENT servlet-name (#PCDATA)>
    <!ELEMENT servlet-class (#PCDATA)>
    <!ELEMENT url-pattern (#PCDATA)>
    <!ELEMENT description (#PCDATA)>
    <!ELEMENT jsp-file (#PCDATA)>
    
    <!ELEMENT welcome-file-list (welcome-file+)>
    <!ELEMENT welcome-file (#PCDATA)>
    
    <!ATTLIST web-app version CDATA #IMPLIED>
    

    案例实现

    l  步骤1:创建web.xml文档,并将“web-app_ 2_ 3.dtd"拷贝相同目录下。

    l  步骤2:从DTD文档开始处,拷贝需要的“文档声明”

    l  步骤3:完成xml内容编写

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
    <web-app version="2.3">	
    <servlet>
    		<servlet-name></servlet-name>
    		<servlet-class></servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name></servlet-name>
    		<url-pattern></url-pattern>
    	</servlet-mapping>
    	<welcome-file-list>
    		<welcome-file></welcome-file>
    		<welcome-file></welcome-file>
    	</welcome-file-list>
    </web-app>
    

     DTD语法(了解)

    文档声明

    1.内部DTD,在XML文档内部嵌入DTD,只对当前XML有效。

    <?xml version="1.0" encoding="UTF-8"? standalone="yes" ?>
    <!DOCTYPE web-app [
    	...//具体语法
    ]>
    <web-app>
    </web-app>
    

      

    2.外部DTD——本地DTD,DTD文档在本地系统上,公司内部自己项目使用。

    3.外部DTD——公共DTD,DTD文档在网络上,一般都有框架提供。

     

    元素声明
    定义元素语法:<!ELEMENT元素名 元素描述>
    
        元素名:自定义
    
        元素描述包括 : 符号和数据类型
    
              常见符号: ?  *  +  ()  |  ,
    
              常见类型:#PCDATA表示内容是文本,不能是子标签
    
     

    符号

    符号类型

    描述

    示例

    ?

    问号

    表示该对象可以出现,但只能出现一次

    (菜鸟?)

    *

    星号

    表示该对象允许出现任意多次,也可以是零次

    (爱好*)

    +

    加号

    表示该对象最少出现一次,可以出现多次

    (成员+)

    ()

    括号

    用来给元素分组

    (古龙|金庸|梁羽生),

    (王朔|余杰),毛毛

    |

    竖条

    表明在列出的对象中选择一个

    (男人|女人)

    ,

    逗号

    表示对象必须按指定的顺序出现

    (西瓜,苹果,香蕉)

    l  实例

    <!ELEMENT  web-app(servlet*,servlet-mapping*,welcome-file-list?)>
    
        web-app包括3个标签,且必须顺序出现。
    
            servlet子标签个数任意
    
            servlet-mapping子标签个数任意
    
            welcome-file-list子标签最多只能出现一次
    
    <!ELEMENT servlet(servlet-name,description?,(servlet-class|jsp-file))>
    
        servlet有3个子标签,且必须顺序出现
    
            servlet-name,必须有,且只能出现1次
    
            description,可选1次
    
            servlet-class和jsp-file二选一,且只能出现一次
    
    <!ELEMENT servlet-name(#PCDATA)>
    
        servlet-name的标签体必须是文本
    
    <!ELEMENT  welcome-file-list  (welcome-file+)>
    
          welcome-file-list至少有1个子标签welcome-file
    
     

    Schema约束

    1.2.3.1什么是Schema

    l  Schema是新的XML文档约束:

    l  Schema要比DTD强大很多,是DTD替代者;

    l  Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml .

    l  Schema功能更强大,数据类型更完善

    l  Schema支持名称空间

    1.2.3.2 Schema重点要求

    与DTD一样,要求可以通过schema约束文档编写xml文档。常见框架使用schema的有:Spring等通过提供”web-app_ 2_ 5.xsd"编写xml文档

    案例实现

    1.步骤1:创建web.xml,并将"web-app_2_5.xsd"拷贝到同级目录

    2.步骤2:从xsd文档中拷贝需要的“命名空间”

    3.完成xml内容编写

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://www.example.org/web-app_2_5" 
    			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    			xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
    			version="2.5">
    	<servlet>
    		<servlet-name></servlet-name>
    		<servlet-class></servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name></servlet-name>
    		<url-pattern></url-pattern>
    	</servlet-mapping>
    	<welcome-file-list>
    		<welcome-file></welcome-file>
    		<welcome-file></welcome-file>
    	</welcome-file-list>
    </web-app>
    

    解析原理及结构模型

    XML DOM和HTML DOM类似,XML DOM将整个XML文档加载到内存,生成一个DOM树,

    并获得一个Document对象,通过Document对象就可以对DOM进行操作

    DOM中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点!

    API使用

    如果需要使用dom4j,必须导入jar包。

     

    dom4j必须使用核心类SaxReader加载xml文档获得Document通过Document对象获得文档的根元素,然后就可以操作了。

     

    步骤:

    1.获取解析器

    2.获得document文档对象

    3.获取根元素

    4.获取根元素下的子元素

    5.遍历子元素

    6.判断元素名称为servlet的元素

    7.获取servlet-name元素

    8.获取servlet-class元素

    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.junit.Test;
    
    public class TestDom4j {
    	@Test
    	public void testReadWebXML() {
    		try {
    			// 1.获取解析器
    			SAXReader saxReader = new SAXReader();
    			// 2.获得document文档对象
    			Document doc = saxReader.read("src/com/oracle/demo06/web.xml");
    			// 3.获取根元素
    			Element rootElement = doc.getRootElement();
    			// System.out.println(rootElement.getName());//获取根元素的名称
    			// System.out.println(rootElement.attributeValue("version"));//获取根元素中的属性值
    			// 4.获取根元素下的子元素
    			List<Element> childElements = rootElement.elements();
    			// 5.遍历子元素
    			for (Element element : childElements) {
    				//6.判断元素名称为servlet的元素
    				if ("servlet".equals(element.getName())) {
    					//7.获取servlet-name元素
    					Element servletName = element.element("servlet-name");
    					//8.获取servlet-class元素
    					Element servletClass = element.element("servlet-class");
    					System.out.println(servletName.getText());
    					System.out.println(servletClass.getText());
    				}
    			}
    
    		} catch (DocumentException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

    案例实现

    1.3.1准备工作

    为了模拟服务器端程序,且可以同时存在多个类似程序。故提供接口,接口中有3个方法,我们人为约定三个方法的调用顺序。

    public interface IMyServlet {
    
    	public void init();
    
    	public void service();
    
    	public void destory();
    }
    
    public class MyServletImpl implements IMyServlet {
    
    	@Override
    	public void init() {
    		System.out.println("啊,俺来也……");
    	}
    
    	@Override
    	public void service() {
    		System.out.println("我可以为你服务……");
    	}
    
    	@Override
    	public void destory() {
    		System.out.println("啊,俺去也……");
    	}
    
    }
    

    反射执行

    测试程序我们直接new HeIloServlet,这种编程方式我们称为硬编码,及代码写死了。为了后期程序的可扩展,开发中通常使用实现类的全限定类名(com.oracle.demo06.MyServletImpl)通过反射加载字符串指定的类,并通过反射创建实例。

    public class TestMyServlet {
    
    	@Test
    	public void testMyServlet(){
    		MyServletImpl my = new MyServletImpl();
    		my.init();
    		my.service();
    		my.destory();
    	}
    	
    	@Test
    	public void testMyServlet1(){
    		try {
    			String className = "com.oracle.demo06.MyServletImpl";
    			Class clazz = Class.forName(className);
    			MyServletImpl my = (MyServletImpl) clazz.newInstance();
    			my.init();
    			my.service();
    			my.destory();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    解析xml

    使用反射我们己经可以创建对象的实例,此时我们使用的全限定类名,在程序是仍写死了,我们将器配置到xml文档中。

    xml文档内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
    	version="2.5">
    	<servlet>
    		<servlet-name>MyServlet1</servlet-name>
    		<servlet-class>com.oracle.demo06.servlet.MyServlet1</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>MyServlet1</servlet-name>
    		<url-pattern>/myServlet1</url-pattern>
    	</servlet-mapping>
    		
    </web-app>
    

    解析实现:

    步骤:

    //1.创建解析器对象

    //2.使用解析器加载web.xml文件得到document对象

    //3.获取根元素节点

    //4.根据元素名称获取子元素节点

    //5.根据元素名称获取servlet-class的文本节点

    //6.通过类全名获取字节码文件

    //7.创建实例对象

    //8.调用实例对象里面的方法

    package com.oracle.demo06.servlet;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.junit.Test;
    
    public class TestMyServlet {
    	
    	@Test
    	public void testMyServlet(){
    		try {
    			//1.创建解析器对象
    			SAXReader saxReader = new SAXReader();
    			//2.使用解析器加载web.xml文件得到document对象
    			Document document = saxReader.read("src/com/oracle/demo06/servlet/web.xml");
    			//3.获取根元素节点
    			Element rootElement = document.getRootElement();
    			//4.根据元素名称获取子元素节点
    			Element servletElement = rootElement.element("servlet");
    			//5.根据元素名称获取servlet-class的文本节点
    			String servletClass = servletElement.element("servlet-class").getText();
    			//System.out.println(servletClass);
    			//6.通过类全名获取字节码文件
    			Class clazz = Class.forName(servletClass);
    			//7.创建实例对象
    			MyServlet1 my = (MyServlet1) clazz.newInstance();
    			//8.调用实例对象里面的方法
    			my.init();
    			my.service();
    			my.destory();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    

      

      

      

      

      

      

      

  • 相关阅读:
    优化SQL查询:如何写出高性能SQL语句
    提高SQL执行效率的16种方法
    Spring Ioc DI 原理
    java内存泄漏
    转:js闭包
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Best Time to Buy and Sell Stock with Cooldown
    LeetCode Length of Longest Fibonacci Subsequence
    LeetCode Divisor Game
    LeetCode Sum of Even Numbers After Queries
  • 原文地址:https://www.cnblogs.com/lxx2014/p/9635560.html
Copyright © 2011-2022 走看看