<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Java论坛最新讨论 - JavaEye</title>
    <description>Java编程、Java Web开发、Java企业应用、Java设计模式、Java开源框架、Java应用服务器 <br/>
圈子: 
<a href="http://android.group.javaeye.com" target="_blank">Android</a>
<a href="http://jbpm.group.javaeye.com" target="_blank">JBPM</a>
<a href="http://jsfgroup.group.javaeye.com" target="_blank">JSF</a>
<a href="http://seam.group.javaeye.com" target="_blank">Seam</a>
<a href="http://tapestrying.group.javaeye.com" target="_blank">Tapestry</a>
<a href="http://grails.group.javaeye.com" target="_blank">Groovy</a>
<a href="http://lucene-group.group.javaeye.com" target="_blank">Lucene</a>
<a href="http://ecside.group.javaeye.com" target="_blank">GT-Grid</a>

 - Java编程，Ruby编程，微软.net，AJAX，敏捷软件开发，综合软件技术</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>解释一下，为什么需要接口而不直接实现类。</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lonelybug.javaeye.com">lonelybug</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248494" style="color:red;">http://www.javaeye.com/topic/248494</a>&nbsp;
          发表时间: 2008年10月01日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看了这里的一些帖子和很多地方的帖子，很多人都在问为什么非要interface或者abstract class，然后还要在写一个实现类，而其实，我就市要做一个很简单的功能！？<br /><br />对，如果你制作一个简单的功能，我同意你可以直接使用spring hibernate等框架来写，他们本身的好处也是干这个的。<br /><br />但是，中国人有句老话，叫做杞人忧天，很多的时候，你有没有内心问自己，这个系统，我设计的，如果老板要改动，我可以在很短的时间内做到改变么？<br /><br />当你问自己这个问题的时候，你就已经把直接写实现类的做法怀疑了。<br /><br />面向接口的原则，不是只出现在程序员或者说IT界，接口设计是人类对一个问题或者一个物体的概括理解能力的表现。我们日常生活中处处有接口。<br /><br />在我作一个简单的说明之前，我要补充以下，系统框架中，除了层的概念，还有一个叫做boundary,每一个layer（层）是由不同的boundary（box）组成。<br /><br />举例一二三，比如，简单的说，发电厂就是实现类(implementation class)，每个发电厂都是独立的boundary，而发电厂就是统称为一个layer，也许还不明白，比如，我们平时说，发电厂，没人关心你家的电来自于那个发电厂，而关心的是你家的插座有没有电，所以三项插座，二项插座至十发电厂给用户的最终接口。发电厂之间也是通过一个特殊的工业接口来互相访问，所以，这也是为什么说，有时候有的发电厂在夏天负担过重，就可以把负担分给其他的电场供应。反过来，如果让老百姓天天关心的是发电厂，而不是插座，那你觉得这样的城市电力设计是不是很糟糕呢？<br /><br />在举个例子，比如果.....，嗯，好，就说汽车，汽车都见过吧，四个轮子，一个方向盘，但是，你们有没有发现，有时候你们的汽车上面的音响系统坏掉或者要升级的时候，只需要取下中间面板上面的那个独立的音响播放器，然后买一个新的，由汽车维修给你们撞上就可以了，不管是飞利浦，boss还是简单的radio的和卡带的，你们从来不会在买一个汽车音响的时候关心他能不能安在汽车上，而是可以完全关心颜色，款式，品牌这些问题上，如果，反过来设计，每一个汽车品牌都直接实现自己的独立设计，不遵循工业接口，那你觉得这样的汽车音响会有很多选择么？<br /><br />最后在举一个我们每天息息相关的例子，门，每天人们通过不同的门，进入或者走出不同的地方，而门就是那个地方或者建筑物的接口，如果说，我们反过来，每个大厦或者建筑物都直接应用自己喜欢的实现进出的方式，那你们觉得每天的生活会不会有点太麻烦？<br /><br />我举例子只是来简单的解释一下，接口不是一个繁琐的过程，而是每个工业，甚至是每天生活中，我们必须应用到的东西，所以，如果看待现在的文明社会用程序员的方式的话，那么就是一种接口世界，现实生活中很多人叫做标准或者协议，由看得见摸得找的，也有看不见摸不着的接口。<br /><br />很多人可能想对我举的例子进行进一步的反驳，其实没有必要，如果你要跟我探讨每一个例子来映射程序中的接口问题，那就是在抬杠，抬杠很浪费时间，所以，我不会跟你探讨例子的问题，那就是个例子，而这个例子是每天确实发生的，使用的。<br /><br />希望能解释明白一点在程序设计中接口编程的优势所在。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248494" style="color:red;">已有 <strong>36</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Oct 2008 23:32:46 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248494</link>
        <guid>http://www.javaeye.com/topic/248494</guid>
      </item>
          <item>
        <title>Pomer：基于Flex和Java EE的信息管理系统基础框架</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ke2000.javaeye.com">ke2000</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249587" style="color:red;">http://www.javaeye.com/topic/249587</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Pomer是几个无聊的人利用业余时间做的希望不是无聊的一个基础框架：），目前的功能还不完整，不过我们这几个无聊的人会继续做下去，现在推出的版本功能：一个可以运行的基础框架和代码生成器。<br />&nbsp;&nbsp;&nbsp; 欢迎大家试用，欢迎拍砖 ^_^,以下是简单的介绍和说明，详细请访问:<a href="http://www.pomer.org.cn" target="_blank">http://www.pomer.org.cn</a><br />&nbsp;&nbsp;&nbsp; * Flex 开发框架 <br />Pomer主要采用spring和hibernate做为后台框架，通过blazeds(LCDS)RemoteObject?与java后台通信，前台采用Cairngorm MVC框架， Pomer框架主要作用就是简化blazeds(LCDS)RemoteObject的访问方式，提高开发效率。Pomer通过注解 (Annotation)将普通java对象，Spring Bean和EJB发布为远程对象（RemoteObject）提供给flex访问，而不需要进行任何配置 。<br /><br />&nbsp;&nbsp;&nbsp; * 代码生成器 <br />Pomer 代码生成器包括两个部分，一个是强大灵活通用代码生成器模型和一套基于Pomer的默认模板。 Pomer通用代码生成器采用freemark做为模板引擎，可以生成任何基于数据表或javaPojo和java接口的代码，用户只需提供 freemark的模板即可。 Pomer提供的默认生成功能和默认模板可以通过数据库生成基于Pomer框架可运行的增删改查代码，也可以从javaBean生成 RemoteObject的数据传输对象、表单和列表，还能通过java接口生成Cairngorm的框架代码。<br />&nbsp;&nbsp; <img src="http://lh4.ggpht.com/yulinlincom/SOGFRdmtH5I/AAAAAAAAAcA/OZkaarZMgFU/s576/pomerUserIndex.JPG" />
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249587" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 22:32:11 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249587</link>
        <guid>http://www.javaeye.com/topic/249587</guid>
      </item>
          <item>
        <title>Struts2+spring2.5.5+Hibernate3.1.1+外网访问内网的苹果茶+Mysq</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ilysony.javaeye.com">ilysony</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249285" style="color:red;">http://www.javaeye.com/topic/249285</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做了一个小网站,来学习SSH <br /><br />Struts2+spring2.5.5+Hibernate3.1.1+外网访问内网的苹果茶+Mysql <br /><br />苦于不能在外网访问,因我是内网,又没权限搞端口映射' <br /><br />于是GOOGLE BAIDU了一大堆,最后发现都用不了, <br /><br />无意中发现了苹果茶,真是太好用了 <br /><br />安装后,tomcat一开就可以访问了,爽 <br /><br />分享一下,分享给那些和我一样,在内网搭建服务器的人 <br /><br />http://ilysony.meibu.org:12649/znt/&nbsp; 我用SSH做的小站,大家多提批语意见 <br /><br /><br />下面是苹果茶的使用方法 <br /><br />--------------- <br /><br />不需要端口映射实现从外网访问内网服务器 2008-10-06 11:28:14 <br /><br /><br />1、 <br />去 www.meibu.org 注册域名（注册域名是免费的）； <br />2、 <br />去 http://www.meibu.org/khd.html 下载“苹果茶”内网服务客户端软件； <br />3、 <br />先不要运行软件登陆，我们这个时候要先把SQL的端口设置一下。先去 www.meibu.org 用刚才申请的域名和密码登陆，进到了端口管理界面，这个时候显示出三个项目（域名、外部访问端口、内部对外端口），其中域名是你自己申请的，外部访问端口是meibu给你分配的，内部对外端口是你电脑打算对外提供的端口，申请域名的时候系统默认给你的是80，这个时候因为你不是想对外提供WEB服务，而是想在外面连接SQL数据库，而SQL数据库的端口是1433，所以在这里你把80修改为1433。然后提交。 <br />4、 <br />运行你下载的“苹果茶”内网服务客户端软件； <br />5、 <br />在外网连接你内网SQL数据库时，请把连接的端口修改为每步提供给你的“外部访问端口”。 <br /><br />尝试一下，很容易就实现了。 <br />其实每步提供给你的“外部访问端口”就是一个端口映射，他帮助我们解决了不能在代理服务器或者路由器上做端口映射的困扰
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249285" style="color:red;">已有 <strong>6</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 12:02:23 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249285</link>
        <guid>http://www.javaeye.com/topic/249285</guid>
      </item>
          <item>
        <title>应用程序的瓶颈？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gembler.javaeye.com">gembler</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249147" style="color:red;">http://www.javaeye.com/topic/249147</a>&nbsp;
          发表时间: 2008年10月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近。。。手头上项目成形了，心里暗喜（可以稍微清闲一点了）。<br />谁知道跑了几天，程序访问不了（喜不出来了）。<br />从error log中得知是PermGen space（开始狂抓了），而且该进程占用cup的百分比是在100%~105%之间浮动。<br /><br /><br />应用程序结构：struts+spring+hibernate。<br /><br />数据库：oracle<br /><br />应用服务器：jboss<br /><br />操作系统：redhat<br /><br />负载均衡：F5<br /><br />JDK：1.5<br /><br /><br />知道是报PermGen space，第一反应当然是修改JAVA_OPTS，可是跑几天问题依然重出（再抓）。<br />这时候，开始断定是代码问题了，然后用jconsole去监控监控，看不到我想看的东西（汗）。<br /><br /><br />目前我想监控的内容是：某个类的实例数量、所占的内存，某个实例所占的内存。</p>
<p>&nbsp;</p>
<p>（过两天跑去尝试一下jprofile）<br /><br />如果大家有好的监控工具，就介绍介绍，<br /><br />有其他的测试方案、压测工具也介绍介绍介绍，<br /><br />有知道导致出现PermGen space的其他原因的也介绍介绍介绍介绍</p>
<p>&nbsp;</p>
<p>或者其他高见 --&gt; 尽管提出提出。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249147" style="color:red;">已有 <strong>6</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Oct 2008 22:04:20 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249147</link>
        <guid>http://www.javaeye.com/topic/249147</guid>
      </item>
          <item>
        <title>基于spring与hibernate的通用分页实现</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iorn-gu.javaeye.com">iorn.gu</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248322" style="color:red;">http://www.javaeye.com/topic/248322</a>&nbsp;
          发表时间: 2008年10月01日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近做了个分页..&nbsp; 拿出来大家讨论一下.<br /><br />先看一下效果.<br />在HTML代码:<br />js框架用的是jQuery. table函数是我自己做的一个表格插件.<br /><pre name="code" class="html">
&lt;#import "/spring.ftl" as spring/>
&lt;#import "/shop.ftl" as shop/>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
  	&lt;title>Data Table Demo&lt;/title>
  &lt;/head>
  &lt;body>
  	&lt;script>
  		$(function(){
  			$('.table4').table({
  				headers : ['&lt;@spring.message code="profile.detail.title"/>'],
  				data_columns : ['name'],
  				data_key: 'data',
  				data_url : $.root_ctx + '/demo/table3.htm',
  				pageable: true,
  				ajaxPager: true,
  				pageSize: 6
  			});
  			
  		});
  	&lt;/script>
  	&lt;div style="width: 90%">
  	&lt;@shop.panel height=245>
  		&lt;table class="table4" border="0" cellspacing="0" cellpadding="0">&lt;/table>
  	&lt;/@shop.panel>
  	&lt;/div>
  &lt;/body>
&lt;/html>
</pre><br /><br />再看controller里.<br /><pre name="code" class="java">
@Controller
public class DemoController extends BaseController{
	
	private ShopService shopService = null;
	
	@Autowired
	public void setShopService(ShopService shopService) {
		this.shopService = shopService;
	}

	@RequestMapping("/demo/table3.htm")
	public String testTable3(HttpServletRequest request,ModelMap map) {
		Object o = doPage(request, map, new PagerExecutor() {
			@Override
			public List&lt;?> doInPager(Pager pager) {
				return shopService.list();
			}
		});
		map.addAttribute("data", escapeForJson(o));
		return JSON;
	}
}
</pre><br /><br />service里的list方法实现<br /><pre name="code" class="java">
	@Override
	//@Exclude("BaseDao.list")
	public List&lt;Shop> list() {
		return shopDao.list();
	}
</pre><br /><br />dao里的list方法实现<br /><pre name="code" class="java">
	@SuppressWarnings("unchecked")
	@Override
	public List&lt;T> list() throws DataAccessException {
		return getHibernateTemplate().loadAll(clazz);
	}
</pre><br /><br /><span style="font-size: large"><strong>到现在. 分页相关的代码已经写完了. <br />可以看到. service与dao里没有任何与分页有关的代码.<br />接下来看下实现分页相关的东西.</strong></span><br /><br />Pager接口<br /><pre name="code" class="java">
/**
 * @author Iorn.Gu
 */
public interface Pager {

	boolean isEnabled();
	
	void setPageSize(int pageSize);
	int getPageSize();
	
	void setCurrentPage(int currentPage);
	int getCurrentPage();
	
	void setFetchCount(boolean fetchCount);
	
	PagerResult execute(PagerExecutor executor);
}
</pre><br /><br />实现类<br /><pre name="code" class="java">
public class PagerImpl implements Pager{

	private boolean enabled = false;
	private boolean fetchCount = false;
	private int pageSize = 10;
	private int currentPage = 0;
	
	private static final Object LOCK = new Object();
	
	@Override
	public PagerResult execute(PagerExecutor executor) {
		synchronized (LOCK) {
			PagerResult result = new PagerResult();
			if( fetchCount || currentPage &lt; 0) {
				enabled = false;
				List&lt;?> re = executor.doInPager(this);
				result.setItemCount(re.size());
				fetchCount = false;
			} else if( currentPage != 0 ){
				enabled = true;
				List&lt;?> re = executor.doInPager(this);
				result.setPageItems(re);
				enabled = false;
			}
			currentPage = 0;
			return result;
		}
	}

	@Override
	public void setCurrentPage(int currentPage) {
		synchronized (LOCK) {
			if( !isEnabled() )
				this.currentPage = currentPage;
		}
	}

	@Override
	public void setPageSize(int pageSize) {
		synchronized (LOCK) {
			if( !isEnabled() )
				this.pageSize = pageSize;
		}
	}

	@Override
	public int getCurrentPage() {
		return currentPage;
	}

	@Override
	public int getPageSize() {
		return pageSize;
	}

	@Override
	public boolean isEnabled() {
		return enabled;
	}

	public void setFetchCount(boolean fetchCount) {
		this.fetchCount = fetchCount;
	}
	
}
</pre><br /><br />PagerResult <br /><pre name="code" class="java">
public class PagerResult {

	private int itemCount = 0;
	private List&lt;?> pageItems = null;
	
	public int getItemCount() {
		return itemCount;
	}
	
	public void setItemCount(int itemCount) {
		this.itemCount = itemCount;
	}
	
	public List&lt;?> getPageItems() {
		return pageItems;
	}
	
	public void setPageItems(List&lt;?> pageItems) {
		this.pageItems = pageItems;
	}
	
}
</pre><br /><br />PagerExecutor <br /><pre name="code" class="java">
public interface PagerExecutor {

	List&lt;?> doInPager(Pager pager);
	
}
</pre><br /><br />PageableHibernateTemplete类.<br />关于PagerMethodExcludeHolder 这个类相关的东西.到最后再说吧.先忽略.! 只看两个prepare方法.<br /><pre name="code" class="java">
public class PageableHibernateTemplete extends HibernateTemplate {

	private Pager pager = null;
	private PagerMethodExcludeHolder excludeHolder = null;
	
	public PageableHibernateTemplete(SessionFactory sessionFactory) {
		super(sessionFactory);
	}
	
	@Autowired
	public void setPager(Pager pager) {
		this.pager = pager;
	}

	@Autowired
	public void setExcludeHolder(PagerMethodExcludeHolder excludeHolder) {
		this.excludeHolder = excludeHolder;
	}

	@Override
	protected void prepareCriteria(Criteria criteria) {
		if( pager.isEnabled() && !isMethodExcluded()) {
			criteria.setFirstResult((pager.getCurrentPage()-1)*pager.getPageSize());
			setMaxResults(pager.getPageSize());
		} else {
			criteria.setFirstResult(0);
			setMaxResults(0);
		}
		super.prepareCriteria(criteria);
	}

	@Override
	protected void prepareQuery(Query queryObject) {
		if( pager.isEnabled() && !isMethodExcluded() ) {
			queryObject.setFirstResult((pager.getCurrentPage()-1)*pager.getPageSize());
			setMaxResults(pager.getPageSize());
		} else {
			queryObject.setFirstResult(0);
			setMaxResults(0);
		}
		super.prepareQuery(queryObject);
	}
	
	private boolean isMethodExcluded() {
		String[] excludeds = excludeHolder.getExcludeMethods();
		if( excludeds != null ) {
			StackTraceElement[] elements = (new Throwable()).getStackTrace();
			boolean inDao = false;
			for( StackTraceElement element : elements ) {
				if( element.getClassName().endsWith("DaoImpl") ) {
					inDao = true;
					for( String excluded : excludeds ) {
						String method = excluded.substring(excluded.lastIndexOf(".")+1);
						String prefix = excluded.substring(0,excluded.lastIndexOf("."));
						if( element.getMethodName().equals(method) && element.getClassName().indexOf(prefix) != -1 ) {
							System.out.println("exlucde Method:" + element.getClassName() + "." + element.getMethodName());
							return true;
						}
					}
				} else if( inDao ){
					break;
				}
			}
		}
		return false;
	}
	
}
</pre><br /><br />然后是BaseController类的doPager(在上面的controller那块里头用到)方法.<br /><pre name="code" class="java">
	@SuppressWarnings("unchecked")
	protected List&lt;?> doPage(HttpServletRequest request,Map model,PagerExecutor executor) {
		String getItemCount = request.getParameter("getItemCount");
		String currentPage = request.getParameter("currentPage");
		String pageSize = request.getParameter("pageSize");
		
		if( "true".equals(getItemCount) ) {
			pager.setFetchCount(true);
			PagerResult result = pager.execute(executor);
			model.put("itemCount", result.getItemCount());
			return null;
		} else if( currentPage != null && !"".equals(currentPage) ) {
			int curr = Integer.parseInt(currentPage);
			pager.setCurrentPage(curr);
			if( pageSize != null && !"".equals(pageSize) ) {
				int ps = Integer.parseInt(pageSize);
				pager.setPageSize(ps);
			}
		} else {
			pager.setCurrentPage(-1);
		}
		PagerResult result = pager.execute(executor);
		
		return result.getPageItems();
	}
</pre><br /><br />最后就是那个jQuery的table插件了.. 代码太长. 就只贴取数据那一段了.<br /><pre name="code" class="javascript">
var AjaxPageableDataModel = function(config){
		var param = $.extend({},config.data_param);
		$.extend(param,{'getItemCount':true});
		
		$.ajax({
			async : false,
			url : config.data_url,
			data : param,
			type : 'POST',
			cache : true,
			success : function(data){
				config.itemCount = eval('('+data+')').itemCount;
			}
		});
		param['getItemCount'] = false;
		
		config.pageCount = parseInt(config.itemCount / config.pageSize);
		config.pageCount += ((config.itemCount % config.pageSize == 0) ? 0 : 1)
		
		return {
			getData : function(curPage){
				config.currentPage = curPage ? curPage : 1;
				param['currentPage'] = config.currentPage;
				param['pageSize'] = config.pageSize;
				
				var result = false;
				$.ajax({
					async : false,
					url : config.data_url,
					data : param,
					type : 'POST',
					success : function(data){
						result = eval('('+data+')');
					}
				});
				return (result && result[config.data_key]) ? result[config.data_key] : [];
			},
			getPageCount : function(){
				return config.pageCount;
			},
			getItemCount : function(){
				return config.itemCount;
			}
		}
	};
</pre><br /><br />就这些了. 虽然没写注释,但应该不难看懂.<br /><br />然后还有PagerMethodExcludeHolder类没有贴.. 这个要说明一下. <br />因为在service层的方法里. 有可能会调用多个dao的方法. 而dao的方法并不是每一个都要分页处理. 这时就要用到这个类相关的东西了.<br />在上面的service方法里. 注释了一行@Exclude("BaseDao.list"). 这行表示.BaseDao里的list方法不需要做分页处理.<br />下面是这些东西的代码.<br /><br /><pre name="code" class="java">
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Exclude {

	String[] value() default {};
	
}
</pre><br /><br /><pre name="code" class="java">
@Aspect
public class PagerMethodExcludeHolder {

	private Map&lt;Method, String[]> methodCache = new HashMap&lt;Method, String[]>();
	private String[] excludeMethods = null;
	
	@Around("execution(public java.util.List *..*service..*.*(..)) and @annotation(com.guyong.common.pager.Exclude)")
	public Object whenPager(ProceedingJoinPoint joinPoint) throws Throwable {
		Method method = getCurrentMethod(joinPoint);
		if( !methodCache.containsKey(method) ) {
			Exclude exclude = AnnotationUtils.findAnnotation(method, Exclude.class);
			String[] excludes = null;
			if( exclude != null ) {
				excludes = exclude.value();
			}
			methodCache.put(method, excludes);
		}
		excludeMethods = methodCache.get(method);
		Object result = joinPoint.proceed();
		excludeMethods = null;
		return result;
	}
	
	private Method getCurrentMethod(ProceedingJoinPoint joinPoint) {
		Signature s = joinPoint.getSignature();
		Class&lt;?> clazz = joinPoint.getTarget().getClass();
		Method getMethod = ReflectionUtils.findMethod(s.getClass(), "getMethod");
		ReflectionUtils.makeAccessible(getMethod);
		Method tmp = (Method)ReflectionUtils.invokeMethod(getMethod, s);
		Class&lt;?>[] argTypes = tmp.getParameterTypes();
		return ReflectionUtils.findMethod(clazz, s.getName(), argTypes);
	}

	public String[] getExcludeMethods() {
		return excludeMethods;
	}
	
}
</pre><br /><br />好了..&nbsp; 欢迎大家批评指教.<br />附件里是效果图跟每页数据的返回值..
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248322" style="color:red;">已有 <strong>13</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Oct 2008 01:22:00 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248322</link>
        <guid>http://www.javaeye.com/topic/248322</guid>
      </item>
          <item>
        <title>[Hibernate]如何针对查询缓存失效的情况，仍同步使缓存数据跟数据库数据保持一致？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vavi.javaeye.com">vavi</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249583" style="color:red;">http://www.javaeye.com/topic/249583</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如标题所说<br />这个问题该如何解决呢？<br />或者存在比较好的方案 <br />使数据 增删改后 <br />使缓存和跟数据库数据保持一致？<br /><br />还有个问题<br />如果针对不是基于主键为条件的查询 （load get ）<br />是否就一定无法使用二级缓存？<br /><br />还有网上有种说法:<br />说get无法使用二级缓存 这个应该是错误的吧 <br />至少应该 Hibernate 3.0.5 是可以的
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249583" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 22:21:09 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249583</link>
        <guid>http://www.javaeye.com/topic/249583</guid>
      </item>
          <item>
        <title>关于Spring 2.5里面的基于注解的配置的一些疑惑</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://caipanjin.javaeye.com">caipanjin</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249496" style="color:red;">http://www.javaeye.com/topic/249496</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          开门见山吧<br /><br />第一个问题：Spring和iBatis整合的时候，我让一个Dao继承SqlMapClientDaoSupport，我怎样用注解注入sqlMapClient？我不想action和service都用注解注入，但是我的dao得用xml注入。（当然有人会说，可以抽象出一个父类dao，由它在xml里面注入sqlMapClient，然后子类dao就可以用注解注入了，这倒可以的。那有没有直接点的方法呢？）<br /><br />第二个问题：单元测试的时候，@Resource注解注入有效，比如在service里面注入dao。到web程序上去跑，就null了，action里面注入的service是null，service里面注入的dao也是null，改成@Autowired就OK了，但是这种现象如何解释呢？而且我不太喜欢用@Autowired，似乎感觉它的效率要差点。<br /><br />大家知道的给我讲讲吧。<br /><br />补充一点：MVC框架用的是struts 2.我之前用struts 1 + JPA + spring 2.5时，没有出现@Resource注解注入无效的情况。<br />看了 http://www.javaeye.com/topic/226937 后，第一个问题解决了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249496" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 17:29:48 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249496</link>
        <guid>http://www.javaeye.com/topic/249496</guid>
      </item>
          <item>
        <title>Hibernate查询缓存的一个可靠性问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://raymond2006k.javaeye.com">raymond2006k</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249508" style="color:red;">http://www.javaeye.com/topic/249508</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          之前在对项目中Hibernate的缓存性能进行测试时发现的一个问题，不知大家有没有遇到或者是解决办法。<br />&nbsp;&nbsp;&nbsp; 问题是：使用sql query且是多表关联查询，并启用查询缓存时，对关联表修改后，查询缓存未能更新，出现了不正确的查询结果集。<br /><br />&nbsp;&nbsp;&nbsp; 测试场景： <br />&nbsp;&nbsp;&nbsp; 1. 用例：为简单起见，测试中使用了两表关联查询。查询指定角色 (roleCode) 的所有已授权限点 (Perm集合)<br />&nbsp;&nbsp;&nbsp; 2. 库表：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 权限点表(sys_perm )字段： permCode, permName, moduleCode,...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 角色授权表(sys_role_perm )字段： roleCode, permCode, createTime,...<br /><br />&nbsp;&nbsp; 3. 关联查询 <br />(其实仅判断所授权限点编码集合，用Hibernate 关联抓取，就可以解决，并且二级缓存也能很好的控制此问题；即使用 named sql query进行鉴权，也只需查 sys_role_perm表返回 permCode集合。这里返回 perm 集合， 这里主要是为测试关联查询时的cache query问题而举的一个例子)<br /><pre name="code" class="xml">
&lt;!-- 角色拥有的所有已授权限集合 -->
&lt;sql-query name="system.roleperms">
	select  *  from sys_perm t join sys_role_perm o 
    on t.perm_code = o.perm_code 
    where o.role_code = :roleCode 
&lt;/sql-query>
&lt;/class>
</pre><br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 3. 预置数据：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 角色编码： STESTOR， <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 权限点：permCode 组织新增： ORG_ADD<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 sys_role_perm 表中为 STESTOR 授予 组织管理新增的权限: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (STESTOR,ORG_ADD,2007-3-27 10:34:32)<br /><br />&nbsp;&nbsp;&nbsp; 4. 测试代码：<br />&nbsp;&nbsp;&nbsp;&nbsp; 执行三次doQueryRolePerms 查询功能，在第二次执行完毕时，删除 (STESTOR,ORG_ADD) 这条授权，观察第三次查询是否重新去数据库取数。<br /><br /><pre name="code" class="java">
for (int i = 0; i &lt; 3; i++) {
   System.out.println(" Execute No. " + i + " ********************");
   List perms = (List)perm.doQueryRolePerms("STESTOR"); 		
   System.out.println("(" + i +")result size:"  + perms.size()  );

   if(i % 2 == 1) 
    rolePerm.doRemoveByVO(rolePermVO1); //删除授权：STESTOR, ORG_ADD	
}
</pre><br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; 5. 执行分析：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第1，2次执行，由于有预置授权，因此 result size： 1；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第3次执行查询，由于删除了唯一的授权，那么 result size： 0。<br /><br />&nbsp;&nbsp;&nbsp; <strong>6. 实际结果：</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <pre name="code" class="java">

 Execute No. 0 ********************
2008-10-06 17:26:26,406 [DEBUG](AbstractBatcher.java,324) - select  this.PERMCODE as  PERM1_0_,  this.MODULECODE as  MODULE2_15_0_,  this.PERMTYPECODE as  PERM3_15_0_,  this.PERMNAME as  PERM4_15_0_,  this.PERMDESC as  PERM5_15_0_,  this.PORTNO as  PORT6_15_0_ from (select  t.perm_code as permCode, 
       t.module_code as moduleCode, 
       t.perm_name as permName, 
       t.perm_desc as permDesc, 
       t.port_no as portNo, 
       t.perm_type_code as permTypeCode 
  		from sys_perm t join sys_role_perm o 
    on t.perm_code = o.perm_code 
    where o.role_code = ? ) this  
(No.0)result size:1

 Execute No. 1 ********************
(No.1)result size:1
2008-10-06 17:26:26,484 [DEBUG](AbstractBatcher.java,324) - delete from SYS_ROLE_PERM where PERM_CODE=? and ROLE_CODE=?

 Execute No. 2 ********************
(No.2)result size:1

Time: 0.422

OK (1 test)
       </pre><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从结果可以看出，第1次，执行了查询； <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2次没有执行查询，说明 query cache，二级cache都起了作用。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但第3次查询，没有重新执行sql，仍然返回的是第二缓存的结果。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此可以判定， 第3次查出的是旧数据。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 7. 分析及结论：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate query cache 在关联表的数据删除时，没能通知查询缓存及时失效或更新， 以便获取最新数据。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 8. 解决办法<br />&nbsp;&nbsp;&nbsp;&nbsp; 暂时还没找到Hibernate自身的解决办法， 为避免此问题，可以关闭查询缓存。 看大家有没有遇到过此问题，分享下你们的经验。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 如果hibernate真的没有解决这个问题，我能想到的一个思路就是，在 named query执行时，分析出查询的关联表，并在关联表进行 create，update，delete时及时通知该 named query的缓存失效。<br />&nbsp;&nbsp;&nbsp;&nbsp; 关联查询，特别是多表关联，且操作复杂时，要精细的进行缓存通知比较困难（例如：修改了 Admin 角色的授权，就对上例的查询没有影响，而修改了 STESTOR 角色的授权才需要通知cache更新，但这判断起来有一定难度），可以做一个笼统的逻辑，即 create，update，delete 关联表后，对 named query的cache都要通知它清除，以便重新查询获取最新数据。 <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query cache的利用率，即命中率取决于具体业务的增删改操作的频率，这个测试暂不考虑此因素 query cache的价值问题。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249508" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 17:47:58 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249508</link>
        <guid>http://www.javaeye.com/topic/249508</guid>
      </item>
          <item>
        <title>图论—深度优先和广度优先算法源码</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cxlh.javaeye.com">kongshanxuelin</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249333" style="color:red;">http://www.javaeye.com/topic/249333</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近由于项目需要，需要实现深度优先和广度优先算法，图论中的基础内容，源代码共享一下，希望对大家有用：</p>
<pre name="code" class="java">public class Graph {
	private final int MAX_VERT=500;
	private Node nodelist[];
	private int adjMat[][];
	private int nverts;
	private Stack theStack;
	private Queue theQuene;
	
	public Graph(){
		//顶点数组
		nodelist=new Node[MAX_VERT];
		//邻接矩阵
		adjMat = new int[MAX_VERT][MAX_VERT];
		nverts=0;
		for(int i=0;i&lt;MAX_VERT;i++){
			for(int j=0;j&lt;MAX_VERT;j++){
				adjMat[i][j]=0;
			}
		}
		theStack=new Stack();
		theQuene=new LinkedList();
		sortedArray = new BusSiteBean[MAX_VERT];
	}
	
	/**
	 * 增加一定点
	 * @param node
	 */
	public void addNode(Node node){
		nodelist[nverts++]=node;
	}
	
	/**
	 * 增加一边
	 * @param start
	 * @param end
	 */
	public void addEdge(int start,int end){
		adjMat[start][end]=1;
		//有向图
		//adjMat[end][start]=1;
	}
	
	public int getAdjUnVisited(int v){
		for(int j=0;j&lt;nverts;j++){
			if(adjMat[v][j]==1&amp;&amp;nodelist[j].isWasVisited()==false){
				return j;
			}
		}
		return -1;
	}
	
	/**
	 * 深度优先搜索算法
	 */
	public void dfs(){
		nodelist[0].setWasVisited(true);
		displayNode(0);
		theStack.push(0);
		while(!theStack.isEmpty()){
			int v=((Integer)theStack.peek()).intValue();
			v=getAdjUnVisited(v);
			
			if(v==-1){
				theStack.pop();
			}else{
				nodelist[v].setWasVisited(true);
				displayNode(v);
				theStack.push(v);
			}
		}
		for(int j=0;j&lt;nverts;j++){
			nodelist[j].setWasVisited(false);
		}
	}
	
	/**
	 * 广度优先搜索算法
	 */
	public void bfs(){
		this.nodelist[0].setWasVisited(true);
		this.displayNode(0);
		this.theQuene.add(0);
		int v2;
		while(!this.theQuene.isEmpty()){
			int v1=((Integer)this.theQuene.remove()).intValue();
			while((v2=this.getAdjUnVisited(v1))!=-1){
				this.nodelist[v2].setWasVisited(true);
				displayNode(v2);
				this.theQuene.add(v2);
			}
		}
		for(int j=0;j&lt;nverts;j++){
			nodelist[j].setWasVisited(false);
		}		
	}
	
	private int noSuccessors(){
		boolean isEdge;
		for(int row=0;row&lt;this.nverts;row++){
			isEdge=false;
			for(int col=0;col&lt;this.nverts;col++){
				if(adjMat[row][col]&gt;0){
					isEdge=true;
					break;
				}
			}
			if(!isEdge)
				return row;
		}
		return -1;
	}
	
	/**
	 * 有向图拓扑
	 */
	public void poto(){
		int orig_nverts=this.nverts;
		while(this.nverts&gt;0){
			int currentNode=noSuccessors();
			if(currentNode==-1){
				System.out.println(&quot;Graph 有环&quot;);
				return;
			}
			sortedArray[this.nverts-1]=nodelist[currentNode].getBs();
			deleteNode(currentNode);
		}
		for(int j=0;j&lt;orig_nverts;j++){
			System.out.print(sortedArray[j]);
		}
	}
	
	private void deleteNode(int delVert){
		if(delVert!=this.nverts-1){
			for(int j=delVert;j&lt;this.nverts-1;j++)
				this.nodelist[j]=this.nodelist[j+1];
			for(int row=delVert;row&lt;this.nverts-1;row++)
				moveRowUp(row,this.nverts);
			for(int col=delVert;col&lt;this.nverts-1;col++)
				moveRowLeft(col,this.nverts-1);
		}
		this.nverts--;		
	}
	private void moveRowUp(int row,int length){
		for(int col=0;col&lt;length;col++)
			adjMat[row][col]=adjMat[row+1][col];
	}
	
	private void moveRowLeft(int col,int length){
		for(int row=0;row&lt;length;row++)
			adjMat[row][col]=adjMat[row][col+1];	
	}

	public void displayNode(int v){
		System.out.println(nodelist[v].getBs().toString());
	}
	
	public static void main(String[] args) {
		Graph g=new Graph();
		g.addNode(new Node(new BusSiteBean(&quot;A&quot;)));
		g.addNode(new Node(new BusSiteBean(&quot;B&quot;)));
		g.addNode(new Node(new BusSiteBean(&quot;C&quot;)));
		g.addNode(new Node(new BusSiteBean(&quot;D&quot;)));
		g.addNode(new Node(new BusSiteBean(&quot;E&quot;)));
		g.addNode(new Node(new BusSiteBean(&quot;F&quot;)));
		g.addNode(new Node(new BusSiteBean(&quot;G&quot;)));
		g.addNode(new Node(new BusSiteBean(&quot;H&quot;)));
		
		g.addEdge(0, 3);
		g.addEdge(0, 4);
		g.addEdge(1, 4);
		g.addEdge(2, 5);
		g.addEdge(3, 6);
		g.addEdge(4, 6);
		g.addEdge(5, 7);
		g.addEdge(6, 7);
		
		g.poto();
	}
}</pre>
&nbsp;
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249333" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 13:21:26 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249333</link>
        <guid>http://www.javaeye.com/topic/249333</guid>
      </item>
          <item>
        <title>Java 存取MySQL大文件问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://it-lian.javaeye.com">lian860911</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249036" style="color:red;">http://www.javaeye.com/topic/249036</a>&nbsp;
          发表时间: 2008年10月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          项目中遇到一个问题：关于文件上传下载<br />&nbsp;&nbsp; 需求要求必须文件必须必须写入数据库(<span style="color: red">MySQL</span>)中，并且要支持大文件（字段类型是<span style="color: red">longblob</span>）；<br />&nbsp;&nbsp; <span style="color: red">现在的问题是：</span><br />&nbsp;&nbsp; <span style="color: red">1.上传时候我们把大文件分块在数据库中进行拼接：</span><br /><pre name="code" class="java">
UPDATE t_blob SET LB_A = concat(LB_A, ?) WHERE [condition] //只修改一条记录
</pre><br />.........<br /><pre name="code" class="java">
ps.setBytes(1, buffer);//从流中读取指定长度的字节数组
ps.execute(); 
</pre><br />&nbsp;&nbsp; 这样做到是能实现大文件上传，但是如果分块太小，速度非常慢，巨慢。。。<br />&nbsp;&nbsp; <span style="color: red">2.文件下载的时候始终报Out of memory错误</span><br /><pre name="code" class="java">   select * from t_blob where [condition] //只取了一条记录
   ResultSet rs=ps.executeQuery();//程序在这里出错</pre><br />&nbsp;&nbsp; Mysql的文档上说Blob类型在执行查询时要把全部内容一次取出，这样内存就不够了<br />&nbsp;&nbsp; <span style="font-size: large">请问有没有什么解决办法呢？</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249036" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Oct 2008 11:14:47 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249036</link>
        <guid>http://www.javaeye.com/topic/249036</guid>
      </item>
          <item>
        <title>Hibernate缓存机制</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yuanyao.javaeye.com">yuanyao</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249465" style="color:red;">http://www.javaeye.com/topic/249465</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red">缓存是位于应用程序与物理数据源之间，用于临时存放复制数据的内存区域，目的是为了减少应用程序对物理数据源访问的次数，从而提高应用程序的运行性能.<br />&nbsp; Hibernate在查询数据时，首先到缓存中去查找，如果找到就直接使用，找不到的时候就会从物理数据源中检索，所以，把频繁使用的数据加载到缓存区后，就可以大大减少应用程序对物理数据源的访问，使得程序的运行性能明显的提升.</span><br />&nbsp; <br /> <span style="color: red"> Hibernate缓存分类：</span><br /> <br /> Session缓存，一级缓存.<br /><br /> SessionFactory的缓存分为内置缓存和外置缓存.内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定义SQL语句等),对于应用程序来说,它是只读的.外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备.<br /><br /> <span style="color: red"> Hibernate的缓存范围</span><br /><br /> Hibernate的一级缓存和二级缓存都位于均位于持久层,且均用于存放数据库数据的副本,最大的区别就是缓存的范围各不一样.<br /> <br /> 缓存的范围分为3类:<br /><br /> 1.事务范围<br />&nbsp;&nbsp; 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围.<br /> 2.应用范围<br />&nbsp;&nbsp; 应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围.<br /> 3.集群范围<br />&nbsp;&nbsp; 在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.<br /><br /><span style="color: red">&nbsp; Hibernate的缓存管理</span><br /><br /> <span style="color: blue"> 一级缓存的管理:</span><br /><br />&nbsp; <span style="color: red">evit(Object obj)</span>&nbsp; 将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象.<br />&nbsp; <span style="color: red">clear()</span>&nbsp; 将一级缓存中的所有持久化对象清除,释放其占用的内存资源<br />&nbsp; <span style="color: red">contains(Object obj) </span> 判断指定的对象是否存在于一级缓存中.<br />&nbsp; <span style="color: red"> flush() </span> 刷新一级缓存区的内容,使之与数据库数据保持同步.<br /><br />&nbsp; <span style="color: blue">二级缓存的管理:</span><br />&nbsp;&nbsp; <br />&nbsp;&nbsp; <span style="color: red">evict(Class arg0, Serializable arg1)</span>&nbsp; 将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源.<br />&nbsp;&nbsp; <pre name="code" class="java">sessionFactory.evict(Customer.class, new Integer(1));</pre><br />&nbsp;&nbsp; <span style="color: red">evict(Class arg0)</span>&nbsp; 将指定类的所有持久化对象从二级缓存中清除,释放其占用的内存资源.<br />&nbsp;&nbsp; <pre name="code" class="java">sessionFactory.evict(Customer.class);</pre><br />&nbsp;&nbsp; <span style="color: red">evictCollection(String arg0)</span>&nbsp; 将指定类的所有持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源.<br />&nbsp;&nbsp; <pre name="code" class="java">sessionFactory.evictCollection("Customer.orders");</pre><br /><br /><span style="color: red">Hibernate的二级缓存的配置</span><br /> <br />首先,不是所有的数据都适合放在二级缓存中,看一下,什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来?<br />&nbsp; 下面这几种情况就<span style="color: red">不适合</span>加载到二级缓存中:<br />&nbsp; 1.经常被修改的数据<br />&nbsp; 2.绝对不允许出现并发访问的数据<br />&nbsp; 3.与其他应用共享的数据<br />&nbsp; 下面这己种情况<span style="color: red">合适</span>加载到二级缓存中:<br />&nbsp; 1.数据更新频率低<br />&nbsp; 2.允许偶尔出现并发问题的非重要数据<br />&nbsp; 3.不会被并发访问的数据<br />&nbsp; 4.常量数据<br />&nbsp; 5.不会被第三方修改的数据<br /><br />Hibernate的二级缓存功能是靠配置二级缓存插件来实现的,Hibernate为了集成这些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充当缓存插件与Hibernate之间的适配器 .<br /><br />常用的二级缓存插件<br />EHCache&nbsp; org.hibernate.cache.EhCacheProvider<br />OSCache&nbsp; org.hibernate.cache.OSCacheProvider<br />SwarmCahe&nbsp; org.hibernate.cache.SwarmCacheProvider<br />JBossCache&nbsp; org.hibernate.cache.TreeCacheProvider<br /><br />简单介绍一下EHCache的配置<br />hibernate.cfg.xml<br /> <pre name="code" class="xml"> &lt;hibernate-configuration>
    &lt;session-factory>
       &lt;!-- 设置二级缓存插件EHCache的Provider类-->
       &lt;property name="hibernate.cache.provider_class">
          org.hibernate.cache.EhCacheProvider
       &lt;/property>
       &lt;!-- 启动"查询缓存" -->
       &lt;property name="hibernate.cache.use_query_cache">
          true
       &lt;/property>
    &lt;/session-factory>
  &lt;/hibernate-configuration></pre><br /><br />ehcache.xml<br /><br /><pre name="code" class="xml">&lt;ehcache>
  &lt;!-- maxElementsInMemory为缓存对象的最大数目, eternal设置是否永远不过期,timeToIdleSeconds对象处于空闲状态的最多秒数,timeToLiveSeconds对象处于缓存状态的最多秒数 -->
  &lt;diskStore path="java.io.tmpdir"/>
    &lt;defaultCache maxElementsInMemory="10000" eternal="false"  timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>
&lt;/ehcache>
</pre><br /><br />****.hbm.xml<br /><br /><pre name="code" class="xml">&lt;?xml version="1.0" encoding='UTF-8'?>
&lt;!DOCTYPE hibernate-mapping PUBLIC
                            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

&lt;hibernate-mapping>
     
   &lt;class>
       &lt;!-- 设置该持久化类的二级缓存并发访问策略 read-only read-write nonstrict-read-write transactional-->
       &lt;cache usage="read-write"/>    
   &lt;/class>

&lt;/hibernate-mapping>
</pre><br /><br />最近用上了,看看了,有什么不妥的地方,多谢指出.
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249465" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 16:29:32 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249465</link>
        <guid>http://www.javaeye.com/topic/249465</guid>
      </item>
          <item>
        <title>HTML&amp; Oracle特殊(敏感)字符处理</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chhj-292.javaeye.com">chhj_292</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249478" style="color:red;">http://www.javaeye.com/topic/249478</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: medium;"><strong>问题描述：</strong></span></p>
<p>&nbsp;&nbsp;&nbsp; 做BS开发，免不了B/S交互，免不了接受客户端输入的各种字符，包括敏感字符（如：&lt;script type="text/javascript"&gt;alert("如果你没有屏蔽我，那可就危险了哦！");&lt;/script&gt;）。这就是敏感字符，如果页面的输出（或者客户端输入，要看具体项目，具体情况而行）没有进行处理，那么*&hellip;&hellip;*&hellip;&hellip;*&hellip;&hellip;&middot;￥*#&hellip;&hellip;*！！&middot;&middot;！...，大家都知道会发生什么情况。</p>
<p><span style="font-size: medium;"><strong>解决：</strong></span></p>
<p>&nbsp;&nbsp; 单个字符串的处理可能大家都有自己的一套，但是如果处理的参数是一个对象的，需要把对象里的字符串属性中的敏感字符用自定义的字符替换的话可能就不是那么方便了，我现在提供的方法就是包含了上述两种处理方式。</p>
<p>&nbsp;&nbsp;&nbsp; HtmlConverter继承一个抽象类（共有的初步实现）和一个接口（面对程序员的接口），中包含两个成员变量、方法和一个静态内部类（为什么使用<strong>私有静态内部类</strong>，大家可以查看其他方面的资料，不在赘述。）</p>
<p>&nbsp;&nbsp;&nbsp; OracleConverter和HtmlConverter类似，不在赘述。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; ----单例对象（参数：当通过第归处理对象中包含的敏感字符时，指定的第归的层数，用于目标对象中的属性也是自定义数据类型的情况）</p>
<p>&nbsp;&nbsp;&nbsp; ----默认递归两层，如果不能满足要求，还有一个构造函数可以使用，不过最大注意其抛出的异常。</p>
<p>&nbsp;&nbsp;&nbsp; private final static AbsConverter&nbsp;&nbsp;&nbsp; converter&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; = new HtmlConverter(2);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; ----静态内部类，静态内部类中包含了所有html敏感字符，可以将敏感字符进行替换后在jsp获取其他客户端输出。</p>
<p>&nbsp;&nbsp;&nbsp; ----该静态内部类继承了一个回调借口。至于其用途和其他地方的回调类似，作用也一样。<br />&nbsp;&nbsp;&nbsp; private static ICallbackEncoder&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; callbackEncoder&nbsp;&nbsp;&nbsp; = new CallbackEncoder();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; ----处理对象中属性的敏感字符。ignoreProperties表示需要忽略的属性。</p>
<p>&nbsp;&nbsp;&nbsp; public Object encoding(Object obj, String[] ignoreProperties)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throws InstantiationException, IllegalAccessException,<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InvocationTargetException, IntrospectionException,<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; NullPointerException, ClassNotFoundException {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return super.encoding(obj, ignoreProperties, callbackEncoder);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; ----处理单个字符串中的敏感字符</p>
<p>&nbsp;&nbsp;&nbsp; public String encoding(String _src) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (String) super.encoding(_src, callbackEncoder);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; 代码如下：</p>
<pre name="code" class="java">/**
 * Copyright 2007 pantosoft. All rights reserved.
 */

package com.pantosoft.cmsnj.utils.converter;

import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;

/**
 * standard interface.
 * @author Cheng 2008-9-3 上午11:26:49
 * @version 1.0.0
 */
public interface IConverter {
	/**
	 * 
	 * @param _src
	 * @return
	 */
	public abstract Object encoding(String _src);

	/**
	 * 
	 * @param obj
	 * @param ignoreProperties
	 * @return
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws IntrospectionException
	 * @throws NullPointerException
	 * @throws ClassNotFoundException
	 */
	public abstract Object encoding(Object obj, String[] ignoreProperties)
			throws InstantiationException, IllegalAccessException,
			InvocationTargetException, IntrospectionException,
			NullPointerException, ClassNotFoundException;

}
</pre>
&nbsp;
<pre name="code" class="java">/**
 * Copyright 2008 pantosoft. All rights reserved.
 */

package com.pantosoft.cmsnj.utils.converter;

import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;

import com.pantosoft.cmsnj.utils.converter.callback.ICallbackEncoder;

/**
 * 
 * @author Cheng 2008-9-3 下午01:38:41
 * @version 1.0.0
 */
public class HtmlConverter extends AbsConverter implements IConverter {
	private final static AbsConverter	converter		= new HtmlConverter(2);
	private static ICallbackEncoder		callbackEncoder	= new CallbackEncoder();

	/**
	 * return a default unmodifiable html converter to convert invalid characters to html characters, and the default loop depth is 2.
	 * 
	 * @return
	 */
	public static AbsConverter getInstance() {
		return converter;
	}

	/**
	 * return a user-defined modifiable and specified depth of loop html converter
	 * @param depth loop depth.
	 */
	public HtmlConverter(int depth) {
		if (depth &lt; 1 || depth &gt; 5)
			throw new IllegalArgumentException(
					"the arguments of 'depth' must betwen 1 and 5");
		else
			this.defaultDepth = depth;
	}

	/*
	 * (non-Javadoc)
	 * @see com.pantosoft.edu.utils.converter.IConverter#encoding(java.lang.Object, java.lang.String[])
	 */
	public Object encoding(Object obj, String[] ignoreProperties)
			throws InstantiationException, IllegalAccessException,
			InvocationTargetException, IntrospectionException,
			NullPointerException, ClassNotFoundException {
		return super.encoding(obj, ignoreProperties, callbackEncoder);
	}

	/*
	 * (non-Javadoc)
	 * @see com.pantosoft.edu.utils.converter.IConverter#encoding(java.lang.String)
	 */
	public String encoding(String _src) {
		return (String) super.encoding(_src, callbackEncoder);
	}

	/**
	 * 
	 * @author Cheng 2008-10-6 下午04:11:16
	 * @version 1.0.0
	 */
	private static class CallbackEncoder implements ICallbackEncoder {
		public String convert(String _src) throws NullPointerException {
			if (_src == null)
				throw new NullPointerException(
						"value of parameter '_src' is null.");
			StringBuilder result = new StringBuilder();
			if (_src != null) {
				_src = _src.trim();
				for (int pos = 0; pos &lt; _src.length(); pos++) {
					switch (_src.charAt(pos)) {
						case '\"':
							result.append(""");
							break;
						case '&lt;':
							result.append("&lt;");
							break;
						case '&gt;':
							result.append("&gt;");
							break;
						case '\'':
							result.append("'");
							break;
						case '&amp;':
							result.append("&amp;");
							break;
						case '%':
							result.append("&amp;pc;");
							break;
						case '_':
							result.append("&amp;ul;");
							break;
						case '#':
							result.append("&amp;shap;");
							break;
						case '?':
							result.append("&amp;ques;");
							break;
						default:
							result.append(_src.charAt(pos));
							break;
					}
				}
			}
			return result.toString();
		}
	}
}
</pre>
<p>
<strong><span style="font-size: medium;">&nbsp;
说明：</span></strong></p>
<p>　　　　其实这种敏感字符的解决方法很多而且前人已早有实现，我这里提供的这种方法无非是自己为了减轻自己的工作量而实现的一种方法，我是做教育系统的开发的，一般按照GB一个学生的直接属性有大概50种，而且又不得不在一个JSP上展示，所以我就干脆将得到的学生对象一次性处理。</p>
<p>&nbsp;</p>
<p><strong>　　　　懒惰，也不失一种写代码的艺术。</strong></p>
<p>　　　　代码全部打包上传，欢迎大家批评指正，不过都有Copyright（版权）和@author（作者）的，大家修改代码和转载的时候务必保留这些信息。</p>
<p>　　　　最近发现此地气氛很浮躁，到处都是喷水的。大家还是静下心来做事情吧。</p>
<p>　　　　代码注释较少，但是必要的注释还是都有的，不明白的可以在这里提问，相互学习。</p>
<p>　　　　<strong>在开源的世界里，我们喜欢更多的源码。</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249478" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 16:57:03 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249478</link>
        <guid>http://www.javaeye.com/topic/249478</guid>
      </item>
          <item>
        <title>有关jaxb2的问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanfengzxh.javaeye.com">hanfengzxh</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249450" style="color:red;">http://www.javaeye.com/topic/249450</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          请问pojo类的setter方法和getter方法是不是不能共存？<br />我同时加上setter和getter方法会报错？<br />请问是什么原因，如何解决？
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249450" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 16:04:52 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249450</link>
        <guid>http://www.javaeye.com/topic/249450</guid>
      </item>
          <item>
        <title>jstl&lt;c:forTokens&gt;问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xiaolong014.javaeye.com">xiaolong014</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249418" style="color:red;">http://www.javaeye.com/topic/249418</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          The method setItems(String) in the type ForTokensTag is not applicable for the arguments (Object)<br />350:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr ><br />351:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="hotelblue">最晚抵达时间：&lt;/td><br />352:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td>&lt;select name="leaveTime" id="leaveTime" onchange="checkTime();" value="${leaveTime}"><br />353:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:forTokens items="00:00,01:00,02:00,03:00,04:00,05:00,06:00,07:00,08:00,09:00,10:00,11:00,12:00,13:00,14:00,15:00,16:00,17:00,18:00,19:00,20:00,21:00,22:00,23:00" delims="," var="hh">	&lt;c:choose><br />354: 			&lt;c:when test="${leaveTime==''||leaveTime==null||leaveTime=='null'||leaveTime=='00:00'}"><br />355: 			&lt;c:if test="${hh=='18:00'}"><br />356: 			&lt;option value="${hh}" selected="selected">${hh}&lt;/option><br /><br /><br />Stacktrace:<br />	com.opensymphony.webwork.dispatcher.DispatcherUtils.serviceAction(DispatcherUtils.java:236)<br />	com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:111)<br />	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br />	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249418" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 15:25:11 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249418</link>
        <guid>http://www.javaeye.com/topic/249418</guid>
      </item>
          <item>
        <title>防止表单重复提交</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://luojiy.javaeye.com">luojiy</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248703" style="color:red;">http://www.javaeye.com/topic/248703</a>&nbsp;
          发表时间: 2008年10月03日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          jsp 页面:<br /><pre name="code" class="java">
  &lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
&lt;%@ taglib prefix="s" uri="/struts-tags" %>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
    &lt;title>
    &lt;s:if test="null == web">
            新增页面
        &lt;/s:if>
        &lt;s:else>
            更新页面
        &lt;/s:else>
    &lt;/title>
    &lt;s:head theme="xhtml"/>
  &lt;/head>
   &lt;body>
    &lt;center>
     	&lt;h3>
       &lt;s:if test="null == web">
            新增页面
        &lt;/s:if>
        &lt;s:else>
            更新页面
        &lt;/s:else>
        &lt;/h3>
    &lt;s:form method="post" action="add">
     	&lt;s:hidden name="web.id"  label="ID号"  theme="xhtml"/>&lt;br>
     	&lt;s:textfield name="web.web" label="别名"  theme="xhtml"/>&lt;br>
     	&lt;s:textfield name="web.webname" label="对应的网页"  theme="xhtml"/>&lt;br>
     	&lt;tr>&lt;td>&lt;/td>&lt;td align="center">&lt;input name="cancle" type="button" onclick="javascript:history.go(-1)" value="返回" />
     	 &lt;input type="submit" name="submit" value="提交" />&lt;/td>&lt;/tr>
      
 &lt;s:token />

     	&lt;/s:form>
    &lt;/center>
  &lt;/body>
&lt;/html>
</pre><br /><br />只要在JSP页面中表单中放&lt;s:token />这样的标签就行了。<br /><br />struts.xml配置<br /><br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8" ?>
&lt;!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
  &lt;constant name="struts.i18n.encoding" value="utf-8" /> 
    &lt;package name="test" extends="struts-default" >
 &lt;interceptors>
  &lt;interceptor-stack name="to">
   &lt;interceptor-ref name="defaultStack">&lt;/interceptor-ref>
   &lt;interceptor-ref name="token">&lt;/interceptor-ref>
  &lt;/interceptor-stack>
&lt;/interceptors>
&lt;action name="add" class="action.TestAction" method="add">
            &lt;result name="success">/success.jsp&lt;/result>
            &lt;result name="error">error.jsp&lt;/result>
            &lt;result name="invalid.token">/tokenerror.jsp&lt;/result>
            &lt;interceptor-ref name="to">&lt;/interceptor-ref>
&lt;/action>
   &lt;/package>
&lt;/struts>
</pre><br />这样就可以实现防止表单重新提交
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248703" style="color:red;">已有 <strong>3</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 03 Oct 2008 17:39:39 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248703</link>
        <guid>http://www.javaeye.com/topic/248703</guid>
      </item>
          <item>
        <title>JSF </title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://goddaughter.javaeye.com">GODdaughter</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249214" style="color:red;">http://www.javaeye.com/topic/249214</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近几天在学习JSF相关的一些知识，在朦胧的学习过程中遇到了一些问题，希望大家多多帮助，我遇到了下面的问题：<br /><br />因为我是用JSF做一个简单的操作数据库的小程序，当我查出了所有的数据库信息后，就要通过链接的形式进行编辑的操作，由于JSF没有自己的迭代标签，但是我在网上查到了，那个高手说，用c标签就可以，但是用c标签的同时不可以用jsf标签，所以在操作链接的时候只能是用jsp的a标签来写：&lt;a href="updateUser.faces?userID=&lt;%=userID%>">&lt;/a>，我的一个朋友帮我看了一下，然后进行了一些相关的测试，结果在BackingBean中得到了userID的信息（他在faces.config.xml中有对userID范围的配置，在BackingBean中也有userID属性的getter,setter方法),但是我就是不知道jsf是如何调用到BackingBean里去的，也不知道他怎么调用jsf配置文件里面的相应的信息的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249214" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 09:52:35 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249214</link>
        <guid>http://www.javaeye.com/topic/249214</guid>
      </item>
          <item>
        <title>How does WAS connect to MQ?</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tomshen.javaeye.com">excuse</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249287" style="color:red;">http://www.javaeye.com/topic/249287</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Steps of how WAS connects to MQ:</p>
<p>1.configure MQ</p>
<p>2.configure WAS</p>
<p>3.write Java web project</p>
<p>&nbsp;</p>
<p>pls download the attachment for detailed example</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249287" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 12:06:39 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249287</link>
        <guid>http://www.javaeye.com/topic/249287</guid>
      </item>
          <item>
        <title>当设计脱离了统一建模，设计就一钱不值？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bloodrate.javaeye.com">bloodrate</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249268" style="color:red;">http://www.javaeye.com/topic/249268</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          老生常谈的问题，假设一种场景：<br />“在写代码，写着写着，突然发现这里用的类有可能发生变化，有可能被改变，有可能被其他类所替换，搜索了脑海里关于设计模式学习的所有资料，翻出了工厂模式，将来替换这个类只需要定义接口，然后在工厂中返回另外一个类而不用满世界寻找需要在哪里替换”，OK，prefect work，程序很好的工作，可是这仍然是程序员式的思维，虽然你灵活运用了工厂解决了问题，并不代表对设计模式有什么见地或者更深的了解，因为缺乏严格建模论证。<br /><br />考虑两个类： 人（people），苹果（apple），人有一个行为是吃苹果，那么是应该给人增加吃苹果的行为还是应该给苹果增加被人吃的行为还是二者都要？？如果是人增加吃苹果的行为，是应该people.eat(apple)还是应该people.setFood(apple);people.eat();我想一般不通过严格建模而写的苹果类就像我在写代码遇到需要用苹果的时候增加了苹果类，那么我看不出来，想当然“这能有什么区别？只是people.eat(apple)看起来舒服一些，就用它”，但其实根据产品真实环境，对环境和需求进行分析，也许people.eat(apple)还是people.setFood(apple);people.eat();还是apple.beEat(eater)有着严格的区别和各自的意义。<br /><br />在考虑分层和职责分配问题，这个是最令人头疼和confuse的，如果写一个业务bean，同时想给他提供一些辅助措施，是应该在bean里增加呢，还是应该单独写一个beanHelper类呢？（如果没有通过统一的建模，就像我常常作的一样，我就会片面觉得这是个无所谓的事情，我看不出单写个beanHelper有什么必要）。我的理解就是系统每分的一层都是有其必须存在的意义的，这个意义是从客观现实需求中提取分析出来，如果写一个层次说不出他的意义（比如这个层解决了谁于谁之间的偶合或者这个层次确保了某两个物件之间能够互不干扰的独立演化）那就是没必要的。<br /><br />初看别人代码的时候，最大的难题有两个：<br />1、总是看不出这样分层的意义是什么，比如将这个类与职责分离到底解决了什么耦合问题<br />2、看不出定义的一些变量的含义，如果数据能清楚，方法围绕数据，自然很容易看懂<br /><br />通过好的建模写出来的程序，总是能指导人最快的找到分层的出路。。。。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249268" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 11:20:13 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249268</link>
        <guid>http://www.javaeye.com/topic/249268</guid>
      </item>
          <item>
        <title>Domain-Driven Design的Entity问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lonelybug.javaeye.com">lonelybug</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249167" style="color:red;">http://www.javaeye.com/topic/249167</a>&nbsp;
          发表时间: 2008年10月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我个人认为，一般DDD中的Entity也就表现的是数据库中的一个table或者是一个在内存中的存储对象，不应该包含复杂的逻辑关系，因为本身数据库的表也只是用来维护Relationship而没有任何关于计算和逻辑的表现。<br /><br />也许有人说不应该从数据库出发来解释OOP设计思想，不过，我觉得，这是有关联的，本身OOP中的对象，有一部分属于对象就是要影射在数据问题上，比如果一个银行系统里面的帐户account他只是表现的一个虚拟的信息，而一个用户customer会有多个account，这两个对象就是用来维护之间的关系，表达整个银行系统中的一个真实世界的人所拥有在这个银行系统中的帐户关系，别无其它。<br /><br />计算机程序设计的基本的原则就是用计算机来表达现实世界中的事情和问题。所以，我们可以用现实世界的角度来分析为什么Entity只需要简单得set/get方法，或者一些对象自身行为（不是那种逻辑行为）。<br /><br />还是以银行为例，在银行系统中，customer代表了一个储户，那么他有多个account，那么影射在现实世界中，customer只是一个人，而这个人在现实世界中是没有相关操作银行帐户的能力，而只是把这个人放在了不同的context中，才会有相应的能力，所以说一个人所得到的相关能力和行为是在不同的领域里面被（这里是被动）赋予的，举个简单的例子，在银行系统中，一个人是一个储户，它可以存钱，取钱，那么，同样的一个人在他平时的工作单位的系统中是一个manager，那么他就有察看员工记录和管理的相关行为，这个人本身如果脱离了这两个context那么他就失去了相应的行为，所以这些行为与这个人的关系不是高度偶尔的，那么如果你在设计一个系统的时候非要把这些相应的行为与这个人在这个系统中的表现对象entity高度联系在一起，那么就违反了相关的OOP设计原则。<br /><br />所以说，一个entity本身的行为是单纯的，这种单纯不是说行为的过程，而是说这个行为在计算机中的被表现方式就是简单得。而他能具有的一些方法和行为，是因为在这个context中，才会拥有，一旦脱离，就不会拥有。那么这些行为是一种service，使这个系统的本身提供给这个entity的，而不是说反过来entity本身带有这种行为。这个是一个关键的用计算机程序描述现实世界问题的原则。<br /><br />有人说account怎么办,account也是entity，你不能把取款，存款，给他，它本身是一种DDD中所描述的，一连串可标识的信息对象，那么根据这个理论，account对应整个银行是一个现实世界中的对象，而相关account要所设计的域domain就是具体的系统的context，那么继而，一个account在银行系统中（这里的角度是银行系统对account来说是一个现实世界），进入不同的域就会被提供不同的方法，比如，进入银行信贷域，那么他就有贷款，分期，利息，信誉度调查等，而进入银行的保险域，那么他就有指定保单，撤销保单等等的行为，而离开这些domain那么他就是单纯的account，所以他也跟customer一样，被相关域domain中的service所服务。<br /><br /><br />说到这里，我并没有说要说服任何人去改变自己理解一个系统设计的或者一个实现方法的方式，因为软件工程，设计模式本身就是一种非常抽象思维的东西，我写的这些只是想提供一种考虑和思维的方式来帮助自己也其他人去更容易的理解，也许有的人用其它的方式更容易理解，者都不一定。<br /><br />也希望，大家更多的是实践，而产生理论，不要因为理论而理论，这是很乏味，无用，也很浪费时间的一种学习方式。<br />当你编写100行代码，1000，1万，100万，那么你就能有不一样的理解和理论产生。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249167" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Oct 2008 23:23:54 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249167</link>
        <guid>http://www.javaeye.com/topic/249167</guid>
      </item>
          <item>
        <title>使用json-rpc实现delphi+java异构语言RPC调用</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://greatewei.javaeye.com">greateWei</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248813" style="color:red;">http://www.javaeye.com/topic/248813</a>&nbsp;
          发表时间: 2008年10月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>之前论坛中有讨论到采用&ldquo;<a href="../../../topic/2397" title="客户端用delphi写，服务器端用java写">客户端用delphi写，服务器端用java写</a>&rdquo;的异构语言方案，当中曾提出采用soap、corba、xml-rpc等方式实现两种开发语言间的数据交换和远程方法调用，其中 一蓑烟雨任平生 曾提议就以下方面展开论题</p>
<div class="quote_title">一蓑烟雨任平生 写道</div>
<div class="quote_div">我们能否这样展开话题：<br />客户端通过XMLHTTP进行请求处理的技术；<br />客户端和服务器端传递的数据格式；<br />如何处理上下文信息；<br />如何设计服务器端的接口；<br />如何利用XML数据源进行客户端数据处理等等；</div>
<p>&nbsp;</p>
<p>在实际开发过程中，我曾使用socket+自定义报文格式、xml-rpc、soap等方式实现delphi客户端调用java远程接口，但总的来说，上述方式都存在明显的局限性</p>
<ul>
<li>socket+自定义报文格式：虽然在性能上报文解析明显要好于xml，但要实现复杂对象基于报文格式的序列化还是有很多局限性(当初到后来采用了xml+报文混合方式，复杂对象使用xml序列化，并以报文方式传递给客户端)，同时在实际开发过程中发现，由于采用私有的实现方式，框架说明文档欠缺、开发技术力量有限等因素，新人学习和框架不断维护升级也是不小的工作量；</li>
<li>之后采用xml-rpc方式来实现delphi+java rpc调用，对于数据交换频率低、一次性大数据量同步此方式是不错的选择，但是对于频繁的业务方法调用、大数据量查询统计等应用，存在一个明显的问题：xml解析性能问题，特别是delphi端xml解析非常耗资源，并且非常慢；为了解决xml解析性能问题，考虑采用了数据分页返回方式来实现，这样一来性能问题只是部分缓解，同时也带来了不必要的开发工作量；</li>
<li>至于soap，除了有好的工具支持外，开发复杂性、性能等都是存在问题的；做了一组测试后就放弃了；</li>
</ul>
<p>在最近的开发过程中，无意中发现json其实不错的数据交换方案。</p>
<p>&nbsp;</p>
<p>Delphi和Java使用json格式交换数据，采用HTTP协议，可结合安全套接字实现交换数据安全性，服务器端通过json-rpc方式export远程调用接口，结合delphi indy session控件实现cookie机制。</p>
<p>&nbsp;</p>
<p>通过初次尝试，在性能方面基本上没有明显的问题，特别是大容量数据交换性能表现不错，目前Java端使用<a href="http://www.jabsorb.org" title="jabsorb">jabsorb</a> 实现框架，Delphi端使用<a href="http://www.progdigy.com/?page_id=6" title="JSON Toolkit">JSON Toolkit </a>实现框架，比较之前方案，个人觉得在以下方面得到了改进：</p>
<ul>
<li>java端对象-json间的序列化/反序列化可以不需要编写任何代码，jabsorb框架可以自动的处理对象序列化；但是delphi需要根据java端的序列化情况还是需要手工编写相应的序列化代码；不过相比较xml-rpc、自定义报文方式，还是减少了一半工作量；</li>
<li>json和json-rpc规范相当简单(xml-rpc也是非常简单的)，新人入门学习看了官方文档基本可以理解，比我自己编写相比较，简洁明了，容易理解；</li>
<li>性能表现不错，基本上1、2万条记录传递、解析在2～3秒钟时间可以完成；</li>
<li>delphi端调用java端远程服务接口比较直观，参考xml-rpc实现，针对JSON Toolkit稍作封装即可；</li>
</ul>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248813" style="color:red;">已有 <strong>3</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 04 Oct 2008 10:42:43 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248813</link>
        <guid>http://www.javaeye.com/topic/248813</guid>
      </item>
          <item>
        <title>struts2入门:登录的小例子,用户名和密码指定</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://daydaystudy.javaeye.com">逆风逛飙</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249038" style="color:red;">http://www.javaeye.com/topic/249038</a>&nbsp;
          发表时间: 2008年10月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          登录页面login.jsp代码:<br /><pre name="code" class="java">
&lt;%@ page language="java" pageEncoding="utf-8"%>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
&lt;head>
&lt;/head>
&lt;body>
&lt;form action="login.action" method="post">
	username:&lt;input type="text"	name="username"/> 
	password:&lt;input type="password" name="password"/>
	&lt;input type="submit" value="submit"/>
&lt;/form>
&lt;/body>
&lt;/html>
</pre><br />登录成功页面success.jsp代码:<br /><pre name="code" class="java">
&lt;%@ page language="java"  pageEncoding="utf-8"%>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
  &lt;/head>
    &lt;body>
    欢迎${requestScope.username}登陆
  &lt;/body>
&lt;/html>
</pre><br />登录失败页面fail.jsp代码:<br /><pre name="code" class="java">
&lt;%@ page language="java" pageEncoding="utf-8"%>

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
  &lt;/head>
  &lt;body>
  用户名或密码错误 &lt;br>
  &lt;/body>
&lt;/html>

</pre><br />action代码:<br /><pre name="code" class="java">
package com.lhtwqh.action;

public class LoginAction {
	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String execute() throws Exception {
		if (this.username.equals("admin") && this.password.equals("admin")) {
			return "success";
		} else {
			return "fail";
		}
	}
}
</pre><br /><br />web.xml配置代码:<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	&lt;filter>
		&lt;filter-name>struts2&lt;/filter-name>
		&lt;filter-class>
			org.apache.struts2.dispatcher.FilterDispatcher
		&lt;/filter-class>
	&lt;/filter>
	&lt;filter-mapping>
		&lt;filter-name>struts2&lt;/filter-name>
		&lt;url-pattern>/*&lt;/url-pattern>
	&lt;/filter-mapping>
&lt;/web-app>
</pre><br /><br />struts2配置文件struts.xml配置代码:<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8" ?>
&lt;!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
   &lt;package name="struts2" extends="struts-default">
	&lt;action name="login" class="com.lhtwqh.action.LoginAction">
	    &lt;result name="success">/success.jsp&lt;/result>
	    &lt;result name="fail">/fail.jsp&lt;/result>
	&lt;/action>
   &lt;/package>
&lt;/struts>
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249038" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Oct 2008 11:33:34 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249038</link>
        <guid>http://www.javaeye.com/topic/249038</guid>
      </item>
          <item>
        <title>有没有什么工具可以把EJB3中的annotations提取到ejb-jar.xml中啊？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gzhw.javaeye.com">gzhw</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248910" style="color:red;">http://www.javaeye.com/topic/248910</a>&nbsp;
          发表时间: 2008年10月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          EJB3中的annotations在开发的时候的确很方便，可以显著提高效率，可是为了以后的部署和维护，我觉得还是Xml的描述符直观（可<br /><br />以不接触源代码），修改也方便。<br /><br />所以我想开发时用annotations，定型了以后可以把EJB3中的annotations提取到ejb-jar.xml中。<br /><br />不知有没有这样的工具？？
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248910" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 04 Oct 2008 18:34:48 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248910</link>
        <guid>http://www.javaeye.com/topic/248910</guid>
      </item>
          <item>
        <title>j2me怎么做画面跳转</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://juansusan.javaeye.com">juansusan</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248658" style="color:red;">http://www.javaeye.com/topic/248658</a>&nbsp;
          发表时间: 2008年10月03日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先确定Form上添加Item还是addCommand(Command c)。 <br /><br />1.如果是前者，在这个Form上实现一个ItemCommandListener接口，然后做一个select按钮，再对每个Item调用setDefaultCommand(select)和setItemCommandListener(this);最后在实现接口时自动跳出来的itemCommandAction(Command command, Item item)函数内，根据item来决定跳转的界面。跳转通过Display类的setCurrent(Displayable d)来实现。 <br />2.如果是后者，首先要实现一个CommandListener接口，然后用addCommand(Command c)添加按钮。再在commandAction(Command command, Displayable d)里，根据command来决定应该setCurrent到哪个界面
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248658" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 03 Oct 2008 11:57:30 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248658</link>
        <guid>http://www.javaeye.com/topic/248658</guid>
      </item>
          <item>
        <title>比较两种处理业务对象的方法的优劣</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://frenchmay.javaeye.com">frenchmay</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248733" style="color:red;">http://www.javaeye.com/topic/248733</a>&nbsp;
          发表时间: 2008年10月03日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Command 是一个封装了命令的请求和响应内容的业务对象，澄清一点这里并不是指的是command模式。<br />doDispatch方法根据Command内的请求信息获得相应的响应信息。<br />这里是使用返回一个新建值对象好呢还是对象引用好呢。<br />希望大家由由代码的优雅和维护性角度来看待这个问题。<br />貌似DDD这本书里面很推荐两种备选方案中的一种，不过想听听大家的意见。<br /><br />public Command doDispatch(Command command) ;<br /><br /><br />public void doDispatch(Command command) ；
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248733" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 03 Oct 2008 21:58:26 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248733</link>
        <guid>http://www.javaeye.com/topic/248733</guid>
      </item>
          <item>
        <title>jms和jboss完美实例</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linres.javaeye.com">hulin</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248829" style="color:red;">http://www.javaeye.com/topic/248829</a>&nbsp;
          发表时间: 2008年10月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近完成个项目是用到jms的，现在把原码和配置一一说明和大家分享！<br />&nbsp; 准备:myeclipse5.5+jdk1.5+JBoss 4.0.1<br />&nbsp; <br />1.导入jms.jar文件,消息发送类<br />package com.test.common.msg;<br /><br />import java.io.Serializable;<br />import java.util.Properties;<br />import javax.jms.Message;<br />import javax.jms.MessageListener;<br />import javax.jms.ObjectMessage;<br />import javax.jms.Session;<br />import javax.jms.TextMessage;<br />import javax.jms.Topic;<br />import javax.jms.TopicConnection;<br />import javax.jms.TopicConnectionFactory;<br />import javax.jms.TopicPublisher;<br />import javax.jms.TopicSession;<br />import javax.naming.Context;<br />import javax.naming.InitialContext;<br />import javax.jms.DeliveryMode;<br /><br /><br />public class MsgSender implements MessageListener {<br />	private static Context context = null;<br /><br />	private boolean transacted = false;<br /><br />	private int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;<br /><br />	private TopicConnectionFactory topicConnectionFactory = null;<br /><br />	private static TopicConnection topicConnection = null;<br /><br />	private TopicSession topicSession = null;<br /><br />	private TopicPublisher topicPublisher = null;<br /><br />	private Topic topic = null;<br /><br />	private String topicConnectionFactoryName = null;<br /><br />	private String publishTopicName = "topic/OPER_MSG";<br /><br />	private String subscribeTopicName = null;<br /><br />	private String clientId = null;<br /><br />	private String durableName = "";<br /><br />	private boolean durable = false;<br /><br />	private String provider_url = null;<br /><br />	private static MsgSender _instance = null;<br /><br />	/**<br />	 * 构造函数<br />	 */<br />	private MsgSender() {<br />		provider_url = "jnp://127.0.0.1" + ":1099";<br />	}<br /><br />	synchronized static public MsgSender instance() {<br />		if (null == _instance) {<br />			_instance = new MsgSender();<br />		}<br />		return _instance;<br />	}<br /><br />	public void init(String serverIP) {<br />		provider_url = "jnp://" + serverIP + ":1099";<br />	}<br /><br />	public boolean isTransacted() {<br />		return transacted;<br />	}<br /><br />	public void setTransacted(boolean transacted) {<br />		this.transacted = transacted;<br />	}<br /><br />	public int getAcknowledgementMode() {<br />		return acknowledgementMode;<br />	}<br /><br />	public void setAcknowledgementMode(int acknowledgementMode) {<br />		this.acknowledgementMode = acknowledgementMode;<br />	}<br /><br />	public String getTopicConnectionFactoryName() {<br />		return topicConnectionFactoryName;<br />	}<br /><br />	public void setTopicConnectionFactoryName(String topicConnectionFactoryName) {<br />		this.topicConnectionFactoryName = topicConnectionFactoryName;<br />	}<br /><br />	public String getPublishTopicName() {<br />		return publishTopicName;<br />	}<br /><br />	public void setPublishTopicName(String publishTopicName) {<br />		this.publishTopicName = publishTopicName;<br />	}<br /><br />	public String getSubscribeTopicName() {<br />		return subscribeTopicName;<br />	}<br /><br />	public void setSubscribeTopicName(String subscribeTopicName) {<br />		this.subscribeTopicName = subscribeTopicName;<br />	}<br /><br />	public String getClientId() {<br />		return clientId;<br />	}<br /><br />	public void setClientId(String clientId) {<br />		this.clientId = clientId;<br />	}<br /><br />	public String getDurableName() {<br />		return durableName;<br />	}<br /><br />	public void setDurableName(String durableName) {<br />		this.durableName = durableName;<br />	}<br /><br />	public boolean isDurable() {<br />		return durable;<br />	}<br /><br />	public void setDurable(boolean durable) {<br />		this.durable = durable;<br />	}<br /><br />	private Context getInitialContext() throws Exception {<br />		Properties properties = null;<br />		try {<br /><br />			properties = new Properties();<br />			properties.put(Context.INITIAL_CONTEXT_FACTORY,<br />					"org.jnp.interfaces.NamingContextFactory");<br />			properties.put(Context.URL_PKG_PREFIXES,<br />					"org.jboss.naming:org.jnp.interfaces");<br />			properties.put(Context.PROVIDER_URL, provider_url);<br /><br />			return new InitialContext(properties);<br />		} catch (Exception e) {<br />			throw e;<br />		}<br />	}<br /><br />	private Context getContext() throws Exception {<br />		if (context == null) {<br />			try {<br />				context = getInitialContext();<br />			} catch (Exception ex) {<br />				throw ex;<br />			}<br />		}<br />		return context;<br />	}<br /><br />	public TopicConnectionFactory getTopicConnectionFactory() throws Exception {<br />		if (topicConnectionFactory == null) {<br />			Object obj = getContext().lookup("ConnectionFactory");<br />			topicConnectionFactory = (TopicConnectionFactory) obj;<br />		}<br />		return topicConnectionFactory;<br />	}<br /><br />	public TopicConnection getTopicConnection(boolean consumer)<br />			throws Exception {<br />		if (topicConnection == null) {<br />			topicConnection = getTopicConnectionFactory()<br />					.createTopicConnection();<br />			topicConnection.start();<br />		}<br />		return topicConnection;<br />	}<br /><br />	public TopicConnection reConnection() throws Exception {<br />		close();<br />		topicConnection = getTopicConnectionFactory().createTopicConnection();<br />		topicConnection.start();<br />		return topicConnection;<br />	}<br /><br />	public TopicSession getTopicSession(boolean consumer) throws Exception {<br />		if (topicSession == null) {<br />			topicSession = getTopicConnection(consumer).createTopicSession(<br />					isTransacted(), getAcknowledgementMode());<br />		}<br />		return topicSession;<br />	}<br /><br />	public Topic getPublishTopic() throws Exception {<br />		if (topic == null) {<br />			Object obj = getContext().lookup(publishTopicName);<br />			topic = (Topic) obj;<br />		}<br />		return topic;<br />	}<br /><br />	public Topic getSubscribeTopic() throws Exception {<br />		if (topic == null) {<br />			Object obj = getContext().lookup(subscribeTopicName);<br />			topic = (Topic) obj;<br />		}<br />		return topic;<br />	}<br /><br />	public TopicPublisher getTopicPublisher() throws Exception {<br />		if (topicPublisher == null) {<br />			topicPublisher = getTopicSession(false).createPublisher(<br />					getPublishTopic());<br />		}<br />		return topicPublisher;<br />	}<br /><br />	public void publishText(String message) throws Exception {<br />		TextMessage textMessage = getTopicSession(false).createTextMessage();<br />		textMessage.clearBody();<br />		textMessage.setText(message);<br />		getTopicPublisher().publish(textMessage);<br />		if (isTransacted()) {<br />			getTopicSession(false).commit();<br />		}<br />	}<br /><br />	public void publishObject(Serializable message) throws Exception {<br />		ObjectMessage objectMessage = getTopicSession(false)<br />				.createObjectMessage();<br />		objectMessage.clearBody();<br />		objectMessage.setObject(message);<br />		getTopicPublisher().publish(objectMessage);<br />		if (isTransacted()) {<br />			getTopicSession(false).commit();<br />		}<br />	}<br /><br />	public void publishObject(Serializable message, int type) throws Exception {<br />		publishObject(message, "type", type);<br /><br />	}<br /><br />	protected void publishObject(Serializable message, String propertyName,<br />			int propertyValue) throws Exception {<br />		ObjectMessage objectMessage = getTopicSession(false)<br />				.createObjectMessage();<br />		objectMessage.clearBody();<br />		objectMessage.clearProperties();<br />		objectMessage.setObject(message);<br />		objectMessage.setIntProperty(propertyName, propertyValue);<br />		getTopicPublisher().publish(objectMessage, DeliveryMode.PERSISTENT, 8,<br />				30 * 60 * 1000);<br />		if (isTransacted()) {<br />			getTopicSession(false).commit();<br />		}<br />	}<br /><br />	public void onMessage(Message message) {<br />	}<br /><br />	public void close() throws Exception {<br />		if (topicPublisher != null) {<br />			topicPublisher.close();<br />			topicPublisher = null;<br />		}<br /><br />		if (topicSession != null) {<br />			topicSession.close();<br />			topicSession = null;<br />		}<br /><br />		if (topicConnection != null) {<br />			topicConnection.close();<br />			topicConnection = null;<br />		}<br />	}<br />} 可以把要发送的信息都放在一个VO类里面，再把VO打成jar加到客户端的项目类里,如TestVO.calss类。使用publishObject方法去发送。TopicName最为关键，因为在jboss里面也是通过TopicName去配置<br /> jboss/server/default/deploy/jms/下jbossmq-destinations-service.xml配置<br /> &lt;?xml version="1.0" encoding="UTF-8"?><br /><br />&lt;!-- $Id: jbossmq-destinations-service.xml,v 1.4.6.1 2004/11/16 04:32:39 ejort Exp $ --><br /><br />&lt;!-- <br />&nbsp;&nbsp; | This file defines the default Queues and Topics that JBossMQ<br />&nbsp;&nbsp; | ships with.&nbsp; The default Queues and Topics are used by the <br />&nbsp;&nbsp; | JBoss test suite and by the sample jms programs.<br />&nbsp;&nbsp; |<br />&nbsp;&nbsp; | You can add other destinations to this file, or you can create other<br />&nbsp;&nbsp; | *-service.xml files to contain your application's destinations.<br /> --><br /><br />&lt;server><br />&nbsp; &lt;!-- Destination without a configured SecurityManager or without a <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a SecurityConf will default to role guest with read=true, write=true,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create=false.<br />&nbsp; --><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Topic"<br />	 name="jboss.mq.destination:service=Topic,name=testTopic"><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;attribute name="SecurityConf"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="guest" read="true" write="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="publisher" read="true" write="true" create="false"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="durpublisher" read="true" write="true" create="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/security><br />&nbsp;&nbsp;&nbsp; &lt;/attribute><br />&nbsp; &lt;/mbean><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Topic"<br />&nbsp;&nbsp;&nbsp; name="jboss.mq.destination:service=Topic,name=OPER_MSG"><br />&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;attribute name="SecurityConf"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="guest" read="true" write="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="publisher" read="true" write="true" create="false"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="durpublisher" read="true" write="true" create="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/security><br />&nbsp;&nbsp;&nbsp; &lt;/attribute><br />&lt;/mbean> <br />&lt;mbean code="org.jboss.mq.server.jmx.Topic"<br />&nbsp;&nbsp;&nbsp; name="jboss.mq.destination:service=Topic,name=LUNPAN_OPER_MSG"><br />&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;attribute name="SecurityConf"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="guest" read="true" write="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="publisher" read="true" write="true" create="false"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="durpublisher" read="true" write="true" create="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/security><br />&nbsp;&nbsp;&nbsp; &lt;/attribute><br />&lt;/mbean><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Topic"<br />	 name="jboss.mq.destination:service=Topic,name=testDurableTopic"><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;attribute name="SecurityConf"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="guest" read="true" write="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="publisher" read="true" write="true" create="false"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="durpublisher" read="true" write="true" create="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/security><br />&nbsp;&nbsp;&nbsp; &lt;/attribute><br />&nbsp; &lt;/mbean><br /><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Queue"<br />	 name="jboss.mq.destination:service=Queue,name=testQueue"><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager&lt;/depends><br />&nbsp;&nbsp;&nbsp; &lt;attribute name="MessageCounterHistoryDayLimit">-1&lt;/attribute><br />&nbsp;&nbsp;&nbsp; &lt;attribute name="SecurityConf"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;security><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="guest" read="true" write="true"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="publisher" read="true" write="true" create="false"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role name="noacc" read="false" write="false" create="false"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/security><br />&nbsp;&nbsp;&nbsp; &lt;/attribute><br />&nbsp; &lt;/mbean><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Queue"<br />	 name="jboss.mq.destination:service=Queue,name=A"><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp; &lt;/mbean><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Queue"<br />	 name="jboss.mq.destination:service=Queue,name=B"><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp; &lt;/mbean><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Queue"<br />	 name="jboss.mq.destination:service=Queue,name=C"><br />	 &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp; &lt;/mbean><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Queue"<br />	 name="jboss.mq.destination:service=Queue,name=D"><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp; &lt;/mbean><br />&nbsp; &lt;mbean code="org.jboss.mq.server.jmx.Queue"<br />	 name="jboss.mq.destination:service=Queue,name=ex"><br />&nbsp;&nbsp;&nbsp; &lt;depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager&lt;/depends><br />&nbsp; &lt;/mbean><br />&lt;/server><br />Jboss/server/default/conf下jbossmq-state.xml<br />&nbsp; &lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;StateManager><br />	&lt;Users><br />		&lt;User><br />			&lt;Name>u0&lt;/Name><br />			&lt;Password>123456&lt;/Password><br />			&lt;Id>ID:00&lt;/Id><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>u1&lt;/Name><br />			&lt;Password>123456&lt;/Password><br />			&lt;Id>ID:01&lt;/Id><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>u2&lt;/Name><br />			&lt;Password>123456&lt;/Password><br />			&lt;Id>ID:02&lt;/Id><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>u3&lt;/Name><br />			&lt;Password>123456&lt;/Password><br />			&lt;Id>ID:03&lt;/Id><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>u4&lt;/Name><br />			&lt;Password>123456&lt;/Password><br />			&lt;Id>ID:04&lt;/Id><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>u5&lt;/Name><br />			&lt;Password>123456&lt;/Password><br />			&lt;Id>ID:05&lt;/Id><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>u6&lt;/Name><br />			&lt;Password>123456&lt;/Password><br />			&lt;Id>ID:06&lt;/Id><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>j2ee&lt;/Name><br />			&lt;Password>j2ee&lt;/Password><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>john&lt;/Name><br />			&lt;Password>needle&lt;/Password><br />			&lt;Id>DurableSubscriberExample&lt;/Id><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>guest&lt;/Name><br />			&lt;Password>guest&lt;/Password><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>nobody&lt;/Name><br />			&lt;Password>nobody&lt;/Password><br />		&lt;/User><br />		&lt;User><br />			&lt;Name>dynsub&lt;/Name><br />			&lt;Password>dynsub&lt;/Password><br />		&lt;/User><br />	&lt;/Users><br />	&lt;Roles><br />		&lt;Role name="guest"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>j2ee&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>guest&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>john&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Role><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Role name="subscriber"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>john&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u0&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u1&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u2&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u3&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u4&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u5&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u6&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Role><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Role name="publisher"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>john&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>dynsub&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u0&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u1&lt;/UserName><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserName>u2&lt;/UserName><br />&nbsp;