xml基础-xml结构介绍

XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言;可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;以及可扩展链接语言(Extensible Link Language,XLL)。


重新编辑勘误一下:在普遍应用XSD文件规范XML格式之前,流传过一段使用DTD文件规范XML格式的时间。因为DTD文件的语法比较复杂,不如XSD简单明了,所以渐渐的DTD文件退出了网络平台。

那xsl文件是做什么的呢?xsl文件更像是一种编程语言,文件中包含了很多逻辑运算符号,用来渲染XML承载的数据的表现方式,因为xsl文件会操作XML文件中的数据,然后生成相应的HTML标签。

以前xml与xsl结合现实web page很常见,CSDN在2004年之前就是这么用的。这种想法是很先进的,就是服务器端分别提供数据与控制展现方式的xsl文件,这样如果想使用不同的主题,就换一套xsl就可以了。但是后来不用了,xsl也退出了舞台,因为效率低,需要在浏览器端进行转换,非常慢。

XLL:Microsoft Excel内插器(加载项)文件。Excel加载项文件与DLL文件类似,只是它们是专门为Microsoft Excel构建的。
XLL 是 XML 链接语言,它提供了 XML 中的链接,类似 HTML 中的链接,然而功能更强。用 XLL,链接可以是多向的,而且链接可存在于对象级,不是仅在页面级。Internet Explorer 5 不支持 XLL。参看MSDN【个人感觉XLL文件,要么是链接文件,要么是加载项文件,目前好像没有看到过XLL文件了。】


(1)DTD
DTD规定了文档的逻辑结构。它可定义文档的语法,而文档的语法反过来也能够让XML语法分析程序确认页面标记使用的合法性。DTD定义了页面的元素、元素的属性及元素和属性间的关系。元素与元素间用起始标记和结束标记来定界,对于空元素,用一个空元素标记来分隔。每一个元素都有一个用名字标识的类型,也称为它的通用标识符,并且它还可以有一个属性说明集。每个属性说明都有一个名字和一个值。理想定义应该面向描述与应用程序相关的数据结构,而不是如何显示数据。就是说,应该把一个元素定义为一个标题行,之后让样式表和脚本定义显示标题行。
DTD不具强制性。对于简单的应用程序来说,开发商不需建立自己的DTD,可以使用预先定义的公共DTD或不使用。即使某个文档已经有DTD,只要文档组织是良好的,语法分析程序也不必对照DTD来检验文档的合法性。服务器可能己执行了检查,所以检验的时间和带宽将得以大幅度节省。
(2)XSL
XSL是用来规定XML文档样式的语言。XSL能使Web浏览器改变原有文档的表示法,例如改变数据的显示顺序,不必再与服务器进行交互通信。通过样式表的变换,同一文档可以显示得更大,或经过折叠只显示外面的一层,或者变为打印格式。
XSL凭借其本身的可扩展性,能够控制无穷无尽的标记,而且控制每个标记的方式也是无穷尽的,这也给Web提供了高级的布局特性。如文本的旋转、多列和独立区域。同时支持国际书写格式,可在一页上混合使用从左至右、从右至左及从上至下的书写格式。就如同XML介于HTML和SGML之间一样,XSL标准是介于CSS和SGMI的文档样式语义和规范语言之间的。
(3)XLL
XLL支持Web上已有的简单链接,而且将进一步扩展链接,包括终结死链接的间接链接及可从服务器中只查询某个元素的相关部分链接等。
超文本标记语言(HTML)仅仅执行历来与超文本系统概念相关的极少功能,仅支持最简单的链接形式,即指向硬编码位置的单向链接,这与XML相比有着很大的差别。在为XML所设想的真正超文本系统中,所有典型的超文本链接机制全部将得到支持,包括:与位置无关命名,双向链接,可在文档外规定和管理的链接,元超链接(如环路、多个窗口),集合链接(多来源),Transc1usion(链接目标文档是链接源文档的一部分),链接属性(链接类型)。
所有这些可通过XLL来实现。由于XML以SGML作为基础,因此,XLL基本上属于Hytime(超媒体/基于时间的结构语言,ISO10744)的一个子集,另外它还遵循文本编码所倡议规定的链接概念。
XML能方便有效地表示结构化数据,这就使得XML可以作为描述和传输数据的手段。使用XML进行数据交换已经成为计算机软件领域的标准技术模式。通过XML实现数据的标准化、结构化,解决了在不同平台、不同系统之间的数据结构/模式的差异,使得数据层在XML技术的支持下统一起来。
Web Service全部的规范,技术都是以XML为底层核心和构架基础的,对Web Service而言,SOAP、WSDL和UDDI,都是使用XML作为信息描述和交换的标准手段。XML技术的产生促使了Web Service技术的产生与发展。

xml基础-xml简介

可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。

1998年2月,W3C正式批准了可扩展标记语言的标准定义,可扩展标记语言可以对文档和数据进行结构化处理,从而能够在部门、客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发。可扩展标记语言可以使我们能够更准确的搜索,更方便的传送软件组件,更好的描述一些事物。例如电子商务交易等。
它被设计用来传输和存储数据; [1]
超文本标记语言被设计用来显示数据。
它们都是标准通用标记语言的子集。

一、什么是可扩展标记语言?
可扩展标记语言是一种很像超文本标记语言的标记语言。
它的设计宗旨是传输数据,而不是显示数据。
它的标签没有被预定义。您需要自行定义标签。
它被设计为具有自我描述性。
它是W3C的推荐标准。

二、可扩展标记语言和超文本标记语言之间的差异
它不是超文本标记语言的替代。
它是对超文本标记语言的补充。
它和超文本标记语言为不同的目的而设计:
它被设计用来传输和存储数据,其焦点是数据的内容。
超文本标记语言被设计用来显示数据,其焦点是数据的外观。
超文本标记语言旨在显示信息,而它旨在传输信息。
对它最好的描述是:它是独立于软件和硬件的信息传输工具。

三、可扩展标记语言是W3C的推荐标准
XML 于 1998 年 2 月 10 日成为 W3C 的推荐标准。

四、可扩展标记语言无所不在
超文本标记语言。
XML 是各种应用程序之间进行数据传输的最常用的工具。


可以在可扩展标记语言文件的内容包括几乎所有的万国码Unicode字符(以下例子使用本条例,以 标准通用标记语言常用来定义针对HTML的文档类型定义(DTD),同时它也常用于编写XML的DTD。标准通用标记语言的问题就在于它允许出现一些奇怪的语法,这让创建HTML的解析器成为一个大难题:
某些起始标签可以选择性出现结束标签或者隐含了结束标签。
某些起始标签要求必须出现结束标签,例如HTML中<script>“脚本”标签。
标签可以以任何顺序嵌套。即使结束标签不按照起始标签的逆序出现也是允许的,例如,This is asamplestring是正确的。
某些特性要求必须包含值,例如<图片 源=”百度百科.jpg”>中的源特性。
某些特性不要求一定有值,例如中的“不换行”(外语:nowrap)特性。
定义特性的两边有没有加上双引号都是可以的,所以都是允许的。

<百度百科  词条="可扩展标记语言">
和
<百度百科  词条=可扩展标记语言>

这些问题使建立一个标准通用标记语言的解析器变成了一项艰巨的任务,判断何时应用以上规则的困难导致了标准通用标记语言语言的定义一直停滞不前,以这些问题作为出发点,XML逐渐步入我们的视野。
XML去掉了之前令许多开发人员头疼的标准通用标记语言的随意语法。在XML中,采用了如下的语法:
一、任何的起始标签都必须有一个结束标签。
二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<百度百科词条/>。XML解析器会将其翻译成<百度百科词条></百度百科词条>。
三、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如这是一串百度百科中的样例字符串。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
四、所有的特性都必须有值。
五、所有的特性都必须在值的周围加上双引号。
这些规则使得开发一个XML解析器要简便得多,而且也除去了解析标准通用标记语言中花在判断何时何地应用那些奇怪语法规则上的工作。仅仅在XML出现后的前六年就衍生出多种不同的语言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同时也将HTML改进为XHTML。


可扩展标记语言是一种元标记语言,即定义了用于定义其他特定领域有关语义的、结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识。XML 文档定义方式有:文档类型定义(DTD)和XML Schema。DTD定义了文档的整体结构以及文档的语法,应用广泛并有丰富工具支持。XML Schema用于定义管理信息等更强大、更丰富的特征。XML能够更精确地声明内容,方便跨越多种平台的更有意义的搜索结果。它提供了一种描述结构数据的格式,简化了网络中数据交换和表示,使得代码、数据和表示分离,并作为数据交换的标准格式,因此它常被称为智能数据文档。
XML技术已经广泛应用于e-Learning应用系统的开发,大多数的商用e-Learning平台都支持XML标准。一些主要的网络设备制造商,如CISCO、JUNIPER等,生产的网络设备也已提供了对XML的支持,以利于今后基于XML的网络管理。
XML在e-Learning管理中的应用
一、兼容现有协议
XML文档格式的管理信息可以很容易地通过HTTP 协议传输,由于HTTP是建立在TCP之上的,故管理数据能够可靠传输。XML还支持访问XML文档的标准API,如DOM,SAX,XSLT,Xpath等。
二、统一的管理数据存取格式
XML能够以灵活有效的方式定义管理信息的结构。以XML格式存储的数据不仅有良好的内在结构,而且由于它是W3C提出的国际标准,因而受到广大软件提供商的支持,易于进行数据交流和开发。现有网络管理标准如TMN、SNMP等的管理信息库规范决定了网管数据符合层次结构和面向对象原则,这使得以XML格式存储网管数据也非常自然,易于实现。
三、不同应用系统间数据的共享和交互
只要定义一套描述各项管理数据和管理功能的XML语言,用Schema对这套语言进行规定,并且共享这些数据的系统的XML文档遵从这些Schema,那么管理数据和管理功能就可以在多个应用系统之间共享和交互。
四、底层传输的数据更具可读性
网络中传输的底层数据因协议不同而编码规则不同,虽然最终传输时都是二进制位流,但是不同的应用协议需要提供不同的转换机制。这种情况导致管理站在对采用不同协议发送管理信息的被管对象之间进行管理时很难实现兼容。如果协议在数据表示时都采用XML格式进行描述,这样网络之间传递的都是简单的字符流,可以通过相同的XML解析器进行解析,然后根据不同的XML标记,对数据的不同部分进行区分处理,使底层数据更具可读性。

eclipse-添加jar包时别放到资源文件夹中

eclipse开发时,有时需要添加jar包,这个时候应该新建一个普通文件夹,然后将jar包,放入文件夹中,最后 将jar包 右键 add build path 中。

如果将jar包 添加到 Source folder 中,那么 在代码中 还是无法 引入已经 添加了的jar包。 仍需要将 Source folder 中的 jar 包 右键 add build path 中。

综上来看,将jar包 直接 右键 add build path 中,就OK了,不需要 将jar包 添加到 Source folder 中。

mybatis基础-配置开发环境

一、搭建数据源

mysql客户端连接mysql数据库,执行下面语句。【第一次写的时候,居然写成tbl_employee{},sql语句没有{},应该是()  】

CREATE TABLE tb1_employee (
   id INT(11) PRIMARY KEY AUTO_INCREMENT,
   last_name VARCHAR(255),
   gender CHAR(1),
   email VARCHAR(255)

)

因为不区分大小写,所以也可以采用如下写法:

create table tbl_employee(
  id int(11) primary key auto_increment,
  last_name varchar(255),
  gender char(1),
  email varchar(255)
)

创建完表格后,并在其中添加一条记录。

id	last_name    gender	     email
1	   mike	       0     [email protected]

二、创建项目代码

1、工程代码总览:

(代码包括mybatis 的两种操作 方法)

2、添加项目jar包

项目用到的jar包主要有:
mybatis-3.4.6.jar 【mybatis 包】
mysql-connector-java-5.1.18.jar 【mysql 驱动包】

额外添加的包:
mybatis-3.4.6-sources.jar 【mybatis 源码包,方便debug 跟踪代码】
mybatis-3.4.6-javadoc【mybatis 文档包,方便查看】
log4j-1.2.17.jar 【日志打印包,需要配合 log4j 的配置文件一起使用,这里用到的配置文件是log4j.xml

log4j.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
   <param name="Encoding" value="UTF-8" />
   <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
   </layout>
 </appender>
 <logger name="java.sql">
   <level value="debug" />
 </logger>
 <logger name="org.apache.ibatis">
   <level value="info" />
 </logger>
 <root>
   <level value="debug" />
   <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>

3、创建ORM中的对象

package com.mybatis.bean;

public class Employee {
	private int id;
	private String lastName;
	private String email;
	private String gender;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	@Override
	public String toString() {
		return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]";
	}

}

4、创建全局配置文件

mybatis-config.xml【文件名可以随便取,只要在代码中加载全局配置文件时,文件名写对就行】

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
				<property name="username" value="root" />
				<property name="password" value="Kitty521!" />
			</dataSource>
		</environment>
	</environments>
	<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 
	如果 数据库全局文件 和 子配置文件 不在同一个目录 ,就需要 /目录/目录/.../EmployeeMapper_old.xml
	-->
	<mappers>
	    <!-- 旧方法操作mybatis 需要 的配置文件 -->
		<mapper resource="EmployeeMapper_old.xml" />
	    <!-- 新方法操作mybatis 需要 的配置文件 -->
		<mapper resource="EmployeeMapper_new.xml" />
	</mappers>
</configuration>

5、旧方法操作mybatis

(1)对象映射配置文件:EmployeeMapper_old.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.hhh.EmployeeMapper">
<!-- 
上面的 namespace:名称空间;名字随便写

下面的 id:唯一标识
下面的 resultType:返回值类型
下面的 #{id}:从传递过来的参数中取出id值
 -->
	<select id="selectEmp" resultType="com.mybatis.bean.Employee">
	<!-- select * from tb1_employee where id = #{id}  
	这样的查询结果导致数据库 last_name 无法赋值给employee bean中的lastName
	所以,employee 中的  lastName 是空值,解决版本是 查询结果 取 别名-->	
	select id ,last_name lastName,email, gender from tbl_employee where id = #{id}
	</select>
</mapper>

(2) JUnit 单元测试:

public class MybatisTest {

	/**
	 * 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
	 * 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。 
	 * 3、将sql映射文件注册在全局配置文件中
	 * 4、写代码:
	 * 		1)、根据全局配置文件得到SqlSessionFactory;
	 * 		2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
	 * 			一个sqlSession就是代表和数据库的一次会话,用完关闭
	 * 		3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
	 * 
	 * @throws IOException
	 */
	@Test
	public void test_old() throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

		//获取sqlSession实例 ,能直接执行已经映射的sql语句。
		// sql的唯一标识:statement Unique identifier matching the statement to use.
		// 执行sql要用的参数:parameter A parameter object to pass to the statement.
		SqlSession openSession = sqlSessionFactory.openSession();
		try{
		//唯一标识符可以直接写 selectEmp 但为了防止 和别可能有的冲突,添加了命名空间
	    Employee employee =  openSession.selectOne("com.mybatis.hhh.EmployeeMapper.selectEmp",1);
	    System.out.println(employee);
		}catch (Exception e) {
			// TODO: handle exception
		}finally {
		    openSession.close();
		}
	}
}

6、新方法操作mybatis

(1)对象映射配置文件:EmployeeMapper_new.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.EmployeeMapper">
<!-- 
上面的 namespace:名称空间;指定为接口的全类名
下面的 id:唯一标识被规定为接口方法名 【public Employee getEmpById(Integer id);】
下面的 resultType:返回值类型
下面的 #{id}:从传递过来的参数中取出id值
 -->
	<select id="getEmpById" resultType="com.mybatis.bean.Employee">
		select id,last_name lastName,email,gender from tbl_employee where id = #{id}
	</select>
</mapper>

(2)创建对象映射的接口文件

EmployeeMapper.java

package com.mybatis.mapper;

import com.mybatis.bean.Employee;

public interface EmployeeMapper {

	public Employee getEmpById(Integer id);
	
}

(3)JUnit 单元测试

/**
 * 1、接口式编程
 * 	原生:		Dao		====>  DaoImpl
 * 	mybatis:	Mapper	====>  xxMapper.xml
 * 
 * 2、SqlSession代表和数据库的一次会话;用完必须关闭;
 * 3、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。(就是不要放在共享成员变量里面,A线程用完释放,B线程再用就为空了)
 * 4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
 * 		(将接口和xml进行绑定)
 * 		EmployeeMapper empMapper =	sqlSession.getMapper(EmployeeMapper.class);
 * 5、两个重要的配置文件:
 * 		mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
 * 		sql映射文件:保存了每一个sql语句的映射信息:
 * 					将sql抽取出来。	
 *
 */
public class MybatisTest {

        public SqlSessionFactory getSqlSessionFactory() throws IOException {
	        String resource = "mybatis-config.xml";
	        InputStream inputStream = Resources.getResourceAsStream(resource);
	        return new SqlSessionFactoryBuilder().build(inputStream);
        }

        @Test
	public void test_new() throws IOException {
		// 1、获取sqlSessionFactory对象
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		// 2、获取sqlSession对象
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			// 3、获取接口的实现类对象
			//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			Employee employee = mapper.getEmpById(1);
			System.out.println(mapper.getClass());
			System.out.println(employee);
		} finally {
			openSession.close();
		}

	}

}

 


三、全局配置文件解析

1、配置标签顺序

在mybatis的全局配置文件中, 在 <configuration>标签下:

Content Model : (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?,

reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)

注意上面的子标签都是有顺序的

2、标签详解请看相关章节

 

四、映射文件解析

 


补充:

SqlSession 的实例不是线程安全的,因此是不能被共享的。

SqlSession每次使用完成后需要正确关闭,这个关闭操作是必须的

SqlSession可以直接调用方法的id进行数据库操作,但是我们一般还是推荐使用SqlSession获取到Mapper接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作

关于JUnit单元测试,只需在eclipse中新建 JUnit Test Case 就行了。

mybatis入门概述-mybatis框架简介

MyBatis简介

核心总结:

默认情况,自动生成的 SQL映射文件,默认 Mybatis的查询,只会返回字段给beanbean中的子对象是不存在的。

除非自己自定义bean中的子对象 ,和自定义SQL语句,并将sql语句返回的属性赋值给子对象的属性中。

事实情况举例如下:
{"code":100,"msg":"处理成功!","extend":{"emp":{"empId":1,"empName":"Jerry","gender":"M","email":"[email protected]","dId":1,"department":null}}}


原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis ,代码于2013年11月迁移到Github(下载地址见后)。

iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。

MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.

MyBatis用处

MyBatis是一个半自动化的持久化层框架。

•JDBC
–SQL夹在Java代码块里,耦合度高导致硬编码内伤
–维护不易且实际开发需求中sql是有变化,频繁修改的情况多见

•Hibernate和JPA
–长难复杂SQL,对于Hibernate而言处理也不容易
–内部自动生产的SQL,不容易做特殊优化。
–基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。

•对开发人员而言,核心sql还是需要自己优化
•sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。

mybatis下载

1、https://github.com/mybatis/mybatis-3/

2、http://central.maven.org/maven2/org/mybatis/mybatis/3.4.6/

 

wordpress-网站迁移与本地主机测试

将网站定期备份到本地 ,方便本地调试 与 文件备份。 

一、网站备份迁移流程:

1、用mysql 客户端 备份数据库,导出sql

2、删除网站自动备份文件,将网站压缩打包,从服务器下载网站备份。

3、因为本地环境是Apache + php ,网站 环境是 nginx +php,所以需要迁移。

(1)开启本地mysql,导入网站 sql 数据,数据库名和原网站相同。

(2)配置本地虚拟主机,并将网站文件存放至虚拟主机目录。

(3)调整网站环境,解决其他迁移问题。


二、配置虚拟主机

mac os x已自带了apahce,so 我们不需要单独安装apache,只需修改其中配置即可。

1、修改apache主配置文件

sudo vim /etc/apache2/httpd.conf

搜索vhost关键字,将以下两行代码前的#删除

#LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
  
#Include /private/etc/apache2/extra/httpd-vhosts.conf

搜索php5关键字,将以下两行代码前的#删除

#LoadModule rewrite_module libexec/apache2/mod_rewrite.so

#LoadModule php5_module libexec/apache2/libphp5.so

wq保存退出,第一步完成。

2、修改虚拟主机配置文件

sudo vim /etc/apache2/extra/httpd-vhost.conf

将以下代码贴进文件尾行,并按照注释配置相关参数

<VirtualHost *:80>
    ServerAdmin [email protected]  //主机邮箱地址
    DocumentRoot "/usr/docs/dummy-host2.example.com"  //站点根目录
    ServerName dummy-host2.example.com  //站点虚拟域名
    ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"  //错误日志输出
    CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common
    <Directory "/usr/docs/dummy-host2.example.com"> //站点根目录   文件权限相关
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Require all granted
    </Directory>
</VirtualHost>

将注释中的配置项改好之后,wq保存退出。

3、修改host配置

sudo vim /etc/hosts

在文件末尾加上一行

127.0.0.1       dummy-host2.example.com  //刚配好的虚拟站点目录

保存退出。

4、将网站文件存放至虚拟主机目录,并重启服务器

sudo apachectl restart

三、调整迁移环境解决迁移问题

1、数据库密码匹配问题

为了以后的方便测试统一,将本地数据库密码与网站统一。

#### 输入密码,进入 mysql 数据库
mysql -u root -p

### 修改数据库密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

2、wordpress 中的 wp-config.php问题

(1)Apache 只能 解析 127.0.0.1  而 Nginx 可以解析 127.0.0.1 和 localhost  ,一开始这个地方填了 localhsot,导致 Apache 无法解析。

/** MySQL hostname  正确填法如下 **/

define('DB_HOST', '127.0.0.1');

(2)开启 debug 输出模式,方便查找 错误

define('WP_DEBUG', true);

(3)服务器内部错误,debug输出下发现文件夹权限问题,无法写入缓存

### 修改网站文件的权限,对指定 文件夹 文件 读写 全开放
sudo chmod -R 777 文件夹  (递归调用,使子文件 文件夹也是这个权限) 

### 对指定 文件夹 ,设置 文件 文件夹 用户组 和用户 ;就是文件所有者
sudo  chown  –R  apache:apache  文件夹  (递归调用,使子文件 文件夹也是这个权限) 

### 最后 设置好 文件权限
sudo  chmod   –R  755 文件夹  (递归调用,使子文件 文件夹也是这个权限) 
### 检查效果效果 ,可以查看文件 权限 用户组
ls  –l   文件夹 

### 移植成功后,别忘记 关闭 debug 模式:
define('WP_DEBUG', false);

3、url路径请求问题

当完成上面的操作时,我们发现 浏览器 可以访问 网站首页了,但是无法访问网站的其他子页面。都是显示  404  错误。经过查找,是路径 重写问题。

以前是nginx 服务器 现在改为 Apache ,所以 在  Permalink Settings 中,需要重新再 保存一下即可。

这样子:网站根目录下的   .htaccess 文件会添加 路径重写模块,开启路径重写功能。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

建议删除 以下原网站的 配置文件,网站运行时 会根据新服务器环境  提示重新配置。
wordfence-waf.php 【插件生成的安全模块】
.htaccess 文件 【Apache 服务器下的 网站配置文件】
.user.ini 文件 【不清楚 之前哪里来的,反正也是在里面 只调用了 wordfence-waf.php 文件】

nginx.conf 【这个是nginx 服务器下的 网站配置文件,我这边是一个 缓存插件 自动生成的】

总结参考:

解决wordpress能打开(无404),但帖子无法打开的办法是:
在固定链接本身设置为 /%postname%/,即文章名的前提下:

1、确保apache的mod_rewrite是开启了。
即httpd.conf中,取消注释,已变成:

LoadModule rewrite_module libexec/apache2/mod_rewrite.so

2、确保有权限可以重写url,即httpd.conf中的<Directory />的AllowOverride从None变成了All:

<Directory /> 
Options FollowSymLinks 
AllowOverride All 
Order deny,allow 
Deny from all 
</Directory>

备份网站是虚拟主机配置,重写权限应该是下面的 虚拟主机 配置目录的AllowOverride All

<VirtualHost *:80>
        ServerAdmin [email protected]
        DocumentRoot "/Users/cool/Sites/www.yyyyy.com"
        ServerName www.yyyyy.com
        ErrorLog "/private/var/log/apache2/testLocalSite-error_log"
        CustomLog "/private/var/log/apache2/testLocalSite-access_log" common

        <Directory "/Users/cool/Sites/www.yyyyy.com">
            AllowOverride All
            Require all granted
        </Directory>
</VirtualHost>

 

四、网站域名更改

UPDATE wp_options SET option_value = replace( option_value, 'http://www.aliyun.com', 'http://www.bieryun.com' ) WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET post_content = replace( post_content, 'http://www.aliyun.com', 'http://www.bieryun.com' ) ;
UPDATE wp_posts SET guid = replace( guid, 'http://www.old.com', 'http://www.new.com' ) ;

### old代表旧域名、new代表新域名,将上面的执行语句修改为自己的,然后点击执行即可!

 

 


参考:

https://www.jianshu.com/p/d09bdabbe065

 

springmvc基础-springmvc与struts2的比较

①. Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter •
②. Spring MVC 会稍微比 Struts2 快些. Spring MVC 是基 •
于方法设计, 而 Sturts2 是基于类, 每次发一次请求都会实
例一个 Action.
③. Spring MVC 使用更加简洁, 开发效率Spring MVC确实 •
比 struts2 高: 支持 JSR303, 处理 ajax 的请求更方便
④. Struts2 的 • OGNL 表达式使页面的开发效率相比
Spring MVC 更高些.

spring踩坑-java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger

在spring 开发中,一开始 我遇到的 是 hibernate 类冲突,查了一下说,删掉就行了。

删掉后,果然就好了,第二次,我想将错误复现时,发现找不到了,并且出现新错误:

Caused by: java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2541)
	at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:858)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1301)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1166)
	at org.hibernate.validator.internal.util.logging.LoggerFactory.make(LoggerFactory.java:29)
	at org.hibernate.validator.internal.util.Version.<clinit>(Version.java:27)
	at org.hibernate.validator.internal.engine.ConfigurationImpl.<clinit>(ConfigurationImpl.java:65)
	at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:41)
	at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276)
	at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:250)
	at org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean.afterPropertiesSet(OptionalValidatorFactoryBean.java:40)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
	... 28 more

发现是缺少了  jboss-logging的jar包,添加了就行。

于是我添加了 jboss-logging.jar  下载链接
因为org/jboss/logging/BasicLogger is inside jboss-logging.jar

springmvc基础-springmvc与spring的整合与关系

<!--  
	需要进行 Spring 整合 SpringMVC 吗 ?
	还是否需要再加入 Spring 的 IOC 容器 ?
	是否需要再 web.xml 文件中配置启动 Spring IOC 容器的 ContextLoaderListener ?
		
	1. 需要: 通常情况下, 类似于数据源, 事务, 整合其他框架都是放在 Spring 的配置文件中(而不是放在 SpringMVC 的配置文件中).
	实际上放入 Spring 配置文件对应的 IOC 容器中的还有 Service 和 Dao. 
	2. 不需要: 都放在 SpringMVC 的配置文件中. 也可以分多个 Spring 的配置文件, 然后使用 import 节点导入其他的配置文件
-->
	
<!--  
	问题: 若 Spring 的 IOC 容器和 SpringMVC 的 IOC 容器扫描的包有重合的部分, 就会导致有的 bean 会被创建 2 次.
	解决:
	1. 使 Spring 的 IOC 容器扫描的包和 SpringMVC 的 IOC 容器扫描的包没有重合的部分. 
	2. 使用 exclude-filter 和 include-filter 子节点来规定只能扫描的注解
-->
	
<!--  
	SpringMVC 的 IOC 容器中的 bean 可以来引用 Spring IOC 容器中的 bean. 
	返回来呢 ? 反之则不行. Spring IOC 容器中的 bean 却不能来引用 SpringMVC IOC 容器中的 bean!
-->

一、springmvc与spring的整合举例:

1、配置 web.xml ,配置了两个容器。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  
  	<!-- 配置启动 Spring IOC 容器的 Listener -->
	<!-- needed for ContextLoaderListener -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:springioc.xml</param-value>
	</context-param>

	<!-- Bootstraps the root web application context before servlet initialization -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
  
  
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

2、配置父容器 springioc.xml

<?xml version="1.0" encoding="UTF-8"?>
<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"
	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-4.0.xsd">

    <context:component-scan base-package="com.test.springmvc">
		<context:exclude-filter type="annotation" 
			expression="org.springframework.stereotype.Controller"/>
		<context:exclude-filter type="annotation" 
			expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
	</context:component-scan>

	<!-- 配置数据源, 整合其他框架, 事务等. -->

</beans>

3、配置springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<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-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

	<!-- 配置自动扫描的包 -->
	<context:component-scan base-package="com.test.springmvc" use-default-filters="false">
		<context:include-filter type="annotation" 
			expression="org.springframework.stereotype.Controller"/>
		<context:include-filter type="annotation" 
			expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
	</context:component-scan>
	
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>


</beans>

4、编辑服务器:

package com.test.springmvc.handlers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

//	//因为父容器 配置文件 规定了 不扫描handler 所以,helloWorld无法注入
//	@Autowired
//	private HelloWorld helloWorld;
	
	public UserService() {
		System.out.println("UserService Constructor...");
	}
	
}

5、编辑控制器:

package com.test.springmvc.handlers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller // spring里面 又名handler 处理器
public class HelloWorld {

	/**
	 * 1、使用RequestMapping 注解来映射 请求的url
	 * 2、返回值会通过视图解析器解析为实际的物理视图,
	 * 对于org.springframework.web.servlet.view.InternalResourceViewResolver
	 * 会做如下解析,prefix + returnVal + suffix 得到实际的物理视图。然后做转发操作。
	 * 即 WEB-INF/views/success.jsp
 	 */

	@Autowired
	private UserService userService;
	
	public HelloWorld() {
		System.out.println("HelloWorld Constructor...");
	}
	
	@RequestMapping("/helloworld")
	public String hello( HttpServletRequest request,HttpServletResponse response){
		System.out.println("hello request" + request.toString());
		System.out.println("hello response" + response.toString());
		
		System.out.println("success");
		System.out.println(userService);
		
		return "success";
		//return "/WEB-INF/views/success.jsp";
     }
	
	
}

二、springmvc与spring容器关系

spring容器是父容器,springmvc是子容器。

子容器(相当于局部变量)可以访问父容器的对象(相当于全局变量)
但是父容器不能访问子容器中的对象。

springmvc基础-运行流程图

备注:

1、
<mvc:default-servlet-handler/>可以解决 请求静态资源问题。<mvc:annotation-driven></mvc:annotation-driven>可以保证非静态资源也能请求,当配置了<mvc:default-servlet-handler/>

2、在DispatcherServlet.doDispatch(request, response)中有一个 mappedHandler= getHandler(processedRequest);

mappedHandler 就是 HandlerExecutionChain (里面包含了控制器方法handler和拦截器Interceptors)

HandlerExecutionChain 由 handlerMapping 根据 处理器 和请求映射而来。

当没有配置1中的<mvc:default-servlet-handler/>和<mvc:annotation-driven>时,handlerMapping 包括:【
BeanNameUrlHandlerMapping
DefaultAnnotationHandlerMapping

当有配置1中时:handlerMapping 包括:【
RequestMappingHandlerMapping
SimpleUrlHandlerMapping
BeanNameUrlHandlerMapping

3、HandlerAdapter 里面有 MessageConverter