<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>开心编程网 &#187; JAVA</title>
	<atom:link href="http://www.kaixinbc.com/category/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.kaixinbc.com</link>
	<description>是一个专注于java、.net、asp、jsp、php、C语言、C++语言、Delphi、go语言、MySQL、sql server、linux、oracle、及Web 2.0等的原创IT编程网站，为国内众多的编程爱好者提供一个“平等自由协作创造”的开放式交流环境，提供编程专题文章、编程论坛、资源下载、博客和开源项目等栏目,作者方志凯（fangzhikai）。</description>
	<lastBuildDate>Thu, 15 Jul 2010 01:32:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>基于Hibernate和Struts的J2EE应用开发</title>
		<link>http://www.kaixinbc.com/2010/04/hibernate-struts-j2ee.html</link>
		<comments>http://www.kaixinbc.com/2010/04/hibernate-struts-j2ee.html#comments</comments>
		<pubDate>Fri, 02 Apr 2010 13:14:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=486</guid>
		<description><![CDATA[       本文分析了Hibernate和Struts的机制，提出了一种基于Hibernate和Struts的J2EE应用开发策略。在这种策略中，模型层用Hibernate实现，视图和控制器则用Struts框架实现。这样可大大降低代码的耦合性以及提高系统的开发效率。
　　关键字 Hibernate，Struts，MVC，持久层
　　引言
　　随着Java技术的逐渐成熟与完善，作为建立企业级应用的标准平台，J2EE平台得到了长足的发展。借助于J2EE规范中包含的多项技术：Enterprise JavaBean(EJB)、Java Servlets(Servlet)、Java Server Pages(JSP)、Java Message Service(JMS)等，开发出了许多应用系统。但是，在传统J2EE应用的开发过程中也出现了一些问题：1）数据模型和逻辑模型之间的矛盾。目前使用的数据库基本上都是关系型数据库，而Java本质上是一种面向对象的语言，对象在存储和读取时使用SQL和JDBC进行数据库操作，降低了编程的效率以及系统的可维护性；2）传统的J2EE应用多采用基于EJB的重量级框架，这种框架适合于开发大型企业应用，但是使用EJB容器进行开发和调试需要耗费大量时间。为了降低代码的耦合性，提高系统的开发效率，本文提出了一种基于Struts框架和Hibernate框架的J2EE应用开发策略。
　　数据持久层及Hibernate
　　Hibernate是一个数据持久层框架，是一种实现对象和关系之间映射（O/R Mapping）的工具，它对JDBC进行了轻量级的对象封装，使程序员可以使用对象编程思想来操作数据库。它不仅提供了从Java类到数据表的映射，也提供了数据查询和恢复机制。相对于使用JDBC和SQL来操作数据库，使用Hibernate能大大的提高实现的效率。Hibernate框架用配置文件的形式来定义Java对象和数据表之间的映射关系，同时在更深的层面将数据表之间的关系解释为Java对象之间的继承及包含等关系。通过使用HQL语句将复杂的关系算法用对象的方式描述，在很大程度上简化了对数据的查询，加快了开发的效率。在Hibernate中有一个简单而直观的API，用于对数据库所表示的对象执行查询。要创建或修改这些对象，只需在程序中与它们进行交互，然后告诉Hibernate保存即可。这样，大量封装持久化操作的业务逻辑不再需要编写烦琐的JDBC语句，从而使数据持久层得到了极大的简化。

　　用Struts实现MVC架构
　　MVC（Model-View-Controller）由Trygve Reenskaug提出，首先被应用在SmallTalk-80环境中，是许多交互和界面系统的构成基础。根据界面设计可变性的需求，MVC把交互系统的组成分解成模型、视图、控制器三部分。
　　模型（Model）是软件所处理问题逻辑在独立于外在显示内容和形式情况下的内在抽象，封装了问题的核心数据、逻辑和功能的计算关系，独立于具体的界面表达和I/O操作。视图（View）把表示模型数据及逻辑关系和状态的信息及特定形式展示给用户。它从模型获得显示信息，对于相同的信息可以有多个不同的显示形式或视图。控制器（Controller）是处理用户与软件的交互操作的，其职责是控制提供模型中任何变化的传播，确保用户界面于模型间的对应联系；它接受用户的输入，将输入反馈给模型，进而实现对模型的计算控制，是使模型和视图协调工作的部件。通常一个视图对应一个控制器。模型、视图与控制器的分离，使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据，所有其它依赖于这些数据的视图都应反映到这些变化。因此，无论何时发生了何种数据变化，控制器都会将变化通知所有的视图，导致显示的更新。这实际上是一种模型的变化-传播机制。

　　Struts框架最早是作为Apache Jakarta项目的组成部分问世运做，它继承了MVC的各项特性，并根据J2EE的特点，做了相应的变化与扩展。Struts框架很好的结合了Jsp，Java Servlet，Java Bean，Taglib等技术。在Struts中，承担MVC中控制器角色的是ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类（这些动作类都是Action类的子类）。另外控制组件也负责用相应的请求参数填充Action Form（FromBean），并传给动作类（ActionBean）。动作类访问核心商业逻辑，即访问Java Bean或调用EJB。最后动作类把控制权传给后续的JSP文件，由JSP文件生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。在Struts框架中，视图主要由JSP生成页面完成，Struts提供丰富的JSP标签库，这有利于分开表现逻辑和程序逻辑。模型以一个或多个Java Bean的形式存在。在Struts中，主要存在三种Bean，分别是：Action，ActionForm，EJB或者Java Bean。
    Struts框架没有具体定义模型层的实现，在实际开发中，模型层通常是和业务逻辑紧密相连的，并且要对底层数据进行操作。下面介绍一种开发策略，将Hibernate引入到Struts框架的模型层中，使用它来进行数据封装和映射，提供持久化的支持。
]]></description>
			<content:encoded><![CDATA[<p>       本文分析了Hibernate和Struts的机制，提出了一种基于Hibernate和Struts的J2EE应用开发策略。在这种策略中，模型层用Hibernate实现，视图和控制器则用Struts框架实现。这样可大大降低代码的耦合性以及提高系统的开发效率。</p>
<p>　　关键字 Hibernate，Struts，MVC，持久层</p>
<p>　　引言</p>
<p>　　随着Java技术的逐渐成熟与完善，作为建立企业级应用的标准平台，J2EE平台得到了长足的发展。借助于J2EE规范中包含的多项技术：Enterprise JavaBean(EJB)、Java Servlets(Servlet)、Java Server Pages(JSP)、Java Message Service(JMS)等，开发出了许多应用系统。但是，在传统J2EE应用的开发过程中也出现了一些问题：1）数据模型和逻辑模型之间的矛盾。目前使用的数据库基本上都是关系型数据库，而Java本质上是一种面向对象的语言，对象在存储和读取时使用SQL和JDBC进行数据库操作，降低了编程的效率以及系统的可维护性；2）传统的J2EE应用多采用基于EJB的重量级框架，这种框架适合于开发大型企业应用，但是使用EJB容器进行开发和调试需要耗费大量时间。为了降低代码的耦合性，提高系统的开发效率，本文提出了一种基于Struts框架和Hibernate框架的J2EE应用开发策略。</p>
<p>　　数据持久层及Hibernate</p>
<p>　　Hibernate是一个数据持久层框架，是一种实现对象和关系之间映射（O/R Mapping）的工具，它对JDBC进行了轻量级的对象封装，使程序员可以使用对象编程思想来操作数据库。它不仅提供了从Java类到数据表的映射，也提供了数据查询和恢复机制。相对于使用JDBC和SQL来操作数据库，使用Hibernate能大大的提高实现的效率。Hibernate框架用配置文件的形式来定义Java对象和数据表之间的映射关系，同时在更深的层面将数据表之间的关系解释为Java对象之间的继承及包含等关系。通过使用HQL语句将复杂的关系算法用对象的方式描述，在很大程度上简化了对数据的查询，加快了开发的效率。在Hibernate中有一个简单而直观的API，用于对数据库所表示的对象执行查询。要创建或修改这些对象，只需在程序中与它们进行交互，然后告诉Hibernate保存即可。这样，大量封装持久化操作的业务逻辑不再需要编写烦琐的JDBC语句，从而使数据持久层得到了极大的简化。</p>
<p><img title="点击图片可在新窗口打开" src="http://image.tianjimedia.com/imagelist/2007/220/q3072l17byae.jpg" alt="" /></p>
<p>　　用Struts实现MVC架构</p>
<p>　　MVC（Model-View-Controller）由Trygve Reenskaug提出，首先被应用在SmallTalk-80环境中，是许多交互和界面系统的构成基础。根据界面设计可变性的需求，MVC把交互系统的组成分解成模型、视图、控制器三部分。</p>
<p>　　模型（Model）是软件所处理问题逻辑在独立于外在显示内容和形式情况下的内在抽象，封装了问题的核心数据、逻辑和功能的计算关系，独立于具体的界面表达和I/O操作。视图（View）把表示模型数据及逻辑关系和状态的信息及特定形式展示给用户。它从模型获得显示信息，对于相同的信息可以有多个不同的显示形式或视图。控制器（Controller）是处理用户与软件的交互操作的，其职责是控制提供模型中任何变化的传播，确保用户界面于模型间的对应联系；它接受用户的输入，将输入反馈给模型，进而实现对模型的计算控制，是使模型和视图协调工作的部件。通常一个视图对应一个控制器。模型、视图与控制器的分离，使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据，所有其它依赖于这些数据的视图都应反映到这些变化。因此，无论何时发生了何种数据变化，控制器都会将变化通知所有的视图，导致显示的更新。这实际上是一种模型的变化-传播机制。</p>
<p><img title="点击图片可在新窗口打开" src="http://image.tianjimedia.com/imagelist/2007/220/lo0gej5cek4a.jpg" alt="" /></p>
<p>　　Struts框架最早是作为Apache Jakarta项目的组成部分问世运做，它继承了MVC的各项特性，并根据J2EE的特点，做了相应的变化与扩展。Struts框架很好的结合了Jsp，Java Servlet，Java Bean，Taglib等技术。在Struts中，承担MVC中控制器角色的是ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类（这些动作类都是Action类的子类）。另外控制组件也负责用相应的请求参数填充Action Form（FromBean），并传给动作类（ActionBean）。动作类访问核心商业逻辑，即访问Java Bean或调用EJB。最后动作类把控制权传给后续的JSP文件，由JSP文件生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。在Struts框架中，视图主要由JSP生成页面完成，Struts提供丰富的JSP标签库，这有利于分开表现逻辑和程序逻辑。模型以一个或多个Java Bean的形式存在。在Struts中，主要存在三种Bean，分别是：Action，ActionForm，EJB或者Java Bean。</p>
<p>    Struts框架没有具体定义模型层的实现，在实际开发中，模型层通常是和业务逻辑紧密相连的，并且要对底层数据进行操作。下面介绍一种开发策略，将Hibernate引入到Struts框架的模型层中，使用它来进行数据封装和映射，提供持久化的支持。</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F04%2Fhibernate-struts-j2ee.html&title=%E5%9F%BA%E4%BA%8EHibernate%E5%92%8CStruts%E7%9A%84J2EE%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/04/hibernate-struts-j2ee.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Swing 中三种事件处理方法的比较</title>
		<link>http://www.kaixinbc.com/2010/03/java-swing.html</link>
		<comments>http://www.kaixinbc.com/2010/03/java-swing.html#comments</comments>
		<pubDate>Sat, 13 Mar 2010 03:45:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=478</guid>
		<description><![CDATA[Swing是目前Java中不可缺少的窗口工具组，是用户建立图形化用户界面(GUI)程序的强大工具。Java  Swing组件自动产生各种事件来响应用户行为。如当用户点击按钮或选择菜单项目时，Swing组件会产生一个ActionEvent。Swing组件会 产生许多事件，如ActionEvents,ChangeEvents,ItemEvents等，来响应用户的鼠标点击行为，列表框中值的改变，计时器的 开始计时等行为。在Java Swing编程中，通过注册监听器，我们可以监听事件源产生的事件，从而在事件处理程序中处理我们所需要处理的用户行为。
Java Swing中处理各组件事件的一般步骤是：
1. 新建一个组件(如JButton)。
2. 将该组件添加到相应的面板(如JPanel)。
3. 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。
4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
以上步骤我们可以用多种方法实现。但人们通常用二种方法。第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件;第二种方 法是使用多个内部类来响应不同组件产生的各种事件，其具体实现又分两种方式，一种是匿名内部类，一种是一般内部类。
为了说明如何使用上述三种方法实现事件的处理方法，我们建立一个简单的应用程序。该程序界面有两个按钮，当用户点击相应的按钮，就会弹出一个对 话框显示相应的内容。通过这个简单程序，你可以实现自己更多、更复杂的用户界面程序。
首先，我们利用单个监听器来实现该程序。我们定义一个名为Simple1的类来包括所有代码。所有的用户行为(如点击按钮)由一个监听器 SimpleListenner中的actionPerformed方法来处理。
]]></description>
			<content:encoded><![CDATA[<p>Swing是目前Java中不可缺少的窗口工具组，是用户建立图形化用户界面(GUI)程序的强大工具。Java  Swing组件自动产生各种事件来响应用户行为。如当用户点击按钮或选择菜单项目时，Swing组件会产生一个ActionEvent。Swing组件会 产生许多事件，如ActionEvents,ChangeEvents,ItemEvents等，来响应用户的鼠标点击行为，列表框中值的改变，计时器的 开始计时等行为。在Java Swing编程中，通过注册监听器，我们可以监听事件源产生的事件，从而在事件处理程序中处理我们所需要处理的用户行为。</p>
<p>Java Swing中处理各组件事件的一般步骤是：</p>
<p>1. 新建一个组件(如JButton)。</p>
<p>2. 将该组件添加到相应的面板(如JPanel)。</p>
<p>3. 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。</p>
<p>4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。</p>
<p>以上步骤我们可以用多种方法实现。但人们通常用二种方法。第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件;第二种方 法是使用多个内部类来响应不同组件产生的各种事件，其具体实现又分两种方式，一种是匿名内部类，一种是一般内部类。</p>
<p>为了说明如何使用上述三种方法实现事件的处理方法，我们建立一个简单的应用程序。该程序界面有两个按钮，当用户点击相应的按钮，就会弹出一个对 话框显示相应的内容。通过这个简单程序，你可以实现自己更多、更复杂的用户界面程序。</p>
<p>首先，我们利用单个监听器来实现该程序。我们定义一个名为Simple1的类来包括所有代码。所有的用户行为(如点击按钮)由一个监听器 SimpleListenner中的actionPerformed方法来处理。</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Fjava-swing.html&title=Java+Swing+%E4%B8%AD%E4%B8%89%E7%A7%8D%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86%E6%96%B9%E6%B3%95%E7%9A%84%E6%AF%94%E8%BE%83" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/java-swing.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java和JSP编程应该注意的六个常见问题</title>
		<link>http://www.kaixinbc.com/2010/03/java-jsp.html</link>
		<comments>http://www.kaixinbc.com/2010/03/java-jsp.html#comments</comments>
		<pubDate>Sat, 13 Mar 2010 03:43:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=476</guid>
		<description><![CDATA[1.对应String类型的对象使用println()方法时，如果对象为null，将打印null而不是引发 NullPointerException，由此引用的问题是容易造成错觉，对于以后对字符串的操作容易引起问题。
2.引发NullPointerException异常，主要原因是没有对对象的存在性进行验证，在jsp编程中经常出现：if  (request.getParameter(“username”).equals(“xxx”))、 out.println(session.getAttribute(“record”))等。解决这个问题的方法是在使用前进行判空比较：
if (request.getParameter(“username”)!=null)
{if if (request.getParameter(“username”).
equals(“xxx”))…}
3.引发NumberFormatException异常：主要原因是将用户提交的内容转换为整数或者浮点数时用户输入了其它非法字符。处理的 主要方式是在需要进行转换的地方使用try/catch块捕获此异常然后提示用户输入合法数据。
4.引发StringIndexOutOfBoundsException异常：主要原因是使用String的substring()、 charAt()等方法，而字符串的长度不够，就会引发此异常;在字符串为null时也会引发NullPointerException。解决的方法是判 空，判断长度或者转换为字节数组。考虑到这些操作很多，可以将之封装到javabean中。
5.引发NoClassDefFoundError错误，主要原因是类路径或者类文件放置错误，类文件的放置要符合服务器的要求。
6.引发java.lang.Error错误，主要原因是对系统所访问外部资源，未执行关闭操作，导致外部资源大量浪费，最终可能导致系统无法 正常运行;对系统所访问的外部资源关闭次数太多，外部系统无法正常处理;所系统访问的外部资源出现异常情况。
解决的方法是：访问外部资源前，首先检查该资源(如数据库)是否可正常连接或操作;访问外部资源时，如果进行了连接，一定进行关闭操作，并仅进 行一次关闭操作;尽量在同一操作中共享外部资源，以减少该操作对资源的消费，提高程序的执行效率。
]]></description>
			<content:encoded><![CDATA[<p>1.对应String类型的对象使用println()方法时，如果对象为null，将打印null而不是引发 NullPointerException，由此引用的问题是容易造成错觉，对于以后对字符串的操作容易引起问题。</p>
<p>2.引发NullPointerException异常，主要原因是没有对对象的存在性进行验证，在jsp编程中经常出现：if  (request.getParameter(“username”).equals(“xxx”))、 out.println(session.getAttribute(“record”))等。解决这个问题的方法是在使用前进行判空比较：</p>
<p>if (request.getParameter(“username”)!=null)</p>
<p>{if if (request.getParameter(“username”).</p>
<p>equals(“xxx”))…}</p>
<p>3.引发NumberFormatException异常：主要原因是将用户提交的内容转换为整数或者浮点数时用户输入了其它非法字符。处理的 主要方式是在需要进行转换的地方使用try/catch块捕获此异常然后提示用户输入合法数据。</p>
<p>4.引发StringIndexOutOfBoundsException异常：主要原因是使用String的substring()、 charAt()等方法，而字符串的长度不够，就会引发此异常;在字符串为null时也会引发NullPointerException。解决的方法是判 空，判断长度或者转换为字节数组。考虑到这些操作很多，可以将之封装到javabean中。</p>
<p>5.引发NoClassDefFoundError错误，主要原因是类路径或者类文件放置错误，类文件的放置要符合服务器的要求。</p>
<p>6.引发java.lang.Error错误，主要原因是对系统所访问外部资源，未执行关闭操作，导致外部资源大量浪费，最终可能导致系统无法 正常运行;对系统所访问的外部资源关闭次数太多，外部系统无法正常处理;所系统访问的外部资源出现异常情况。</p>
<p>解决的方法是：访问外部资源前，首先检查该资源(如数据库)是否可正常连接或操作;访问外部资源时，如果进行了连接，一定进行关闭操作，并仅进 行一次关闭操作;尽量在同一操作中共享外部资源，以减少该操作对资源的消费，提高程序的执行效率。</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Fjava-jsp.html&title=Java%E5%92%8CJSP%E7%BC%96%E7%A8%8B%E5%BA%94%E8%AF%A5%E6%B3%A8%E6%84%8F%E7%9A%84%E5%85%AD%E4%B8%AA%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/java-jsp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2整合Spring Hibernate的CRUD实例</title>
		<link>http://www.kaixinbc.com/2010/03/struts2-spring-hibernate-crud.html</link>
		<comments>http://www.kaixinbc.com/2010/03/struts2-spring-hibernate-crud.html#comments</comments>
		<pubDate>Wed, 10 Mar 2010 08:53:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=457</guid>
		<description><![CDATA[本文提供Struts2整合Spring Hibernate的CRUD的实例的源代码
1. 数据库脚本，数据库采用MySQL 5.0



CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL,
`password` varchar(32) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



2. 几个重要的文件
web.xml



&#60;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&#62;
&#60;web-app version=&#8221;2.5&#8243; xmlns=&#8221;[url=http://java.sun.com/xml/ns/javaee]http://java.sun.com/xml/ns/javaee[/url]&#8221;
xmlns:xsi=&#8221;[url=http://www.w3.org/2001/XMLSchema-instance]http://www.w3.org/2001/XMLSchema-instance[/url]&#8221;
xsi:schemaLocation=&#8221;[url=http://java.sun.com/xml/ns/javaee]http://java.sun.com/xml/ns/javaee[/url]
[url=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]&#8220;&#62;
&#60;!&#8211; spring的应用上下文 &#8211;&#62;
&#60;context-param&#62;
&#60;param-name&#62;contextConfigLocation&#60;/param-name&#62;
&#60;param-value&#62;/WEB-INF/applicationContext*.xml&#60;/param-value&#62;
&#60;/context-param&#62;
&#60;!&#8211; struts2 过滤器 &#8211;&#62;
&#60;filter&#62;
&#60;filter-name&#62;struts2&#60;/filter-name&#62;
&#60;filter-class&#62;
org.apache.struts2.dispatcher.FilterDispatcher
&#60;/filter-class&#62;
&#60;/filter&#62;
&#60;filter-mapping&#62;
&#60;filter-name&#62;struts2&#60;/filter-name&#62;
&#60;url-pattern&#62;/*&#60;/url-pattern&#62;
&#60;/filter-mapping&#62;
&#60;!&#8211; spring的监听器，以便在启动时就自动加载spring的配置 &#8211;&#62;
&#60;listener&#62;
&#60;listener-class&#62;
org.springframework.web.context.ContextLoaderListener
&#60;/listener-class&#62;
&#60;/listener&#62;
&#60;!&#8211; OpenSessionInViewFilter过滤器 &#8211;&#62;
&#60;filter&#62;
&#60;filter-name&#62;lazyLoadingFilter&#60;/filter-name&#62;
&#60;filter-class&#62;
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
&#60;/filter-class&#62;
&#60;/filter&#62;
&#60;filter-mapping&#62;
&#60;filter-name&#62;lazyLoadingFilter&#60;/filter-name&#62;
&#60;url-pattern&#62;*.action&#60;/url-pattern&#62;
&#60;/filter-mapping&#62;
&#60;welcome-file-list&#62;
&#60;welcome-file&#62;/user/userAdd.jsp&#60;/welcome-file&#62;
&#60;/welcome-file-list&#62;
&#60;/web-app&#62;



applicationContext.xml




&#60;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&#62;
&#60;beans xmlns=&#8221;[url=http://www.springframework.org/schema/beans]http://www.springframework.org/schema/beans[/url]&#8221;
xmlns:xsi=&#8221;[url=http://www.w3.org/2001/XMLSchema-instance]http://www.w3.org/2001/XMLSchema-instance[/url]&#8221;
xsi:schemaLocation=&#8221;[url=http://www.springframework.org/schema/beans]http://www.springframework.org/schema/beans[/url] [url=http://www.springframework.org/schema/beans/spring-beans-2.0.xsd]http://www.springframework.org/schema/beans/spring-beans-2.0.xsd[/url]&#8220;&#62;
&#60;bean id=&#8221;dataSource&#8221;
class=&#8221;org.apache.commons.dbcp.BasicDataSource&#8221;&#62;
&#60;property name=&#8221;driverClassName&#8221;
value=&#8221;com.mysql.jdbc.Driver&#8221;&#62;
&#60;/property&#62;
&#60;property name=&#8221;url&#8221;
value=&#8221;jdbc:mysql://localhost:3306/catalog&#8221;&#62;
&#60;/property&#62;
&#60;property name=&#8221;username&#8221; value=&#8221;root&#8221;&#62;&#60;/property&#62;
&#60;property name=&#8221;password&#8221; value=&#8221;ethip&#8221;&#62;&#60;/property&#62;
&#60;/bean&#62;
&#60;bean id=&#8221;sessionFactory&#8221;
class=&#8221;org.springframework.orm.hibernate3.LocalSessionFactoryBean&#8221;&#62;
&#60;property name=&#8221;dataSource&#8221;&#62;
&#60;ref bean=&#8221;dataSource&#8221; /&#62;
&#60;/property&#62;
&#60;property name=&#8221;hibernateProperties&#8221;&#62;
&#60;props&#62;
&#60;prop key=&#8221;hibernate.dialect&#8221;&#62;
org.hibernate.dialect.MySQLDialect
&#60;/prop&#62;
&#60;/props&#62;
&#60;/property&#62;
&#60;property name=&#8221;mappingResources&#8221;&#62;
&#60;list&#62;
&#60;value&#62;org/ethip/catalog/model/User.hbm.xml&#60;/value&#62;
&#60;/list&#62;
&#60;/property&#62;
&#60;/bean&#62;
&#60;bean id=&#8221;UserDAO&#8221;&#62;
&#60;property name=&#8221;sessionFactory&#8221;&#62;
&#60;ref [...]]]></description>
			<content:encoded><![CDATA[<p>本文提供Struts2整合Spring Hibernate的CRUD的实例的源代码</p>
<p>1. 数据库脚本，数据库采用MySQL 5.0</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3">CREATE TABLE `user` (<br />
`id` int(11) NOT NULL auto_increment,<br />
`username` varchar(32) NOT NULL,<br />
`password` varchar(32) NOT NULL,<br />
PRIMARY KEY  (`id`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</td>
</tr>
</tbody>
</table>
<p>2. 几个重要的文件</p>
<p><span style="color: red;">web.xml</span></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;web-app version=&#8221;2.5&#8243; xmlns=&#8221;[url=http://java.sun.com/xml/ns/javaee]http://java.sun.com/xml/ns/javaee[/url]&#8221;<br />
xmlns:xsi=&#8221;[url=http://www.w3.org/2001/XMLSchema-instance]http://www.w3.org/2001/XMLSchema-instance[/url]&#8221;<br />
xsi:schemaLocation=&#8221;[url=http://java.sun.com/xml/ns/javaee]http://java.sun.com/xml/ns/javaee[/url]<br />
[url=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]&#8220;&gt;<br />
&lt;!&#8211; spring的应用上下文 &#8211;&gt;<br />
&lt;context-param&gt;<br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&lt;param-value&gt;/WEB-INF/applicationContext*.xml&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
&lt;!&#8211; struts2 过滤器 &#8211;&gt;<br />
&lt;filter&gt;<br />
&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&lt;filter-class&gt;<br />
org.apache.struts2.dispatcher.FilterDispatcher<br />
&lt;/filter-class&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
&lt;!&#8211; spring的监听器，以便在启动时就自动加载spring的配置 &#8211;&gt;<br />
&lt;listener&gt;<br />
&lt;listener-class&gt;<br />
org.springframework.web.context.ContextLoaderListener<br />
&lt;/listener-class&gt;<br />
&lt;/listener&gt;<br />
&lt;!&#8211; OpenSessionInViewFilter过滤器 &#8211;&gt;<br />
&lt;filter&gt;<br />
&lt;filter-name&gt;lazyLoadingFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;<br />
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter<br />
&lt;/filter-class&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;lazyLoadingFilter&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
&lt;welcome-file-list&gt;<br />
&lt;welcome-file&gt;/user/userAdd.jsp&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;</td>
</tr>
</tbody>
</table>
<p><span style="color: #ff0000;">applicationContext.xml</span></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3">
<blockquote><p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;beans xmlns=&#8221;[url=http://www.springframework.org/schema/beans]http://www.springframework.org/schema/beans[/url]&#8221;<br />
xmlns:xsi=&#8221;[url=http://www.w3.org/2001/XMLSchema-instance]http://www.w3.org/2001/XMLSchema-instance[/url]&#8221;<br />
xsi:schemaLocation=&#8221;[url=http://www.springframework.org/schema/beans]http://www.springframework.org/schema/beans[/url] [url=http://www.springframework.org/schema/beans/spring-beans-2.0.xsd]http://www.springframework.org/schema/beans/spring-beans-2.0.xsd[/url]&#8220;&gt;</p>
<p>&lt;bean id=&#8221;dataSource&#8221;<br />
class=&#8221;org.apache.commons.dbcp.BasicDataSource&#8221;&gt;<br />
&lt;property name=&#8221;driverClassName&#8221;<br />
value=&#8221;com.mysql.jdbc.Driver&#8221;&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;url&#8221;<br />
value=&#8221;jdbc:mysql://localhost:3306/catalog&#8221;&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;username&#8221; value=&#8221;root&#8221;&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;password&#8221; value=&#8221;ethip&#8221;&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean id=&#8221;sessionFactory&#8221;<br />
class=&#8221;org.springframework.orm.hibernate3.LocalSessionFactoryBean&#8221;&gt;<br />
&lt;property name=&#8221;dataSource&#8221;&gt;<br />
&lt;ref bean=&#8221;dataSource&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;hibernateProperties&#8221;&gt;<br />
&lt;props&gt;<br />
&lt;prop key=&#8221;hibernate.dialect&#8221;&gt;<br />
org.hibernate.dialect.MySQLDialect<br />
&lt;/prop&gt;<br />
&lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;mappingResources&#8221;&gt;<br />
&lt;list&gt;<br />
&lt;value&gt;org/ethip/catalog/model/User.hbm.xml&lt;/value&gt;<br />
&lt;/list&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean id=&#8221;UserDAO&#8221;&gt;<br />
&lt;property name=&#8221;sessionFactory&#8221;&gt;<br />
&lt;ref bean=&#8221;sessionFactory&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean id=&#8221;UserService&#8221;<br />
class=&#8221;org.ethip.catalog.service.UserService&#8221;&gt;<br />
&lt;property name=&#8221;dao&#8221;&gt;<br />
&lt;ref bean=&#8221;UserDAO&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean name=&#8221;addUserBean&#8221;<br />
scope=&#8221;prototype&#8221;&gt;<br />
&lt;property name=&#8221;service&#8221;&gt;<br />
&lt;ref bean=&#8221;UserService&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean name=&#8221;listUserBean&#8221;<br />
scope=&#8221;prototype&#8221;&gt;<br />
&lt;property name=&#8221;service&#8221;&gt;<br />
&lt;ref bean=&#8221;UserService&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean name=&#8221;deleteUserBean&#8221;<br />
scope=&#8221;prototype&#8221;&gt;<br />
&lt;property name=&#8221;service&#8221;&gt;<br />
&lt;ref bean=&#8221;UserService&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean name=&#8221;editUserBean&#8221;<br />
scope=&#8221;prototype&#8221;&gt;<br />
&lt;property name=&#8221;service&#8221;&gt;<br />
&lt;ref bean=&#8221;UserService&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean name=&#8221;updateUserBean&#8221;<br />
scope=&#8221;prototype&#8221;&gt;<br />
&lt;property name=&#8221;service&#8221;&gt;<br />
&lt;ref bean=&#8221;UserService&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;/beans&gt;</p></blockquote>
</td>
</tr>
</tbody>
</table>
<p><span style="color: #ff0000;">struts.xml</span></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;!DOCTYPE struts PUBLIC &#8220;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&#8221; &#8220;[url=http://struts.apache.org/dtds/struts-2.0.dtd]http://struts.apache.org/dtds/struts-2.0.dtd[/url]&#8220;&gt;<br />
<span style="color: black;">&lt;struts&gt;<br />
&lt;include file=&#8221;struts-default.xml&#8221; /&gt;<br />
&lt;!&#8211; 此constant设置临时文件存放目录，因为默认的default.properties中没有指定 &#8211;&gt;<br />
&lt;constant name=&#8221;struts.multipart.saveDir&#8221; value=&#8221;c:\&#8221;&gt;&lt;/constant&gt;<br />
&lt;!&#8211; 将action托管给spring &#8211;&gt;<br />
&lt;constant name=&#8221;struts.objectFactory&#8221; value=&#8221;spring&#8221;&gt;&lt;/constant&gt;<br />
&lt;package name=&#8221;SSH2&#8243; extends=&#8221;struts-default&#8221;&gt;<br />
&lt;action name=&#8221;userAdd&#8221; method=&#8221;userAdd&#8221;&gt;<br />
&lt;result name=&#8221;success&#8221; type=&#8221;redirect&#8221;&gt;userList.action&lt;/result&gt;<br />
&lt;/action&gt;<br />
&lt;action name=&#8221;userList&#8221; method=&#8221;userList&#8221;&gt;<br />
&lt;result name=&#8221;success&#8221;&gt;/user/userList.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
&lt;action name=&#8221;userDelete&#8221;<br />
method=&#8221;userDelete&#8221;&gt;<br />
&lt;result name=&#8221;success&#8221; type=&#8221;redirect&#8221;&gt;userList.action&lt;/result&gt;<br />
&lt;/action&gt;<br />
&lt;action name=&#8221;userEdit&#8221;<br />
method=&#8221;userEdit&#8221;&gt;<br />
&lt;result name=&#8221;success&#8221;&gt;/user/userEdit.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
&lt;action name=&#8221;userUpdate&#8221;<br />
method=&#8221;userUpdate&#8221;&gt;<br />
&lt;result name=&#8221;success&#8221; type=&#8221;redirect&#8221;&gt;userList.action&lt;/result&gt;<br />
&lt;/action&gt;<br />
&lt;/package&gt;<br />
&lt;/struts&gt;</span></td>
</tr>
</tbody>
</table>
<p>3. 本实例仅实现CRUD功能，没有实现其他的处理，如数据校验、国际化、分页等.</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Fstruts2-spring-hibernate-crud.html&title=Struts2%E6%95%B4%E5%90%88Spring+Hibernate%E7%9A%84CRUD%E5%AE%9E%E4%BE%8B" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/struts2-spring-hibernate-crud.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate入门篇三：建立hibernate应用程序的步骤</title>
		<link>http://www.kaixinbc.com/2010/03/java-hibernate-third.html</link>
		<comments>http://www.kaixinbc.com/2010/03/java-hibernate-third.html#comments</comments>
		<pubDate>Wed, 10 Mar 2010 08:51:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=455</guid>
		<description><![CDATA[Hibernate入门篇三：建立hibernate应用程序的步骤
（我的IDE： MyEclipse_6.0.1GA_E3.3.1_FullStackInstaller）
1.建立一个Java Project（或者Web Project）
（Hibernate主要是与数据库交互，初学时就新建一个Java Project吧）
2.在数据库中创建数据库和表
e.g. datebase name = test，
test.table name =login
表login的字段可参照 UserInfo.hbm.xml或者POJO类的属性
3.创建持久化类
4.导入hibernate的jar
利用myeclipse自动完成。其间会生成配置文件hibernate.cfg.xml。
5.创建数据库关系映射文件
e.g.UserInfo.hbm.cml
6.建立测试类
]]></description>
			<content:encoded><![CDATA[<p>Hibernate入门篇三：建立hibernate应用程序的步骤</p>
<p>（我的IDE： MyEclipse_6.0.1GA_E3.3.1_FullStackInstaller）</p>
<p>1.建立一个Java Project（或者Web Project）<br />
（Hibernate主要是与数据库交互，初学时就新建一个Java Project吧）</p>
<p>2.在数据库中创建数据库和表<br />
e.g. datebase name = test，<br />
test.table name =login<br />
表login的字段可参照 UserInfo.hbm.xml或者POJO类的属性</p>
<p>3.创建持久化类</p>
<p>4.导入hibernate的jar<br />
利用myeclipse自动完成。其间会生成配置文件hibernate.cfg.xml。</p>
<p>5.创建数据库关系映射文件<br />
e.g.UserInfo.hbm.cml</p>
<p>6.建立测试类</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Fjava-hibernate-third.html&title=Hibernate%E5%85%A5%E9%97%A8%E7%AF%87%E4%B8%89%EF%BC%9A%E5%BB%BA%E7%AB%8Bhibernate%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%AD%A5%E9%AA%A4" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/java-hibernate-third.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java多线程技术中所有方法的详细解析&#8211;java,java多线程</title>
		<link>http://www.kaixinbc.com/2010/03/java-duoxiancheng.html</link>
		<comments>http://www.kaixinbc.com/2010/03/java-duoxiancheng.html#comments</comments>
		<pubDate>Wed, 10 Mar 2010 08:39:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=452</guid>
		<description><![CDATA[一、run()和start()
这两个方法应该都比较熟悉，把需要并行处理的代码放在run()方法中，start()方法启动线程将自动调用 run()方法，这是由Java的内存机制规定的。并且run()方法必须是public访问权限，返回值类型为void.
二、关键字Synchronized
这个关键字用于保护共享数据，当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志，当一个线程访问该对象时，被Synchronized修饰的数据将被“上锁”，阻止其他线程访问。当前线程访问完这部分数据后释放锁标志，其他线程就可以访问了。



以下是引用片段：
public ThreadTest implements Runnable
{
public synchronized void run(){
for(int i=0;i&#60;10;i++)
{
System.out.println(&#8220; &#8221; + i);
}
}
public static void main(String[] args)
{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}



以上这段程序中的 i 变量并不是共享数据，也就是这里的Synchronized关键字并未起作用。因为t1，t2两个线程是两个对象(r1，r2)的线程。不同的对象其数据是不同的，所以r1和r2两个对象的i变量是并不是共享数据。
当把代码改成如下：Synchronized关键字才会起作用



以下是引用片段：
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();



三、sleep()
使当前线程(即调用该方法的线程)暂停执行一段时间，让其他线程有机会继续执行，但它并不释放对象锁。也就是如果有Synchronized同步块，其他线程仍然不同访问共享数据。注意该方法要捕获异常
比如有两个线程同时执行(没有Synchronized)，一个线程优先级为MAX_PRIORITY，另一个为MIN_PRIORITY，如果没有Sleep()方法，只有高优先级的线程执行完成后，低优先级的线程才能执行;但当高优先级的线程sleep(5000)后，低优先级就有机会执行了。
总之，sleep()可以使低优先级的线程得到执行的机会，当然也可以让同优先级、高优先级的线程有执行的机会。
四、join()
join()方法使调用该方法的线程在此之前执行完毕，也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。
五、yield()
它与sleep()类似，只是不能由用户指定暂停多长时间，并且yield()方法只能让同优先级的线程有执行的机会。
六、wait()和notify()、notifyAll()
这三个方法用于协调多个线程对共享数据的存取，所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized 这个关键字用于保护共享数据，阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了，如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。
wait()方法使当前线程暂停执行并释放对象锁标志，让其他线程可以进入Synchronized数据块，当前线程被放入对象等待池中。当调用 notify()方法后，将从对象的等待池中移走一个任意的线程并放到锁标志等待池中，只有
锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程，则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
]]></description>
			<content:encoded><![CDATA[<p>一、run()和start()</p>
<p>这两个方法应该都比较熟悉，把需要并行处理的代码放在run()方法中，start()方法启动线程将自动调用 run()方法，这是由Java的内存机制规定的。并且run()方法必须是public访问权限，返回值类型为void.</p>
<p>二、关键字Synchronized</p>
<p>这个关键字用于保护共享数据，当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志，当一个线程访问该对象时，被Synchronized修饰的数据将被“上锁”，阻止其他线程访问。当前线程访问完这部分数据后释放锁标志，其他线程就可以访问了。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3"><span>以下是引用片段：</span><br />
public ThreadTest implements Runnable<br />
{<br />
public synchronized void run(){<br />
for(int i=0;i&lt;10;i++)<br />
{<br />
System.out.println(&#8220; &#8221; + i);<br />
}<br />
}<br />
public static void main(String[] args)<br />
{<br />
Runnable r1 = new ThreadTest();<br />
Runnable r2 = new ThreadTest();<br />
Thread t1 = new Thread(r1);<br />
Thread t2 = new Thread(r2);<br />
t1.start();<br />
t2.start();<br />
}<br />
}</td>
</tr>
</tbody>
</table>
<p>以上这段程序中的 i 变量并不是共享数据，也就是这里的Synchronized关键字并未起作用。因为t1，t2两个线程是两个对象(r1，r2)的线程。不同的对象其数据是不同的，所以r1和r2两个对象的i变量是并不是共享数据。</p>
<p>当把代码改成如下：Synchronized关键字才会起作用</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3"><span>以下是引用片段：</span><br />
Runnable r = new ThreadTest();<br />
Thread t1 = new Thread(r);<br />
Thread t2 = new Thread(r);<br />
t1.start();<br />
t2.start();</td>
</tr>
</tbody>
</table>
<p>三、sleep()</p>
<p>使当前线程(即调用该方法的线程)暂停执行一段时间，让其他线程有机会继续执行，但它并不释放对象锁。也就是如果有Synchronized同步块，其他线程仍然不同访问共享数据。注意该方法要捕获异常</p>
<p>比如有两个线程同时执行(没有Synchronized)，一个线程优先级为MAX_PRIORITY，另一个为MIN_PRIORITY，如果没有Sleep()方法，只有高优先级的线程执行完成后，低优先级的线程才能执行;但当高优先级的线程sleep(5000)后，低优先级就有机会执行了。</p>
<p>总之，sleep()可以使低优先级的线程得到执行的机会，当然也可以让同优先级、高优先级的线程有执行的机会。</p>
<p>四、join()</p>
<p>join()方法使调用该方法的线程在此之前执行完毕，也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。</p>
<p>五、yield()</p>
<p>它与sleep()类似，只是不能由用户指定暂停多长时间，并且yield()方法只能让同优先级的线程有执行的机会。</p>
<p>六、wait()和notify()、notifyAll()</p>
<p>这三个方法用于协调多个线程对共享数据的存取，所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized 这个关键字用于保护共享数据，阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了，如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。</p>
<p>wait()方法使当前线程暂停执行并释放对象锁标志，让其他线程可以进入Synchronized数据块，当前线程被放入对象等待池中。当调用 notify()方法后，将从对象的等待池中移走一个任意的线程并放到锁标志等待池中，只有</p>
<p>锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程，则notify()不起作用。</p>
<p>notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Fjava-duoxiancheng.html&title=Java%E5%A4%9A%E7%BA%BF%E7%A8%8B%E6%8A%80%E6%9C%AF%E4%B8%AD%E6%89%80%E6%9C%89%E6%96%B9%E6%B3%95%E7%9A%84%E8%AF%A6%E7%BB%86%E8%A7%A3%E6%9E%90--java%2Cjava%E5%A4%9A%E7%BA%BF%E7%A8%8B" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/java-duoxiancheng.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>介绍一下Java的Map以及如何使用HashMap</title>
		<link>http://www.kaixinbc.com/2010/02/java-map-hashmap.html</link>
		<comments>http://www.kaixinbc.com/2010/02/java-map-hashmap.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 12:44:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=424</guid>
		<description><![CDATA[Map是一个保存键值对的对象，根据键值可以找到它对应的值。键必须是唯一的，但是值可以重复。HashMap类提供了map接口的主要实现，它使用hash  table来实现map接口。这就使得一些常见的操作如get()和put()所用的时间基本不变。
如下代码是一个使用hashmap的实例，它提供了account信息和account balance的对应：
import java.util.*;
public class HashMapDemo {
public static void main(  String[] args) {
HashMap hm =  new HashMap();
hm.put(“Rohit”, new Double(3434.34));
hm.put(“Mohit”, new Double(123.22));
hm.put(“Ashish”,  new Double(1200.34));
hm.put(“Khariwal”,  new Double(99.34));
hm.put(“Pankaj”,  new Double(-19.34));
Set set = hm.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry me = (Map.Entry)i.next();
System.out.println(me.getKey()  + “ : ”  + me.getValue() );
}
//deposit into Rohit’s Account
double balance = ((Double)hm.get(“Rohit”)).doubleValue();
hm.put(“Rohit”, new Double(balance +  1000));
System.out.println(“Rohit new balance : ” + hm.get(“Rohit”));
}
}
运行后的输出如下：
Rohit : 3434.34
Ashish : 1200.34
Pankaj : -19.34
Mohit : 123.22
Khariwal : 99.34
Rohit new balance : 4434.34
]]></description>
			<content:encoded><![CDATA[<p>Map是一个保存键值对的对象，根据键值可以找到它对应的值。键必须是唯一的，但是值可以重复。HashMap类提供了map接口的主要实现，它使用hash  table来实现map接口。这就使得一些常见的操作如get()和put()所用的时间基本不变。</p>
<p>如下代码是一个使用hashmap的实例，它提供了account信息和account balance的对应：</p>
<p><code><strong>import </strong>java.util.*;</code></p>
<p><strong>public class </strong>HashMapDemo {</p>
<p><strong>public static </strong><strong>void </strong>main(  String[]<code> args) {</code></p>
<p>HashMap hm =  <strong>new </strong>HashMap();<br />
hm.put(“Rohit”, <strong>new </strong>Double(3434.34));<br />
hm.put(“Mohit”, <strong>new </strong>Double(123.22));<br />
hm.put(“Ashish”,  <strong>new </strong>Double(1200.34));<br />
hm.put(“Khariwal”,  <strong>new </strong>Double(99.34));<br />
hm.put(“Pankaj”,  <strong>new </strong>Double(-19.34));<br />
Set set = hm.entrySet();</p>
<p>Iterator i = set.iterator();</p>
<p><strong>while</strong>(i.hasNext()){<br />
Map.Entry me = (Map.Entry)i.next();<br />
System.out.println(me.getKey()  + “ : ”  + me.getValue() );<br />
}</p>
<p>//deposit into Rohit’s Account<br />
<strong>double </strong>balance = ((Double)hm.get(“Rohit”)).doubleValue();<br />
hm.put(“Rohit”, <strong>new </strong>Double(balance +  1000));</p>
<p>System.out.println(“Rohit new balance : ” + hm.get(“Rohit”));</p>
<p>}<br />
}</p>
<p>运行后的输出如下：</p>
<pre>Rohit : 3434.34
Ashish : 1200.34
Pankaj : -19.34
Mohit : 123.22
Khariwal : 99.34
Rohit new balance : 4434.34</pre>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F02%2Fjava-map-hashmap.html&title=%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%8BJava%E7%9A%84Map%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8HashMap+" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/02/java-map-hashmap.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA面试题：ArrayList和vector的区别有哪些</title>
		<link>http://www.kaixinbc.com/2010/02/java-arraylist-vector.html</link>
		<comments>http://www.kaixinbc.com/2010/02/java-arraylist-vector.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 11:45:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[java面试题]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=422</guid>
		<description><![CDATA[一.同步性:Vector是线程安全的，也就是说是同步的，而ArrayList是线程序不安全的，不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培，而ArrayList却是原来的一半
就HashMap与HashTable主要从三方面来说:
一.历史原因:Hashtable是基于陈旧的Dictionary类的，HashMap是Java    1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的，也就是说是同步的，而HashMap是线程序不安全的，不是同步的
三.值：只有HashMap可以让你将空值作为一个表的条目的key或value
]]></description>
			<content:encoded><![CDATA[<p>一.同步性:Vector是线程安全的，也就是说是同步的，而ArrayList是线程序不安全的，不是同步的<br />
二.数据增长:当需要增长时,Vector默认增长为原来一培，而ArrayList却是原来的一半<br />
<strong>就HashMap与HashTable主要从三方面来说</strong>:</p>
<p>一.历史原因:Hashtable是基于陈旧的Dictionary类的，HashMap是Java    1.2引进的Map接口的一个实现<br />
二.同步性:Hashtable是线程安全的，也就是说是同步的，而HashMap是线程序不安全的，不是同步的<br />
三.值：只有HashMap可以让你将空值作为一个表的条目的key或value</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F02%2Fjava-arraylist-vector.html&title=JAVA%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%9AArrayList%E5%92%8Cvector%E7%9A%84%E5%8C%BA%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/02/java-arraylist-vector.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA WEB程序中添加定时器</title>
		<link>http://www.kaixinbc.com/2010/02/java-web-clock.html</link>
		<comments>http://www.kaixinbc.com/2010/02/java-web-clock.html#comments</comments>
		<pubDate>Sun, 21 Feb 2010 06:10:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=382</guid>
		<description><![CDATA[//这是我的定时器类，用来定时执行某段任务；
package com.my.time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
public class BugXmlTimer  {
public   Timer timer;
public void timerStart(){
timer = new Timer();
Date datetime=new Date();
Date midnightDate=new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat(&#8220;yyyy-MM-dd&#8221;);
SimpleDateFormat sdf2 = new SimpleDateFormat(&#8220;yyyy-MM-dd HH:mm:ss&#8221;);
try {
midnightDate = sdf2.parse(sdf1.format(datetime)+&#8221; 23:00:00&#8243;);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long in=midnightDate.getTime()-datetime.getTime();
System.out.println(&#8220;before task&#8221;);
//立刻执行，然后每隔30s执行一次
timer.schedule(new BugXmlTimerTask(), 0,30000);
}
public void timerStop(){
if(timer!=null)
timer.cancel();
}
public static void main(String[] args){
BugXmlTimer myTimer=new BugXmlTimer();
// TODO Auto-generated [...]]]></description>
			<content:encoded><![CDATA[<p>//这是我的定时器类，用来定时执行某段任务；</p>
<p>package com.my.time;</p>
<p>import java.text.ParseException;</p>
<p>import java.text.SimpleDateFormat;</p>
<p>import java.util.Date;</p>
<p>import java.util.Timer;</p>
<p>public class BugXmlTimer  {</p>
<p>public   Timer timer;</p>
<p>public void timerStart(){</p>
<p>timer = new Timer();</p>
<p>Date datetime=new Date();</p>
<p>Date midnightDate=new Date();</p>
<p>SimpleDateFormat sdf1 = new SimpleDateFormat(&#8220;yyyy-MM-dd&#8221;);</p>
<p>SimpleDateFormat sdf2 = new SimpleDateFormat(&#8220;yyyy-MM-dd HH:mm:ss&#8221;);</p>
<p>try {</p>
<p>midnightDate = sdf2.parse(sdf1.format(datetime)+&#8221; 23:00:00&#8243;);</p>
<p>} catch (ParseException e) {</p>
<p>// TODO Auto-generated catch block</p>
<p>e.printStackTrace();</p>
<p>}</p>
<p>long in=midnightDate.getTime()-datetime.getTime();</p>
<p>System.out.println(&#8220;before task&#8221;);</p>
<p>//立刻执行，然后每隔30s执行一次</p>
<p>timer.schedule(new BugXmlTimerTask(), 0,30000);</p>
<p>}</p>
<p>public void timerStop(){</p>
<p>if(timer!=null)</p>
<p>timer.cancel();</p>
<p>}</p>
<p>public static void main(String[] args){</p>
<p>BugXmlTimer myTimer=new BugXmlTimer();</p>
<p>// TODO Auto-generated method stub</p>
<p>myTimer.timerStart();</p>
<p>}</p>
<p>}</p>
<p>//这是执行任务的类，即每隔一段时间要做的事情在这里</p>
<p>package com.my.time;</p>
<p>import java.util.TimerTask;</p>
<p>public class BugXmlTimerTask extends TimerTask {</p>
<p>@Override</p>
<p>public void run() {</p>
<p>System.out.print(&#8220;run task&#8221;);</p>
<p>}</p>
<p>}</p>
<p>//以下是出发定时操作的类，该类实现了ServletContextListener</p>
<p>public class MyTimerListener implements ServletContextListener {</p>
<p>private BugXmlTimer  mytimer = new BugXmlTimer  ();</p>
<p>public void contextInitialized(ServletContextEvent event) {</p>
<p>mytimer.timerStart();</p>
<p>}</p>
<p>public void contextDestroyed(ServletContextEvent event) {</p>
<p>mytimer.timerStop();</p>
<p>}</p>
<p>}</p>
<p>然后在web.xml里部署一下，即可在程序启动后运行定时器了！</p>
<p>&lt;listener&gt;</p>
<p>&lt;listener-class&gt;com.my.time.MyTimerListener  &lt;/listener-class&gt;</p>
<p>&lt;/listener&gt;</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F02%2Fjava-web-clock.html&title=JAVA+WEB%E7%A8%8B%E5%BA%8F%E4%B8%AD%E6%B7%BB%E5%8A%A0%E5%AE%9A%E6%97%B6%E5%99%A8" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/02/java-web-clock.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java相关技术之事务管理与ThreadLocal</title>
		<link>http://www.kaixinbc.com/2010/02/java-threadlocal.html</link>
		<comments>http://www.kaixinbc.com/2010/02/java-threadlocal.html#comments</comments>
		<pubDate>Thu, 18 Feb 2010 04:39:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=340</guid>
		<description><![CDATA[通常我们会把事务处理放在业务层。
[1]引子
比如:
业务逻辑方法
public A bussinessMethod(){
   DaoA   a = new DaoA();
   a.udpate();
   DaoB  b = new DaoB();
   b.update;
}
假设，上面的事务是自动提交的。
那么，我们就可以什么不考虑。但是有一个问题，创建DAO对象的时候两个对象用的是不同的Connection对象。
再假定我们的取得连接的代码是
    public Connection getConnection(String username, String password)
            throws SQLException {
        Connection con = DriverManager
                .getConnection(conStr, username, password);
        return con;
    }
这个方法的一个调用。
那么如果，我们需要自己控制事务的开始和结束。
如何控制呢。
也许又有了新的方法
public A bussinessMethod(){
   DaoA   a = new DaoA();
   a.beginTx();
   a.udpate();
   a.endTx();
   a.close();
   DaoB  b = [...]]]></description>
			<content:encoded><![CDATA[<p>通常我们会把事务处理放在业务层。<br />
[1]引子</p>
<p>比如:<br />
业务逻辑方法</p>
<p>public A bussinessMethod(){</p>
<p>   DaoA   a = new DaoA();<br />
   a.udpate();</p>
<p>   DaoB  b = new DaoB();<br />
   b.update;</p>
<p>}</p>
<p>假设，上面的事务是自动提交的。<br />
那么，我们就可以什么不考虑。但是有一个问题，创建DAO对象的时候两个对象用的是不同的Connection对象。</p>
<p>再假定我们的取得连接的代码是</p>
<p>    public Connection getConnection(String username, String password)<br />
            throws SQLException {<br />
        Connection con = DriverManager<br />
                .getConnection(conStr, username, password);<br />
        return con;<br />
    }</p>
<p>这个方法的一个调用。</p>
<p>那么如果，我们需要自己控制事务的开始和结束。<br />
如何控制呢。<br />
也许又有了新的方法<br />
public A bussinessMethod(){</p>
<p>   DaoA   a = new DaoA();<br />
   a.beginTx();<br />
   a.udpate();<br />
   a.endTx();<br />
   a.close();</p>
<p>   DaoB  b = new DaoB();<br />
   b.beginTx();<br />
   b.update;<br />
   b.endTx();<br />
   b.close();<br />
}</p>
<p>这样我们就控制了事务，并且我们也只有这样才能实现，因为，不同的DAO取得的是不同的Connection对象。</p>
<p>[2]问题<br />
那么怎么才能实现两个或多个DAO用同一个事务来控制呢？</p>
<p>首先就要解决一个根本问题，我们在一个事务中，不同的DAO取得的是同一个Connection,这个要怎么实现呢。我们想到了TheadLocal.<br />
[3]方案<br />
因为当一个业务逻辑要对多个DAO进行处理的时候，此操作属于同一个线程内。所以，我们希望能把此Connection放在线程内，或者和线程有关联。<br />
第一个方案，可以用Map来使现。<br />
就是Map&lt;Thread,Connection&gt;<br />
但是这个map维护起来比较麻烦，如果一直put的话，那么这个map随着系统的运行就会越来越大。<br />
第二个方案，就是用ThreadLocal<br />
在任何一个线程内都可以用ThreadLocal来保存一个变量的copy,这样，如果此对象存在，就可以直接取用。<br />
如果把Connection存在ThreadLocal也一样。<br />
所以，在同一个线程内，就可以保证取得到的是同一个Connection.</p>
<p>[4]实现<br />
代码<br />
    private static ThreadLocal&lt;Connection&gt; localCon = new ThreadLocal&lt;Connection&gt;();</p>
<p>    public final static Connection getConnection() throws SQLException {</p>
<p>        Connection con = localCon.get();<br />
       <br />
        if(con==null||con.isClosed()){</p>
<p>            con = new OracleJdbcDatasource().getConnection();<br />
           <br />
            localCon.set(con);<br />
        }<br />
        return con;<br />
    }<br />
这样就实现了上面的问题。</p>
<p>[5]新的事务管理</p>
<p>public A bussinessMethod(){</p>
<p>   DaoA   a = new DaoA();<br />
   DaoB  b = new DaoB();</p>
<p><strong>   a.beginTx();</strong><br />
   a.udpate();</p>
<p>   b.beginTx();<br />
   b.update;</p>
<p><strong>   a.endTx();<br />
   a.close();</p>
<p></strong><strong>//   b.endTx();<br />
//   b.close();</strong><br />
能实现一样的效果<br />
}<br />
上面的黑体部分，就可以实现对事务的统一管理。</p>
<p>[6]改进<br />
上面的方法给人的感觉有点别扭，但是却能实现事务的统一管理。</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F02%2Fjava-threadlocal.html&title=Java%E7%9B%B8%E5%85%B3%E6%8A%80%E6%9C%AF%E4%B9%8B%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86%E4%B8%8EThreadLocal+" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/02/java-threadlocal.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
