<?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>IOC?真的IOC了？还是Factory?</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yananay.javaeye.com">yananay</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252235" style="color:red;">http://www.javaeye.com/topic/252235</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在google上搜索 “spring ioc”，会出来一堆堆的搜索结果，随便点哪一个进去，都会看到这样的教程：<br /><br /><pre name="code" class="java">
ClassA a = (ClassA) beanFactory.getBean("A");
</pre><br /><br />ok, 教程中都说这是Spring的ioc用法， ClassA 是被 Spring管理的，ClassA中的需要set的变量都是“自动注入”的，例如：<br /><br /><pre name="code" class="java">
public class ClassA {
  private ClassB b;
  public void setB(ClassB b) {
    this.b = b;
  }
}
</pre><br /><br />所有的教程，文档，甚至Spring的文档，都说这是 <strong>IOC</strong>。<br /><br />但是很少有人提及这一点：<strong>beanFactory.getBean("A") 是一个工厂模式</strong>。<br /><br />前一阵经过梁兄的指点，俺才发现：<strong>这明明就是工厂模式呀</strong>！也就是说你要使用 IOC，前提是要使用工厂模式。虽然 ClassA 是被自动装配的，但那之前，你必须使用工厂模式来得到装配后的 ClassA。<br /><br />换个比喻来说：如果你要使用一个手枪，必须先用火柴去点燃手枪里的火药。<br /><br />不晓得大家对这个问题怎么个看法，至少俺觉得有些别扭，其实我们完全可以不使用工厂模式。考虑下面这个类：<br /><br /><pre name="code" class="java">
public class StandardConfiguration {

	private static Logger logger = Logger.getLogger(StandardConfiguration.class);
	
	private ImportBusiness importBusiness;
	
	public StandardConfiguration(BeanFactory beanFactory) {
		
		Method[] methods = getClass().getMethods();
		
		for(Method method : methods) {
			
			String methodName = method.getName();
			Class returnType = method.getReturnType();
			if(methodName.startsWith("get")) {
				
				String fieldName = getFieldName(methodName);
				
				Object bean = null;
				try {
					bean = beanFactory.getBean(fieldName);
					
				} catch (NoSuchBeanDefinitionException e) {
					
					logger.debug("StandardConfiguration - " + fieldName + " NoSuchBeanDefinitionException, ignore.");
					continue;
				}
				
				String setMethodName = "set" + createFieldMethodVar(fieldName);
				
				Method setMethod = null;
				try {
					setMethod = getClass().getMethod(setMethodName, new Class[]{returnType});
					setMethod.invoke(this, bean);
					
				} catch (NoSuchMethodException e) {
					
					logger.debug("StandardConfiguration - " + fieldName + " has no set method.");
					
				} catch (InvocationTargetException e) {
					
					logger.error("StandardConfiguration - " + fieldName + " invoke failed.");
				} catch (IllegalAccessException e) {
					
					logger.error("StandardConfiguration - " + fieldName + " IllegalAccessException.");
				}
			}
		}
		
	}
	
	private String getFieldName(String methodName) {
		
		String fieldName = methodName.substring(3, methodName.length());
		fieldName = fieldName.substring(0, 1).toLowerCase() +
						fieldName.substring(1, fieldName.length());
		
		return fieldName;
	}
	
	private String createFieldMethodVar(String fieldName) {
		
		return fieldName.substring(0, 1).toUpperCase() +
				fieldName.substring(1, fieldName.length());
	}

	public ImportBusiness getImportBusiness() {
		return importBusiness;
	}

	public void setImportBusiness(ImportBusiness business) {
		this.importBusiness = business;
	}
}
</pre><br /><br />这个类按照下面的方式来使用：<br /><br /><pre name="code" class="java">
StandardConfiguration config = new StandardConfiguration(beanFactory)
ImportBusiness importBusiness = config.getImportBusiness();
</pre><br /><br />其中 beanFactory 是 Spring 中的 BeanFactory，ImportBusiness 是一个普通的类。<br /><br />ok，我们避免了 beanFactory.getBean("A") 的用法，我可以说：<strong>当我 new 一个 StandardConfiguration 的时候，里面的变量都是自动注入的。</strong><br /><br />但是有人说：你这是穿裤子放屁--你不是还得使用 BeanFactory？<br /><br />没错，没错，这也是我想说的主要话题之一，<strong>如果 BeanFactory 能修改一下该多好</strong>！<br /><br />我设想的情况是这样使用：<br /><br /><pre name="code" class="java">
public class StandardConfiguration extends BeanFactory {
  private ImportBusiness importBusiness;
  public ImportBusiness getImportBusiness() {
    return importBusiness;
  }

  public void setImportBusiness(ImportBusiness business) {
     this.importBusiness = business;
  }
}
</pre><br /><br />这样当我 new 一个 StandardConfiguration 的时候，里面的变量就自动装配起来。这样的话，BeanFactory 似乎应该叫 BeanConfiguration 更好了。<br /><br />通过这样的方式，我们完全可以避免工厂模式的出现。这样做有什么好处呢：<br />1、避免了工厂模式的使用，单一的IOC更加简单。<br />2、避免了通过 bean name（beanFactory.getBean("A");） 来获得某一个对象。其实也就是避免了hardcode。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252235" 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/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, 13 Oct 2008 15:08:41 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252235</link>
        <guid>http://www.javaeye.com/topic/252235</guid>
      </item>
          <item>
        <title>SPRING的AOP不适合多线程应用？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dmtm.javaeye.com">大猫汤姆</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251923" style="color:red;">http://www.javaeye.com/topic/251923</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如题，<br />我的理解是：AOP代理对像实例化所花费的开销比较大，而且是非线程安全的，<br />所以线程安全的解决办法：<br />方法一：使用时要么每次都NEW一个，这样的用一次就扔掉我认为是对资源的浪费。<br />方法二：在应用中适当的地方加同步进行排队。这样虽然减小了开消，但是对线程高并发的情况肯定是个瓶颈。<br />我目前对SPRING的观点是：<br />SPRING是一种解决问题的办法,方案，一种思想。<br /><br />IOC 只有IOC是个很不错的东西。但是如果不使用AOP的话IOC好像没什么价值，只是换个角度去解决问题。<br /><br />AOP 如果不在乎机器资源的开消问题才可以使用，以灵活性换取性能。小型应用没必要使用，流量大的门户网站不能使用。<br /><br />MVC 愿意用就用。<br /><br />对HIBERNATE，JDBC，MAIL的封装等&nbsp; 我认为没有必要，完全可以自己来实现，这样更清楚，更容易撑握应用程序。看到SPRING把这些东西包裹起来从心底感到恶心。比如封装HIBERNATE时，获取Session里用到的threadLocal，这东西被封装了起来，客户端程序员想用的时候只能新创建一个,THREADLOCAL对性能是有一定的影响的(虽然JDK1.5已经很好的优化了)，一个就够了。<br /><br />感觉SPRING就是狗皮膏药，做救 急的东西，在不修改源代码的情况下拦腰插入一些代码，因为实际上线的应用程序中大家都不敢修改源代码，修改源代码非常危险麻烦,整个应用还需要反复测试，所以用AOP来支撑。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251923" 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/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, 12 Oct 2008 21:51:39 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251923</link>
        <guid>http://www.javaeye.com/topic/251923</guid>
      </item>
          <item>
        <title>servlet成功连接sql2000</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://collonn.javaeye.com">collonn</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252431" style="color:red;">http://www.javaeye.com/topic/252431</a>&nbsp;
          发表时间: 2008年10月14日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>1：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一定要为sql2000打上 <strong>SQL2KSP4 </strong>补丁，否则的话，不用往下看了</p>
<p><strong>2：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载sql2000需要的三个驱动文件 <strong>msSQL2000JDBC</strong> ，将解压后的三个文件msbase.jar，mssqlserver.jar，</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msutil.jar拷贝到WEB-INF/lib文件夹下，记得刷新喔</p>
<p><strong>3：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建一个测试用数据库siaswushu，新建表userinfo(name,pwd)</p>
<p><strong>4：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql2000要启用"混合验证模式"</p>
<p><strong>5：</strong>编写测试用servlet，代码如下</p>
<p>package collon;</p>
<p>import java.io.IOException;<br />import java.io.PrintWriter;<br />import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.ResultSet;<br />import java.sql.SQLException;<br />import java.sql.Statement;</p>
<p>import javax.servlet.ServletException;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p>
<p>public class ConnSql extends HttpServlet {</p>
<p>&nbsp;public ConnSql() {<br />&nbsp;&nbsp;super();<br />&nbsp;}</p>
<p>&nbsp;public void destroy() {<br />&nbsp;&nbsp;super.destroy(); // Just puts "destroy" string in log<br />&nbsp;&nbsp;// Put your code here<br />&nbsp;}</p>
<p>&nbsp;public void doGet(HttpServletRequest request, HttpServletResponse response)<br />&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<strong>response.setCharacterEncoding("GBK");</strong></p>
<p>&nbsp;&nbsp;response.setContentType("text/html");<br />&nbsp;&nbsp;PrintWriter out = response.getWriter();<br />&nbsp;&nbsp;out.println("&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"&gt;");<br />&nbsp;&nbsp;out.println("&lt;HTML&gt;");<br />&nbsp;&nbsp;out.println("&nbsp; &lt;HEAD&gt;&lt;TITLE&gt;A Servlet&lt;/TITLE&gt;&lt;/HEAD&gt;");<br />&nbsp;&nbsp;out.println("&nbsp; &lt;BODY&gt;");<br />&nbsp;&nbsp;out.print("所有用户的信息为&lt;br /&gt;");<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Connection conn = null;<br />&nbsp;&nbsp;Statement stm = null;<br />&nbsp;&nbsp;ResultSet rs = null;<br />&nbsp;&nbsp;String connStr = "<strong>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=siaswushu</strong>";<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}catch(ClassNotFoundException e){<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;conn = DriverManager.getConnection(<strong>connStr,"sa","sa"</strong>);<br />&nbsp;&nbsp;&nbsp;stm = conn.createStatement(<strong><span style="color: #0000ff;">ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY</span></strong>);<br />&nbsp;&nbsp;&nbsp;rs = stm.executeQuery("<strong>select * from userinfo</strong>");<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(rs.next()){<br />&nbsp;&nbsp;&nbsp;&nbsp;out.print("用户名: " + rs.getString("name") + "------密码: " + rs.getString("pwd") + "&lt;br /&gt;");<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;rs.close();<br />&nbsp;&nbsp;&nbsp;stm.close();<br />&nbsp;&nbsp;&nbsp;conn.close();<br />&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;out.println("&nbsp; &lt;/BODY&gt;");<br />&nbsp;&nbsp;out.println("&lt;/HTML&gt;");<br />&nbsp;&nbsp;out.flush();<br />&nbsp;&nbsp;out.close();<br />&nbsp;}<br />&nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response)<br />&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />&nbsp;&nbsp;this.doGet(request, response);<br />&nbsp;}</p>
<p>&nbsp;public void init() throws ServletException {<br />&nbsp;&nbsp;// Put your code here<br />&nbsp;}</p>
<p>}</p>
<p>&nbsp;</p>
<p>注意：</p>
<p><strong><span style="color: #0000ff;">ResultSet.TYPE_FORWORD_ONLY:结果记录指针只能向下移动</span></strong></p>
<p><strong><span style="color: #0000ff;">ResultSet.TYPE_SCROLL_INSENSITIVE:------可以上下移动，但数据库内容发生变化时，结果集不变</span></strong></p>
<p><strong><span style="color: #0000ff;">ResultSet.TYPE_SCROLL_SENSITIVE:------可以上下移动，但数据库内容变化时，结果集也跟随着变化</span></strong></p>
<p><strong></strong></p>
<p><strong><span style="color: #0000ff;">ResultSet.CONCUR_READ_ONLY:结果记录集只读</span></strong></p>
<p><strong><span style="color: #0000ff;">ResultSet.CONCUR_UPDATABLE:结果记录集可更新数据库中数据</span></strong></p>
<p>&nbsp;</p>
<p>下一步是用Hibernate测试sql2000</p>
<p><strong>Fighting!!</strong></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252431" 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>Tue, 14 Oct 2008 00:19:22 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252431</link>
        <guid>http://www.javaeye.com/topic/252431</guid>
      </item>
          <item>
        <title>现在用grails来做项目是不是太激进</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vansention.javaeye.com">范三山</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250349" style="color:red;">http://www.javaeye.com/topic/250349</a>&nbsp;
          发表时间: 2008年10月08日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在要做一个互联网的项目，不是很大。人员大概就是两个java程序员，美工另算。我一直以为，用java来做中小型的互联网项目不是一个明智的选择。这个项目如果我们按照以往的方法不外乎是struts2+spring+hibernate，我觉得效率不是很高。<br />&nbsp;&nbsp;&nbsp; 我前一段时间自己弄过一下grails，写了一个blog程序，感觉非常棒。我想这个项目用grails十分的不错，因为时间比较紧，用grails来做会非常的快。但是我现在有一些担心<br />&nbsp;&nbsp;&nbsp; 1.grails的性能问题，不过我不太相信瓶颈会出现在程序端，怎么说也是数据库先有瓶颈。<br />&nbsp;&nbsp;&nbsp; 2.将来的维护问题，如果我们不在了维护的人还得学grails。<br />&nbsp;&nbsp;&nbsp; 3.ide不怎么好用，几乎是完全没有作用。我写grails程序一般用netbeans，不知道那位老兄会不会不习惯。IntelliJ IDEA是不会考虑的，实在没有兴趣去搞注册码。<br />&nbsp;&nbsp;&nbsp; 虽然很看好grails，但是还是会有些担心，不知道大家怎么看的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250349" style="color:red;">已有 <strong>53</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, 08 Oct 2008 15:47:12 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250349</link>
        <guid>http://www.javaeye.com/topic/250349</guid>
      </item>
          <item>
        <title>hibernate一直的疑问</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nlvivian.javaeye.com">nlvivian</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251460" style="color:red;">http://www.javaeye.com/topic/251460</a>&nbsp;
          发表时间: 2008年10月10日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 <br /><br />用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化. <br />用户B访问B机,创建了一个session.并对tableA做更新操作. <br />用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗?
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251460" 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>Fri, 10 Oct 2008 21:16:49 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251460</link>
        <guid>http://www.javaeye.com/topic/251460</guid>
      </item>
          <item>
        <title>再谈IOC</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bloodrate.javaeye.com">bloodrate</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252418" style="color:red;">http://www.javaeye.com/topic/252418</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天看POJOs IN ACTION书中有类似这样一段话“传统的J2EE应用程序使用JNDI作为一个组件访问另外一个组件的依据，比如JNDI访问EJB组件，JNDI访问Datasource获取服务器上的数据库连接池中的连接，但是JNDI的弱点在于它把应用程序和应用服务器耦合在一起，难于测试和维护。而Spring提供的IOC可以提供一种更为灵活的一个组件访问一个另一个组件的机制，并且与应用服务器脱离耦合。”<br /><br />那么我可以简要分析出，IOC是某种意义上是作为JNDI的取代品出现的，这也和Martin Fowler对IOC的讲法一致：IOC作为一个系统中“组件插槽”的身份出现的，IOC鼓励程序员基于组建开发督促程序员多写POJO，而绝非是DaoFactory这样的工厂类替代品。<br /><br />那么我产生疑惑，IOC作为一个系统访问各个基础组件的访问机制，是否能起到真正作用呢？是否它真的比JNDI强呢？考虑这样一种情况：如果一个很大型的系统，有很多子系统，而这些子系统有公用了一些服务，由你来开发这个服务。<br />如果是JNDI，你将服务部单独署在应用服务器里，然后告诉每个系统负责人你的JNDI，他们就可以访问使用，如若你想维护更新修改你的服务，你只需进行自己的修改而不用告诉大家，因为大家只用你的jndi接口。如果是IOC，你维护了你自己写的服务，还要告诉大家“喂，开会了，大家把我新写的JAR拷走吧，部署在你们的classpath下”这看起来没什么，但是子系统多了，难免出现版本混乱问题。<br /><br />我是觉得IOC确实看起来只像是一个工厂，而不像一个注册服务的地方。至少它没能让服务组件实现“可单独维护”，反而JNDI接近服务理念，服务的目的就是服务的变化相对于服务使用者透明。。。。。。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252418" 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, 13 Oct 2008 23:12:19 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252418</link>
        <guid>http://www.javaeye.com/topic/252418</guid>
      </item>
          <item>
        <title>Struts验证框架与一些技巧</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://huangyuan.javaeye.com">folie2006</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251827" style="color:red;">http://www.javaeye.com/topic/251827</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>还是通过一些步骤例子说明 <br />首先建立Struts工程的时候要启动验证框架。 <br />它称为Validator验证框架 <br />主要依赖与两个.jar文件</p>
<p>&nbsp;<br />Jakarta-oro.jar <br />Commons-validator.jar&nbsp;<br /> <br />这个是在struts-config.xml文件中如下加入配置之后即代表该工程已经使用验证框架的插件了&nbsp;</p>
<pre name="code" class="xml">&lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt; 
        &lt;set-property property="pathnames" value="/WEB-INF/validator-rules.xml, 
                                                  /WEB-INF/validation.xml"/&gt; 
&lt;/plug-in&gt;</pre>
<p>&nbsp; <br />完成好了之后以注册的例子说明它的主要使用方法 <br />1.建立一个注册的页面；包含用户名: 密码: 年龄: 邮箱:都不能为空。密码长度必须大于或等于8位，邮箱格式验证等 <br />显示方式一：使用错误消息显示在相应的控件后面。 <br />2.建立注册页相对应的表单Bean(ActionForm),重点在这里，因为要使用验证框架的话该表单类需要修改 <br />1)修改该类的继承&nbsp;</p>
<pre name="code" class="java">  import org.apache.struts.validator.ValidatorForm;// 导入要继承的类 
  public class 表单类 extends ValidatorForm //修改继承类</pre>
<p>&nbsp; <br />2) //修改该类且不包含validate()方法. <br />3、在validation.xml 中配置验证规则 <br />&nbsp; 这个验证规则依赖与validator-rules.xml此文件已经配置好的验证类 <br />&nbsp; 大概介绍几种规则吧{}中的为参数 <br />&nbsp;&nbsp; errors.required={0} is required.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须的，或者不能为空的 <br />&nbsp;&nbsp; errors.minlength={0} can not be less than {1} characters. {某某}不能小于{多少}位 <br />&nbsp;&nbsp; errors.maxlength={0} can not be greater than {1} characters.{ 某某}不能大于{多少}位 <br />&nbsp; errors.range={0} is not in the range {1} through {2}.{0}是不能在{1}与{2}之间</p>
<pre name="code" class="xml">&lt;form-validation&gt;   &lt;!--以下是配置一些常用的验证规则 --&gt;
  &lt;formset&gt; 
&lt;form name="regActionForm"&gt;  
&lt;!--表单名，为验证哪个表单而配置，这里的name指定struts中form-bean的别名 --&gt;
    &lt;field property="username" depends="required"&gt; 
      &lt;arg0 key="tip.username"/&gt; 
    &lt;/field&gt;         arg0指要为该规则传入的第一个参数 
&lt;!--property为表单中的属性，depends为要验证的规则key为消息资料文件中的配置键 --&gt;
&lt;!-- 验证密码最小长度不小于8位 要一个控件属性验证两个规则的话真正以逗号分开, --&gt; 

&lt;field property="userpass" depends="required,minlength"&gt; 
      &lt;arg0 key="tip.userpass"/&gt; 
      &lt;arg1 key="${var:minlength}" name="minlength" resource="false"/&gt; 
      &lt;var&gt; 
        &lt;var-name&gt;minlength&lt;/var-name&gt; 
        &lt;var-value&gt;8&lt;/var-value&gt; 
      &lt;/var&gt; 
    &lt;/field&gt; 
 
    &lt;!--绿色的为变量名,好像定义也有规则，必须是那样而resource 则是配置是否从资源文件中查找key --&gt;
    

&lt;field property="email" depends="required,email"&gt; 
      &lt;arg0 key="tip.email"/&gt; 
    &lt;/field&gt; 
 
&lt;!-- 验证年龄在一定范围之内 --&gt;
    &lt;field property="age" depends="required,intRange"&gt; 
      &lt;arg0 key="tip.age"/&gt; 
      &lt;arg1 key="${var:min}" name="intRange" resource="false"/&gt; 
      &lt;arg2 key="${var:max}" name="intRange" resource="false"/&gt; 
       &lt;var&gt; 
         &lt;var-name&gt;min&lt;/var-name&gt; 
         &lt;var-value&gt;1&lt;/var-value&gt; 
       &lt;/var&gt; 
       &lt;var&gt; 
         &lt;var-name&gt;max&lt;/var-name&gt; 
         &lt;var-value&gt;100&lt;/var-value&gt; 
       &lt;/var&gt; 
    &lt;/field&gt; 
    &lt;/form&gt; 
  &lt;/formset&gt; 
&lt;/form-validation&gt; 

</pre>
<p>&nbsp;</p>
<p>4、编写消息资源文件</p>
<p>验证规则的配置文件中所用key的名字为该资源文件所配置</p>
<pre name="code" class="python"># errors.required={0}不能为空. 
# tip.username=用户名 
# tip.userpass=密码 
# errors.minlength={0}不能少于{1}个字符. 
# errors.email={0} 格式不合法. 
# tip.email=邮箱 
# tip.age=年龄 
# errors.range={0} 必须在 {1} - {2} 之间. 

errors.required={0}\u4e0d\u80fd\u4e3a\u7a7a. 
tip.username=\u7528\u6237\u540d 
tip.userpass=\u5bc6\u7801 
errors.minlength={0}\u4e0d\u80fd\u5c11\u4e8e{1}\u4e2a\u5b57\u7b26. 
errors.email={0} \u683c\u5f0f\u4e0d\u5408\u6cd5. 
tip.email=\u90ae\u7bb1 
tip.age=\u5e74\u9f84 
errors.range={0} \u5fc5\u987b\u5728 {1} - {2} \u4e4b\u95f4. 
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5.在struts-config.xml中配置Action验证失败跳转页面，属性为input指向的地方 <br /><br />二、手工验证； <br />1、用户名、密码不能为空； <br />2、密码长度不能小于8位； <br /><br />（1）验证代码写在哪儿？ <br />ActionForm的validate()方法中，如果该方法返回的ActionErrors中没有包含错误消息，认为验证通过。 <br /><br />（2）错误集合存在哪儿？ <br />由 RequestProcessor 将错误集合存储在 Request 中，键名为 <br />Globas.ERROR_KEY； <br /><br />（3）如何显示错误消息？&nbsp;</p>
<pre name="code" class="html">&lt;html:errors/&gt; &lt;!--显示所有消息 --&gt;
&lt;html:errors property="xx"/&gt; &lt;!--显示指定的消息--&gt;</pre>
<p>&nbsp; <br /><br />三、生成JavaScript <br />（1）ActionForm继承 org.apache.struts.validator.ValidatorForm； <br />（2）ActionForm中无 validate() 方法； <br />（3）表单JSP页中加： <br />&lt;html:form .... onsubmit="return validateRegForm(this);"&gt;颜色字体一致，首字母大写 <br />&lt;html:javascript formName="regForm"/&gt; <br />（4）在validation.xml中配置验证规则； <br /><br /><br /><br />另外再说一个不怎么常用的标签，它的作用一般就是方便表单Bean对象的重复代码</p>
<pre name="code" class="html">&lt;%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %&gt; 
&lt;h1&gt;用户注册&lt;/h1&gt; 
&lt;html:form action="reg.do" method="post"&gt; 
  &lt;nested:nest property="user"&gt;   
    用户名:&lt;nested:text property="username"/&gt;&lt;br/&gt; 
    密码:&lt;nested:text property="userpass"/&gt;&lt;br/&gt; 
  &lt;/nested:nest&gt; 
  &lt;html:submit value="提交"/&gt; 
&lt;/html:form&gt; 
</pre>
<p>&nbsp;</p>
<p>要使用该配置，在ActionForm中要实例化一个user对象才可以通过以上配置使用对象中username的属性</p>
<pre name="code" class="html">&lt;hr&gt; 
&lt;h1&gt;用户注册&lt;/h1&gt; 
&lt;html:form action="reg.do" method="post"&gt; 
    用户名:&lt;html:text property="user.username"/&gt;&lt;br/&gt; 
    密码:&lt;html:text property="user.userpass"/&gt;&lt;br/&gt; 
  &lt;html:submit value="提交"/&gt; 
&lt;/html:form&gt; </pre>
<p>&nbsp;<br /><br />上面的代码也可以实现刚才的功能，但是在验证框架中就不能那么使用了 <br /><br /><span style="color: #ff00ff;">Tiles标签 <br /></span></p>
<pre name="code" class="html">&lt;tiles:insert page="header.jsp" flush="true"/&gt;&lt;!--标头内容 --&gt;</pre>
<p>&nbsp;<br />作用与嵌套网页，可以定制好一个模板，然后在模板中使用相应的可编辑内容</p>
<pre name="code" class="html">&lt;h1&gt;t1.jsp&lt;/h1&gt; 
111111111111111 
&lt;hr&gt; 
&lt;!--page表示所要插入的网页，flush是否及时更新 --&gt;
&lt;tiles:insert page="footer.jsp" flush="true"/&gt;&lt;!--末尾内容 --&gt;</pre>
<p>&nbsp;<br /><br />第二种情况是以一个定制了的模板生成个新的网页</p>
<pre name="code" class="html">&lt;tiles:insert attribute="header"/&gt; 
&lt;tiles:insert attribute="footer"/&gt; 

&lt;tiles:insert page="template1.jsp" flush="true"&gt;   &lt;!--已经存在一个template1.jsp模板 --&gt;
&lt;tiles:put name="header" value="header.jsp"/&gt;  &lt;!--往属性header设置嵌入页面 --&gt;
&lt;tiles:put name="footer" value="footer.jsp"/&gt;    &lt;!--往属性footer设置嵌入页面 --&gt;
&lt;/tiles:insert&gt; 
</pre>
<p>&nbsp;<br />（1）防止重复提交；&nbsp; Action <br />原理是通过在请求里面加入一些身份标记，在请求的时候判断是否事先存放的标记，如果不是则是第二次非正常提交 <br /></p>
<pre name="code" class="java">this.saveToken(request);        //在第一次点击请求的时候存入然后存转发到另一个JSP页面 
//判断令牌是否有效； 
if(! this.isTokenValid(request) ){     //如果是刚才的页面转发过来的话则它返回真 
saveToken(request); 
return ( new ActionForward(mapping.getInput()) );  
//跳转到Action配置的input中的页面 
} 
//最后正常执行完业务逻辑就把先前存的Token删除 
request.removeAttribute(mapping.getAttribute()); 
this.resetToken(request); 
</pre>
<p>&nbsp;<br /><br />（2）动态ActionForm（对应的JAVA类是动态产生的，JAVA类中的属性在struts-config.xml文件中动态配置） <br />1.配置Struts-config.xml中的 &lt;form-bean/&gt;，在其中声明 <br />表单中要包含的字段元素； <br />---------------------------------------- <br />例如页面上有以下一个表单 ，分别有属性username userage</p>
<pre name="code" class="html">&lt;form action="dynaReg.do" method="post"&gt; 
username:&lt;input size=10 name="username"&gt;&lt;br&gt; 
userage:&lt;input size=10 name="userage"&gt;&lt;br&gt; 
&lt;input type="submit" value=" OK "&gt; 
&lt;/form&gt; 
</pre>
<p>&nbsp;</p>
<p>那么对应这个表单就要在Struts-config.xml中配置一个与其对应的form-bean</p>
<pre name="code" class="xml">&lt;form-bean name="dynaRegForm" dynamic="true" type="org.apache.struts.action.DynaActionForm"&gt; &lt;!--指定该bean为动态的，并类型是该类 
如果使用了动态FORMBEAN也想用验证框架的话这里的TYPE就要指定DynaValidatorActionForm --&gt;
        &lt;form-property name="username" type="java.lang.String"/&gt; 
        &lt;form-property name="userage" type="java.lang.Integer" initial="0"/&gt; 
&lt;/form-bean&gt; 
  </pre>
<p>&nbsp;---------------------------------------------------- <br />2.配置Struts-config.xml中的 &lt;action/&gt;，将动态ActionForm <br />与某个Action结合起来; <br />只要name属性名称一致就可以了 <br />在Action中的业务方法有些改动，因为它自动生成表单bean,所以取值的时候要像这样取,get中填写xml配置中的属性名字,把form强转换成DynaActionForm类对象，使用.get方法，返回Object，所以相应的再强转成想要的类型 <br />String username=(String)((DynaActionForm)form).get("username"); <br />Integer userage=(Integer)((DynaActionForm)form).get("userage"); <br />3.客户使用表单,表单中名称与&lt;form-bean&gt;中声明的相同； <br /><br />最后在使用完表单bean之后要删除掉刚才生成的bean;方法如下 <br />request.removeAttribute(mapping.getAttribute());//删除FormBean <br /><br /><br />(3)DispatchAction类，可以在一个Action中编写多个业务方法; <br />1、编写Action，要继承DispatchAction，且无execute()方法； <br />2、在Action类中提供多个业务方法； <br />3、在表单/超链接中生成请求时，用URL： xxxxx.do?method=XX <br />4、使用该类，可以节省Action的个数; <br /><br />测试DispatchAction类(一个Action处理多种业务): <br />加math.do?method=add <br />减math.do?method=dec <br />乘math.do?method=mul <br /><br />在Action类中要写入相应的方法。</p>
<pre name="code" class="java">public ActionForward add(ActionMapping mapping, 
                            ActionForm form, 
                            HttpServletRequest request, 
                            HttpServletResponse response) 
    throws Exception { 
    System.out.println("add...."); 
    request.setAttribute( "mathresult","add...." ); 
    return mapping.findForward( "success" ); 
    } </pre>
<p>&nbsp;<br />其他几个以此类推。。。。。。。。。。。。 <br /><br />(4)一个表单实现多种业务（计算器）----LookupDispatchAction; <br />LookupDispatchAction(一个表单对应多个处理方法): <br /><br />1、编写Action，继承LookupDispatchAction类； <br />2、重写LookupDispatchAction类的getKeyMethodMap()，在该方法内对提交按钮文字&ldquo;键名&rdquo;和&ldquo;业务方法名&rdquo;进行映射；</p>
<pre name="code" class="java">protected Map getKeyMethodMap(){ 
Map map=new HashMap(); 
map.put("页面显示的按钮","本类中的业务方法名"); 
map.put("button.add ","add"); 
return map; 
} </pre>
<p>&nbsp;<br />3、编写业务方法；</p>
<pre name="code" class="java">//add 
    public ActionForward add(ActionMapping mapping, 
                                 ActionForm form, 
                                 HttpServletRequest request, 
                                 HttpServletResponse response) 
    throws Exception 
    { 

        int num1 = ((Math2Form) form).getNum1(); 
        int num2 = ((Math2Form) form).getNum2(); 
request.setAttribute( "math2Result", ""+(num1+num2) ); 
        request.removeAttribute(mapping.getAttribute()); 
        return (mapping.findForward("success")); 
    } </pre>
<p>&nbsp;<br />4、表单中的提交按钮中，显示文字时使用</p>
<pre name="code" class="html">&lt;bean:message key="xxx"/&gt;</pre>
<p>&nbsp; <br />5、使用该类，可以出现许多避免重复性表单；(如下为前台表单显示的内容)</p>
<pre name="code" class="html">&lt;html:submit property="action"&gt; 
&lt;bean:message key="button.add"/&gt; 
&lt;/html:submit&gt; 
</pre>
<p>&nbsp;<br />(5)ForwardAction</p>
<pre name="code" class="html">&lt;action    
path = "/jsp1" 
type = "org.apache.struts.actions.ForwardAction" 
parameter ="/jsp1.jsp" 
/&gt; 

&lt;action    
path = "/jsp1" 
forward="/jsp1.jsp" 
/&gt; 
</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251827" 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>Sun, 12 Oct 2008 16:36:01 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251827</link>
        <guid>http://www.javaeye.com/topic/251827</guid>
      </item>
          <item>
        <title>让你的 Ibatis2 也支持Annotation</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnoss.javaeye.com">cnoss</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251047" style="color:red;">http://www.javaeye.com/topic/251047</a>&nbsp;
          发表时间: 2008年10月10日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><span style="color: Blue">在支持xml配置方式的基础上增加了对annotation的支持，用户可以根据自己的喜好来选择或者两种方式并存。</span></strong><br /><br />详情请大家看：<a href="http://www.rest4g.org/viewthread.php?tid=12&amp;extra=page%3D1" target="_blank">http://www.rest4g.org/viewthread.php?tid=12&amp;extra=page%3D1</a><br /><br />代码示例如下：<br />Account.java<pre name="code" class="java">
package org.jrest4guice.persistence.ibatis;
public class Account {
  private int id;
  private String firstName;
  private String lastName;
  private String emailAddress;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public String getEmailAddress() {
    return emailAddress;
  }

  public void setEmailAddress(String emailAddress) {
    this.emailAddress = emailAddress;
  }

}
</pre>AccountService.java<pre name="code" class="java">
package org.jrest4guice.persistence.ibatis;

import java.sql.SQLException;
import java.util.List;

import org.jrest4guice.persistence.ibatis.annotations.Delete;
import org.jrest4guice.persistence.ibatis.annotations.IbatisDao;
import org.jrest4guice.persistence.ibatis.annotations.Insert;
import org.jrest4guice.persistence.ibatis.annotations.Result;
import org.jrest4guice.persistence.ibatis.annotations.ResultMap;
import org.jrest4guice.persistence.ibatis.annotations.Select;
import org.jrest4guice.persistence.ibatis.annotations.Update;
import org.jrest4guice.transaction.annotations.Transactional;
import org.jrest4guice.transaction.annotations.TransactionalType;

import com.google.inject.Inject;
import com.ibatis.sqlmap.client.SqlMapClient;

@IbatisDao
@SuppressWarnings("unchecked")
@Transactional
@ResultMap(id = "accountResultMap", result = {
		@Result(property = "id", column = "id"),
		@Result(property = "firstName", column = "firstName"),
		@Result(property = "lastName", column = "lastName"),
		@Result(property = "emailAddress", column = "emailAddress") }, resultClass = Account.class)
@Cachemodel(id = "account-cache", flushInterval = "24", flushOnExecute = {
		"insertAccount", "updateAccount", "deleteAccount" }, type = "LRU", 
		property = { @Property(name = "size", value = "100") })
public class AccountService {
	@Inject
	private SqlMapClient sqlMapper;

	@Select(id = "selectAllAccounts", sql = "select * from ACCOUNT", 
			resltMap = "accountResultMap", cacheModel = "account-cache")
	@Transactional(type = TransactionalType.READOLNY)
	public List&lt;Account> findAll() throws SQLException {
		return sqlMapper.queryForList("selectAllAccounts");
	}

	@Select(sql = "select id ,firstName,lastName,emailAddress from "
			+ "ACCOUNT where id = #id#")
	@Transactional(type = TransactionalType.READOLNY)
	public Account getAccountById(int id) throws SQLException {
		return (Account) sqlMapper.queryForObject("getAccountById", id);
	}

	@Insert(id = "insertAccount", sql = "insert into ACCOUNT (id,firstName,"
			+ "lastName,emailAddress) values (#id#, #firstName#, #lastName#, "
			+ "#emailAddress#)")
	public void createAccount(Account account) throws SQLException {
		sqlMapper.insert("insertAccount", account);
	}

	@Update(sql = "update ACCOUNT set firstName = #firstName#,lastName = "
			+ "#lastName#,emailAddress = #emailAddress# where id = #id#")
	public void updateAccount(Account account) throws SQLException {
		sqlMapper.update("updateAccount", account);
	}

	@Delete(id = "deleteAccount", sql = "delete from ACCOUNT where id = #id#")
	public void deleteAccount(int id) throws SQLException {
		sqlMapper.delete("deleteAccount", id);
	}

	@Select(id = "queryAccounts", 
		sql = "select * from ACCOUNT "
			+ "&lt;dynamic prepend=\"where\">"
			+ " &lt;isNotNull prepend=\"and\" property=\"firstName\">"
			+ "    firstName = #firstName#" 
			+ " &lt;/isNotNull>"
			+ " &lt;isNotNull prepend=\"and\" property=\"lastName\">"
			+ "    lastName = #lastName#" 
			+ " &lt;/isNotNull>"
			+ " &lt;isNotNull prepend=\"and\" property=\"emailAddress\">"
			+ "    emailAddress = #emailAddress#" 
			+ " &lt;/isNotNull>"
			+ "&lt;/dynamic> " 
			+ "order by lastName", resltMap = "accountResultMap", 
			cacheModel = "account-cache")
	@Transactional(type = TransactionalType.READOLNY)
	/**
	 * 动态SQL查询
	 */
	public List&lt;Account> queryAccounts(Account account) throws SQLException {
		return sqlMapper.queryForList("queryAccounts",account);
	}
}
</pre>AccountServiceTest.java<pre name="code" class="java">
package org.jrest4guice.persistence.ibatis;

import java.sql.SQLException;
import java.util.List;

import junit.framework.Assert;

import org.jrest4guice.guice.GuiceContext;
import org.jrest4guice.guice.PersistenceGuiceContext;
import org.junit.BeforeClass;
import org.junit.Test;

public class AccountServiceTest {
	private static AccountService service;

	@BeforeClass
	public static void setUp() throws Exception {
		// 初始化JRest4Guice
		PersistenceGuiceContext.getInstance().useIbatis(
				"org.jrest4guice.persistence.ibatis").init();
		// 获取服务
		service = GuiceContext.getInstance().getBean(AccountService.class);
	}

	@Test
	public void doTest() {
		List&lt;Account> accounts;
		try {
			Account account = new Account();
			account.setFirstName("张");
			account.setLastName("学友");
			account.setEmailAddress("jackey@rest4g.org");
			// 添加
			service.createAccount(account);

			account = new Account();
			account.setFirstName("刘");
			account.setLastName("学友");
			account.setEmailAddress("test@rest4g.org");
			// 添加
			service.createAccount(account);
			
			//查询（按lastName）
			Account queryCondition = new Account();
			queryCondition.setLastName("学友");
			accounts = service.queryAccounts(queryCondition);
			Assert.assertEquals(2, accounts.size());
			
			//查询（按firstName和lastName）
			queryCondition.setFirstName("张");
			accounts = service.queryAccounts(queryCondition);
			Assert.assertEquals(1, accounts.size());

			// 修改
			account = accounts.get(0);
			account.setFirstName("何");
			service.updateAccount(account);
			account = service.getAccountById(account.getId());
			Assert.assertNotNull(account);
			Assert.assertEquals("何", account.getFirstName());

			//查询所有
			accounts = service.findAll();
			Assert.assertEquals(2, accounts.size());

			// 删除
			for (Account ac : accounts){
				service.deleteAccount(ac.getId());
			}
			
			//断言删除的结果
			accounts = service.findAll();
			Assert.assertEquals(0, accounts.size());
		} catch (SQLException e) {
			Assert.fail(e.getLocalizedMessage());
		}
	}
}
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251047" style="color:red;">已有 <strong>46</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, 10 Oct 2008 07:17:02 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251047</link>
        <guid>http://www.javaeye.com/topic/251047</guid>
      </item>
          <item>
        <title>在web集群环境下如何实现网站全局变量</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shinewang.javaeye.com">shinewang</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251854" style="color:red;">http://www.javaeye.com/topic/251854</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近正在开发一个网站，碰到一个关于web集群环境下全局变量实现的问题，例如网站是否开放用户注册，禁用的IP列表这类不经常更改却频繁调用的系统设置，如何实现才能保证不影响系统性能，并且修改后能及时更新到每台服务器？<br /><br />考虑想了几种方法：<br />1.存在数据库中，每次调用时去查数据库 <br />每次都需要查数据库会不会影响性能？<br /><br />2.存在数据库中，本地有一个config类作缓存，每隔一段时间调用计划任务和数据库同步一下<br />更新后同步到其他服务器需要一段时间，不是很及时<br /><br />3.存在数据库中，本地有一个config类作缓存，用JMS发送/接收更新数据<br />需要引入JMS<br /><br />4.直接写在config类中，不提供在web界面的修改配置，修改配置需要改写config类，然后重新部署到各服务器<br />修改配置需要修改代码，管理起来不方便，另外java的热部署只更新这个修改了的config类吗，会不会影响jvm里面其他的类，也就是会不会影响用户？<br /><br />5.存在配置文件中每次读文件，更新时同上一方案<br />性能？热部署？<br /><br />这个问题应该很简单吧，由于不是做互联网的，没什么经验。各位有什么好的想法？
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251854" 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/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, 12 Oct 2008 19:15:31 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251854</link>
        <guid>http://www.javaeye.com/topic/251854</guid>
      </item>
          <item>
        <title>折腾百度空间</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chbest.javaeye.com">chbest</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252287" style="color:red;">http://www.javaeye.com/topic/252287</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          公司要做个人空间sns类似的模块.<br />最先考虑的就是百度空间.<br />自己有个百度空间的账号.<br />hi.baidu.com/水痕2000<br />无论在ie还是火狐上面敲,都能成功访问.一想百度还真厉害.这样也成?<br />utf-8 和gbk都处理的这么好<br />在接着:<br />申请账号:水痕水痕<br />申请gbk下'水痕水痕'对应的账号:姘寸棔姘寸棔<br />然后在ie和火狐下进入:<br />hi.baidu.com/水痕水痕 || hi.baidu.com/姘寸棔姘寸棔<br />发现hi.baidu.com/姘寸棔姘寸棔 在火狐下 是进入 水痕水痕 的空间;在ie下进入的姘寸棔姘寸棔的空间.<br />然后在姘寸棔姘寸棔空间下 点blog或者相册模块,又跑到 水痕水痕 里面去了.<br />得出结论:用中文名做url的path是不可取的.<br />1 百度默认连接是用gbk编码的<br />2 百度处理请求的时候,默认以utf-8进行转译,查询不到数据库在用gbk;<br />基本来说姘寸棔姘寸棔的空间很难点进去<br />最后放上连接:<br />http://hi.baidu.com/%E6%B0%B4%E7%97%95%E6%B0%B4%E7%97%95 <br />http://hi.baidu.com/%CB%AE%BA%DB%CB%AE%BA%DB<br />都是进一个空间
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252287" 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, 13 Oct 2008 15:59:23 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252287</link>
        <guid>http://www.javaeye.com/topic/252287</guid>
      </item>
          <item>
        <title>Ejb3.0--1</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xiaocong1001.javaeye.com">xiaocong1001</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/252343" style="color:red;">http://www.javaeye.com/topic/252343</a>&nbsp;
          发表时间: 2008年10月13日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Ejb3.0--1<br />&nbsp; 今天学习了一下午的ejb3.0遇见了一些麻烦，拿出来和大家分享一下。以免大家以后遇到同样的问题<img src="/images/smiles/icon_razz.gif"/><br />&nbsp; A）首先，我下载了jboss服务器，这个是ejb的运行环境，必不可少。<br />&nbsp;&nbsp; B）我将他解压到/usr/jboos下，然后修改用户的profile文件vi /home/xiaocong/.bash_profile ；在里面添加<br />export JBOSS_HOME=/usr/jboss;<br />export PATH= $PATH:$JBOSS_HOME/bin;<br />(注）我已经安装了jdk1.5，并且已经设置好环境变量了，还要注意jboss文件夹的所有者啊！必要的时候使用root用户，chown一下。<br />C）ok，现在可以运行一下jboss了。<br />D）打开我的IDE，新建一个ejb工程HelloWorld。<br />E）创建个自己的包com.chenzhq.ejb.<br />F）创建一个无状态的会话bean(stateless session bean)的远程接口HelloWorldRemote.<br /><pre name="code" class="java">package com.chenzhq.ejb;

import javax.ejb.Remote;

@Remote ({HelloWorldRemote.class})
public interface HelloWorldRemote {

	   public String say(String name);
}</pre><br /><br />G）创建Remote接口的实现。<br /><pre name="code" class="java">package com.chenzhq.ejb;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless//注意这里啊
@Remote ({HelloWorldRemote.class})//注意这里啊

public class HelloWorld implements HelloWorldRemote {

	   public String say(String name){
		   System.out.println(HelloWorld.class.getCanonicalName());
		   return name;
	   }
}</pre><br />H）ok，写个ant脚本<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;project name="ejb" default="jar">
  
  &lt;target name="jar">
      &lt;jar destfile="D:\work\lib\helloworld.jar">
          &lt;fileset dir="./classes">
             &lt;include name="**/*.class"/>
             &lt;include name="**/*.xml"/>
          &lt;/fileset>
      &lt;/jar>
  
  &lt;/target>

&lt;/project></pre><br />I）将helloworld.jar复制到/usr/jboss/server/all/deploy下。看看控制台是否有输出<br />15:40:51,714 INFO&nbsp; [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=helloworld.jar,name=HelloWorld,service=EJB3 with dependencies:<br />15:40:51,757 INFO&nbsp; [EJBContainer] STARTED EJB: com.chenzhq.ejb.HelloWorld ejbName: HelloWorld<br />15:40:51,781 INFO&nbsp; [EJB3Deployer] Deployed: file:/usr/jboss/server/default/deploy/helloworld.jar<br />如果有上面的输出，说明是成功部署了。<br />在ie里输入http://ip：port访问jboss的jmx-console点击service=jndiView，然后是点击Output JNDI info as text下的invoke，查找HelloWorld。<br />J）在client端调用ejb的代码。<br /><pre name="code" class="java">package com.chenzhq;

import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.chenzhq.ejb.HelloWorldRemote;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Properties props = new Properties();
		props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
		props.setProperty("java.naming.provider.url", "jnp://192.168.0.2:1099");//这里是我部署ejb的主机地址。
		props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); 
		
		try {
			InitialContext ic = new InitialContext(props);
			HelloWorldRemote hwr = ((HelloWorldRemote)ic.lookup("HelloWorld/remote"));
			System.out.println(hwr.say("chenzhq"));
			
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			System.out.print(e);
			e.printStackTrace();
		}
		
		// 

	}

}</pre><br />Ok了，待续。。。。。。。。。。。。 :D&nbsp; :D&nbsp; :D&nbsp; :D&nbsp;<img src="/images/smiles/icon_biggrin.gif"/>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/252343" 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, 13 Oct 2008 17:57:49 +0800</pubDate>
        <link>http://www.javaeye.com/topic/252343</link>
        <guid>http://www.javaeye.com/topic/252343</guid>
      </item>
          <item>
        <title>hibernate-memcached补丁：支持Whalin的MemCached Java客户端</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://movingboy.javaeye.com">movingboy</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/250534" style="color:red;">http://www.javaeye.com/topic/250534</a>&nbsp;
          发表时间: 2008年10月09日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>hibernate-memcached（<a href="http://code.google.com/p/hibernate-memcached/" target="_blank">http://code.google.com/p/hibernate-memcached/</a>）是允许hibernate使用MemCached作为二级缓存的项目，它用到了spymemcached（<a href="http://code.google.com/p/spymemcached/" target="_blank">http://code.google.com/p/spymemcached/</a>）这个MemCached的Java客户端。花了一点时间做了个补丁，让它也支持Whalin的Java客户端（<a href="http://whalin.com/memcached/" target="_blank">http://whalin.com/memcached/</a>）。<br /><br />所有的代码（包括原hibernate-memcached的所有源码）、javadoc及重新制作的发布包请见附件，限于篇幅就不具体说明了。以下是我更新过的hibernate-memcached的配置说明，原配置说明请参见<a href="http://code.google.com/p/hibernate-memcached/wiki/Configuration" target="_blank">http://code.google.com/p/hibernate-memcached/wiki/Configuration</a></p>
<p>&nbsp;</p>
<h2><a id="Adding_hibernate-memcached_to_your_application">Adding hibernate-memcached to your application</a></h2>
<p><a id="Adding_hibernate-memcached_to_your_application">If you are using Maven2 for your application build you can follow the instructions on the  </a><a href="file:///p/hibernate-memcached/wiki/MavenRepository">MavenRepository</a>
page. For those that aren't using Maven2 you'll need to collect a few
simple jars for yourself. I am going to assume you already have
hibenrnate3 setup before you came here. </p>
<p>You'll need...
 	</p>
<ul>
<li>hibernate-memcached-&lt;version&gt;.jar </li>
<li><a href="http://repo1.maven.org/maven2/commons-codec/commons-codec/1.3/commons-codec-1.3.jar" rel="nofollow">commons-codec 1.3</a> </li>
<li><a href="http://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.5.0/slf4j-api-1.5.0.jar" rel="nofollow">slf4j-1.5.0.jar</a> </li>
<li>An slf4j implementation for your preferred logging framework. For log4j you can use <a href="http://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.5.0/slf4j-log4j12-1.5.0.jar" rel="nofollow">slf4j-log4j12-1.5.0.jar</a>. </li>
</ul>
<p>If you are using <a href="http://code.google.com/p/spymemcached/">spymemcached</a> as the MemCached client, you also need
 	</p>
<ul>
<li><a href="http://spymemcached.googlecode.com/files/memcached-2.1.jar" rel="nofollow">memcached-2.1.jar</a> </li>
<li><a href="http://bleu.west.spy.net/%7Edustin/repo/spy/jars/spy-2.4.jar" rel="nofollow">spy-2.4.jar</a> </li>
</ul>
<p><span style="color: #0000ff;">or if you prefer Whalin's</span> <a href="http://whalin.com/memcached/">memcached client for java</a><span style="color: #0000ff;">, you need to download java_memcached-release_2.0.1.jar from the</span> <a href="http://whalin.com/memcached/#download">download page</a> <span style="color: #0000ff;">according to your Java VM version.</span>
</p>
<h2><a id="Configuring_Hibernate">Configuring Hibernate</a></h2>
<p><a id="Configuring_Hibernate">The first thing to do is to tell hibernate which cache provider you'd like to use, and to enable the second level cache.
	</a></p>
<table border="0">
<tbody>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;">hibernate.cache.provider_class</td>
<td style="border: 1px solid #aaaaaa; padding: 5px;">com.googlecode.hibernate.memcached.MemcachedCacheProvider</td>
</tr>
</tbody>
</table>
<p><a id="Configuring_Hibernate">Using just the property above you get
basic entity caching by default. The hibernate-memcached library
supports query caching, but you have to enable query caching
separately. </a></p>
<table border="0">
<tbody>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;">hibernate.cache.use_query_cache</td>
<td style="border: 1px solid #aaaaaa; padding: 5px;">true</td>
</tr>
</tbody>
</table>
<p><a id="Configuring_Hibernate">!Now you can start setting up the
hibernate-memcached specific properties. The hibernate-memcached
properties are divided into two categories; cache-wide settings and
cache-region settings. </a></p>
<h3><a id="Cache_Wide_Settings">Cache Wide Settings</a></h3>
<p><a id="Cache_Wide_Settings">The cache wide settings all have
defaults can mostly be overwritten at a cache-region level. For both
spymemcached and Whalin's client, you can set: </a></p>
<table border="0">
<tbody>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> <strong>Property</strong> </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> <strong>Default</strong> </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> <strong>Description</strong> </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.servers </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> localhost:11211 </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> Space delimited list of memcached instances in host:port format </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.cacheTimeSeconds </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> 300 </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> The default number of seconds items should be cached. Can be overriden at the regon level. </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.keyStrategy </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> HashCodeKeyStrategy </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> Sets the strategy class to to use for generating cache keys. Must provide a class name that implements KeyStrategy </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.clearSupported </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> false </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;">
Enables support for the MemcachedCache.clear() method for all cache
regions. The way clear is implemented for memcached is expensive and
adds overhead to all get/set operations. It is not recommended for
production use. </td>
</tr>
</tbody>
</table>
<p><a id="Cache_Wide_Settings">For spymemcached, you can set:
	</a></p>
<table border="0">
<tbody>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.readBufferSize </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> DefaultConnectionFactory.DEFAULT_READ_BUFFER_SIZE </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> The read buffer size for each server connection from this factory </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.operationQueueLength </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> DefaultConnectionFactory.DEFAULT_OP_QUEUE_LEN </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> Maximum length of the operation queue returned by this connection factory </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.operationTimeout </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> DefaultConnectionFactory.DEFAULT_OPERATION_TIMEOUT </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> Default operation timeout in milliseconds </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.hashAlgorithm </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> HashAlgorithm.KETAMA_HASH </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;">
Which hash algorithm to use when adding items to the cache. Note: the
MemcachedClient defaults to using HashAlgorithm.NATIVE_HASH, while the
hibernate-memcached cache defaults to KETAMA_HASH for "consistent
hashing" </td>
</tr>
</tbody>
</table>
<p><span style="color: #0000ff;"><a id="Cache_Wide_Settings">For Whalin's client, you can set:
	</a></span></p>
<table border="0">
<tbody>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.weights </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;">  <span style="color: #0000ff;"></span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Space delimited list of server weights. If not set, all servers get the same weight </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.errorHandler </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> com.googlecode.hibernate.memcached.<br />dangamemcached.SimpleErrorHandler </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Error handler used by Whalin's client internally</span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.poolName </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> default </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> The name of SockIOPool </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.initConn </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> 1 </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Initial pool size </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.minConn </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> 1 </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Min pool size </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.maxConn </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> 10 </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Max pool size </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.maxIdle </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> 3000000 </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Max idle time for available sockets. Default 5 minutes </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.socketTimeout </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> 30000 </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Default timeout of socket reads. Default 30 seconds </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.socketConnectTimeout </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> 3000 </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Default timeout of socket connections. Default 3 seconds </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.maintSleep </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> 30000 </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Maintenance thread sleep time. Default 30 seconds </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.compressEnable </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> true </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> If compression enabled </span></td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> hibernate.memcached.defaultEncoding </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> UTF-8 </span></td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"><span style="color: #0000ff;"> Default encoding </span></td>
</tr>
</tbody>
</table>
<h3><a id="Cache_Region_Settings">Cache Region Settings</a></h3>
<p><a id="Cache_Region_Settings">Cache regon properties are set by
giving your cached data a "region name" in hibernate. You can tune the
MemcachedCache instance for your region using the following properties.
These properties essentially override the cache-wide properties above. </a></p>
<table border="0">
<tbody>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> <strong>Property</strong> </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> <strong>Default</strong> </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> <strong>Description</strong> </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.[region-name].cacheTimeSeconds </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> none, see hibernate.memcached.cacheTimeSeconds </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> Set the cache time for this cache region, overriding the cache-wide setting. </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.[region-name].keyStrategy </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> none, see hibernate.memcached.keyStrategy </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;">
Overrides the strategy class to to use for generating cache keys in
this cache region. Must provide a class name that implements
KeyStrategy </td>
</tr>
<tr>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> hibernate.memcached.[region-name].clearSupported </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> none, see hibernate.memcached.clearSupported </td>
<td style="border: 1px solid #aaaaaa; padding: 5px;"> Enables clear() operations for this cache region only. Again, the clear operation incurs cost on every get/set operation. </td>
</tr>
</tbody>
</table>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/250534" 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>Thu, 09 Oct 2008 00:03:19 +0800</pubDate>
        <link>http://www.javaeye.com/topic/250534</link>
        <guid>http://www.javaeye.com/topic/250534</guid>
      </item>
          <item>
        <title>Android入门扫盲之二</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuikui.javaeye.com">LinuxFans</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251964" style="color:red;">http://www.javaeye.com/topic/251964</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2 style="margin: 13pt 0cm;"><span style="font-family: 宋体; mso-ascii-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: major-fareast; mso-hansi-font-family: Cambria; mso-hansi-theme-font: major-latin;"><span style="font-size: large;">资源的引用</span></span></h2>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">在</span><span lang="EN-US"><span style="font-family: Calibri;">Android</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">开发中对资源的引用是很重要的内容，看一个</span><span lang="EN-US"><span style="font-family: Calibri;">Android</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">工程结构的好与坏，其实看看工程结构的资源文件的相互关系就大概可以看出来了，个人觉得学习好</span><span lang="EN-US"><span style="font-family: Calibri;">Android</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">，资源文件是很重要的部分，这里讲的都是些入门级别的知识点，耐下心思看哦，呵呵。</span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 18.75pt; text-indent: -18.75pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-size: small; font-family: Calibri;">1，</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">三种资源文件形式。资源文件之间的相互引用自然是基础的基础，三种形式</span><span lang="EN-US"><span style="font-family: Calibri;">(android:xxx/yyy,@xxxx/yyy,?xxx)</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的区别要彻底地弄明白。</span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 18.75pt; text-indent: -18.75pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-size: small; font-family: Calibri;">2，</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">资源文件的属性命名。资源文件属性的命名</span><span lang="EN-US"><span style="font-family: Calibri;">(</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">其实大部分是</span><span lang="EN-US"><span style="font-family: Calibri;">id</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">名字，也有其它的，这里不再累赘</span><span lang="EN-US"><span style="font-family: Calibri;">)</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">对于初学者可能不太会在意，其实是很重要的部分，它其实也就是一些我们预先定义好的变量，能不在乎吗，这些变量会在自动生成映射类</span><span lang="EN-US"><span style="font-family: Calibri;">R.java</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">中生成一些静态索引值，帮助</span><span lang="EN-US"><span style="font-family: Calibri;">Android</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">快速定位，命名说白了，也是要求我们做到望名知意</span><span lang="EN-US"><span style="font-family: Calibri;">(</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">最好包括类型</span><span lang="EN-US"><span style="font-family: Calibri;">)</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。</span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 18.75pt; text-indent: -18.75pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-size: small; font-family: Calibri;">3，</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">每个工程都会有对应的一个</span><span lang="EN-US"><span style="font-family: Calibri;">AndroidManifest.xml</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">文件，这个文件要注意的是一些权限的表示属性，如：</span></span></p>
<p class="MsoListParagraph" align="left" style="margin: 0cm 0cm 0pt 18.75pt; text-indent: 0cm; text-align: left; mso-char-indent-count: 0; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">uses-permission </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:name</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"android.permission.INTERNET" </span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">uses-permission </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:name</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"android.permission.READ_CONTACTS" </span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">uses-permission </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:name</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"android.permission.WRITE_CONTACTS" </span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">uses-permission </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:name</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"android.permission.INSTALL_PACKAGES" </span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">uses-permission </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:name</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"android.permission.DELETE_PACKAGES" </span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 18.75pt; text-indent: 0cm; mso-char-indent-count: 0;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">看命名就知道是针对什么做权限限制，所以初学者要注意了，在你的程序运行的时候报</span><span lang="EN-US"><span style="font-family: Calibri;">SecurityException</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">的时候要看看你的程序是否涉及到限制操作，呵呵。这些在</span><span lang="EN-US"><span style="font-family: Calibri;">android.Manifest.permission</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">里面，大家自己看可能会更好，自己学习的能力很重要哦，要不然你做的不可能是前沿的东西啦。</span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 18.75pt; text-indent: -18.75pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo1;"><span lang="EN-US" style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: Ignore;"><span style="font-size: small; font-family: Calibri;">4，</span><span style="font-family: &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">自己定义类的引用。怎么定义、怎么使用，可以参考</span><span lang="EN-US"><span style="font-family: Calibri;">ApiDemo</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">里面的经典实例：</span><span lang="EN-US"><span style="font-family: Calibri;">com.example.android.apis.view.LableView.java </span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">。这也是很重哦，因为在我们开发的过程中</span><span lang="EN-US"><span style="font-family: Calibri;">,Android</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">提供的</span><span lang="EN-US"><span style="font-family: Calibri;">UI</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">肯定不能满足我们的要求，这样你就得自己写新的</span><span lang="EN-US"><span style="font-family: Calibri;">UI</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">类，我在开发中就遇到很多这样的问题。如，</span><span lang="EN-US"><span style="font-family: Calibri;">Android</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">现有的</span><span lang="EN-US"><span style="font-family: Calibri;">TabHost</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">，在</span><span lang="EN-US"><span style="font-family: Calibri;">TabSpec</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">多的时候你就感觉出</span><span lang="EN-US"><span style="font-family: Calibri;">TabHost</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">英雄无用武之地啦，这样就得自己写了。</span></span></p>
<h3 style="margin: 13pt 0cm;"><span style="font-size: large;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">写自己的</span><span lang="EN-US"><span style="font-family: Calibri;">Android Components</span></span></span></h3>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">上面的第四点已经提到了一下，学会写自己的控件的重要性。在</span><span lang="EN-US"><span style="font-family: Calibri;">Android</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">里面，提供了丰富的类库，如何使用好也是值得探讨的问题。当然这里说的也是</span><span lang="EN-US"><span style="font-family: Calibri;">api</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">里面说的，这里说的主要是我在学习的过程中认为很重要的方面</span><span lang="EN-US"><span style="font-family: Calibri;">.</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">主要把界面布局类：</span><span lang="EN-US"><span style="font-family: Calibri;">LinearLayout</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">和</span><span lang="EN-US"><span style="font-family: Calibri;">FrameLayout</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">弄懂简单的开发就够了，再深入一点就要把</span><span lang="EN-US"><span style="font-family: Calibri;">ViewManager</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">及其子类弄清楚了。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">其中，</span><span lang="EN-US"><span style="font-family: Calibri;">LinearLayout</span></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">垂直和水平两种，他们之间可以相互嵌套，嵌套时候要注意高和宽的属性，如。</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">LinearLayout </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">xmlns:android</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"http://schemas.android.com/apk/res/android"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">xmlns:app</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"http://schemas.android.com/apk/res/com.srk.study"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:id</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"@+id/screen" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_width</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"fill_parent"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_height</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"fill_parent"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:background</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"@drawable/background" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:focusable</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"true"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:orientation</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"vertical"</span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">LinearLayout<span style="mso-spacerun: yes;">&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_width</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"fill_parent"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_height</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"65dip"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:background</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"@drawable/background"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:orientation</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"horizontal"</span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">com.srk.study.model.TitleView </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:id</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"@+id/titleView"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_width</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"280dip" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_height</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"65dip"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:paddingLeft</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"5dip" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:paddingTop</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"10dip"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">app:focusBgColor</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">@drawable/whiteColor </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">app:titleColor</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">@drawable/blackColor</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">app:titleSize</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"15dip" </span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">com.srk.study.model.ConnectView </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:id</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"@+id/connectView"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_height</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"65dip"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 3;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_width</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"40dip" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">app.startX</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"280dip" </span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">LinearLayout</span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #3f5fbf; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;!-- ############# Body ############ --&gt;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">ListView </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:id</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"@+id/bodyListView" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_width</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"fill_parent"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:paddingTop</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"3dip" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_height</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"wrap_content"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:layout_weight</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"1.0"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:persistentDrawingCache</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"animation|scrolling"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:scrollbars</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"vertical" </span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:focusable</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"true"</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">android:scrollbarSize</span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"12dip" </span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">LinearLayout</span><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">以上的配置文件是我学习过程的小练习，在这里秀一下，哈哈，记得在去年刚毕业的时候，特别爱学习，什么都想弄弄，在去年一年的时光中，每天都过得很充实，也许那就是年轻的标志吧，扯远了。今天就说这么多，有空分享点源代码出来。。。</span></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251964" 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>Sun, 12 Oct 2008 22:51:44 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251964</link>
        <guid>http://www.javaeye.com/topic/251964</guid>
      </item>
          <item>
        <title>用 oml4j 解释 office2007 docx 文档</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pzzy2000.javaeye.com">pzzy2000</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251969" style="color:red;">http://www.javaeye.com/topic/251969</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这几天在 做项目的 时候，需要把一些工程文档用WEB 显示出来，本人有点懒，不想集成web 页面编辑控件。<br />就在 group.google.com，找到 http://groups.google.com/group/oxml4j 工程，用来解释 docx 文档的 ；<br /><br />&nbsp;&nbsp;&nbsp; 1 : 先 从 http://code.google.com/p/oxmlj/ 下载 需要的&nbsp; jar lib ;<br /><br />&nbsp;&nbsp;&nbsp; 2: 写了个解释TEST;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentFactory oxmlPaserFactory = new ReadDocumentFactory();<br /><br />		XDocument document = oxmlPaserFactory.getXDocument(ocxFile);<br /><br />		 List&lt;Paragraph>&nbsp; paragraphs=document.getParagraph();<br />		 <br />		 for(int i=0;i&lt;paragraphs.size();i++)<br />		 {<br />			 <br />			 Paragraph paragraph=paragraphs.get(i);<br />			 <br />			 System.out.println("-- "+paragraph.getText()+" "+paragraph.getStyle()+"&nbsp;&nbsp; image : "+paragraph.getImages());<br />		 }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; 竟然 可以解析出 段落文档；<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paragraph.getImages()； 好像 是 可以解析 出docx 文档中的图片的； <br />&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我 用 struts2 ,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String getImages()throws Exception<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response = ServletActionContext.getResponse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.wirte(paragraph.getImages());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 页面上用&lt;img&nbsp; src="etImagesn?file="test.docx"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以显示 图片；<br /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 竟然 成功了。。<br /> <br />&nbsp;&nbsp;&nbsp;&nbsp; 好高兴 ，这样 可以 省了 很多的代码；<br />&nbsp;&nbsp;&nbsp; 项目可以提前完成了；
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/251969" 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>Sun, 12 Oct 2008 23:20:22 +0800</pubDate>
        <link>http://www.javaeye.com/topic/251969</link>
        <guid>http://www.javaeye.com/topic/251969</guid>
      </item>
          <item>
        <title>如何Tomcat下中文乱码问题？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhuzhsh.javaeye.com">zhuzhsh</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/251743" style="color:red;">http://www.javaeye.com/topic/251743</a>&nbsp;
          发表时间: 2008年10月12日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <span style="text-decoration: underline;"><strong>1）JSP页面中显示中文乱码</strong></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JSP文件中使用page命令指定响应结果的MIME类型，如&lt;%@ page language="java" contentType="text/html;charset=gb2312" %&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="text-decoration: underline;">2）表单提交乱码</span></strong>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 表单提交时（post和Get方法），使用request.getParameter方法得到乱码，这是因为tomcat处理提交的参数时默认的是iso-8859-1，表单提交get和post处理乱码问题不同，下面分别说明。<br />&nbsp;&nbsp;&nbsp; (1)POST处理<br />&nbsp;&nbsp; &nbsp;对post提交的表单通过编写一个过滤器的方法来解决，过滤器