﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;明月松间照 清泉石上流-随笔分类-Java EE</title><link>http://www.blogjava.net/xuechen0721/category/12468.html</link><description>&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;———&amp;nbsp;兵临城下&amp;nbsp;&amp;nbsp;猫科动物</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 23:48:28 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 23:48:28 GMT</pubDate><ttl>60</ttl><item><title>关于实例变量和静态变量</title><link>http://www.blogjava.net/xuechen0721/archive/2007/01/25/96031.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Thu, 25 Jan 2007 12:29:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2007/01/25/96031.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/96031.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2007/01/25/96031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/96031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/96031.html</trackback:ping><description><![CDATA[           （以下所述只在WEB程序中）<br />          近期在项目调试时遇到一个关于Servlet的实例变量的问题，由于Servlet是多线程的，所以Servlet的实例变量是非线程安全的，在项目调试中出现多线程的同步问题。<br />         由于Web容器维护的Servlet在容器中只会创建一个实例，也就单例模式。Servlet多线程运行，则实例变量是多线程共享的，存在隐患，但很难发现！<br />         下面来说一下这个问题，比较离奇：<br />         原先的jsp页面中，存在一个Hidden的Iframe来实现页面上菜单联动的功能，一直运行良好。最近把iframe去掉了，改用ajax来实现。在下拉菜单onchange时，同时发出三个请求，调用同一个servlet，在这个Servlet中存在一个实例变量来返回数据，由于线程变量是非线程安全的，所以出现了bug，这个bug很隐秘，不是每次都能测试出来。<br />         在这里我不想讨论iframe和ajax的好坏，只是想讨论一下实例变量和静态变量。<br />         静态变量大家肯定比较熟悉，使用静态变量就是为了维护一个状态，使得可以让多实例共享这个变量，我们可以用它来实现一些类似缓存的功能。现在如果这个类的实现是一个单例的模式，那么静态变量就失去了优势。单例，那就意味着只能多线程使用，那么多线程中实例变量就是多线程共享的（非线程安全），此时实例变量的作用类似于静态变量了。<br />         是不是可以这样说，单例模式中可以用实例变量来实现静态变量的功能呢？？ 现在Spring中默认的都是单例模式（singleton）。<br />         但是个人观点，不提倡使用实例变量，毕竟非线程安全。如果一定要使用的话，个人观点只用实例变量来维护一些web资源（缓存功能，如xml资源等等，公司项目中有很多这样的情况），不能在这个类中频繁使用它，不安全（我遇到的就是这样一个问题）。<br />         纯属个人观点，欢迎大家发表意见，讨论一下！<img src ="http://www.blogjava.net/xuechen0721/aggbug/96031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2007-01-25 20:29 <a href="http://www.blogjava.net/xuechen0721/archive/2007/01/25/96031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA文件上传</title><link>http://www.blogjava.net/xuechen0721/archive/2006/12/24/89731.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Sun, 24 Dec 2006 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/12/24/89731.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/89731.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/12/24/89731.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/89731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/89731.html</trackback:ping><description><![CDATA[
		<p>      废话不多说，直接看程序：<br />      Web端：<br />&lt;form method = "post" id = "upload" action ="servlet/UploadServlet" enctype="multipart/form-data"&gt;<br />&lt;input type = "file" id = "uploadFile" name = "uploadFile"&gt;<br />&lt;input type="text" name ="text1"&gt;<br />&lt;input type = "submit" value = "UPLOAD"&gt;<br />&lt;/form&gt;<br /><br />      Servlet端：<br /> public void doGet(HttpServletRequest request, HttpServletResponse response)<br />   throws ServletException, IOException {<br />  Map parameters = new HashMap();<br />  try {<br />      FileItemFactory factory = new DiskFileItemFactory();<br />      ServletFileUpload fu = new ServletFileUpload(factory);<br />   <br />      fu.setSizeMax(4194304);</p>
		<p>      // 得到所有的文件，以及其它请求参数：<br />       List fileItems = fu.parseRequest(request);<br />       Iterator i = fileItems.iterator();<br />       // 依次处理每一个文件，以及请求参数：<br />       while(i.hasNext()) {<br />           FileItem fi = (FileItem)i.next();</p>
		<p>           // 如果是文件项，则保存文件到上传目录<br />           if (!fi.isFormField()) {<br />               // 获得文件名，这个文件名包括路径：<br />               String fileName = fi.getName();</p>
		<p>               long filesize = fi.getSize();<br />               System.out.println("上传的文件名为!!!"+fileName + " size : " + filesize);</p>
		<p>               // 写入文件<br />               fileName = fileName.substring(fileName.lastIndexOf("\\"));<br />               String conPath = getServletContext().getRealPath("");<br />               fi.write(new File(conPath + "//uploadFolder//" +fileName));<br />           }<br />           else { //如果是请求参数，则保存到HashMap中<br />               String name = fi.getFieldName();<br />               String value = fi.getString();<br />               parameters.put(name, value);<br />               System.out.println(parameters);<br />           }<br />       }</p>
		<p>  }<br />  catch(Exception ex) {<br />      System.out.println("上传文件时出错!!!");<br />      ex.printStackTrace();<br />  }</p>
		<p> }<br /><br />外加导入两个包：org.apache.commons.fileupload、org.apache.commons.io</p>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/89731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-12-24 11:30 <a href="http://www.blogjava.net/xuechen0721/archive/2006/12/24/89731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java store procedure 的使用（DB2）</title><link>http://www.blogjava.net/xuechen0721/archive/2006/12/15/87954.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Fri, 15 Dec 2006 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/12/15/87954.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/87954.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/12/15/87954.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/87954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/87954.html</trackback:ping><description><![CDATA[突然被要求写一个测试程序，测试java存储过程和sql的执行效率，以前没写过存储过程，啃了一段时间，记录如下：<br />使用的数据库为DB2，首先在db2中建立一个procedure：<br /><span><font face="Courier New" color="#0000ff" point-size="9">CREATE </font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">PROCEDURE</font><font face="Courier New" color="#000000" point-size="9"> SQLTEST (</font><font face="Courier New" color="#0000ff" point-size="9">IN</font><font face="Courier New" color="#000000" point-size="9"> tables </font><font face="Courier New" color="#0000ff" point-size="9">VARCHAR</font><font face="Courier New" color="#000000" point-size="9">(200),</font><font face="Courier New" color="#0000ff" point-size="9">IN</font><font face="Courier New" color="#000000" point-size="9"> num </font><font face="Courier New" color="#0000ff" point-size="9">INTEGER</font><font face="Courier New" color="#000000" point-size="9">)</font><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">SPECIFIC</font><font face="Courier New" color="#000000" point-size="9"> JDBC_SQLTEST</font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">DYNAMIC </font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">RESULT</font><font face="Courier New" color="#000000" point-size="9"> SETS 0</font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">DETERMINISTIC</font><font face="Courier New" color="#000000" point-size="9"></font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">LANGUAGE </font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">JAVA</font><font face="Courier New" color="#000000" point-size="9"></font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">PARAMETER </font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">STYLE</font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">JAVA</font><font face="Courier New" color="#000000" point-size="9"></font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">NO</font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">DBINFO</font><font face="Courier New" color="#000000" point-size="9"></font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">FENCED</font><font face="Courier New" color="#000000" point-size="9"></font></div><div><font face="Courier New" color="#000000" point-size="9">THREADSAFE</font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">MODIFIES </font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">SQL</font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">DATA</font><font face="Courier New" color="#000000" point-size="9"></font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">PROGRAM </font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">TYPE</font><font face="Courier New" color="#000000" point-size="9"> SUB</font></div><div><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">EXTERNAL </font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">NAME</font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#ff0000" point-size="9">'SQLTEST.procedureTest'<br /><br /><font color="#000000">其中SQLTEST为java 的calss名，</font><font color="#000000">procedureTest为方法名（详见如下程序）：<br /></font></font></div><div><font face="Courier New" color="#ff0000" point-size="9"><font color="#000000">import java.util.StringTokenizer;<br />import java.sql.Connection;<br />import java.sql.Statement;<br />import java.sql.DriverManager;</font></font></div><font face="Courier New" color="#ff0000" point-size="9"><font color="#000000"><div><br />import javax.naming.Context;<br />import javax.naming.InitialContext;<br />import javax.sql.DataSource;<br /><br />public class SQLTEST {<br /> <br /> public static void procedureTest(String tables,int num) {<br />  try{<br />   Connection conn = DriverManager.getConnection("jdbc:default:connection");<br />   Statement stmt = conn.createStatement();<br />   StringTokenizer stk = new StringTokenizer(tables,",");<br />   while(stk.hasMoreTokens()) {<br />    String table = stk.nextToken();<br />    String sql = "SELECT * FROM " + table;<br />    for(int i=0;i&lt;num;i++) {<br />     stmt.executeQuery(sql);<br />     <br />    }<br />   }<br />   stmt.close();<br />   conn.close();<br />  }catch(Exception e) {<br />   e.printStackTrace();<br />  }</div><div> }<br />}<br />将此class编译后拷贝到DB2安装目录的function目录下。<br /><br />再用servlet来调用它：<br />package com.test;</div><div>import java.io.IOException;<br />import java.util.StringTokenizer;<br />import java.sql.*;</div><div>import javax.sql.DataSource;<br />import javax.naming.InitialContext;<br />import javax.servlet.ServletException;</div><div>import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</div><div>public class SQLServlet extends HttpServlet {</div><div> public void doGet(HttpServletRequest req, HttpServletResponse resp)<br />  throws ServletException, IOException {<br />   doPost(req,resp);</div><div> }</div><div> public void doPost(HttpServletRequest req, HttpServletResponse resp)<br />  throws ServletException, IOException {<br />   CallableStatement callStmt = null;<br />   Connection conn = null;<br />   Statement stmt = null;<br />   String tables = "shgt_auth,shgt_master,trx_inbox";<br />   long start = 0;<br />   long end = 0;<br />   long lastTime = 0;<br />   int num = 100;<br />   try {<br />    <br />    //存储过程调用<br />    conn = getConnection("CET","eximtrx","Standard00");<br />    String procName = "SQLTEST";<br />    String sql = "CALL " + procName + "(?,?)";<br />    callStmt = conn.prepareCall(sql);<br />    callStmt.setString(1,tables);<br />    callStmt.setInt(2,num);<br />    start = System.currentTimeMillis();<br />    callStmt.execute();<br />    end = System.currentTimeMillis();<br />    lastTime = end - start;<br />    System.out.println("###########java store procedure Last time : " + lastTime/1000  + "s" + lastTime%1000 + "ms");<br />    <br />    <br />    <br />    //SQL 调用<br />    conn = getConnection("CET","eximtrx","Standard00");<br />    stmt = conn.createStatement();<br />    StringTokenizer strTok = new StringTokenizer(tables,",");<br />    start = System.currentTimeMillis();<br />    while(strTok.hasMoreTokens()) {<br />     String table = strTok.nextToken();<br />     String sql2 = "select * from " + table;<br />     for(int i=0;i&lt;num;i++){<br />      stmt.executeQuery(sql2);<br />     }<br />    }<br />    end = System.currentTimeMillis();<br />    lastTime = end - start;<br />    System.out.println("###########SQL Last time : " + lastTime/1000  + "s" + lastTime%1000 + "ms");</div><div>   } catch (Exception e) {<br />    e.printStackTrace();<br />   }</div><div> }</div><div> private Connection getConnection(String ds, String user, String pwd)<br />  throws Exception {<br />   Connection con = null;<br />   InitialContext ctx = new InitialContext();<br />   DataSource fDS = (DataSource)ctx.lookup(ds);<br />   con = fDS.getConnection(user, pwd);<br />   return con;<br /> }<br />}<br /><br />运行此servlet就可成功调用存储过程。<br />其中有个注意点，就是大小写的问题，刚开始时建存储过程是这样<span><font face="Courier New" color="#0000ff" point-size="9">CREATE</font><font face="Courier New" color="#000000" point-size="9"></font><font face="Courier New" color="#0000ff" point-size="9">PROCEDURE</font><font face="Courier New" color="#000000" point-size="9"> SQLT<font color="#ff0000">est</font>(</font><font face="Courier New" color="#0000ff" point-size="9">IN</font><font face="Courier New" color="#000000" point-size="9"> tables </font><font face="Courier New" color="#0000ff" point-size="9">VARCHAR</font><font face="Courier New" color="#000000" point-size="9">(200),</font><font face="Courier New" color="#0000ff" point-size="9">IN</font><font face="Courier New" color="#000000" point-size="9"> num </font><font face="Courier New" color="#0000ff" point-size="9">INTEGER</font><font face="Courier New" color="#000000" point-size="9">)</font> ，java class也用的是SQLT<font color="#ff0000">est，</font><font color="#000000">但是在调存储过程时会抱错，说找不到SQLTEST.</font><font color="#000000">procedureTest方法，原来数据库在创建存储过程时，即使你使用SQLT<font color="#ff0000">est</font></font><font color="#000000">，但也会被执行为SQLTEST,所以只有都改成大写。<br /><br />但有点意外的是，通过这个测试出来的数据，存储过程既然比sql跑得慢，不知道为什么，难道程序有问题？请大家看一下</font></span><br /><br /></div></font></font></span><img src ="http://www.blogjava.net/xuechen0721/aggbug/87954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-12-15 15:30 <a href="http://www.blogjava.net/xuechen0721/archive/2006/12/15/87954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Filter servler 的使用</title><link>http://www.blogjava.net/xuechen0721/archive/2006/12/12/87125.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Tue, 12 Dec 2006 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/12/12/87125.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/87125.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/12/12/87125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/87125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/87125.html</trackback:ping><description><![CDATA[创建filter的类（引用自<a href="/leishiran/">T-shirt</a>）<br />package testfilterservlet; 
<p>import java.io.IOException;</p><p>import javax.servlet.Filter;<br />import javax.servlet.FilterChain;<br />import javax.servlet.FilterConfig;<br />import javax.servlet.RequestDispatcher;<br />import javax.servlet.ServletException;<br />import javax.servlet.ServletRequest;<br />import javax.servlet.ServletResponse;</p><p>public class MyFirstFilter implements Filter {</p><p> private FilterConfig config;</p><p> public void init(FilterConfig filterConfig) throws ServletException {<br />  this.config = filterConfig;<br />  System.out.println("MyFirstFilter init!");<br /> }<br /> public void doFilter(ServletRequest request, ServletResponse response,<br />   FilterChain chain) throws IOException, ServletException { <br />  String myName = (String)request.getParameter("name");<br />  if(myName.equals("lsr")){<br />   System.out.print("lsr");<br />   chain.doFilter(request,response); //继续响应下一个filter或者servlet<br />  }else{<br />   System.out.print("not lsr");<br />   RequestDispatcher dispatcher = request.getRequestDispatcher("/testForm/testform1.html");<br />   dispatcher.forward(request,response);<br />  }<br /> }<br /> public void destroy() {<br />  // TODO 自动生成方法存根<br />  <br />  System.out.println("MyFirstFilter destroy!");<br /> }<br />}</p><p>然后注册(简写)<br />&lt;web-app&gt;<br />        &lt;filter&gt;<br />  &lt;filter-name&gt;MyFirstFilter&lt;/filter-name&gt;<br />  &lt;filter-class&gt;testfilterservlet.MyFirstFilter&lt;/filter-class&gt;<br /> &lt;/filter&gt;<br /> &lt;filter-mapping&gt;<br />  &lt;filter-name&gt;MyFirstFilter&lt;/filter-name&gt;<br />  &lt;servlet-name&gt;PrintLog&lt;/servlet-name&gt; //这里可以使用 url-pattern<br /> &lt;/filter-mapping&gt;</p><p> &lt;servlet&gt;<br />  &lt;description&gt;&lt;/description&gt;<br />  &lt;display-name&gt;PrintLog&lt;/display-name&gt;<br />  &lt;servlet-name&gt;PrintLog&lt;/servlet-name&gt;<br />  &lt;servlet-class&gt;testservlet.PrintLog&lt;/servlet-class&gt;<br />  &lt;init-param&gt;<br />   &lt;param-name&gt;des&lt;/param-name&gt;<br />   &lt;param-value&gt;this is a test&lt;/param-value&gt;<br />  &lt;/init-param&gt;<br /> &lt;/servlet&gt;<br /> &lt;servlet-mapping&gt;<br />  &lt;servlet-name&gt;PrintLog&lt;/servlet-name&gt;<br />  &lt;url-pattern&gt;/PrintLog&lt;/url-pattern&gt;<br /> &lt;/servlet-mapping&gt;<br />&lt;/web-app&gt;</p><img src ="http://www.blogjava.net/xuechen0721/aggbug/87125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-12-12 09:11 <a href="http://www.blogjava.net/xuechen0721/archive/2006/12/12/87125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>singleton的一点疑问</title><link>http://www.blogjava.net/xuechen0721/archive/2006/11/29/84354.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Wed, 29 Nov 2006 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/11/29/84354.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/84354.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/11/29/84354.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/84354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/84354.html</trackback:ping><description><![CDATA[一般Singleton模式通常有几种形式:<br />第一种形式<span lang="EN-US">:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span><br /><table style="WIDTH: 100%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="100%" border="0"><tbody><tr><td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt"><p><span lang="EN-US">public class Singleton {<o:p></o:p></span></p><p>　　<span lang="EN-US">private Singleton(){}</span></p><p>　　<span lang="EN-US">private static Singleton instance = new Singleton();<o:p></o:p></span></p><p><span lang="EN-US">　　public static Singleton getInstance() {<br />　　　　return instance; 　　<br />　　 } <br />} <o:p></o:p></span></p></td></tr></tbody></table><p>第二种形式<span lang="EN-US">:<o:p></o:p></span></p><table style="WIDTH: 100%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="100%" border="0"><tbody><tr><td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt"><p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 10.5pt">public class Singleton { <o:p></o:p></span></p><p>　　<span lang="EN-US">private static Singleton instance = null;<span lang="EN-US"><br /></span><span lang="EN-US">         <br />        private Singleton(){}<br /><o:p></o:p></span><br />　　public static synchronized Singleton getInstance() {<br /><br />　　if (instance==null)<br />　　　　instance＝new Singleton();<br />　　return instance; 　　} <o:p></o:p></span></p><p><span lang="EN-US">} <o:p></o:p></span></p></td></tr></tbody></table>都说第二种形式是<span lang="EN-US">lazy initialization，也就是说第一次调用时初始Singleton，不用每次都进行生成对象实例，提高了效率。<br /><o:p>我的疑问是：第一种形式每次通过Singleton.getInstance()就会多次生成实例吗？instance 不是static的吗，也只初始化一次啊！<br />还有第二种形式中的synchronized 为什么是必须的？不明白，望指点！</o:p></span><img src ="http://www.blogjava.net/xuechen0721/aggbug/84354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-11-29 15:07 <a href="http://www.blogjava.net/xuechen0721/archive/2006/11/29/84354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Taglib</title><link>http://www.blogjava.net/xuechen0721/archive/2006/11/25/83461.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Sat, 25 Nov 2006 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/11/25/83461.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/83461.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/11/25/83461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/83461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/83461.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<th class="f24">
										<h1>
												<font color="#000000">Taglib原理和实现之循环的Tag</font>
										</h1>
								</th>
						</tr>
						<tr>
								<td align="middle" height="20">
										<small>
												<font color="#000000">作者：WalkingWithJava Java研究组织 (2005-04-21 14:13:39)</font>
										</small>
								</td>
						</tr>
						<tr>
								<td>
										<br />
										<script type="text/javascript">
												<!--
google_ad_client = "pub-0052768304011480";
google_alternate_color = "000000";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_channel ="5959447789";
google_color_border = "000000";
google_color_bg = "666666";
google_color_link = "FFFFFF";
google_color_url = "FF9900";
google_color_text = "CCCCCC";
//-->
										</script>
										<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
										</script>
										<font color="#000000">
										</font>
								</td>
						</tr>
						<tr>
								<td height="15">
										<font color="#000000">
										</font>
								</td>
						</tr>
						<tr>
								<td class="l17">
										<font class="f14" id="zoom">
												<font color="#cccccc">
														<!-- 正文begin -->
														<!--StartFragment -->
														<font color="#000000"> </font>
														<span class="f14">
																<font color="#000000">1、问题：在request里的 People 对象，有个属性叫 men ，men 是一个Collection ，有许多个man 。现在，把 collection里的man的名字都显示出来。<br /><br />　　显然，这是一个嵌套Tag的问题。有三个Tag互相作用：最外层的Tag找到People对象，中间的Tag取得Collection，子Tag负责打印。<br /><br />　　例如:</font>
																<br />
																<br />
																<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
																		<tbody>
																				<tr>
																						<td>＜diego:withObject value="${people}"＞<br />　＜diego:withCollection property="men"＞<br />　　＜diego:elementout property="name"/＞ <br />　＜/diego:withCollection＞<br />＜/diego:withObject＞</td>
																				</tr>
																		</tbody>
																</table>
																<br />
																<font color="#000000">　　思路如下:<br /><br />　　1) 编写WithObjectTag,负责从El表达式中取得对象<br /><br />　　2) 编写WithCollectionTag,负责从对象中取得 Collection ,遍历 Collection ,每遍历一次 Collection ,执行一次body<br /><br />　　3) 编写ElementoutTag ,把 Collection 中每个men对象的 name 打印出来<br /><br />　　2. 完整程序如下：<br /><br />　　在上例的diegoyun.vo包内，编写 People 类</font>
																<br />
																<br />
																<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
																		<tbody>
																				<tr>
																						<td>package diegoyun.vo;<br />import java.util.Collection;<br />public class People<br />{<br />　private Collection men = null; <br />　public Collection getMen()<br />　{<br />　　return men;<br />　}<br />　public void setMen(Collection men)<br />　{<br />　　this.men = men;<br />　}<br />}</td>
																				</tr>
																		</tbody>
																</table>
																<br />　　<font color="#000000">编写 withObject ，这是从request里取得People对象的最外层Tag</font><br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>package diegoyun;<br />import javax.servlet.jsp.JspException;<br />import javax.servlet.jsp.tagext.BodyTagSupport;<br />import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;<br />public class WithObjectTag extends BodyTagSupport<br />{<br />　private Object value = null;<br /><br />　public Object getValue()<br />　{<br />　　return value;<br />　}<br />　public void setValue(Object value)throws JspException<br />　{<br />　　this.value = ExpressionEvaluatorManager.evaluate("value", value.toString(), Object.class, this, pageContext);<br />　}<br />　public int doStartTag()<br />　{ <br />　　return EVAL_BODY_INCLUDE;<br />　}<br />　public int doEndTag()throws JspException<br />　{ <br />　　return EVAL_PAGE;<br />　}<br />} </td></tr></tbody></table><br />　　<font color="#000000">编写WithCollectionTag，该Tag负责取得Collection，并遍历执行子Tag</font><br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>package diegoyun;<br /><br />import java.util.Collection;<br />import java.util.Iterator;<br /><br />import javax.servlet.jsp.JspException;<br />import javax.servlet.jsp.tagext.BodyTagSupport;<br /><br />import org.apache.commons.beanutils.PropertyUtils;<br /><br />public class WithCollectionTag extends BodyTagSupport {<br />　private Object element = null;<br /><br />　private Collection list = null;<br /><br />　private Iterator iterator = null;<br /><br />　public Object getElement() {<br />　　return element;<br />　}<br /><br />　public void setProperty(String property) throws JspException {<br />　　//取得父Tag对象,并且得到Collection<br />　　WithObjectTag parent = (WithObjectTag) getParent();<br />　　if (parent == null)<br />　　　throw new JspException("parent tag is null");<br />　　　try {<br />　　　　Object propertyValue = PropertyUtils.getProperty(parent.getValue(),property);<br />　　　　this.list = (Collection) propertyValue;<br />　　　　if (list == null)<br />　　　　　throw new JspException("Collection is null");<br />　　　} catch (Exception e) {<br />　　　　throw new JspException(e);<br />　　}<br />　}<br /><br />　public int doStartTag() throws JspException {<br />　　//设置第一个元素,然后执行子Tag<br />　　iterator = list.iterator();<br />　　if (iterator.hasNext())<br />　　　element = iterator.next();<br />　　　return EVAL_BODY_INCLUDE;<br />　}<br /><br />　public int doAfterBody() {<br />　　if (iterator.hasNext()) {<br />　　　//如果还存在子元素,设置子元素,并且再次执行子Tag<br />　　　//循环由此而来<br />　　　//否则不再执行子Tag<br />　　　element = iterator.next();<br />　　　return EVAL_BODY_AGAIN;<br />　　}<br />　　else<br />　　　return EVAL_PAGE;<br />　}<br />}</td></tr></tbody></table><br />　　<font color="#000000">编写 ElementOutputTag</font><br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>package diegoyun;<br />import java.io.IOException;<br /><br />import javax.servlet.jsp.JspException;<br />import javax.servlet.jsp.tagext.TagSupport;<br /><br />import org.apache.commons.beanutils.PropertyUtils;<br /><br />public class ElementOutputTag extends TagSupport<br />{<br />　private Object propertyValue = null;<br />　public void setProperty(String property)throws JspException<br />　{<br />　　WithCollectionTag parent = (WithCollectionTag)getParent();<br />　　if(parent == null)<br />　　　throw new JspException("parent tag is null");<br />　　try<br />　　{<br />　　　//判断上层tag中是否存在该属性名称,如果存在,取得属性值,否则报错<br />　　　propertyValue = PropertyUtils.getProperty(parent.getElement(), property);<br />　　}<br />　　catch (Exception e)<br />　　{<br />　　　throw new JspException(e);<br />　　}<br />　}<br />　public int doEndTag()throws JspException<br />　{<br />　　try<br />　　{<br />　　　//简单的把值打印到jsp页面<br />　　　pageContext.getOut().print(propertyValue);<br />　　}<br />　　catch (IOException e)<br />　　{<br />　　　throw new JspException(e);<br />　　}<br />　　return EVAL_PAGE;<br />　}<br />}</td></tr></tbody></table><br />　　<font color="#000000">编写tld</font><br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>＜!--WithObjectTag--＞<br />＜tag＞<br />　＜name＞withObject＜/name＞<br />　＜tag-class＞diegoyun.WithObjectTag＜/tag-class＞<br />　＜body-content＞JSP＜/body-content＞<br />　＜attribute＞<br />　　＜name＞value＜/name＞<br />　　＜required＞false＜/required＞<br />　　＜rtexprvalue＞true＜/rtexprvalue＞<br />　＜/attribute＞<br />＜/tag＞<br />＜!--WithCollectionTag--＞<br />＜tag＞<br />　＜name＞withCollection＜/name＞<br />　＜tag-class＞diegoyun.WithCollectionTag＜/tag-class＞<br />　＜body-content＞JSP＜/body-content＞<br />　＜attribute＞<br />　　＜name＞property＜/name＞<br />　　＜required＞false＜/required＞<br />　　＜rtexprvalue＞true＜/rtexprvalue＞<br />　＜/attribute＞<br />＜/tag＞<br />＜!--ElementOutputTag--＞<br />＜tag＞<br />　＜name＞elementout＜/name＞<br />　＜tag-class＞diegoyun.ElementOutputTag＜/tag-class＞<br />　＜body-content＞empty＜/body-content＞<br />　＜attribute＞<br />　　＜name＞property＜/name＞<br />　　＜required＞false＜/required＞<br />　　＜rtexprvalue＞true＜/rtexprvalue＞<br />　＜/attribute＞<br />＜/tag＞</td></tr></tbody></table><br />　　<font color="#000000">编写jsp</font><br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>＜%@ page language="java" %＞<br />＜%@ page import="diegoyun.vo.*"%＞<br />＜%@ page import="java.util.*"%＞<br />＜%@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego"%＞<br /><br />＜html＞<br />＜body bgcolor="#FFFFFF"＞<br />＜%<br />　Collection c = new ArrayList();<br /><br />　Man man1 = new Man();<br />　man1.setName("diego");<br />　c.add(man1);<br /><br />　Man man2 = new Man();<br />　man2.setName("Zidane");<br />　c.add(man2);<br /><br />　Man man3 = new Man();<br />　man3.setName("Rui");<br />　c.add(man3);<br /><br />　People p =new People();<br />　p.setMen(c);<br />　request.setAttribute("people",p);<br />%＞<br />Test loop tag:<br />＜br＞<br />＜diego:withObject value="${people}"＞<br />＜diego:withCollection property="men"＞<br />＜diego:elementout property="name"/＞<br />＜br＞<br />＜/diego:withCollection＞<br />＜/diego:withObject＞<br />＜/body＞<br />＜/html＞</td></tr></tbody></table><br />　　<font color="#000000">运行,则可以看到:</font>　<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>Test loop tag: <br />diego <br />Zidane <br />Rui</td></tr></tbody></table><p></p></span>
												</font>
										</font>
										<br />个人觉得不错的一片文章，现在才知道Tag也可以这么用！学海无涯啊！<br /><br />有几个疑问：<br />1、在WithCollectionTag中为什么没有调用doEndTag()方法，而使用了doAfterBody()？<br />2、在ElementOutputTag中为什么只使用了doEndTag()方法？<br />doStartTag() 、doEndTag()、doAfterBody()不知该怎么用，什么时候用哪个，不用哪个？请教了！<p>还有就是下面几个属性，不知道该怎么用？<br />SKIP_BODY     SKIP_PAGE       EVAL_PAGE   EVAL_BODY_BUFFERED      <br />EVAL_BODY_INCLUDE           EVAL_BODY_AGAIN </p></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/83461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-11-25 16:36 <a href="http://www.blogjava.net/xuechen0721/archive/2006/11/25/83461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于数据库count的问题</title><link>http://www.blogjava.net/xuechen0721/archive/2006/11/13/80843.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Mon, 13 Nov 2006 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/11/13/80843.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/80843.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/11/13/80843.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/80843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/80843.html</trackback:ping><description><![CDATA[
		<p>有以下一个表：programmer<br />id        name      adresss<br />1         xc          cn<br />2         xc          ae<br />2         xc           rr<br /><br />现在我要计算总条数，用count， select count(*) as acount from programmer，这条语句返回3。<br />因为这条语句count(*)是计算的所有的字段，而我现在这样一个要求，就是说写一条sql语句count id和name 两个字段，并去掉重复记录，就是说我查询id和name两个字段，去掉重复记录并返回记录的条数。<br />想了很多办法都没成功，网上有这么一条语句：select count(distinct 'id&amp;name') as acount from programmer ,从语句上看好像符合了我的要求，但是这条sql语句返回的却是1 ，而不是2 ，不知到为什么，还向各位请教。有什么其他的办法吗？？急等</p>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/80843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-11-13 11:38 <a href="http://www.blogjava.net/xuechen0721/archive/2006/11/13/80843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>久违了啊！遇到一个关于session id的问题，向大家请教！</title><link>http://www.blogjava.net/xuechen0721/archive/2006/11/11/80552.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Sat, 11 Nov 2006 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/11/11/80552.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/80552.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/11/11/80552.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/80552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/80552.html</trackback:ping><description><![CDATA[      问题很简单：<br />      假设我现在有两个用户：user1、user2。user1打开浏览器后登陆，在后台我得到一个sessionID1来记录该用户的各种信息。在同一浏览器中又以user2的帐户登陆，我后台得到的sessionID2，现在这个sessionID2与sessionID1是相同的。这对我的信息处理带来了混乱。<br />      我知道如果用户打开另一个浏览器用user2的帐户登陆，得到的sessionID肯定是不相同的，现在我想问的是在同一浏览器中以不同的帐号登陆，能得到不同的sessionID吗？或者可以采取其他另外的操作来避免相同的sessionID吗？不吝赐教！<img src ="http://www.blogjava.net/xuechen0721/aggbug/80552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-11-11 11:07 <a href="http://www.blogjava.net/xuechen0721/archive/2006/11/11/80552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近比较忙！忙完后一点心得</title><link>http://www.blogjava.net/xuechen0721/archive/2006/09/09/68754.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Sat, 09 Sep 2006 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/09/09/68754.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/68754.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/09/09/68754.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/68754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/68754.html</trackback:ping><description><![CDATA[
		<font color="#0000ff">         好久没有更新我的blog了！呵呵！最近比较忙！<br />         进入公司用已经整整5个月了，最近完成了项目升级版本中一个新增功能，做完以后现在回想起来，感觉很简单，没做什么，可当时做的时候怎么就感觉那么复杂呢！（当初的开发和后续的解bug，确实花了不少精力）<br />         通过这次的开发，对公司这套系统架构有了一个大概的了解，和大家讨论共享一下：<br />         公司是做银行金融软件的，客户主要面向国外（如亚洲的渣打银行）。这套系统给我的第一感觉就是：自己发明了“轮子”。（看来公司还是有一点底蕴的）<br />         Rod Johnson说不要重复发明“轮子” ，可我好像看到了一个新“轮子”。这个系统也是建立在J2EE的平台上，但比较特殊，不是常见的web系统，它是一个参数配置系统，web中的所有业务元素都可以由配置文件来控制。在web程序之外，还有一套用Java Swing开发的配套软件，对于不同的业务做不同的配置，生成一套参数供web使用。（灵活性相当大）<br />         结合MVC来讨论一下这套系统：（系统分为web端和AP端）<br />         MODEL（AP）：看来J2EE中Enity Bean确实有很多诟病，公司没有采用任何的ORM，而是直接通过SQL语句与数据库交互。但使用了Session Bean（stateless） 来做facade，封装DAO层，来实现持久化逻辑。大概框架如此，不过其中为了实现分层，还有很多的control层和实现层。我还没彻底理解就不说了。<br />        VIEW、CONTROL（WEB）：公司系统的view层没有采用任何的开源框架，所有的动态逻辑都是通过Tag来实现的。其实和struts一样，只不过struts是写好的Tag，而我们是用我们自己写的Tag，虽然比较复杂，但控制的粒度精细，是struts所不能比的（不是贬低struts，只是在粒度方面，struts确实不怎么样）。<br />        有一点我要说的是状态管理。公司系统并没有使用J2EE中的有状态的Session Bean，而是把所有的状态都保存在httpSession中，网上看到一些文章说，Session中存储大量的信息会增加服务器的负担，不知道公司在性能方面是怎么考虑的。我觉得状态管理是个很头疼的问题，就是SSH架构中，Spring也不能管理状态，我知道的就是J2EE中有状态会话Bean是一个管理状态的组件。把状态信息存储在Session中使用起来确实很方便，但server要维护这个状态就很耗资源了。<br />         还有一点就是，公司系统中大量的使用了JS，因为我对JS不熟，所以让我写JS比较头疼，留下的印象比较深。我曾经问过我的一个朋友，问他公司的系统中JS的使用程度，他的回答是：能不用尽量不用。所以我现在比较疑惑，对JS的使用是不是有一个度的问题呢？<br />         还有一点，我前面说过了，我们公司的系统是一个参数配置系统，配置一个应用需求，有一整套参数，都是XML文件。所以在系统中的数据交互都是通过XML来组织的（也就是通过DOM）。比如说，当一个用户登录后，会从数据库和配置参数中读取这个用户的相关信息，存储在DOM中，然后伴随这个用户的整个会话周期，交易的状态和信息都可以从这个DOM中读取。以前在学习XML时，书中总是说XML是组织数据传递数据的，当时不理解，现在总算明白了！呵呵！<br />         说了很多，只是一个初步的了解，欢迎各位网友发表看法！<br />         好了，不说了，刚下了部电影，看电影去了！呵呵！</font>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/68754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-09-09 20:53 <a href="http://www.blogjava.net/xuechen0721/archive/2006/09/09/68754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谁有Hibernate源代码，给一个</title><link>http://www.blogjava.net/xuechen0721/archive/2006/05/19/47043.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Fri, 19 May 2006 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/05/19/47043.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/47043.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/05/19/47043.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/47043.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/47043.html</trackback:ping><description><![CDATA[谁有Hibernate源代码，给一个<img src ="http://www.blogjava.net/xuechen0721/aggbug/47043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-05-19 14:03 <a href="http://www.blogjava.net/xuechen0721/archive/2006/05/19/47043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于EJB的调用问题（初始化上下文）</title><link>http://www.blogjava.net/xuechen0721/archive/2006/04/30/44123.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Sun, 30 Apr 2006 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/04/30/44123.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/44123.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/04/30/44123.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/44123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/44123.html</trackback:ping><description><![CDATA[
		<font color="#006400">　　笔者使用的应用服务器从Weblogic到现在的WebSphere，在EJB的调用问题上始终存在的一点疑虑,今天说出来和大家探讨一下。<br />　　在远程调用EJB时，有一个初始化环境的问题，有以下两种代码：<br />一、Context ctx = new InitialContext();<br />二、String initialFactory = "com.ibm.websphere.naming.WsnInitialContextFactory";<br />    　String initialURL = "iiop://localhost:2809";<br />    　Hashtable env = new Hashtable();<br />    　env.put(Context.PROVIDER_URL, initialURL);<br />   　 env.put(Context.INITIAL_CONTEXT_FACTORY,initialFactory);<br />    　Context ctx = new InitialContext(env);<br /><br />       笔者也看了很多这方面的书，大多数书中都是按照第一种的写法，大概都这样论述，说EJB已经在容器中初始化，所以只需调用默认的初始化环境即可，但是却都不介绍怎么在容器中初始化这些信息。根据笔者的使用经验，不设置容器的情况下（其实笔者也不知道怎么设置）使用第一种方法都提示不能初始化上下文。<br />　　笔者现在都使用第二种硬编码的方式，现在想请教大家，如果想设置EJB的容器，利用第一种方法，那该怎么设置呢？毕竟每次调用时都按第二种方法很麻烦。<br />　　还有一个就是JNDI的书写问题有两种：（比如笔者创建的EJB名为HelloEntity）一种是ejb/HelloEntity，还有一种是java:comp/env/ejb/HelloEntity<br />请问java:comp/env怎么设置，在哪个配置文件中设置？笔者在WebSphere的配置文件ibm-ejb-jar-bnd.xmi中设置了java:comp/env，可在使用时还是报错，说找不到java这个初始化上下文，不懂，请指教该怎么设置？</font>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/44123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-04-30 09:28 <a href="http://www.blogjava.net/xuechen0721/archive/2006/04/30/44123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CMP的本地方法调用</title><link>http://www.blogjava.net/xuechen0721/archive/2006/04/28/43879.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Fri, 28 Apr 2006 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/04/28/43879.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/43879.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/04/28/43879.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/43879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/43879.html</trackback:ping><description><![CDATA[
		<p>        <font color="#0000ff">继续昨天发的随笔，虽然解决了CMP的部署发布问题，在WebSphere中成功发布。但以我的经验写出的代码却不能调用它！弄了一下午，有点郁闷！向大家说说！<br />       先向大家叙述一下我的CMP的情况：<br />       我使用的CMP使用的本地接口，没有建立远程接口。我想运用facade模式，也就是在一个SessionBean中调用实体Bean，所以我使用本地接口。我的本意是这样可以减少频繁的远程调用而带来的资源占用。<br />       然而我在调试时wsad报错，从报错中显示找不到这个CMP，后来我设了断点在下面这个语句：<br />ctx.lookup("ejb/com/diablo/ProgrammerLocalHome);这个语句是在一个try语句中，发现程序运行这句后就捕捉到异常，直接跳到catch中了。所以确定是JNDI出问题了啊！<br />       以我对本地接口的认识，bean之间调用属于内部调用，利用本地接口可以减少资源的占用。然而却不能如我所愿啊！如果把这个CMP设成远程接口，就没有任何问题。<br />       想问问各位，这个CMP的本地接口到底应该怎么调用呢?还是我哪里认识有错误呢？  <br />       欢迎指点！</font></p>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/43879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-04-28 21:54 <a href="http://www.blogjava.net/xuechen0721/archive/2006/04/28/43879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 中CMP的部署发布问题</title><link>http://www.blogjava.net/xuechen0721/archive/2006/04/27/43625.html</link><dc:creator>兵临城下</dc:creator><author>兵临城下</author><pubDate>Thu, 27 Apr 2006 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/xuechen0721/archive/2006/04/27/43625.html</guid><wfw:comment>http://www.blogjava.net/xuechen0721/comments/43625.html</wfw:comment><comments>http://www.blogjava.net/xuechen0721/archive/2006/04/27/43625.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xuechen0721/comments/commentRss/43625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xuechen0721/services/trackbacks/43625.html</trackback:ping><description><![CDATA[
		<p>我创建了一个简单的CMP，是基于数据库中的一个表的。<br />创建过程和部署过程都很正常，但我在向应用服务器（WebSphere）发布时却出现以下报错：</p>
		<p>[06-4-27 11:59:52:531 CST] 3e725b31 Helpers       W NMSV0605W: 使用名称“</p>
		<p>comp/PM/WebSphereCMPConnectionFactory”从上下文“java:”中查找的引用对象发送到 </p>
		<p>JNDI 命名管理器并且导致异常。引用数据如下：<br />引用工厂类名：com.ibm.ws.naming.util.IndirectJndiLookupObjectFactory<br />引用工厂类位置 URL：&lt;null&gt;<br />Reference Class Name: java.lang.Object<br />Type: JndiLookupInfo<br />Content: JndiLookupInfo: jndiName="jdbc/Default"; providerURL=""; </p>
		<p>initialContextFactory=""</p>
		<p>异常数据如下：<br />javax.naming.NameNotFoundException: Context: </p>
		<p>localhost/nodes/localhost/servers/server1, name: jdbc/Default: First </p>
		<p>component in name Default not found.  Root exception is </p>
		<p>org.omg.CosNaming.NamingContextPackage.NotFound: </p>
		<p>IDL:omg.org/CosNaming/NamingContext/NotFound:1.0<br /> at </p>
		<p>com.ibm.ws.naming.ipcos.WsnOptimizedNamingImpl.do_resolve_complete_info(Ws</p>
		<p>nOptimizedNamingImpl.java:968)<br /> at </p>
		<p>com.ibm.ws.naming.cosbase.WsnOptimizedNamingImplBase.resolve_complete_info</p>
		<p>(WsnOptimizedNamingImplBase.java:1399)<br /> at </p>
		<p>com.ibm.WsnOptimizedNaming._NamingContextStub.resolve_complete_info(Unknow</p>
		<p>n Source)<br /> at </p>
		<p>com.ibm.ws.naming.jndicos.CNContextImpl.cosResolve(CNContextImpl.java:3491</p>
		<p>)<br /> at </p>
		<p>com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1519)<br /> at </p>
		<p>com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1480)<br /> at </p>
		<p>com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1187)<br /> at </p>
		<p>com.ibm.ws.naming.util.IndirectJndiLookupObjectFactory$1.run(IndirectJndiL</p>
		<p>ookupObjectFactory.java:372)<br /> at </p>
		<p>com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.ja</p>
		<p>va:111)<br /> at </p>
		<p>com.ibm.ws.naming.util.IndirectJndiLookupObjectFactory.getObjectInstanceEx</p>
		<p>t(IndirectJndiLookupObjectFactory.java:221)<br /> at </p>
		<p>com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers</p>
		<p>.java:868)<br /> at </p>
		<p>com.ibm.ws.naming.urlbase.UrlContextHelper.processBoundObjectForLookup(Url</p>
		<p>ContextHelper.java:152)<br /> at </p>
		<p>com.ibm.ws.naming.java.javaURLContextRoot.processBoundObjectForLookup(java</p>
		<p>URLContextRoot.java:398)<br /> at </p>
		<p>com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1278)<br /> at </p>
		<p>com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:1</p>
		<p>96)<br /> at </p>
		<p>com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:1</p>
		<p>37)<br /> at javax.naming.InitialContext.lookup(InitialContext.java:360)<br /> at </p>
		<p>com.ibm.ws.ejbpersistence.beanextensions.ConcreteBeanClassExtensionImpl.lo</p>
		<p>okup(Unknown Source)<br /> at </p>
		<p>com.ibm.ws.ejbpersistence.beanextensions.ConcreteBeanClassExtensionImpl.ge</p>
		<p>tConnectionFactory(Unknown Source)<br /> at </p>
		<p>com.ibm.ws.ejbpersistence.beanextensions.PMModuleCookieImpl.beanInstall(Un</p>
		<p>known Source)<br /> at </p>
		<p>com.ibm.ws.ejbpersistence.beanextensions.PersistenceManagerImpl.beanInstal</p>
		<p>l(Unknown Source)<br /> at </p>
		<p>com.ibm.ejs.container.EJSContainer.loadBeanMetaData(EJSContainer.java:1367</p>
		<p>)<br /> at </p>
		<p>com.ibm.ejs.container.EJSContainer.getHomeWrapperCommon(EJSContainer.java:</p>
		<p>1012)<br /> at </p>
		<p>com.ibm.ejs.container.EJSContainer.getHomeInstance(EJSContainer.java:934)<br /> at </p>
		<p>com.ibm.ejs.container.EJSContainer.startBean(EJSContainer.java:913)<br /> at </p>
		<p>com.ibm.ws.runtime.component.EJBContainerImpl.startBean(EJBContainerImpl.j</p>
		<p>ava:1301)<br /> at </p>
		<p>com.ibm.ws.runtime.component.EJBContainerImpl.install(EJBContainerImpl.jav</p>
		<p>a:1034)<br /> at </p>
		<p>com.ibm.ws.runtime.component.EJBContainerImpl.start(EJBContainerImpl.java:</p>
		<p>1508)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.j</p>
		<p>ava:505)<br /> at </p>
		<p>com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectSta</p>
		<p>rt(DeployedApplicationImpl.java:808)<br /> at </p>
		<p>com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.j</p>
		<p>ava:354)<br /> at </p>
		<p>com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplica</p>
		<p>tionImpl.java:578)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(Applicati</p>
		<p>onMgrImpl.java:299)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.j</p>
		<p>ava:256)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ContainerImpl.startComponents(ContainerImpl.j</p>
		<p>ava:536)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ContainerImpl.start(ContainerImpl.java:413)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ApplicationServerImpl.start(ApplicationServer</p>
		<p>Impl.java:128)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ContainerImpl.startComponents(ContainerImpl.j</p>
		<p>ava:536)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ContainerImpl.start(ContainerImpl.java:413)<br /> at </p>
		<p>com.ibm.ws.runtime.component.ServerImpl.start(ServerImpl.java:183)<br /> at com.ibm.ws.runtime.WsServer.start(WsServer.java:128)<br /> at com.ibm.ws.runtime.WsServer.main(WsServer.java:225)<br /> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br /> at </p>
		<p>sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:</p>
		<p>79)<br /> at </p>
		<p>sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm</p>
		<p>pl.java:41)<br /> at java.lang.reflect.Method.invoke(Method.java:386)<br /> at com.ibm.ws.bootstrap.WSLauncher.main(WSLauncher.java:105)<br /> at </p>
		<p>com.ibm.etools.websphere.tools.runner.api.ServerRunnerV5$1.run(ServerRunne</p>
		<p>rV5.java:97)</p>
		<p>从报错信息中看出好像是CMP的连接初始化工厂配置有问题。由于我刚上手使用Eclipse + </p>
		<p>WebSphere（以前使用的是Jbuilder + Weblogic），但我有一个疑问：<br />在部署成功后发布时怎么会出现初始化工厂的问题呢？我还没有调用这个CMP啊？只是发布到</p>
		<p>WebSphere而已（相当于发布到Weblogic应用服务器），为什么会初始化环境工厂呢？以我的</p>
		<p>经验只有在发布成功后，客户端调用CMP时才会涉及到这个问题吧！<br />我实在弄不明白。难道这两个应用服务期在这一点上有区别？<br />另外，如果发布时进行初始化环境工厂，那我创建的SessionBean为什么就没有这个问题，部署</p>
		<p>发布都很正常，不知道为什么？</p>
		<p>问题困扰我很久了。期望解决方案！</p>
<img src ="http://www.blogjava.net/xuechen0721/aggbug/43625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xuechen0721/" target="_blank">兵临城下</a> 2006-04-27 17:28 <a href="http://www.blogjava.net/xuechen0721/archive/2006/04/27/43625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>