<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>hua6884858</title>
    <description>一起分享,一起成长   </description>
    <link>http://hua6884858.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>css基础</title>
        <author>hua6884858</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hua6884858.javaeye.com">hua6884858</a>&nbsp;
          链接：<a href="http://hua6884858.javaeye.com/blog/228455" style="color:red;">http://hua6884858.javaeye.com/blog/228455</a>&nbsp;
          发表时间: 2008年08月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="color: #ff0000;">怎么我现在那么健忘呢？</span></p>
<p><strong>1、CSS（Cascading Style Sheets）层叠式样表结构</strong></p>
<p>&nbsp;&nbsp; CSS段落或CSS文件由CSS声明组成，每个CSS声明又由<span style="color: #ff0000;">选择器</span>和<span style="color: #ff0000;">样式声明段</span>构成。</p>
<p>一个CSS声明的基本语法是：</p>
<p><span style="color: #339966;">选择器 {样式属性1，值1；样式属性2，值2；&hellip;&hellip;}</span></p>
<p>也可以一次定义多个选择器：</p>
<p><span style="color: #339966;">选择器1，选择器2&hellip;&hellip;{样式属性1，值1；样式属性2，值2&hellip;&hellip;}</span></p>
<p>另一种是定义选择器的交集：</p>
<p><span style="color: #339966;">选择器1 选择器2&hellip;&hellip;{样式属性1，值1；样式属性2，值2&hellip;&hellip;}</span></p>
<p>跟上一种的区别是选择器之间用空格而不是逗号分开，这个定义表示选择器2的内容同时包含在选择器1中的时候，所设置的属性才会起作用。</p>
<p><strong>2、选择器</strong></p>
<p>&nbsp;&nbsp;&nbsp;选择器定义这个CSS声明的作用对象。</p>
<p>a. 基于HTML元素的选择器，这样声明的CSS样式应用于页面上的定义元素上，例如：</p>
<p><span style="color: #339966;">body{color:#000000; font-size:9px; ......}</span></p>
<p>b. 基于类属性的选择器，这样声明的CSS样式应用于class属性为定义类名的元素上，例如：</p>
<p><span style="color: #339966;">.classname{color:#000000; font-size:9px; ......}</span></p>
<p>c. 基于ID属性的选择器，这样声明的CSS样式应用于ID属性为定义标识符的元素上，与基于类属性的选择器不同的是，每个ID只能引用一次，例如：</p>
<p><span style="color: #339966;">#id_string{color:#000000; font-size:9px; ......}</span></p>
<p>d. 伪选择器，使用伪选择器可以进一步定义使用CSS样式的元素的具体行为或具体位置，伪选择器由浏览器定义，具体的伪选择器可以参阅不同浏览器的支持文档。如：</p>
<p><span style="color: #339966;">:pseudo-selector{color:#000000; font-size:9px; ......}</span><span style="color: #339966;"> </span></p>
<p><span style="color: #339966;">a:hover{color:#000000; font-size:9px; ......}</span><span style="color: #339966;"> //在&lt;a&gt;元素有鼠标滑过的行为时应用样式</span></p>
<p><span style="color: #339966;">p:first-letter</span><span style="color: #339966;">{color:#000000; font-size:9px; ......} //在&lt;p&gt;元素的首字母上应用样式</span></p>
<p>e. 混合的选择器，同时使用上面的三种定义方式来限制CSS样式的作用域，例如：</p>
<p><span style="color: #000000;">div p{color:#000000; font-size:9px; ......}</span><span style="color: #339966;"> //在&lt;div&gt;元素内的&lt;p&gt;元素可用，其他&lt;p&gt;元素则不受限制</span></p>
<p><span style="color: #000000;">p .class1{color:#000000; font-size:9px; ......}</span><span style="color: #339966;"> //在class="class1"的&lt;p&gt;元素上应用，其他&lt;p&gt;元素和其他class="class1"的元素都不受限制</span></p>
<p><span style="color: #339966;"><span style="color: #000000;">div .class p #article</span><span style="color: #000000;">{color:#000000; font-size:9px; ......}</span><span style="color: #339966;"> //...</span></span></p>
<p><span style="color: #339966;"><span style="color: #000000;">div，p .class</span><span style="color: #000000;">{color:#000000; font-size:9px; ......}</span><span style="color: #339966;"> //在&lt;div&gt;和class="class1"的&lt;p&gt;元素中同时应用</span></span></p>
<p><span style="color: #339966;"><span style="color: #000000;">a .class1 :hover{color:#000000; font-size:9px; ......}</span><span style="color: #339966;"> //...</span></span></p>
<p><strong>3、样式声明段</strong></p>
<p><strong>&nbsp;&nbsp; </strong>样式声明包含在<span style="color: #ff0000;">{}</span>内，由多个名-值对构成，样式名和样式值之间用<span style="color: #ff0000;">:</span>号，名-值对之间用<span style="color: #ff0000;">;</span>号隔开。样式名和样式值可以参阅CSS手册。</p>
<p><strong>4、在不同的位置应用CSS样式</strong></p>
<p><strong>&nbsp;</strong>&nbsp; 在不同的位置应用CSS样式，使得样式有不一样的作用域。</p>
<p>a. 在元素的style属性里，只对当前元素有效，比较灵活但没有重用性，如：</p>
<p><span style="color: #339966;">&lt;p style="color: blue; font-size: 10pt"&gt;H.S WORKSHOP&lt;/p&gt;</span></p>
<p>b. 在&lt;style&gt;元素内，&lt;style&gt;可以在HTML文档的任何位置，一般包含在&lt;head&gt;元素里，作用于当前这个HTML文件，多个元素间可以重用，但HTML文件间不可以重用，如：</p>
<p><span style="color: #339966;">&lt;STYLE TYPE="text/css"&gt;<br />&lt;!--<br />样式规则表<br />--&gt; <br />&lt;/STYLE&gt;</span></p>
<p>c. 用&lt;link&gt;元素引用独立的CSS文件，多个HTML文件都可以使用同一个CSS文件，具有很好的重用性，如：</p>
<p><span style="color: #339966;">&lt;link rel="stylesheet" href="cssfilename.css" type="text/css" media="screen"&gt;</span></p>
<p>d. 引用网络上的css文件，如</p>
<p><span style="color: #339966;">&lt;STYLE TYPE="text/css"&gt;<br />&lt;!--<br />　　@import url; //分号不可以省略哦！<br />--&gt;<br />&lt;/STYLE&gt; <br /></span><br /><span style="color: #ff0000;">ps.</span></p>
<p><span style="color: #ff0000;"><span style="color: #ff0000;">DIV和SPAN这两个标识在应用上十分类似，不同之处在于：DIV定义为区块（block），在 &lt;DIV&gt;...&lt;/DIV&gt;之间是一个很完整的段落区块。 而SPAN标识则是定义为同轴（in-line），&lt;SPAN&gt;...&lt; /SPAN&gt;应用于于小范围内的设定。两者可以彼此混合，夹杂使用，因为彼此是相互独立的。也因此，您可以利用这两个元素，配合其它性质，灵活地调整您的网页显示的内容.</span><br /></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://hua6884858.javaeye.com/blog/228455#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Aug 2008 16:58:12 +0800</pubDate>
        <link>http://hua6884858.javaeye.com/blog/228455</link>
        <guid>http://hua6884858.javaeye.com/blog/228455</guid>
      </item>
      <item>
        <title>四川论坛学习</title>
        <author>hua6884858</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hua6884858.javaeye.com">hua6884858</a>&nbsp;
          链接：<a href="http://hua6884858.javaeye.com/blog/228104" style="color:red;">http://hua6884858.javaeye.com/blog/228104</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>四川论坛学习</p>
<p>在网客的APP中的libconfig.xml 配置<br />&lt;class name="com.doone.fj1w.bbs.webbbs.WebBBSTransfers" desc="网客论坛" /&gt;</p>
<p>这样的话，这个类文件，一开始就加载了<br />所有方法方到键值队中，可以读取，WEB就可以访问所有的类<br />中的方法</p>
<p><br />APP中的FormBody是 WebBBSTransfers类中<br />&nbsp;/**<br />&nbsp; * 删除帖子 0成功 1 失败<br />&nbsp; * @param fb<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String deleteNote(FormBody fb){//删除帖子&nbsp;&nbsp; 0成功 1 失败<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;String aContent_ID = fb.getString("CONTENT_ID");<br />&nbsp;&nbsp;&nbsp;//String sPurvICode = fb.getString("PURVCODE");<br />&nbsp;&nbsp;&nbsp;DacClient db = new DacClient();<br />&nbsp;&nbsp;&nbsp;if ( TF_Content.deleteContent(db, Long.parseLong(aContent_ID)) == 0 ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "1";<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "0";<br />&nbsp;&nbsp;}catch (Exception ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp; FileLogger.getLogger().warn(ex.getMessage(), ex);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "1";<br />&nbsp;}</p>
<p><br />public static int deleteContent(DacClient db, long contentID) {<br />&nbsp;&nbsp;int ret = 0;<br />&nbsp;&nbsp;boolean bTran = false;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;if (!db.getTransactionState()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;db.beginTransaction(-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;bTran = true;<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;StringBuffer sql = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;// 读取要删除帖子的子帖数。<br />&nbsp;&nbsp;&nbsp;sql.append("select count(1)");<br />&nbsp;&nbsp;&nbsp;sql.append(" from (SELECT content_id, first_content_id");<br />&nbsp;&nbsp;&nbsp;sql.append(" FROM tf_content a");<br />&nbsp;&nbsp;&nbsp;sql.append(" CONNECT BY PRIOR a.content_id = a.up_content_id");<br />&nbsp;&nbsp;&nbsp;sql.append(" START WITH a.content_id = ?)");<br />&nbsp;&nbsp;&nbsp;sql.append(" where content_id &lt;&gt; first_content_id");</p>
<p>&nbsp;&nbsp;&nbsp;Object[] ap = new Object[1];<br />&nbsp;&nbsp;&nbsp;ap[0] = new Long(contentID);</p>
<p>&nbsp;&nbsp;&nbsp;int count = Integer.parseInt(db.getStringFromSqlQuery(sql.toString(), ap));</p>
<p>&nbsp;&nbsp;&nbsp;if (count &gt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;// 更新用户可用分及回帖数<br />&nbsp;&nbsp;&nbsp;&nbsp;sql = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append("update tf_mark m");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" set m.reversion_count = m.reversion_count - ?,");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" m.useable_mark = m.useable_mark - ? * 10");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" where exists (select 1");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" from (SELECT content_id, mark_id, first_content_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" FROM tf_content a");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" CONNECT BY PRIOR a.content_id = a.up_content_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" START WITH a.content_id = ?) t");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" where m.mark_id = t.mark_id");<br />&nbsp;&nbsp;&nbsp;&nbsp;sql.append(" and t.content_id &lt;&gt; t.first_content_id)");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Object[] ap1 = new Object[3];<br />&nbsp;&nbsp;&nbsp;&nbsp;ap1[0] = new Integer(count);<br />&nbsp;&nbsp;&nbsp;&nbsp;ap1[1] = new Integer(count);<br />&nbsp;&nbsp;&nbsp;&nbsp;ap1[2] = new Long(contentID);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;db.executeUpdate(sql.toString(), -1, ap1);<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;// 更新用户可用分及主帖数<br />&nbsp;&nbsp;&nbsp;sql = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;sql.append("update tf_mark m");<br />&nbsp;&nbsp;&nbsp;sql.append(" set m.publish_count = m.publish_count - 1,");<br />&nbsp;&nbsp;&nbsp;sql.append(" m.useable_mark&nbsp; = m.useable_mark - 20,");<br />&nbsp;&nbsp;&nbsp;sql.append(" m.integral = m.integral - 1");<br />&nbsp;&nbsp;&nbsp;sql.append(" where exists (select 1");<br />&nbsp;&nbsp;&nbsp;sql.append(" from tf_content t");<br />&nbsp;&nbsp;&nbsp;sql.append(" where m.mark_id = t.mark_id");<br />&nbsp;&nbsp;&nbsp;sql.append(" and t.content_id = ?");<br />&nbsp;&nbsp;&nbsp;sql.append(" and t.content_id = t.first_content_id)");<br />&nbsp;&nbsp;&nbsp;db.executeUpdate(sql.toString(), -1, ap);</p>
<p>&nbsp;&nbsp;&nbsp;// 删除帖子<br />&nbsp;&nbsp;&nbsp;sql = new StringBuffer();<br />&nbsp;&nbsp;&nbsp;sql.append("UPDATE tf_content t");<br />&nbsp;&nbsp;&nbsp;sql.append(" SET t.delete_sign = 'D'");<br />&nbsp;&nbsp;&nbsp;sql.append(" WHERE exists (select 1");<br />&nbsp;&nbsp;&nbsp;sql.append(" from (SELECT content_id");<br />&nbsp;&nbsp;&nbsp;sql.append(" FROM tf_content a");<br />&nbsp;&nbsp;&nbsp;sql.append(" CONNECT BY PRIOR a.content_id = a.up_content_id");<br />&nbsp;&nbsp;&nbsp;sql.append(" START WITH a.content_id = ?) a1");<br />&nbsp;&nbsp;&nbsp;sql.append(" where a1.content_id = t.content_id)");</p>
<p>&nbsp;&nbsp;&nbsp;ret = db.executeUpdate(sql.toString(), -1, ap);</p>
<p>&nbsp;&nbsp;&nbsp;if (bTran)<br />&nbsp;&nbsp;&nbsp;&nbsp;db.endTransaction(true);<br />&nbsp;&nbsp;} catch (Exception ex) {<br />&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;if (bTran)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.endTransaction(false);<br />&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;FileLogger.getLogger().info(ex.getMessage(), ex);<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return ret;<br />&nbsp;}</p>
<p>&nbsp;</p>
<p>WEB对应的方法<br />&nbsp;/**<br />&nbsp; * 删除帖子<br />&nbsp; * @param request<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public String webDelContent(HttpServletRequest request){<br />&nbsp;&nbsp;FormBody body = new FormBody();<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;WSClient _wsClient = WSClient.getInstance(Proxy_FJ1W.S_QUERYAPP,"deleteNote");<br />&nbsp;&nbsp;&nbsp;body.append("CONTENT_ID", request.getParameter("id"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _wsClient.setBody(body);<br />&nbsp;&nbsp;&nbsp;String value = _wsClient.Call();<br />&nbsp;&nbsp;&nbsp;return value;<br />&nbsp;&nbsp;}catch(RuntimeException e){<br />&nbsp;&nbsp;&nbsp;throw e;<br />&nbsp;&nbsp;}catch(Exception e){<br />&nbsp;&nbsp;&nbsp;throw new RuntimeException(e);<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>JSP</p>
<p>&lt;%<br />&nbsp;String isJieTie = null;<br />&nbsp;DacClient db = new DacClient();<br />&nbsp;String sContentId = request.getParameter("id");<br />&nbsp;String sPurvICode = "BBS";<br />&nbsp;DataTable table = null;<br />&nbsp;SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br />&nbsp;BBSAuth bbsAuth = null;<br />&nbsp;WebAuth auth = null;<br />&nbsp;TF_Content content = null;<br />&nbsp;FormBody body = null;<br />&nbsp;long lParentId = 0;<br />&nbsp;try{<br />&nbsp;&nbsp;if ( sContentId != null ) {<br />&nbsp;&nbsp;&nbsp;long lContentId = Long.parseLong(sContentId);<br />&nbsp;&nbsp;&nbsp;WebBBSTransfers webbbs = new WebBBSTransfers();<br />&nbsp;&nbsp;&nbsp;body = webbbs.getTfContentPurviewDate(lContentId);<br />&nbsp;&nbsp;&nbsp;sPurvICode = body.getString("sPurvICode");<br />&nbsp;&nbsp;&nbsp;lParentId = Long.parseLong(body.getString("lParentId"));<br />&nbsp;&nbsp;&nbsp;auth = WebAuth.getInstance(request);<br />&nbsp;&nbsp;&nbsp;//bbsAuth = BBSAuth.getInstance(auth, sPurvICode);<br />&nbsp;&nbsp;&nbsp;//table = BBSFactory.getInstance(request).getContentListByContent_ID(lContentId, 0, 100);<br />&nbsp;&nbsp;&nbsp;table = webbbs.getContentListByContentId(lContentId,0,100);<br />&nbsp;&nbsp;}<br />&nbsp;}catch(Exception e){<br />&nbsp;&nbsp;FileLogger.getLogger().info(e.getMessage(),e);<br />&nbsp;}<br />&nbsp;<br />%&gt;<br />对应的formbody解析为<br />&lt;td align="right" nowrap&gt;&lt;span id="ItemTitle"&gt;主题：<br />&lt;%= body.getString("Delete_Sign").equals("E")?"&lt;font color='highgreen'&gt;&lt;b&gt;<br />【审核已通过】&lt;/b&gt;&lt;/font&gt;":""%&gt;&lt;%= body.getString("TITLE")%&gt;&lt;/span&gt;&lt;/td&gt;</p>
<p>对应的table 是DATATABLE类型解析 </p>
<p>&lt;%<br />&nbsp;&nbsp;isJieTie = table.getRow(0).getString("state");<br />&nbsp;&nbsp;System.out.println("======================:"+isJieTie);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( int i=0; i&lt;table.getRows().getCount(); i++ ) {<br />&nbsp;&nbsp;DataRow dr = table.getRow(i);<br />%&gt;</p>
<p><br />解析LIST<br />{ %&gt;<br />&nbsp;&nbsp;&lt;font color="red"&gt;附件列表：&lt;/font&gt;&lt;%<br />&nbsp;&nbsp;TF_Attchment[] attchList = TF_Attchment.getAttchList(db, dr.getLong("CONTENT_ID"), "2"); <br />&nbsp;&nbsp;for ( int j=0; j&lt;attchList.length; j++) {%&gt;<br />&nbsp;&nbsp;&lt;div id="lblAttch" style="padding-left: 10px;"&gt;<br />&nbsp;&lt;a href="AttchMap/&lt;%= attchList[j].getAttch_ID()%&gt;/&lt;%= attchList[j].getFile_Name()%&gt;" target="Attchment"&gt;&lt;%= attchList[j].getFile_Name()%&gt;&lt;/a&gt;<br />&lt;/div&gt;&lt;%</p>
<p>对应类</p>
<p>&nbsp;/**<br />&nbsp; * 取内容和权限实体的数据<br />&nbsp; * @param lContentId<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public FormBody getTfContentPurviewDate(long lContentId){<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;WSClient _wsClient = WSClient.getInstance(Proxy_FJ1W.S_QUERYAPP,"getTfContentPurviewDate");<br />&nbsp;&nbsp;&nbsp;_wsClient.setField("lContentId", lContentId+"");<br />&nbsp;&nbsp;&nbsp;String value = _wsClient.Call();<br />&nbsp;&nbsp;&nbsp;EMessage msg = new EMessage(value);<br />&nbsp;&nbsp;&nbsp;return msg.getFormBody();<br />&nbsp;&nbsp;}catch(RuntimeException e){<br />&nbsp;&nbsp;&nbsp;throw e;<br />&nbsp;&nbsp;}catch(Exception e){<br />&nbsp;&nbsp;&nbsp;throw new RuntimeException(e);<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p><br />&nbsp;/**<br />&nbsp; * webBBSViewContent.jsp页面<br />&nbsp; * @param lContentId<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String getTfContentPurviewDate(String lContentId){<br />&nbsp;&nbsp;EMessage msg = new EMessage();<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;FormBody formBody = new FormBody();<br />&nbsp;&nbsp;&nbsp;DacClient db = new DacClient();<br />&nbsp;&nbsp;&nbsp;TF_Content tf_content = new TF_Content(db, Long.parseLong(lContentId));<br />&nbsp;&nbsp;&nbsp;Sys_Purview purview = Sys_Purview.getPurviewByID(db, tf_content.getBoard_ID());<br />&nbsp;&nbsp;&nbsp;String sPurvICode = purview.getPurviewCode(); <br />&nbsp;&nbsp;&nbsp;long lParentId = tf_content.getBoard_ID();<br />&nbsp;&nbsp;&nbsp;formBody.append("sPurvICode", sPurvICode);<br />&nbsp;&nbsp;&nbsp;formBody.append("lParentId", lParentId+"");<br />&nbsp;&nbsp;&nbsp;//formBody.append("lParentId", tf_content.getBoard_ID()+"");<br />&nbsp;&nbsp;&nbsp;formBody.append("UP_CONTENT_ID", tf_content.getContent_ID()+"");<br />&nbsp;&nbsp;&nbsp;formBody.append("TITLE", tf_content.getTitle());<br />&nbsp;&nbsp;&nbsp;formBody.append("Delete_Sign", tf_content.getDelete_Sign());<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;msg.setBody(formBody);<br />&nbsp;&nbsp;&nbsp;return msg.getXmlMsg();<br />&nbsp;&nbsp;}catch(Exception e){<br />&nbsp;&nbsp;&nbsp;FileLogger.getLogger().info(e.getMessage(),e);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;return null;<br />&nbsp;}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://hua6884858.javaeye.com/blog/228104#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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, 14 Aug 2008 18:02:04 +0800</pubDate>
        <link>http://hua6884858.javaeye.com/blog/228104</link>
        <guid>http://hua6884858.javaeye.com/blog/228104</guid>
      </item>
      <item>
        <title>Java应用中的编码问题</title>
        <author>hua6884858</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hua6884858.javaeye.com">hua6884858</a>&nbsp;
          链接：<a href="http://hua6884858.javaeye.com/blog/228018" style="color:red;">http://hua6884858.javaeye.com/blog/228018</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="1">1. 概述</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">本文主要包括以下几个方面：编码基本知识，java，系统软件，url，工具软件等。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">在下面的描述中，将以"中文"两个字为例，经查表可以知道其GB2312编码是"<span style="text-decoration: underline;">d6d0 cec4</span>"，Unicode编码为"<span style="text-decoration: underline;">4e2d 6587</span>"，UTF编码就是"<span style="text-decoration: underline;">e4b8ad e69687</span>"。注意，这两个字没有iso8859-1编码，但可以用iso8859-1编码来"表示"。</p>
<p class="1">2. 编码基本知识</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">最早的编码是iso8859-1，和ascii编码相似。但为了方便表示各种各样的语言，逐渐出现了很多标准编码，重要的有如下几个。</p>
<p class="2">2.1. iso8859-1</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">属于单字节编码，最多能表示的字符范围是0-255，应用于英文系列。比如，字母'a'的编码为0x61=97。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">很明显，iso8859-1编码表示的字符范围很窄，无法表示中文字符。但是，由于是单字节编码，和计算机最基础的表示单位一致，所以很多时候，仍旧使用iso8859-1编码来表示。而且在很多协议上，默认使用该编码。比如，虽然"中文"两个字不存在iso8859-1编码，以gb2312编码为例，应该是"<span style="text-decoration: underline;">d6d0 cec4</span>"两个字符，使用iso8859-1编码的时候则将它拆开为4个字节来表示："<span style="text-decoration: underline;">d6 d0 ce c4</span>"（事实上，在进行存储的时候，也是以字节为单位处理的）。而如果是UTF编码，则是6个字节"<span style="text-decoration: underline;">e4 b8 ad e6 96 87</span>"。很明显，这种表示方法还需要以另一种编码为基础。</p>
<p class="2">2.2. GB2312/GBK</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">这就是汉子的国标码，专门用来表示汉字，是双字节编码，而英文字母和iso8859-1一致（兼容iso8859-1编码）。其中gbk编码能够用来同时表示繁体字和简体字，而gb2312只能表示简体字，gbk是兼容gb2312编码的。</p>
<p class="2">2.3. unicode</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">这是最统一的编码，可以用来表示所有语言的字符，而且是定长双字节（也有四字节的）编码，包括英文字母在内。所以可以说它是不兼容iso8859-1编码的，也不兼容任何编码。不过，相对于iso8859-1编码来说，uniocode编码只是在前面增加了一个0字节，比如字母'a'为"<span style="text-decoration: underline;">00 61</span>"。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">需要说明的是，定长编码便于计算机处理（注意GB2312/GBK不是定长编码），而unicode又可以用来表示所有字符，所以在很多软件内部是使用unicode编码来处理的，比如java。</p>
<p class="2">2.4. UTF</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">考虑到unicode编码不兼容iso8859-1编码，而且容易占用更多的空间：因为对于英文字母，unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码，utf编码兼容iso8859-1编码，同时也可以用来表示所有语言的字符，不过，utf编码是不定长编码，每一个字符的长度从1-6个字节不等。另外，utf编码自带简单的校验功能。一般来讲，英文字母都是用一个字节表示，而汉字使用三个字节。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">注意，虽然说utf是为了使用更少的空间而使用的，但那只是相对于unicode编码来说，如果已经知道是汉字，则使用GB2312/GBK无疑是最节省的。不过另一方面，值得说明的是，虽然utf编码对汉字使用3个字节，但即使对于汉字网页，utf编码也会比unicode编码节省，因为网页中包含了很多的英文字符。</p>
<p class="1">3. java对字符的处理</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">在java应用软件中，会有多处涉及到字符集编码，有些地方需要进行正确的设置，有些地方需要进行一定程度的处理。</p>
<p class="2">3.1. getBytes(charset)</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">这是java字符串处理的一个标准函数，其作用是将字符串所表示的字符按照charset编码，并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如"中文"，正常情况下（即没有错误的时候）存储为"<span style="text-decoration: underline;">4e2d 6587</span>"，如果charset为"gbk"，则被编码为"<span style="text-decoration: underline;">d6d0 cec4</span>"，然后返回字节"<span style="text-decoration: underline;">d6 d0 ce c4</span>"。如果charset为"utf8"则最后是"<span style="text-decoration: underline;">e4 b8 ad e6 96 87</span>"。如果是"iso8859-1"，则由于无法编码，最后返回 "<span style="text-decoration: underline;">3f 3f</span>"（两个问号）。</p>
<p class="2">3.2. new String(charset)</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">这是java字符串处理的另一个标准函数，和上一个函数的作用相反，将字节数组按照charset编码进行组合识别，最后转换为unicode存储。参考上述getBytes的例子，"gbk" 和"utf8"都可以得出正确的结果"<span style="text-decoration: underline;">4e2d 6587</span>"，但iso8859-1最后变成了"<span style="text-decoration: underline;">003f 003f</span>"（两个问号）。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">因为utf8可以用来表示/编码所有字符，所以new String( str.getBytes( "utf8" ), "utf8" ) === str，即完全可逆。</p>
<p class="2">3.3. setCharacterEncoding()</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">该函数用来设置http请求或者相应的编码。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">对于request，是指提交内容的编码，指定后可以通过getParameter()则直接获得正确的字符串，如果不指定，则默认使用iso8859-1编码，需要进一步处理。参见下述"表单输入"。值得注意的是在执行setCharacterEncoding()之前，不能执行任何getParameter()。java doc上说明：This method must be called prior to reading request parameters or reading input using getReader()。而且，该指定只对POST方法有效，对GET方法无效。分析原因，应该是在执行第一个getParameter()的时候，java将会按照编码分析所有的提交内容，而后续的getParameter()不再进行分析，所以setCharacterEncoding()无效。而对于GET方法提交表单是，提交的内容在URL中，一开始就已经按照编码分析所有的提交内容，setCharacterEncoding()自然就无效。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">对于response，则是指定输出内容的编码，同时，该设置会传递给浏览器，告诉浏览器输出内容所采用的编码。</p>
<p class="2">3.4. 处理过程</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">下面分析两个有代表性的例子，说明java对编码有关问题的处理方法。</p>
<p class="3">3.4.1. 表单输入</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">User input<span style="text-decoration: underline;">&nbsp; *(gbk:d6d0 cec4)&nbsp; </span>browser<span style="text-decoration: underline;">&nbsp; *(gbk:d6d0 cec4)&nbsp; </span>web server<span style="text-decoration: underline;">&nbsp; iso8859-1(00d6 00d 000ce 00c4)&nbsp; </span>class，需要在class中进行处理：getbytes("iso8859-1")为<span style="text-decoration: underline;">d6 d0 ce c4</span>，new String("gbk")为<span style="text-decoration: underline;">d6d0 cec4</span>，内存中以unicode编码则为<span style="text-decoration: underline;">4e2d 6587</span>。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> 用户输入的编码方式和页面指定的编码有关，也和用户的操作系统有关，所以是不确定的，上例以gbk为例。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> 从browser到web server，可以在表单中指定提交内容时使用的字符集，否则会使用页面指定的编码。而如果在url中直接用?的方式输入参数，则其编码往往是操作系统本身的编码，因为这时和页面无关。上述仍旧以gbk编码为例。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> Web server接收到的是字节流，默认时（getParameter）会以iso8859-1编码处理之，结果是不正确的，所以需要进行处理。但如果预先设置了编码（通过request. setCharacterEncoding ()），则能够直接获取到正确的结果。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> 在页面中指定编码是个好习惯，否则可能失去控制，无法指定正确的编码。</p>
<p class="3">3.4.2. 文件编译</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">假设文件是gbk编码保存的，而编译有两种编码选择：gbk或者iso8859-1，前者是中文windows的默认编码，后者是linux的默认编码，当然也可以在编译时指定编码。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">Jsp<span style="text-decoration: underline;">&nbsp; *(gbk:d6d0 cec4)&nbsp; </span>java file<span style="text-decoration: underline;">&nbsp; *(gbk:d6d0 cec4)&nbsp; </span>compiler read<span style="text-decoration: underline;">&nbsp; uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)&nbsp; </span>compiler write<span style="text-decoration: underline;">&nbsp; utf(gbk: e4b8ad e69687; iso8859-1: *)&nbsp; </span>compiled file<span style="text-decoration: underline;">&nbsp; unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)&nbsp; </span>class。所以用gbk编码保存，而用iso8859-1编译的结果是不正确的。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">class<span style="text-decoration: underline;">&nbsp; unicode(4e2d 6587)&nbsp; </span>system.out / jsp.out<span style="text-decoration: underline;">&nbsp; gbk(d6d0 cec4)&nbsp; </span>os console / browser。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> 文件可以以多种编码方式保存，中文windows下，默认为ansi/gbk。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> 编译器读取文件时，需要得到文件的编码，如果未指定，则使用系统默认编码。一般class文件，是以系统默认编码保存的，所以编译不会出问题，但对于jsp文件，如果在中文windows下编辑保存，而部署在英文linux下运行/编译，则会出现问题。所以需要在jsp文件中用pageEncoding指定编码。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> Java编译的时候会转换成统一的unicode编码处理，最后保存的时候再转换为utf编码。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> 当系统输出字符的时候，会按指定编码输出，对于中文windows下，System.out将使用gbk编码，而对于response（浏览器），则使用jsp文件头指定的contentType，或者可以直接为response指定编码。同时，会告诉browser网页的编码。如果未指定，则会使用iso8859-1编码。对于中文，应该为browser指定输出字符串的编码。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt;"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings;">l</span> browser显示网页的时候，首先使用response中指定的编码（jsp文件头指定的contentType最终也反映在response上），如果未指定，则会使用网页中meta项指定中的contentType。</p>
<p class="2">3.5. 几处设置</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">对于web应用程序，和编码有关的设置或者函数如下。</p>
<p class="3">3.5.1. jsp编译</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">指定文件的存储编码，很明显，该设置应该置于文件的开头。例如：&lt;%@page pageEncoding="GBK"%&gt;。另外，对于一般class文件，可以在编译的时候指定编码。</p>
<p class="3">3.5.2. jsp输出</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">指定文件输出到browser是使用的编码，该设置也应该置于文件的开头。例如：&lt;%@ page contentType="text/html; charset= GBK" %&gt;。该设置和response.setCharacterEncoding("GBK")等效。</p>
<p class="3">3.5.3. meta设置</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">指定网页使用的编码，该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置，而且也无法执行response.setCharacterEncoding()。例如：&lt;META http-equiv="Content-Type" content="text/html; charset=GBK" /&gt;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">如果同时采用了jsp输出和meta设置两种编码指定方式，则jsp指定的优先。因为jsp指定的直接体现在response中。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">需要注意的是，apache有一个设置可以给无编码指定的网页指定编码，该指定等同于jsp的编码指定方式，所以会覆盖静态网页中的meta指定。所以有人建议关闭该设置。</p>
<p class="3">3.5.4. form设置</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">当浏览器提交表单的时候，可以指定相应的编码。例如：&lt;form accept-charset= "gb2312"&gt;。一般不必不使用该设置，浏览器会直接使用网页的编码。</p>
<p class="1">4. 系统软件</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">下面讨论几个相关的系统软件。</p>
<p class="2">4.1. mysql数据库</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">很明显，要支持多语言，应该将数据库的编码设置成utf或者unicode，而utf更适合与存储。但是，如果中文数据中包含的英文字母很少，其实unicode更为适合。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">数据库的编码可以通过mysql的配置文件设置，例如default-character-set=utf8。还可以在数据库链接URL中设置，例如： useUnicode=true&amp;characterEncoding=UTF-8。注意这两者应该保持一致，在新的sql版本里，在数据库链接URL里可以不进行设置，但也不能是错误的设置。</p>
<p class="2">4.2. apache</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">appache和编码有关的配置在httpd.conf中，例如AddDefaultCharset UTF-8。如前所述，该功能会将所有静态页面的编码设置为UTF-8，最好关闭该功能。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">另外，apache还有单独的模块来处理网页响应头，其中也可能对编码进行设置。</p>
<p class="2">4.3. linux默认编码</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">这里所说的linux默认编码，是指运行时的环境变量。两个重要的环境变量是LC_ALL和LANG，默认编码会影响到java URLEncode的行为，下面有描述。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">建议都设置为"zh_CN.UTF-8"。</p>
<p class="2">4.4. 其它</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">为了支持中文文件名，linux在加载磁盘时应该指定字符集，例如：mount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">另外，如前所述，使用GET方法提交的信息不支持request.setCharacterEncoding()，但可以通过tomcat的配置文件指定字符集，在tomcat的server.xml文件中，形如：&lt;Connector ... URIEncoding="GBK"/&gt;。这种方法将统一设置所有请求，而不能针对具体页面进行设置，也不一定和browser使用的编码相同，所以有时候并不是所期望的。</p>
<p class="1">5. URL地址</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">URL地址中含有中文字符是很麻烦的，前面描述过使用GET方法提交表单的情况，使用GET方法时，参数就是包含在URL中。</p>
<p class="2">5.1. URL编码</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">对于URL中的一些特殊字符，浏览器会自动进行编码。这些字符除了"/?&amp;"等外，还包括unicode字符，比如汉子。这时的编码比较特殊。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">IE有一个选项"总是使用UTF-8发送URL"，当该选项有效时，IE将会对特殊字符进行UTF-8编码，同时进行URL编码。如果改选项无效，则使用默认编码"GBK"，并且不进行URL编码。但是，对于URL后面的参数，则总是不进行编码，相当于UTF-8选项无效。比如"中文.html?a=中文"，当UTF-8选项有效时，将发送链接"%<span style="text-decoration: underline;">e4%b8%ad%e6%96%87.html?a=\x4e\x2d\x65\x87</span>"；而UTF-8选项无效时，将发送链接"<span style="text-decoration: underline;">\x4e\x2d\x65\x87.html?a=\x4e\x2d\x65\x87</span>"。注意后者前面的"中文"两个字只有4个字节，而前者却有18个字节，这主要时URL编码的原因。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">当web server（tomcat）接收到该链接时，将会进行URL解码，即去掉"%"，同时按照ISO8859-1编码（上面已经描述，可以使用URLEncoding来设置成其它编码）识别。上述例子的结果分别是"<span style="text-decoration: underline;">\ue4\ub8\uad\ue6\u96\u87.html?a=\u4e\u2d\u65\u87</span>"和"<span style="text-decoration: underline;">\u4e\u2d\u65\u87.html?a=\u4e\u2d\u65\u87</span>"，注意前者前面的"中文"两个字恢复成了6个字符。这里用"\u"，表示是unicode。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">所以，由于客户端设置的不同，相同的链接，在服务器上得到了不同结果。这个问题不少人都遇到，却没有很好的解决办法。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt;">.2. rewrite</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">熟悉的人都知道，apache有一个功能强大的rewrite模块，这里不描述其功能。需要说明的是该模块会自动将URL解码（去除%），即完成上述web server（tomcat）的部分功能。有相关文档介绍说可以使用[NE]参数来关闭该功能，但我试验并未成功，可能是因为版本（我使用的是apache 2.0.54）问题。另外，当参数中含有"?&amp; "等符号的时候，该功能将导致系统得不到正常结果。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">rewrite本身似乎完全是采用字节处理的方式，而不考虑字符串的编码，所以不会带来编码问题。</p>
<p class="2">5.3. URLEncode.encode()</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">这是Java本身提供对的URL编码函数，完成的工作和上述UTF-8选项有效时浏览器所做的工作相似。值得说明的是，java已经不赞成不指定编码来使用该方法（deprecated）。应该在使用的时候增加编码指定。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">当不指定编码的时候，该方法使用系统默认编码，这会导致软件运行结果得不确定。比如对于"中文"，当系统默认编码为"gb2312"时，结果是"%<span style="text-decoration: underline;">4e%2d%65%87</span>"，而默认编码为"UTF-8"，结果却是"%<span style="text-decoration: underline;">e4%b8%ad%e6%96%87</span>"，后续程序将难以处理。另外，这儿说的系统默认编码是由运行tomcat时的环境变量LC_ALL和LANG等决定的，曾经出现过tomcat重启后就出现乱码的问题，最后才郁闷的发现是因为修改修改了这两个环境变量。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">建议统一指定为"UTF-8"编码，可能需要修改相应的程序。</p>
<p class="1">6. 其它</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">下面描述一些和编码有关的其他问题。</p>
<p class="2">6.1. SecureCRT</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">除了浏览器和控制台与编码有关外，一些客户端也很有关系。比如在使用SecureCRT连接linux时，应该让SecureCRT的显示编码（不同的session，可以有不同的编码设置）和linux的编码环境变量保持一致。否则看到的一些帮助信息，就可能是乱码。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">另外，mysql有自己的编码设置，也应该保持和SecureCRT的显示编码一致。否则通过SecureCRT执行sql语句的时候，可能无法处理中文字符，查询结果也会出现乱码。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">对于Utf-8文件，很多编辑器（比如记事本）会在文件开头增加三个不可见的标志字节，如果作为mysql的输入文件，则必须要去掉这三个字符。（用linux的vi保存可以去掉这三个字符）。一个有趣的现象是，在中文windows下，创建一个新txt文件，用记事本打开，输入"连通"两个字，保存，再打开，你会发现两个字没了，只留下一个小黑点。</p>
<p class="2">6.2. 过滤器</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">如果需要统一设置编码，则通过filter进行设置是个不错的选择。在filter class中，可以统一为需要的请求或者回应设置编码。参加上述setCharacterEncoding()。这个类apache已经给出了可以直接使用的例子SetCharacterEncodingFilter。</p>
<p class="2">6.3. POST和GET</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">很明显，以POST提交信息时，URL有更好的可读性，而且可以方便的使用setCharacterEncoding()来处理字符集问题。但GET方法形成的URL能够更容易表达网页的实际内容，也能够用于收藏。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">从统一的角度考虑问题，建议采用GET方法，这要求在程序中获得参数是进行特殊处理，而无法使用setCharacterEncoding()的便利，如果不考虑rewrite，就不存在IE的UTF-8问题，可以考虑通过设置URIEncoding来方便获取URL中的参数。</p>
<p class="2">6.4. 简繁体编码转换</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">GBK同时包含简体和繁体编码，也就是说同一个字，由于编码不同，在GBK编码下属于两个字。有时候，为了正确取得完整的结果，应该将繁体和简体进行统一。可以考虑将UTF、GBK中的所有繁体字，转换为相应的简体字，BIG5编码的数据，也应该转化成相应的简体字。当然，仍旧以UTF编码存储。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt;">例如，对于"语言 語言"，用UTF表示为"<span style="text-decoration: underline;">\x</span><span style="text-decoration: underline;">E8\xAF\xAD\xE8\xA8\x80 \xE8\xAA\x9E\xE8\xA8\x80</span>"，进行简繁体编码转换后应该是两个相同的 "<span style="text-decoration: underline;">\x</span><span style="text-decoration: underline;">E8\xAF\xAD\xE8\xA8\x80&gt;</span>"。</p>
          <br/>
          <span style="color:red;">
            <a href="http://hua6884858.javaeye.com/blog/228018#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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, 14 Aug 2008 14:51:52 +0800</pubDate>
        <link>http://hua6884858.javaeye.com/blog/228018</link>
        <guid>http://hua6884858.javaeye.com/blog/228018</guid>
      </item>
      <item>
        <title>ORACLE数据库日期类型</title>
        <author>hua6884858</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hua6884858.javaeye.com">hua6884858</a>&nbsp;
          链接：<a href="http://hua6884858.javaeye.com/blog/227957" style="color:red;">http://hua6884858.javaeye.com/blog/227957</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>　在ORACLE数据库中有一类比较特别的数据类型，它就是时间类的数据类型。这中数据类型表面上看看，像字符型的数据类型，但是又不是。因为他可以像数字型的数据类型那样，进行运算。所以说，他是兼有数字型与字符型数据类型的特点。掌握好时间型的数据类型，是掌握ORACLE数据库设计的一个必须具备的知识。因为在实际的数据库设计中，基本上没没张表都要用到这个数据类型。如信息化管理系统中的单据日期，就是一个时间型的数据类型。</p>
<p>　　下面我对ORACLE数据库中的时间型的数据类型(包括日期类的数据类型)的操作技巧做一个小结，希望对大家有所帮助。</p>
<p>　　第一个数据类型：DATE数据类型。</p>
<p>　　在ORACLE 以前的版本中，关于日期的数据类型就这么一个。可以说，这个DATE数据类型是这个数据库中元老级别的数据类型了。这个数据类型不要光看表面是个日期数据类型，其实，在存储数据的时候，这个数据类型不光是储存现在是几几年几月几号，而会储存几点几分几秒。也就是说，默认情况下，利用DATE函数读取当前日期的话，其存储的格式是存储世纪(就是我们常说的公元)、年、月、日、时、分、秒。</p>
<p>　　可是在大部分时候，我们不需要这么精确的日期或者时间。我们只需要年、月、日就可以了。该怎么处理呢?此时，我们可以利用Trunc函数来限制。</p>
<p>　　另外还要注意两个默认的情况。如果我们在给一个日期型的字段赋值的时候，没有指定具体的时间，也就是说，我们假设字段&ldquo;当前日期&rdquo;为一个数据型的日期类型，我们给其赋值为2008年6月12日，则其存储在数据中不是2008年6月12日，而是2008年6月12日午夜00时00分00秒。也就是说，在保存时，数据库会自动把后面时间部分补上，并默认为午夜00时00分00秒。</p>
<p>　　若我们给&ldquo;当前日期&rdquo;字段赋值是，只给其具体的时间，而没有给定具体的日期，又会如何呢。如我们给&ldquo;当前日期&rdquo;赋值的时候，给的是08时08分08秒。那是哪一天的08时08分08秒呢?默认情况下，不是当天的这个时刻，这要注意，而是当月的第一天的这个时刻。如我们是在6月分处理业务的时候，给予这个值的。我们系统存储的时候，在数据库中存储的就是2008年6月1日08时08分08秒。而不是处理业务的日期。这一点我们在数据库设计的时候要引起充分的重视。</p>
<p>　　另外，我们要以什么格式来显示时间呢?是日期放在前面还是时间放在前面呢?是用空格来进行区分还是用横杠来进行区分?是用24小时制呢还是采用12小时制?为了实现不同用户自己喜欢的格式来显示日期，数据库系统中提供了一些格式函数，如NTS_DATE_FORMATE函数或者TO_CHAR函数指定一个格式掩码来进行格式的转换。把系统格式转换成我们自己喜欢的格式。</p>
<p>　　第二个数据类型：INTERVAL YEAR TO MOUNTH数据类型。</p>
<p>　　如我们现在想知道，今天(2008年6月12日)离2008年8月8日还有几年几个月?在系统中就是利用这个字段来存储这个值。在官方资料上，对这个字段的解释是用年和月的形式存储一段时间。这个数据类型可以用来存储两个日期/时间之间的差值，只是其精确度不是很高，只会统计两个日期之间相差多少年多少月，而没有具体到日。</p>
<p>　　第三个数据类型：INTERVAL DAY TO SECOND数据类型。</p>
<p>　　有时候，我们计算两个日期的差值，若只是具体到月的话，可能还不能满足我们的需求。如现在奥运会的倒计时，就需要精确到具体的日子。在岁末倒计时的时候，我们需要的是精确到秒。所以，此时利用上面哪个数据类型来储存数据，明显精度不够，就要用到这个数据类型了。</p>
<p>　　根据官方文档资料，这个字段是用天、时、分、秒的形式来存储一段时间。也就是说，我们若要知道2008年6月12日08时08分08秒离2008年8月8日8时8分07秒还差几天几分几秒，就需要利用这个字段来存储这个数据。</p>
<p>　　不过有时候我们也不需要精确到具体的秒，而只要具体的时间。如想知道2008年6月12日离2008年8月8日还差几天，此时没有对应的数据类型来存储这个数据。我们只有先精确到秒，然后再用我们上面讲到的TRUNK割断函数，来取得具体相差的天数。或者利用格式函数来对显示的内容进行格式化，让起忽略后面具体的时间信息，而只精确到天数。</p>
<p>　　在利用这个函数时，要注意，其显示的格式只会是说两个日期还会相差多少天，而不是会相差多少月多少天。若我们要实现这个需求，还是要利用相关的函数来进行转换。或者在存储的时候，直接以字符型的数据类型来进行存储。</p>
<p>第一个函数：datetimezone函数。</p>
<p>　　顾名思义，这个函数的意思就是时区的意思。返回当前系统所采用的时区。这个功能在一些跨国度的系统应用上比较广泛。如现在有一个企业资源计划系统，是为一个集团企业所部署的。这个集团企业，不仅在美国有办事处，而且在中国也有生产工厂，在日本也有自己的销售办事处。现在利用企业资源计划系统把这几个不同国度的办事处及生产工厂有机的联系在了一起。此时，各个办事处或许都要采用自己所在地方的时区。现在的问题是，美国的销售办事处下了一张销售定单，销售定单的交货日期是美国时间2008年8月10日。但是，在中国的生产工厂中看到的就应该是按照中国北京时间转换的日期。这个需求该如何实现呢?就是要用到这个datetimezone函数。先从当前系统中利用这个函数取得系统这张单据日期所采用的时区，然后再根据相关规则进行转换。</p>
<p>　　所以，这个函数在这些跨集团的信息化管理系统的应用上，用的非常广泛。</p>
<p>　　另外，也可以采用NEW&mdash;TIME函数结合其他相关的函数实现这个功能。</p>
<p>　　第二个函数：Sysdate函数。</p>
<p>　　这个函数是用来获取当前的系统日期。默认情况下，利用这个函数显示的日期格式为&ldquo;月-日-年 星期几&rdquo;。若我们要以其他格式进行显示，我们就需要用到格式转换类型，如TO-CHAR函数来转换我们自己需要的类型。</p>
<p>　　这个函数在实际应用中还是非常广泛的。</p>
<p>　　如我们新建一张销售定单的日期，建立定单的日期我们一般需要为其设立一个默认日期，这个日期不是当前系统的日期就是服务器的当前系统日期。而要获得这个日期的话，都是需要用到这个SYSDATE系统函数。</p>
<p>　　如在一些项目管理系统中，需要知道离某个具体的任务还有多少时间，具体的算法就是将来某个日期减去当前日期还剩多少天。在这个计算的过程中，也需要用到SYSDATE函数，用来取得系统的当前日期。</p>
<p>　　另外这里还要注意一个问题。有些人在数据库设计的时候，喜欢把取得的当前日期通过数据类型转换函数，把日期型的数据转换为字符型的数据。这我个人认为是一个不好的习惯。</p>
<p>　　第三个函数：MOUNTS_BETWEEN函数。</p>
<p>　　上面我们在谈到数据类型的时候，说到过一个需求，有时候我们需要知道2008年6月12日到2008年8月8日还剩几个过。此时，就是利用MOUNTS_BETWEEN函数来获取这个信息，并利用INTERVAL YEAR TO MOUNTH数据类型的字段来储存这个信息。</p>
<p>　　这个函数的话，在一些项目管理系统中用的也比较频繁。有时候一个项目可能时间比较久，我们采用的精度是月而不是天。此时就要利用这个函数来计算两个具体日期之间还相差几个月。</p>
<p>　　给与日期操作的函数还有很多。如有时候我们需要知道，今年的母亲节是什么时候。根据中国的习俗，5月分的第二个星期日就是母亲节。若我们通过日历查找出这个日期，那没有什么难度。现在我们若希望能够通过数据库，计算出这个日期。此时，就需要用用到数据库的日期操作函数，实现这个需求。类似的情况很多，如我们想知道2008年的5月1日劳动节，那天是星期几，以方便我们安排假期。这些需求的都是通过日期函数来解决的。今天在这里由于篇幅的限制，不做过多的解释。在后续数据库的设计中，遇到具体的应用，我们再做深入的阐述。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://hua6884858.javaeye.com/blog/227957#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Aug 2008 11:51:59 +0800</pubDate>
        <link>http://hua6884858.javaeye.com/blog/227957</link>
        <guid>http://hua6884858.javaeye.com/blog/227957</guid>
      </item>
      <item>
        <title>Oracle中SEQUENCES的使用</title>
        <author>hua6884858</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hua6884858.javaeye.com">hua6884858</a>&nbsp;
          链接：<a href="http://hua6884858.javaeye.com/blog/225135" style="color:red;">http://hua6884858.javaeye.com/blog/225135</a>&nbsp;
          发表时间: 2008年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center" style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"><strong><em><span style="font-size: medium;">Oracle中SEQUENCES的使用</span></em></strong></span></p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">Oracle</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">提供了</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">对象</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">,</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">由系统提供自增长的序列号</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">,</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">通常用于生成数据库数据记录的自增长主键或序号的地方</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">.</span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">下面介绍一下关于</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">的生成</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">,</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">修改</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">,</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">删除等常用的操作</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">: </span></p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"><br />1. </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">创建</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> Sequence </span></p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">使用如下命令新建</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence(</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">用户需要有</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">CREATE SEQUENCE </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">或者</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">CREATE ANY SEQUENCE</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">权限</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">):</span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">CREATE&nbsp; SEQUENCE test_sequence <br />&nbsp;INCREMENT&nbsp; BY&nbsp;&nbsp; 1 </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">　</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp;&nbsp;--&nbsp; </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">每次加的个数据</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp; <br />&nbsp;START&nbsp; WITH&nbsp;&nbsp; 1 </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">　　</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp;&nbsp;--&nbsp; </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">从</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">1</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">开始计数</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp; <br />&nbsp;NOMAXVALUE</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">　　　</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp;&nbsp;&nbsp;--&nbsp; </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">不设置最大值</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp; <br />&nbsp;NOCYCLE</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">　　　　　</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp;&nbsp;&nbsp;--&nbsp; </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">一直累加，不循环</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp; <br />&nbsp;CACHE&nbsp; 10 ;&nbsp; <br />&nbsp;<br />[</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">注意</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">] <br /></span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">如果设置了</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">CACHE</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">值，</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">ORACLE</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">将在内存里预先放置一些</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">，以使存取速度更快。</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">cache</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">里面的取完后，</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">oracle</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">自动再取一组到</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">cache</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">。</span></span><span style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">但是，使用</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">cache</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">可能会跳号，</span></span><span style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">当遇到数据库突然异常</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">down</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">掉（</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">shutdown abort),cache</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">中的</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">就会丢失</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">. <br /></span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">因此，推荐在</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">create sequence</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">的时候使用</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> nocache </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">选项。</span></span><span style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> </span></p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"><br />2. </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">使用</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> sequence:</span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence.CURRVAL&nbsp;&nbsp;&nbsp; -- </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">返回</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> sequence</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">的当前值</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> <br />sequence.NEXTVAL&nbsp;&nbsp;&nbsp; -- </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">增加</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">的值，然后返回</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> sequence </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">值</span></span><span style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> </span></p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">[</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">注意</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">]<br /></span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">第一次</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">NEXTVAL</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">返回的是初始值；</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"><br /></span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">随后的</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">NEXTVAL</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">会自动增加你定义的</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">INCREMENT BY</span><span style="font-family: 宋体;"><span style="font-size: 9.5pt; color: #333333;">值，然后返回增加后的值。</span></span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">CURRVAL </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">总是返回当前</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">SEQUENCE</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">的值，但是在第一次</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">NEXTVAL</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">初始化之后才能使用</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">CURRVAL</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">，否则会出错。</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"><br /></span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">一次</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">NEXTVAL</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">会增加一次</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> SEQUENCE</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">的值，所以如果你在同一个语句里面使用多个</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">NEXTVAL</span><span style="font-family: 宋体;"><span style="font-size: 9.5pt; color: #333333;">，其值就是不一样的。</span></span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"><br />sequence </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">存储在数据字典中</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">,</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">存储于</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">user_sequences</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">表</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"><br />&nbsp;<br />LAST_NUMBER </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">为最终序列号，也就是</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence</span><span style="font-family: 宋体;"><span style="font-size: 9.5pt; color: #333333;">游标当前所在的位置。</span></span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">//get sequence last_number</span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME=TEST_SEQNAME</span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">// NEXTVAL </span><span style="font-family: 宋体;"><span style="font-size: 9.5pt; color: #333333;">使游标指向下一位（增一或减一）</span></span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">SELECT SEQNAME.NEXTVAL FROM USER_SEQUENCES </span><span style="font-family: 宋体;"><span style="font-size: 9.5pt; color: #333333;">得到下一位游标的值</span></span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"><br />3. </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">修改</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> Sequence </span></p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">用户必须拥有</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">ALTER ANY SEQUENCE </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">权限才能修改</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence. </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">可以</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">alter</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">除</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">start</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">至以外的所有</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">sequence</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">参数</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">.<br /></span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">如果想要改变</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">start</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">值，必须</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> drop sequence </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">再</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> re-create.</span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span style="font-family: 宋体;"><span style="font-size: 9.5pt; color: #333333;">命令格式如下：</span></span> </p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">ALTER&nbsp; SEQUENCE test_sequence <br />&nbsp;INCREMENT&nbsp; BY&nbsp;&nbsp; 10&nbsp; <br />&nbsp;MAXVALUE&nbsp; 10000&nbsp; <br />&nbsp;CYCLE </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">　　</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp; </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">到</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">10000</span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">后从头开始</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">&nbsp; <br />&nbsp;NOCACHE ;&nbsp; </span></p>
<p style="background: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial;"><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';">4.&nbsp; </span><span style="font-size: 9.5pt; color: #333333;"><span style="font-family: 宋体;">删除</span></span><span lang="EN-US" style="font-size: 9.5pt; color: #333333; font-family: 'Verdana','sans-serif';"> Sequence <br />&nbsp;DROP&nbsp; SEQUENCE order_seq;</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://hua6884858.javaeye.com/blog/225135#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Aug 2008 17:32:34 +0800</pubDate>
        <link>http://hua6884858.javaeye.com/blog/225135</link>
        <guid>http://hua6884858.javaeye.com/blog/225135</guid>
      </item>
      <item>
        <title>Java 编程技术中汉字问题的分析及解决</title>
        <author>hua6884858</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hua6884858.javaeye.com">hua6884858</a>&nbsp;
          链接：<a href="http://hua6884858.javaeye.com/blog/224929" style="color:red;">http://hua6884858.javaeye.com/blog/224929</a>&nbsp;
          发表时间: 2008年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <blockquote><em>在基于 Java 语言的编程中，我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果，怎样才能够让那些汉字正确显示呢？Java语言默认的编码方式是UNICODE，而我们中国人通常使用的文件和数据库都是基于GB2312或者BIG5等方式编码的，怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢？本文将从汉字编码的常识入手，结合Java编程实例，分析以上两个问题并提出解决它们的方案。</em> </blockquote>
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
<p>现在 Java 编程语言已经广泛应用于互联网世界，早在 Sun 公司开发 Java 语言的时候，就已经考虑到对非英文字符的支持了。Sun 公司公布的 Java 运行环境（JRE）本身就分英文版和国际版，但只有国际版才支持非英文字符。不过在 Java 编程语言的应用中，对中文字符的支持并非如同 Java Soft 的标准规范中所宣称的那样完美，因为中文字符集不只一个，而且不同的操作系统对中文字符的支持也不尽相同，所以会有许多和汉字编码处理有关的问题在我们进行应用开发中困扰着我们。有很多关于这些问题的解答，但都比较琐碎，并不能够满足大家迫切解决问题的愿望，关于 Java 中文问题的系统研究并不多，本文从汉字编码常识出发，分析 Java 中文问题，希望对大家解决这个问题有所帮助。</p>
<p><a name="1"><span class="atitle">汉字编码的常识</span></a></p>
<p>我们知道，英文字符一般是以一个字节来表示的，最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符，而汉字成千上万，所以现在都以双字节来表示汉字，为了能够与英文字符分开，每个字节的最高位一定为1，这样双字节最多可以表示64K格字符。我们经常碰到的编码方式有 GB2312、BIG5、UNICODE 等。关于具体编码方式的详细资料，有兴趣的读者可以查阅相关资料。我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE。GB2312 码，中华人民共和国国家标准汉字信息交换用编码，是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码，通行于中国大陆地区及新加坡，简称国标码。两个字节中，第一个字节（高字节）的值为区号值加32（20H），第二个字节（低字节）的值为位号值加32（20H），用这两个值来表示一个汉字的编码。UNICODE 码是微软提出的解决多国字符问题的多字节等长编码，它对英文字符采取前面加&ldquo;0&rdquo;字节的策略实现等长兼容。如 &ldquo;A&rdquo; 的 ASCII 码为0x41，UNICODE 就为0x00，0x41。利用特殊的工具各种编码之间可以互相转换。</p>
<p>&nbsp;</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
</tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0">
<tbody>
<tr align="right">
<td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
<table cellspacing="0" border="0" cellpadding="0">
<tbody>
<tr>
<td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td>
<td align="right" valign="top"><a href="http://hua6884858.javaeye.com/admin/blogs/#main" class="fbox"><strong><span style="color: #996699;">回页首</span></strong></a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p><br /></p>
<p><a name="2"><span class="atitle">Java 中文问题的初步认识</span></a></p>
<p>我们基于 Java 编程语言进行应用开发时，不可避免地要处理中文。Java 编程语言默认的编码方式是 UNICODE，而我们通常使用的数据库及文件都是基于 GB2312 编码的，我们经常碰到这样的情况：浏览基于 JSP 技术的网站看到的是乱码，文件打开后看到的也是乱码，被 Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息。</p>
<p>String sEnglish = &ldquo;apple&rdquo;;</p>
<p>String sChinese = &ldquo;苹果&rdquo;;</p>
<p>String s = &ldquo;苹果 apple &rdquo;;</p>
<p>sEnglish 的长度是5，sChinese的长度是4，而 s 默认的长度是14。对于 sEnglish来说， Java 中的各个类都支持得非常好，肯定能够正确显示。但对于 sChinese 和 s 来说，虽然 Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持（默认 UNICODE 编码），但是如果操作系统的默认编码不是 UNICODE ，而是国标码等。从 Java 源代码到得到正确的结果，要经过 &ldquo;Java 源代码-&gt; Java 字节码-&gt; ;虚拟机-&gt;操作系统-&gt;显示设备&rdquo;的过程。在上述过程中的每一步骤，我们都必须正确地处理汉字的编码，才能够使最终的显示结果正确。</p>
<p>&ldquo; Java 源代码-&gt; Java 字节码&rdquo;，标准的 Java 编译器 javac 使用的字符集是系统默认的字符集，比如在中文 Windows 操作系统上就是 GBK ,而在 Linux 操作系统上就是ISO-8859-1，所以大家会发现在 Linux 操作系统上编译的类中源文件中的中文字符都出了问题，解决的办法就是在编译的时候添加 encoding 参数，这样才能够与平台无关。用法是</p>
<p>javac ?Cencoding GBK。</p>
<p>&ldquo; Java 字节码-&gt;虚拟机-&gt;操作系统&rdquo;， Java 运行环境 （JRE） 分英文版和国际版，但只有国际版才支持非英文字符。 Java 开发工具包 （JDK） 肯定支持多国字符，但并非所有的计算机用户都安装了 JDK 。很多操作系统及应用软件为了能够更好的支持 Java ，都内嵌了 JRE 的国际版本，为自己支持多国字符提供了方便。</p>
<p>&ldquo;操作系统-&gt;显示设备&rdquo;，对于汉字来说，操作系统必须支持并能够显示它。英文操作系统如果不搭配特殊的应用软件的话，是肯定不能够显示中文的。</p>
<p>还有一个问题，就是在 Java 编程过程中，对中文字符进行正确的编码转换。例如，向网页输出中文字符串的时候，不论你是用</p>
<p>out.println(string);还是用</p>
<p>&lt;%=string%&gt;，都必须作 UNICODE 到 GBK 的转换，或者手动，或者自动。在 JSP 1.0中，可以定义输出字符集，从而实现内码的自动转换。用法是</p>
<p>&lt;%@page contentType=&rdquo;text/html;charset=gb2312&rdquo; %&gt;</p>
<p>但是在一些 JSP 版本中并没有提供对输出字符集的支持，（例如 JSP 0.92），这就需要手动编码输出了，方法非常多。最常用的方法是</p>
<p>String s1 = request.getParameter(&ldquo;keyword&rdquo;);</p>
<p>String s2 = new String(s1.getBytes(&ldquo;ISO-8859-1&rdquo;),&rdquo;GBK&rdquo;);</p>
<p>getBytes 方法用于将中文字符以&ldquo;ISO-8859-1&rdquo;编码方式转化成字节数组，而&ldquo;GBK&rdquo; 是目标编码方式。我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 ，经过上述转换过程，在支持 GBK 字符集的操作系统和应用软件中就能够正确显示中文字符串 s2 。</p>
<p>&nbsp;</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
</tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0">
<tbody>
<tr align="right">
<td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
<table cellspacing="0" border="0" cellpadding="0">
<tbody>
<tr>
<td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td>
<td align="right" valign="top"><a href="http://hua6884858.javaeye.com/admin/blogs/#main" class="fbox"><strong><span style="color: #996699;">回页首</span></strong></a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p><br /></p>
<p><a name="3"><span class="atitle">Java 中文问题的表层分析及处理</span></a></p>
<table cellspacing="0" border="1" width="80%" cellpadding="3">
<tbody>
<tr valign="top">
<td align="center" width="100%" colspan="4">背景 </td>
</tr>
<tr valign="top">
<td width="25%">开发环境 </td>
<td width="25%">JDK1.15 </td>
<td width="25%">Vcafe2.0 </td>
<td width="25%">JPadPro </td>
</tr>
<tr valign="top">
<td width="25%">服务器端 </td>
<td width="25%">NT IIS </td>
<td width="25%">Sybase System </td>
<td width="25%">Jconnect（JDBC） </td>
</tr>
<tr valign="top">
<td width="25%">客户端 </td>
<td width="25%">IE5.0 </td>
<td width="25%">Pwin98 </td>
<td width="25%">?span &gt; </td>
</tr>
</tbody>
</table>
<p>.CLASS 文件存放在服务器端，由客户端的浏览器运行 APPLET ， APPLET 只起调入 FRAME 类等主程序的作用。界面包括 Textfield ，TextArea，List，Choice 等。</p>
<p>I.用 JDBC 执行 SELECT 语句从服务器端读取数据（中文）后，将数据用 APPEND 方法加到 TextArea（TA） ，不能正确显示。但加到 List 中时，大部分汉字却可正确显示。</p>
<p>将数据按&ldquo;ISO-8859-1&rdquo; 编码方式转化为字节数组，再按系统缺省编码方式 （Default Character Encoding） 转化为 STRING ，即可在 TA 和 List 中正确显示。</p>
<p>程序段如下：</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">dbstr2 = results.getString(1);
//After reading the result from DB server，converting it to string.
dbbyte1 = dbstr2.getBytes(“iso-8859-1”);
dbstr1 = new String(dbbyte1);</pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>在转换字符串时不采用系统默认编码方式，而直接采用&ldquo; GBK&rdquo; 或者 &ldquo;GB2312&rdquo; ,在 A 和 B 两种情况下，从数据库取数据都没有问题。</p>
<p>II.处理方式与&ldquo;取中文&rdquo;相逆，先将 SQL 语句按系统缺省编码方式转化为字节数组，再按&ldquo;ISO-8859-1&rdquo;编码方式转化为 STRING ，最后送去执行，则中文信息可正确写入数据库。</p>
<p>程序段如下：</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">sqlstmt = tf_input.getText();
//Before sending statement to DB server，converting it to sql statement.
dbbyte1 = sqlstmt.getBytes();
sqlstmt = newString(dbbyte1,”iso-8859-1”);
_stmt = _con.createStatement();
_stmt.executeUpdate(sqlstmt);
……
</pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>问题：如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时（称为 A 情况），上述程序代码可正确执行。但是如果客户机只有浏览器，而没有 JDK 和 CLASSPATH 时（称为 B 情况），则汉字无法正确转换。</p>
<p>我们的分析：</p>
<p>1.经过测试，在 A 情况下，程序运行时系统的缺省编码方式为 GBK 或者 GB2312 。在 B 情况下，程序启动时浏览器的 JAVA 控制台中出现如下错误信息：</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">Can't find resource for sun.awt.windows.awtLocalization_zh_CN</pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>然后系统的缺省编码方式为&ldquo;8859-1&rdquo;。</p>
<p>2.如果在转换字符串时不采用系统缺省编码方式，而是直接采用 &ldquo;GBK&rdquo; 或&ldquo;GB2312&rdquo;，则在 A 情况下程序仍然可正常运行，在 B 情况下，系统出现错误：</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">UnsupportedEncodingException。</pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>3.在客户机上，把 JDK 的 CLASSES.ZIP 解压后，放在另一个目录中， CLASSPATH 只包含该目录。然后一边逐步删除该目录中的 .CLASS 文件，另一边运行测试程序，最后发现在一千多个 CLASS 文件中，只有一个是必不可少的，该文件是：</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">sun.io.CharToByteDoubleByte.class。</pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>将该文件拷到服务器端和其它的类放在一起，并在程序的开头 IMPORT 它，在 B 情况下程序仍然无法正常运行。</p>
<p>4.在 A 情况下，如果在 CLASSPTH 中去掉 sun.io.CharToByteDoubleByte.class ，则程序运行时测得默认编码方式为&ldquo;8859-1&rdquo;，否则为 &ldquo;GBK&rdquo; 或 &ldquo;GB2312&rdquo; 。</p>
<p>如果 JDK 的版本为1.2以上的话，在 B 情况下遇到的问题得到了很好的解决，测试的步骤同上，有兴趣的读者可以尝试一下。</p>
<p>&nbsp;</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
</tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0">
<tbody>
<tr align="right">
<td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
<table cellspacing="0" border="0" cellpadding="0">
<tbody>
<tr>
<td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td>
<td align="right" valign="top"><a href="http://hua6884858.javaeye.com/admin/blogs/#main" class="fbox"><strong><span style="color: #996699;">回页首</span></strong></a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p><br /></p>
<p><a name="4"><span class="atitle">Java 中文问题的根源分析及解决</span></a></p>
<p>在简体中文 MS Windows 98 + JDK 1.3 下，可以用 System.getProperties() 得到 Java 运行环境的一些基本属性，类 PoorChinese 可以帮助我们得到这些属性。</p>
<p>类 PoorChinese 的源代码：</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">public class PoorChinese {
}</pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>执行 java PoorChinese 后，我们会得到:</p>
<p>系统变量 file.encoding 的值为 GBK ，user.language 的值为 zh ， user.region 的值为 CN ，这些系统变量的值决定了系统默认的编码方式是 GBK 。</p>
<p>在上述系统中，下面的代码将 GB2312 文件转换成 Big5 文件，它们能够帮助我们理解 Java 中汉字编码的转化:</p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td class="code-outline">
<pre class="displaycode">?
import java.io.*;
import java.util.*;
?
public class gb2big5 {
?
static int iCharNum=0;
?
public static void main(String[] args) {
System.out.println("Input GB2312 file, output Big5 file.");
if (args.length!=2) {
System.err.println("Usage: jview gb2big5 gbfile big5file");
System.exit(1);
String inputString = readInput(args[0]);
writeOutput(inputString,args[1]);
System.out.println("Number of Characters in file: "+iCharNum+".");
}
?
static void writeOutput(String str, String strOutFile) {
try {
FileOutputStream fos = new FileOutputStream(strOutFile);
Writer out = new OutputStreamWriter(fos, "Big5");
out.write(str);
out.close();
}
catch (IOException e) {
e.printStackTrace();
e.printStackTrace();
}
}
?
static String readInput(String strInFile) {
StringBuffer buffer = new StringBuffer();
try {
FileInputStream fis = new FileInputStream(strInFile);
InputStreamReader isr = new InputStreamReader(fis, "GB2312");
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) &gt; -1) {
iCharNum += 1;
buffer.append((char)ch);
}
in.close();
return buffer.toString();
}
catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
?
			</pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>编码转化的过程如下：</p>
<p>GB2312------------------&gt;Unicode-------------&gt;Big5</p>
<p>执行 java gb2big5 gb.txt big5.txt ，如果 gb.txt 的内容是&ldquo;今天星期三&rdquo;，则得到的文件 big5.txt 中的字符能够正确显示；而如果 gb.txt 的内容是&ldquo;情人节快乐&rdquo;，则得到的文件 big5.txt 中对应于&ldquo;节&rdquo;和&ldquo;乐&rdquo;的字符都是符号&ldquo;？&rdquo;（0x3F），可见 sun.io.ByteToCharGB2312 和 sun.io.CharToByteBig5 这两个基本类并没有编好。</p>
<p>正如上例一样， Java 的基本类也可能存在问题。由于国际化的工作并不是在国内完成的，所以在这些基本类发布之前，没有经过严格的测试，所以对中文字符的支持并不像 Java Soft 所声称的那样完美。前不久，我的一位技术上的朋友发信给我说，他终于找到了 <strong>Java Servlet 中文问题的根源</strong>。两周以来，他一直为 Java Servlet 的中文问题所困扰，因为每面对一个含有中文字符的字符串都必须进行强制转换才能够得到正确的结果（这好象是大家公认的唯一的解决办法）。后来，他确实不想如此继续安分下去了，因为这样的事情确实不应该是高级程序员所要做的工作，他就找出 Servlet 解码的源代码进行分析，因为他怀疑问题就出在解码这部分。经过四个小时的奋斗，他终于找到了问题的根源所在。原来他的怀疑是正确的， Servlet 的解码部分完全没有考虑双字节，直接把 %XX 当作一个字符。（原来 Java Soft 也会犯这幺低级的错误！） </p>
<p>如果你对这个问题有兴趣或者遇到了同样的烦恼的话，你可以按照他的步骤 <strong>对Servlet.jar 进行修改</strong>： </p>
<p>找到源代码 HttpUtils 中的 static private String parseName ，在返回前将 sb（StringBuffer） 复制成 byte bs[] ，然后 return new String(bs,&rdquo;GB2312&rdquo;)。作上述修改后就需要自己解码了：</p>
<p>HashTable form=HttpUtils .parseQueryString(request.getQueryString())或者</p>
<p>form=HttpUtils.parsePostData(&hellip;&hellip;)</p>
<p>千万别忘了编译后放到 Servlet.jar 里面。</p>
          <br/>
          <span style="color:red;">
            <a href="http://hua6884858.javaeye.com/blog/224929#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Aug 2008 11:30:46 +0800</pubDate>
        <link>http://hua6884858.javaeye.com/blog/224929</link>
        <guid>http://hua6884858.javaeye.com/blog/224929</guid>
      </item>
      <item>
        <title>ibatis+JSP</title>
        <author>hua6884858</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hua6884858.javaeye.com">hua6884858</a>&nbsp;
          链接：<a href="http://hua6884858.javaeye.com/blog/224055" style="color:red;">http://hua6884858.javaeye.com/blog/224055</a>&nbsp;
          发表时间: 2008年08月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">sql-map-config.xml</span><span style="font-size: 10pt; color: teal; font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">文件</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;?</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">xml </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">version</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"1.0" </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">encoding</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"UTF-8" </span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">?&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;!</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">DOCTYPE </span><span lang="EN-US" style="font-size: 10pt; color: navy; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">sqlMapConfig </span><span lang="EN-US" style="font-size: 10pt; color: gray; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">PUBLIC </span><span lang="EN-US" style="font-size: 10pt; color: navy; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"-//iBATIS.com//DTD SQL Map Config 2.0//EN"</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: navy; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #3f7f5f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"http://www.ibatis.com/dtd/sql-map-config-2.dtd"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">sqlMapConfig</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">settings</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">cacheModelsEnabled</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"true"</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" 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 style="mso-spacerun: yes;">&nbsp;&nbsp;</span></span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">enhancementEnabled</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"true"</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">lazyLoadingEnabled</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"true"</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">errorTracingEnabled</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"true"</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">maxRequests</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"32"</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">maxSessions</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"10"</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">maxTransactions</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"5"</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">useStatementNamespaces</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"true"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">transactionManager </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">type</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"JDBC"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">dataSource </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">type</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"SIMPLE"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: #3f5fbf; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;!-- &lt;property name="JDBC.Driver" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: #3f5fbf; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property name="JDBC.ConnectionURL" value="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test;SelectMethod=Cursor"/&gt;--&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp; </span><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">property </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">name</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"JDBC.Driver" </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">value</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"com.mysql.jdbc.Driver"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">property </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">name</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"JDBC.ConnectionURL" </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">value</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"jdbc:mysql://localhost:3306/fzlyhj"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">property </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">name</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"JDBC.Username" </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">value</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"root"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">property </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">name</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"JDBC.Password" </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">value</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"123"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">property </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">name</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"Pool.MaximumActiveConnections" </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">value</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"10"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">property </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">name</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"Pool.MaximumIdleConnections" </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">value</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">=</span><span lang="EN-US" style="font-size: 10pt; color: #2a00ff; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">"5"</span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">/&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: teal; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;</span><span lang="EN-US" style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">property </span><span lang="EN-US" style="font-size: 10pt; color: #7f007f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">name</span><span lang="EN-US" style="font-size: 10pt; color: black; f