java xml 二之Schema总结

2024-05-27 10:32
文章标签 java xml 总结 schema

本文主要是介绍java xml 二之Schema总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面讲解XML Schema【非常重要】:


我们自己写的XML文件需要用Schema来验证有效性,而Schema恰恰也是一个XML文件,那么Schema这个XML文件的有效性用什么来验证呢?答案是用DTD来验证。用内置的XMLSchema.dtd来验证Schema文件(一个XML文件)的有效性。所以Schema里面定义命名空间的那个URL不能换成其他的,只能是http://www.w3.org/2001/XMLSchema,这里面包含了验证Schema有效性的DTD。


重点查看附件xml_3.pdf文档里面的内容,这个是上课的课件,里面详细讲解了Schema的相关内容,仔细阅读研究。

下面是自定义数据类型的一对使用示例:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="cat" type="xs:string"/>
<xs:element name="dog" type="xs:string"/>
<!--自定义数据类型,这种类型里面必须包含cat和dog两个元素,并且这两个元素都是字符串类型的-->
<xs:complexType name="myType">
<xs:sequence maxOccurs="unbounded">
<xs:element ref="cat"/>
<xs:element ref="dog"/>
</xs:sequence>
<!-- sequence表示按顺序,minOccurs表示最小出现次数,maxOccurs表示最大出现次数,unbounded表示最大出现次数没有限制 -->
</xs:complexType>
<!-- 定义了一个元素,这个元素的类型是自定义的myType类型 -->
<xs:element name="pets" type="myType"/>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<pets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema2.xsd">
<cat>123</cat>
<dog>456</dog>
</pets>


凡是在Schema里面定义的element元素,就表示在相应的XML里面直接用的,Schema里面定义的类型complexType是不能直接在XML里面使用的。类型是抽象的概念,比如定义的某个元素可以是牟某种类型的,类型不能直接在XML里面使用。


下面是日常Schema-XML开发中最常用到的一些Schema使用示例【非常重要,根据里面的注释仔细研究,拷贝到XMLSpy里面运行起来】:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 把name、birthday、age三个放到一组里面,以后凡是使用myGroup的地方,这三个元素就会同时出现 -->
<xs:group name="myGroup">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:group>
<!-- 定义一个元素,这个元素引用上面定义的组myGroup -->
<xs:element name="person">
<xs:complexType>
<xs:group ref="myGroup"/>
</xs:complexType>
</xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema3.xsd">

<name>tom</name>
<birthday>2013-10-10</birthday>
<age>12</age>

</person>


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:attribute name="interest" type="xs:integer"/>
<!-- person这个元素里面包含hello和world两个元素,并且它有一个属性interest,这个属性可有可无 -->
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="hello" type="xs:string"/>
<xs:element name="world" type="xs:string"/>
</xs:sequence>
<xs:attribute ref="interest"/>
</xs:complexType>
</xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema4.xsd" interest="123">

<hello></hello>
<world></world>


</person>


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 属性组定义,hello属性必须有,world属性可有可无 -->
<xs:attributeGroup name="myAttributeGroup">
<xs:attribute name="hello" type="xs:string" use="required"/>
<xs:attribute name="world" type="xs:string" use="optional"/>
</xs:attributeGroup>
<!-- 这个元素里面不包含其他元素,里面是空的,但是它有一些属性,它引用了属性组myAttributeGroup -->
<xs:element name="myElement">
<xs:complexType>
<xs:attributeGroup ref="myAttributeGroup"/>
</xs:complexType>
</xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<myElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema5.xsd" hello="abc"></myElement>



<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义一个类型,如果有一个元素它的类型是myType,那么这个元素的值只能是介于0到100之间 -->
<xs:simpleType name="myType">
<xs:restriction base="xs:integer">
<xs:minExclusive value="0"/>
<xs:maxExclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="hello" type="myType"/>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema6.xsd">

10

</hello>




<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义一个类型,如果有一个元素它的类型是myType,那么这个元素的值只能是5、7、9中的一个 -->
<xs:simpleType name="myType">
<xs:restriction base="xs:integer">
<xs:enumeration value="5"/>
<xs:enumeration value="7"/>
<xs:enumeration value="9"/>
<!-- 定义的枚举类型,用户的元素值只能是这几个值当中的一个 -->
</xs:restriction>
</xs:simpleType>
<xs:element name="hello" type="myType"/>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema7.xsd">

5

</hello>




<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义一种类型,如果某个元素是这种类型,那么在这个元素里面可以使用itemType所指定的类型,只要我的所有元素值是属于所指定的类型就行。有一个元素值不属于这种类型就会报错。每个元素值中间用空格间隔 -->
<xs:simpleType name="myType">
<xs:list itemType="xs:integer"/>
<!-- list相当于一种集合一样 -->
</xs:simpleType>
<xs:element name="hello" type="myType"/>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema8.xsd">

1 2 3 78

</hello>


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 定义一个属性。把roadbikeSize类型和mountainbikeSize类型作为allFrameSize这个属性的union的memberTypes的属性值(中间用空格间隔)。也就是说memberTypes值要么取roadbikeSize要么取mountainbikeSize,二者只能取一个。如果取roadbikeSize,那么memberTypes值是46、55、60中的一个;如果取mountainbikeSize,那么memberTypes值是small、medium、large中的一个。总结:属性allFrameSize只能是六选一 -->
<xs:attribute name="allFrameSize">
<xs:simpleType>
<xs:union memberTypes="roadbikeSize mountainbikeSize"/>
</xs:simpleType>
</xs:attribute>
<!-- 自定义一种类型,名字叫roadbikeSize,它的约定限制是基于正整数,从46、55、60这三个值里面选一个可以作为这个类型的值 -->
<xs:simpleType name="roadbikeSize">
<xs:restriction base="xs:positiveInteger">
<xs:enumeration value="46"/>
<xs:enumeration value="55"/>
<xs:enumeration value="60"/>
</xs:restriction>
</xs:simpleType>
<!-- 自定义一种类型,名字叫mountainbikeSize,它的约定限制是基于字符串,从small、medium、large这三个值里面选一个可以作为这个类型的值 -->
<xs:simpleType name="mountainbikeSize">
<xs:restriction base="xs:string">
<xs:enumeration value="small"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="large"/>
</xs:restriction>
</xs:simpleType>
<!-- 定义一个元素 -->
<xs:element name="hello">
<xs:complexType>
<xs:sequence>
<xs:element name="welcome" type="xs:string"/>
</xs:sequence>
<xs:attribute ref="allFrameSize" use="required"/>
<!-- 复杂类型,定义一个元素(子元素) -->
<!-- 定义一个属性,这个属性类型是allFrameSize -->
</xs:complexType>
</xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema9.xsd" allFrameSize="small">

<welcome>

</welcome>

</hello>



========================以上都是simpleType的一些用法=====================

simpleType和complexType区别:
1、simpleType类型的元素中不能包含元素或者属性。
2、当需要声明一个元素的子元素和/或属性时,用complexType【特点:有子元素,同时有可能有属性,换句话说,属性和子元素里面必然至少有一个,或者两个都有。】;
3、当需要基于内置的基本数据类型定义一个新的数据类型时,用simpleType。


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 根元素 -->
<xs:element name="showSize">
<!-- 这个元素是复杂类型 -->
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="sizing" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="us"/>
<xs:enumeration value="europe"/>
<xs:enumeration value="uk"/>
</xs:restriction>
<!-- sizing属性的值是一个枚举,可以从下面几个值里面选择一个 -->
</xs:simpleType>
</xs:attribute>
</xs:extension>
<!-- 表示showSize元素内容是decimal类型的(十进制的小数)。基于decimal进行扩展,十进制的,可以包含小数,对十进制有一个扩展 -->
<!-- 里面必定有一个名字叫做sizing的属性 -->
</xs:simpleContent>
<!-- simpleContent表示上面的showSize元素内容符合什么约定,<xs:simpleContent>标签中间的内容来表示这种约定 -->
<!-- simpleContent表示元素下不包括子元素但是可以包含属性,否则你直接用simpleType不就可以了么。complexType可以包含子元素,可以包含属性,但是使用simpleContent就是为了限定元素中间的内容是什么类型(也就是说元素中间必须有内容,不能是空的),不能包含子元素,但可以包含属性 -->
</xs:complexType>
</xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<showSize xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema10.xsd" sizing="uk">

10

</showSize>


1. Schema(模式):其作用与dtd一样,也是用于验证XML文档的有效性,只不过它提供了比dtd更强大的功能和更细粒度的数据类型,另外Schema还可以自定义数据类型。此外,Schema也是一个XML文件,而dtd则不是。
2. 所有的schema文档,其根元素必须为schema。
3. SimpleType与ComplexType的区别:
1) SimpleType类型的元素没有子元素,也没有属性。
2) 当需要定义的元素包含了子元素或者属性时,必须要使用ComplexType。
4. SimpleContent,用于ComplexType元素上,用于限定该ComplexType的内容类型,表示该ComplexType没有子元素,同时该ComplexType需要有属性,否则它就成为SimpleType了。
5. 通过DOCTYPE可以明确指定文档的根元素,因为DOCTYPE后面跟的元素就是文档的根元素【用DTD验证的情况下。】;通过Schema是没法明确指定目标XML文档的根元素,XmlSpy是通过推断哪个元素包含了其他元素来选择包含其他元素最多的那个元素作为文档的根,但我们可以明确指定文档的根元素而不必按照XmlSpy的生成来做【并且Schema验证的XML文档根元素也不是固定的,是根据Schema具体内容来定。比如用下面这个Schema验证的XML文档的根元素就不是固定的,可以是helloworld,也可以是welcome,用XmlSpy根据这个Schema生成XML文档的时候它会提示你选择根元素,选哪个都行,比如你选择了helloworld,那么在你的这个XML文档里面就不可能出现welcome了,选择welcome就不可能出现helloworld了。】。


注意sequence和choice的区别,下面这两组例子(4个文件)做比较【重点】:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 这里表示myType这个复杂类型里面要么有hello这个子元素,要么有world这个子元素,二选一 -->
<xs:complexType name="myType">
<xs:choice maxOccurs="3">
<!-- choice里面定义的元素都相当于局部元素,只能在choice的选择中使用 -->
<xs:element name="hello" type="xs:string"/>
<xs:element name="world" type="xs:string"/>
</xs:choice>
<!-- choice里面的元素最多出现三次(和同一个元素重复出现没有关系,同一个元素出现三次也可以,不同元素出现三次也可以) -->
</xs:complexType>
<xs:element name="helloworld" type="myType"/>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<helloworld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema11.xsd">

<hello>123</hello>
<hello>123</hello>


</helloworld>


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义一种类型,里面包含两个元素 -->
<xs:complexType name="myType">
<xs:sequence maxOccurs="3">
<xs:element name="hello" type="xs:string"/>
<xs:element name="world" type="xs:string"/>
</xs:sequence>
<!-- sequence表示序列,按照顺序执行。equence表示里面的元素都得出现,而且按照顺序,minOccurs和maxOccurs同样指的是整体一组,整体(两个元素必须同时出现,同时出现算作一次)要求最少出现一次,最多出现3次。 -->
</xs:complexType>
<xs:element name="helloworld" type="myType"/>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<helloworld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema12.xsd">

<hello>abc</hello>
<world>xyz</world>

<hello>abc</hello>
<world>xyz</world>

<hello>abc</hello>
<world>xyz</world>


</helloworld>



<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 总结:通过DTD验证的XML文档,在DTD里面通过DOCTYPE可以明确指定文档的根元素,因为DOCTYPE后面跟的元素就是文档的根元素。而通过Schema验证的XML文档,是没法明确指定目标XML文档的根元素的,XmlSpy是通过推断哪个元素包含了其他元素来选择包含其他元素最多的那个元素作为文档的根,但我们可以明确指定文档的根元素而不必按照XmlSpy的生成来做,并且Schema验证的XML文档根元素也不是固定的,是根据Schema具体内容来定。比如用下面这个Schema验证的XML文档的根元素就不是固定的,可以是helloworld,也可以是welcome,用XmlSpy根据这个Schema生成XML文档的时候它会提示你选择根元素,选哪个都行,比如你选择了helloworld,那么在你的这个XML文档里面就不可能出现welcome了,选择welcome就不可能出现helloworld了。 -->
<xs:complexType name="myType">
<xs:sequence maxOccurs="3">
<xs:element name="hello" type="xs:string"/>
<xs:element name="world" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="helloworld" type="myType"/>
<xs:element name="welcome" type="myType"/>
</xs:schema>



下面是一个课堂作业,根据给定的XML文件test1.xml自己写出相应的Schema文件,这里写出了两个对应的Schema那件test1-1.xsd和test1_2.xsd,这两个文件都能用来验证test1.xml,首先给出test1.xml代码,然后再给出test1-1.xsd和test1-2.xsd代码。
<?xml version="1.0" encoding="UTF-8"?>
<学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\test1-2.xsd">

<学生 学号="1">
<姓名>张三</姓名>
<性别>男</性别>
<年龄>19</年龄>
</学生>

<学生 学号="2">
<姓名>李四</姓名>
<性别>女</性别>
<年龄>20</年龄>
</学生>

<学生 学号="3">
<姓名>王五</姓名>
<性别>男</性别>
<年龄>21</年龄>
</学生>

</学生名册>

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="sexType">
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ageType">
<xs:restriction base="xs:integer">
<xs:minExclusive value="1"/>
<xs:maxExclusive value="150"/>
</xs:restriction>
</xs:simpleType>
<xs:group name="groupType">
<xs:sequence>
<xs:element name="姓名" type="xs:string"/>
<xs:element name="性别" type="sexType"/>
<xs:element name="年龄" type="xs:integer"/>
</xs:sequence>
</xs:group>
<xs:complexType name="myType">
<xs:choice maxOccurs="unbounded">
<xs:element name="学生">
<xs:complexType>
<xs:group ref="groupType"/>
<xs:attribute name="学号" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:element name="学生名册" type="myType"/>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="学生名册">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="学生">
<xs:complexType>
<xs:sequence>
<xs:element name="姓名" type="xs:string"/>
<xs:element name="性别">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="年龄">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minExclusive value="1"/>
<xs:maxExclusive value="150"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="学号" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Schema简单总结:
Schema是另一种文档类型定义,它遵循XML的语言规范。
Schema是可扩展的,支持命名空间。
Schema支持更多的数据类型与元素类型。
Schema用element声明元素,用attribute声明元素的属性。
Schema用simpleType定义简单类型,用complexType定义复杂类型。


附件里面的XML_Schema学习总结是教师针对Schema模块专门系统总结的一些重点笔记,一定要详细查看,并且以后的XML Schema开发会经常用到这个笔记总结
附件为上课课件,详细笔记在里面

这篇关于java xml 二之Schema总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007226

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;