Xml和Tomcat

Posted IT技术学习栈

tags:

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

Xml & Tomcat

Xml

eXtendsible  markup language  可扩展的标记语言

XML 有什么用?

  1. 可以用来保存数据

  2. 可以用来做配置文件

  3. 数据传输载体

定义xml

其实就是一个文件,文件的后缀为 .xml

. 文档声明

 简单声明, version : 解析这个xml的时候,使用什么版本的解析器解析
<?xml version="1.0" ?>

encoding : 解析xml中的文字的时候,使用什么编码来翻译
<?xml version="1.0" encoding="gbk" ?>

standalone : no - 该文档会依赖关联其他文档 , yes-- 这是一个独立的文档
<?xml version="1.0" encoding="gbk" standalone="no" ?>

encoding详解

在解析这个xml的时候,使用什么编码去解析。---解码。


文字, 而是存储这些文字对应的二进制 。那么这些文字对应的二进制到底是多少呢?根据文件使用的编码 来得到。

默认文件保存的时候,使用的是GBK的编码保存。

所以要想让我们的xml能够正常的显示中文,有两种解决办法

  1. 让encoding也是GBK 或者 gb2312 .

  2. 如果encoding是 utf-8 , 那么保存文件的时候也必须使用utf-8

  3. 保存的时候见到的ANSI 对应的其实是我们的本地编码 GBK。

为了通用,建议使用UTF-8编码保存,以及encoding 都是 utf-8

元素定义(标签)

  1. 其实就是里面的标签, <> 括起来的都叫元素 。成对出现。如下:

    <stu> </stu>

  2. 文档声明下来的第一个元素叫做根元素 (根标签)

  3. 标签里面可以嵌套标签

  4. 空标签

    既是开始也是结束。一般配合属性来用。


    <age/>

<stu>
<name>张三</name>
<age/>
</stu>
  1. 标签可以自定义。

    XML 命名规则 XML 元素必须遵循以下命名规则:


    名称可以含字母、数字以及其他的字符
    名称不能以数字或者标点符号开始
    名称不能以字符 “xml”(或者 XML、Xml)开始
    名称不能包含空格

命名尽量简单,做到见名知义

简单元素  & 复杂元素

  • 简单元素

元素里面包含了普通的文字

  • 复杂元素

元素里面还可以嵌套其他的元素

属性的定义

定义在元素里面, <元素名称  属性名称="属性的值"></元素名称> <stus> <stu id="10086"> <name>张三</name> <age>18</age> </stu> <stu id="10087"> <name>李四</name> <age>28</age> </stu> </stus>


xml注释:

html的注释一样。


<!-- -->
如:

<?xml version="1.0" encoding="UTF-8"?>
<!--
//这里有两个学生
//一个学生,名字叫张三, 年龄18岁, 学号:10086
//另外一个学生叫李四 。。。
-->

xml的注释,不允许放置在文档的第一行。必须在文档声明的下面。

CDATA区

  • 非法字符

    严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

    <   &  

如果某段字符串里面有过多的字符, 并且里面包含了类似标签或者关键字的这种文字,不想让xml的解析器去解析。那么可以使用CDATA来包装。不过这个CDATA 一般比较少看到。通常在服务器给客户端返回数据的时候。


<des><![CDATA[<a href="http://www.baidu.com">我爱黑马训练营</a>]]></des>

XML 解析

其实就是获取元素里面的字符数据或者属性数据。

XML解析方式(面试常问)

有很多种,但是常用的有两种。

  • DOM

  • SAX

针对这两种解析方式的API

一些组织或者公司, 针对以上两种解析方式, 给出的解决方案有哪些?


jaxp sun公司。比较繁琐

jdom
dom4j 使用比较广泛

Dom4j 基本用法


element.element("stu") : 返回该元素下的第一个stu元素
element.elements(); 返回该元素下的所有子元素。
  1. 创建SaxReader对象

  2. 指定解析的xml

  3. 获取根元素。

  4. 根据根元素获取子元素或者下面的子孙元素


try {
//1. 创建sax读取对象
SAXReader reader = new SAXReader(); //jdbc -- classloader
//2. 指定解析的xml源
Document document = reader.read(new File("src/xml/stus.xml"));

//3. 得到元素、
//得到根元素
Element rootElement= document.getRootElement();

//获取根元素下面的子元素 age
//rootElement.element("age")
//System.out.println(rootElement.element("stu").element("age").getText());

//获取根元素下面的所有子元素 。stu元素
List<Element> elements = rootElement.elements();
//遍历所有的stu元素
for (Element element : elements) {
//获取stu元素下面的name元素
String name = element.element("name").getText();
String age = element.element("age").getText();
String address = element.element("address").getText();
System.out.println("name="+name+"==age+"+age+"==address="+address);
}

} catch (Exception e) {
e.printStackTrace();
}

SaxReader 创建好对象 。  

DocumentElement

  1. 看文档

  2. 记住关键字 。

  3. 有对象先点一下。

  4. 看一下方法的返回值。

  5. 根据平时的积累。getXXX setXXX

Dom4j 的 Xpath使用

dom4j里面支持Xpath的写法。xpath其实是xml的路径语言,支持我们在解析xml的时候,能够快速的定位到具体的某一个元素。

  1. 添加jar包依赖

    jaxen-1.1-beta-6.jar

  2. 在查找指定节点的时候,根据XPath语法规则来查找

  3. 后续的代码与以前的解析代码一样。



//要想使用Xpath, 还得添加支持的jar 获取的是第一个 只返回一个。
Element nameElement = (Element) rootElement.selectSingleNode("//name");
System.out.println(nameElement.getText());

System.out.println("----------------");

//获取文档里面的所有name元素
List<Element> list = rootElement.selectNodes("//name");
for (Element element : list) {
System.out.println(element.getText());
}

tomcat配置文件context.xml和server.xml分析

在tomcat 5.5之前
Context体现在/conf/server.xml中的Host里的<Context>元素,它由Context接口定义。每个<Context元素代表了运行在虚拟主机上的单个Web应用
在tomcat 5.5之后
不推荐在server.xml中进行配置,而是在/conf/context.xml中进行独立的配置。因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。

context.xml

<?xml version='1.0' encoding='utf-8'?>
<Context>
<!-- 监控资源文件,如果web.xml改变了,则自动重新加载应用 -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!--本地测试项目-->
<!-- name,指定JNDI名称 -->
<!-- auth,表示认证方式,一般为Container -->
<!-- maxActive,连接池支持的最大连接数 -->
<!-- maxIdle,连接池中最多可空闲连接数 -->
<!-- maxWait,连接池中连接用完时,新的请求等待时间,单位毫秒 -->
<!-- username,password,数据库用户名/密码 -->
<!-- driverClassName,jdbc驱动 -->
<!-- url,数据库url地址 -->
<Resource name="jdbc/opslocal"
auth
="Container"
type
="javax.sql.DataSource"
username
="scott"
password
="admin"
driverClassName
="oracle.jdbc.driver.OracleDriver"
url
="jdbc:oracle:thin:@localhost:1521:orcl"
maxActive
="100000"
maxIdle
="4"/>
<Resource name="jdbc/inslocal"
auth
="Container"
type
="javax.sql.DataSource"
username
="ins"
password
="ayw_ins1"
driverClassName
="oracle.jdbc.driver.OracleDriver"
url
="jdbc:oracle:thin:@132.228.213.137:1521:ossmob"
maxActive
="100000"
maxIdle
="4"/>
<!--生产项目-->
<Resource name="jdbc/cpflocal"
auth
="Container"
type
="javax.sql.DataSource"
username
="cpf_dispatch"
password
="cpf_dispatch"
driverClassName
="oracle.jdbc.driver.OracleDriver"
url
="jdbc:oracle:thin:@132.232.7.51:15211:orcl"
maxActive
="100000"
maxIdle
="4"/>
</Context>

server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- port:指定一个端口,负责监听关闭tomcat的请求,shutdown:指定向端口发送的命令字符串-->
<Server port="8005" shutdown="SHUTDOWN">

<!-- 监听器:通常实现tomcat内部进行通信的,可在各组件之间完成通信-->
<Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
<Listener className="org.apache.catalina.core.JasperListener"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

<!-- 全局命名资源:方便全局引用,所以为其起完名称后可以随便调用的-->
<GlobalNamingResources>

<!-- pathname:即调用tomcat-user.xml配置文件进行用户认证-->
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>

<!-- 服务:一个服务组件通常包含一个引擎和此引擎相关联的一个或多个链接服务器-->
<Service name="Catalina">
<!-- 连接服务器:表示客户端和service之间的连接,一个引擎能配置多个连接器 但是每个连接器的端口不能冲突;负责接收客户请求,以及向客户返回响应结果-->
<!-- port:所在监听端口,protocol:协议版本号,connectionTimeout:连接超时时间,单位毫秒-->
<!-- maxThreads设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200 -->
<!-- connectionTimeout定义建立客户连接超时的时间.如果为-1,表示不限制建立客户连接的时间 -->
<Connector port="8080"
maxThreads
="1500"
maxProcessors
="450"
connectionTimeout
="20000"
protocol
="HTTP/1.1"
redirectPort
="8443"/>

<!-- redirectPort指定转发端口.如果当前端口只支持non-SSL请求,在需要安全通信的场命,将把客户请求转发至SSL的redirectPort端口-->
<!-- enableLookups如果设为true,表示支持域名解析,可以把IP地址解析为主机名.WEB应用中调用request.getRemoteHost方法返回客户机主机名.默认值为true -->
<Connector port="8009" enableLookups ="false" protocol="AJP/1.3" redirectPort="8443"/>
<!--maxThreads:最大线程,scheme:协议版本,secure:安全的-->
<!--clientAuth:不验证客户端,sslProtocol:协议用的是tls-->
<!--
<Connector port="8443"
protocol="HTTP/1.1"
SSLEnabled="true"
maxThreads="700"
scheme="https"
secure="true"
maxProcessors="300"
clientAuth="false"
sslProtocol="TLS" />
-->
<!--引擎:表示指定service中的请求处理机,接收和处理来自Connector的请求.可以接收用户的http请求,并构建响应报文,而且可以在内部处理java程序的整个套间-->
<!-- defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的 -->
<Engine defaultHost="localhost" name="Catalina">

<!-- Realm 表示存放用户名,密码及role的数据库 -->
<!-- className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口 -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>

<!-- appBase 应用程序基本目录,即存放应用程序的目录-->
<!-- unpackWARs:如果此项设置为true,表示把WEB应用的WAR文件先展开为开放目录结构后再运行.如果设为false将直接运行为WAR文件,-->
<!-- autoDeploy:如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自运发布这个WEB应用-->
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">

<!-- ValveclassName:定义阀门,java中类的记录方式,当前所处域名反过来写的记录方式-->
<!-- prefix,suffix:日志的命名-->
<!-- pattern:访问日志的格式-->
<!-- directory 指定log文件存放的位置 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log." suffix=".txt"/>

<!-- Context 表示运行在虚拟主机上的一个web应用程序,通常为WAR文件 -->
<!-- 一个<Host>可以包含多个<Context>元素.每个web应用有唯一的一个相对应的Context代表web应用自身.servlet容器为第一个web应用创建一个ServletContext对象. -->
<!-- docBase 应用程序的路径或者是WAR文件存放的路径 -->
<!-- path 表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/**** -->
<!-- reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载应用程序,我们可以在不重起tomcat的情况下改变应用程序 -->
<Context docBase="sample-demo" path="/sample-demo" reloadable="true" source="org.eclipse.jst.jee.server:sample-demo"/>
</Host>
</Engine>
</Service>
</Server>

XML 约束【了解】

如下的文档, 属性的ID值是一样的。这在生活中是不可能出现的。并且第二个学生的姓名有好几个。一般也很少。那么怎么规定ID的值唯一, 或者是元素只能出现一次,不能出现多次?甚至是规定里面只能出现具体的元素名字。


<stus>
<stu id="10086">
<name>张三</name>
<age>18</age>
<address>深圳</address>
</stu>
<stu id="10086">
<name>李四</name>
<name>李五</name>
<name>李六</name>
<age>28</age>
<address>北京</address>
</stu>
</stus>

DTD


语法自成一派, 早起就出现的。可读性比较差。
  1. 引入网络上的DTD

    <!-- 引入dtd 来约束这个xml -->


    <!--   文档类型 根标签名字 网络上的dtd   dtd的名称   dtd的路径
    <!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> -->
  2. 引入本地的DTD

    <!-- 引入本地的DTD  :根标签名字 引入本地的DTD  dtd的位置 --><!-- <!DOCTYPE stus SYSTEM "stus.dtd"> -->

  3. 直接在XML里面嵌入DTD的约束规则

    <!-- xml文档里面直接嵌入DTD的约束法则 --> <!DOCTYPE stus [ <!ELEMENT stus (stu)> <!ELEMENT stu (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]>


    <stus>
    <stu>
    <name>张三</name>
    <age>18</age>
    </stu>
    </stus>

<!ELEMENT stus (stu)> : stus 下面有一个元素 stu , 但是只有一个
<!ELEMENT stu (name , age)> stu下面有两个元素 name ,age 顺序必须name-age
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST stu id CDATA #IMPLIED> stu有一个属性 文本类型, 该属性可有可无

元素的个数:

+ 一个或多个
* 零个或多个
? 零个或一个

属性的类型定义

CDATA : 属性是普通文字
ID : 属性的值必须唯一

<!ELEMENT stu (name , age)> 按照顺序来

<!ELEMENT stu (name | age)>   两个中只能包含一个子元素

Schema


其实就是一个xml , 使用xml的语法规则, xml解析器解析起来比较方便 , 是为了替代DTD 。
但是Schema 约束文本内容比DTD的内容还要多。所以目前也没有真正意义上的替代DTD

约束文档:
<!-- xmlns : xml namespace : 名称空间 / 命名空间
targetNamespace : 目标名称空间 。下面定义的那些元素都与这个名称空间绑定上。
elementFormDefault :元素的格式化情况。-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itheima.com/teacher"
elementFormDefault="qualified">

<element name="teachers">
<complexType>
<sequence maxOccurs="unbounded">
<!-- 这是一个复杂元素 -->
<element name="teacher">
<complexType>
<sequence>
<!-- 以下两个是简单元素 -->
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>

实例文档:
<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns:xsi : 这里必须是这样的写法,也就是这个值已经固定了。
xmlns : 这里是名称空间,也固定了,写的是schema里面的顶部目标名称空间
xsi:schemaLocation : 有两段:前半段是名称空间,也是目标空间的值 , 后面是约束文档的路径。
-->
<teachers
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itheima.com/teacher"
xsi:schemaLocation="http://www.itheima.com/teacher teacher.xsd"
>
<teacher>
<name>zhangsan</name>
<age>19</age>
</teacher>
<teacher>
<name>lisi</name>
<age>29</age>
</teacher>
<teacher>
<name>lisi</name>
<age>29</age>
</teacher>
</teachers>

最后是关于welcom-file-list的定义:

       <welcome-file-list>

        <welcome-file>index.html</welcome-file>

        <welcome-file>index.htm</welcome-file>

        <welcome-file>index.jsp</welcome-file>

</welcome-file-list>

 

可能还有事件监听器,过滤器

事件监听器:

事件监听器和servlet的过滤器类似,都是在web程序被部署到web服务器时生成并被初始化的。

几类监听器的作用:

ServletContext监听器接口可以使web得知整个程序的载入和卸载等运行情况。

HttpSession监听器接口可以使web程序了解程序会话期间的状况并作出响应。

ServletRequest监听器接口可以使web程序控制请求的生命周期。

 

在第一个请求被web容器接受之前实例化并注册好监听器类是必须的。监听器在整个web应用生命周期中都要使用。

web容器对每个监听类只会创建一个实例(单例模式),在第一个请求到来之前实例化并注册。web容器注册监听类的顺序根据他们实现的接口和在部署描述文件中定义的顺序。web应用调用监听实例的顺序按照他们注册的顺序。

对appfuse来说,在web容器根据应用程序部署文件web.xml进行部署的时候,首先完成对listener和filter的实例化和初始化,然后由于

public class StartupListener extends ContextLoaderListener

    implements ServletContextListener {。。。。

StartupListener继承自ServletContextListener,因此在容器对servletContext进行初始化的时候,会调用这个监听。由于在appfuse应用程序的web.xml里有关于spring的配置信息,因此这里就把spring配置好了!!!

 

过滤器:

Filter生命周期

在web工程发布后,在请求使引擎访问一个web资源之前,引擎必须定位Filter列表;引擎必须确保为列表中的每一个Filter建立了一个实例,并调用了他们的init(FilterConfig config)方法。在这过程中可以抛出异常。部署描述文件中定义的所有filter,仅会在引擎中产生一个实例。

当引擎接受一个请求时,引擎就会调用filter列表中第一个filter的doFilter方法,把ServletRequest,ServletResponse和FilterChain作为参数传给它。filter中doFilter方法典型的处理步骤是:

1)检查请求头信息

2)开发者创建一个实现了ServletRequest或HttpServletRequest的类,去包装request对象,以便修改请求的头信息或体数据。

3)开发者创建一个实现了ServletReqponse或HttpServletResponse的类,去包装response对象,以便修改请求的头信息或体数据。

4)filter可以调用链中的下一个实体,下一个实体是另一个filter,如果该filter是列表中最后的一个,则它的下一个实体就是一个目标web资源。如果要调用下一个filter的doFilter方法,把request,和response对象传给FilterChain对象的doFilter方法中就可以了。

Filter chain 的doFilter方法是由引擎提供的,引擎在该方法中会定位filter列表中的下一个filter,调用它的doFilter方法,把传来的request和response对象传给它。

5)在调用chain.doFilter之后,filter可以检测响应的头信息

6)在这些过程中,filter可以抛出异常。当在调用doFilter过程中抛出UnavailableException异常时,引擎重复尝试处理

下面的filter chain的方法,如过时后还没请求到filter chain 就会关闭对filter chain的请求。当filter是列表中最后一个filter时,它的下一个实体是描述配置文件中filter后面的servlet或其它资源。

在引擎删除一个Filter之前,引擎必须调用Filter的destroy方法,来释放资源。

 

Web.xml:都是关于应用程序的。

 

<web-app >

各种<context-param>。。。。

各种<filter>,以及<filter-mapping>。。。。

各种<listener>。。。。

各种<servlet>,以及<servlet-mapping>。。。

<session-config>

<welcome-file-list>

各种<error-page>。。。。

       <taglib>

       <resource-ref>

       <security-constraint>

       <login-config>

       <security-role>

 

Server.xml里的主要内容:

首先是关于server的定义:

<Server port="8005" shutdown="SHUTDOWN" debug="0">

。。。

关于server的注释:

A "Server" is a singleton element that represents the entire JVM,

     which may contain one or more "Service" instances.  The Server

     listens for a shutdown command on the indicated port.

 

关于listener的定义:

<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"

            debug="0"/>

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"

            debug="0"/>

 

关于globalNamingResources的定义:

<GlobalNamingResources>

 

    <!-- Test entry for demonstration purposes -->

    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>

 

    <!-- Editable user database that can also be used by

         UserDatabaseRealm to authenticate users -->

    <Resource name="UserDatabase" auth="Container"

              type="org.apache.catalina.UserDatabase"

       description="User database that can be updated and saved">

    </Resource>

    <ResourceParams name="UserDatabase">

      <parameter>

        <name>factory</name>

        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>

      </parameter>

      <parameter>

        <name>pathname</name>

        <value>conf/tomcat-users.xml</value>

      </parameter>

    </ResourceParams>

 

  </GlobalNamingResources>

 

关于service的定义:

<Service name="Catalina">

。。。

注意connector和engine(container)都是service里的元素。

 

关于connector的定义:

<Connector port="8000"       URIEncoding="gbk"

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

               enableLookups="false" redirectPort="8443" acceptCount="100"

               debug="0" connectionTimeout="20000"

               disableUploadTimeout="true" />

关于connector的注释:

A "Connector" represents an endpoint by which requests are received

         and responses are returned.  Each Connector passes requests on to the

         associated "Container" (normally an Engine) for processing.

 

关于engine的定义:

       <Engine name="Catalina" defaultHost="localhost" debug="0">

。。。

 

关于engine的注释:

An Engine represents the entry point (within Catalina) that processes

         every request.  The Engine implementation for Tomcat stand alone

         analyzes the HTTP headers included with the request, and passes them

         on to the appropriate Host (virtual host).

 

关于logger的定义:

<Logger className="org.apache.catalina.logger.FileLogger"

              prefix="catalina_log." suffix=".txt"

              timestamp="true"/>

 

关于realm的定义:

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"

                 debug="0" resourceName="UserDatabase"/>

 

关于host的定义:

<Host name="localhost" debug="0" appBase="webapps"

       unpackWARs="true" autoDeploy="true"

       xmlValidation="false" xmlNamespaceAware="false">

 

关于logger的定义:

<Logger className="org.apache.catalina.logger.FileLogger"

                 directory="logs"  prefix="localhost_log." suffix=".txt"

            timestamp="true"/>

关于logger的注释:

Logger shared by all Contexts related to this virtual host.  By

          default (when using FileLogger), log files are created in the "logs"

           directory relative to $CATALINA_HOME.  If you wish, you can specify

           a different directory with the "directory" attribute.  Specify either a

           relative (to $CATALINA_HOME) or absolute path to the desired

           directory.

 



名称空间的作用

一个xml如果想指定它的约束规则, 假设使用的是DTD ,那么这个xml只能指定一个DTD  ,  不能指定多个DTD 。但是如果一个xml的约束是定义在schema里面,并且是多个schema,那么是可以的。简单的说:一个xml 可以引用多个schema约束。但是只能引用一个DTD约束。

名称空间的作用就是在 写元素的时候,可以指定该元素使用的是哪一套约束规则。默认情况下 ,如果只有一套规则,那么都可以这么写


<name>张三</name>

<aa:name></aa:name>
<bb:name></bb:name>


程序架构

网页游戏

  • C/S(client/server)

QQ 微信 LOL

优点:


有一部分代码写在客户端, 用户体验比较好。

缺点:


服务器更新,客户端也要随着更新。占用资源大。
  • B/S(browser/server)

网页游戏 , WebQQ ...

优点:


客户端只要有浏览器就可以了。 占用资源小, 不用更新。

缺点:


用户体验不佳。

服务器

其实服务器就是一台电脑。配置比一般的要好。

Web服务器软件

Web应用  需要服务器支撑。index.html


Tomcat apache

WebLogic BEA
Websphere IBM  

IIS   微软

Tomcat安装

  1. 直接解压 ,然后找到bin/startup.bat

  2. 可以安装

  1. 如果双击了startup.bat,  看到一闪而过的情形,一般都是 JDK的环境变量没有配置。

Tomcat目录介绍

bin##


> 包含了一些jar , bat文件 。startup.bat

conf## tomcat的配置 server.xml  web.xml

lib

  	tomcat运行所需的jar文件


logs

	运行的日志文件


temp

	临时文件


webapps##

	发布到tomcat服务器上的项目,就存放在这个目录。	


work(目前不用管)

	jsp翻译成class文件存放地


如何把一个项目发布到tomcat中

需求:如何能让其他的电脑访问我这台电脑上的资源 。stu.xml

localhost : 本机地址


1.  拷贝这个文件到webapps/ROOT底下, 在浏览器里面访问:

	http://localhost:8080/stu.xml

* 在webaps下面新建一个文件夹xml , 然后拷贝文件放置到这个文件夹中


http://localhost:8080/xml/stu.xml

	http://localhost:8080 :其实对应的是到webapps/root
http://localhost:8080/xml/ : 对应是 webapps/xml

使用IP地址访问:

http://192.168.37.48:8080/xml/stu.xml


2. 配置虚拟路径

使用localhost:8080 打开tomcat首页, 在左侧找到tomcat的文档入口, 点击进去后, 在左侧接着找到 Context入口,点击进入。

http://localhost:8080/docs/config/context.html


  1. 在conf/server.xml 找到host元素节点。

  2. 加入以下内容。

3. 配置虚拟路径

  1. 在tomcat/conf/catalina/localhost/ 文件夹下新建一个xml文件,名字可以自己定义。person.xml

  2. 在这个文件里面写入以下内容

    <?xml version='1.0' encoding='utf-8'?><Context docBase="D:\xml02"></Context>

  3. 在浏览器上面访问

    http://localhost:8080/person/xml的名字即可

给Eclipse配置Tomcat

  1. 在server里面 右键新建一个服务器, 选择到apache分类, 找到对应的tomcat版本, 接着一步一步配置即可。

  2. 配置完毕后, 在server 里面, 右键刚才的服务器,然后open  , 找到上面的Server Location , 选择中间的 Use Tomcat installation...

  3. 创建web工程, 在WebContent下定义html文件, 右键工程, run as server

总结:

xml

1. 会定义xml

2. 会解析xml

dom4j 基本解析

Xpath手法


tomcat

1. 会安装 ,会启动 , 会访问。

2. 会设置虚拟路径

3. 给eclipse配置tomcat




以上是关于Xml和Tomcat的主要内容,如果未能解决你的问题,请参考以下文章

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

iOS)我应该在哪里复制和粘贴 facebook XML 片段?

xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException

需要示例代码片段帮助

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

我们可以在活动 xml 中编写 UI 以及在片段 xm 中编写 UI 吗?