空山雪林通用模塊工作室

           

          置頂隨筆

          [置頂]Openfire 3.7.0提供的優(yōu)秀開源在線客服系統(tǒng)

          Openfire 3.7.0開始官方為我們提供了一套優(yōu)秀的在線客服系統(tǒng),你可以按如下步驟安裝使用這套在線客服系統(tǒng):
          1. 安裝和部署Openfire 3.7.0
          2. 安裝fastpath插件
          3. 從openfire的svn上下載webchat源碼,webchat導(dǎo)入到eclipse中的工程如下圖:
           
          這套系統(tǒng)為我們提供了嵌入到客戶端代碼的源碼,客戶端只需要簡單的嵌入如下代碼,即可顯示在線客服圖標(biāo):<html>
          <head>
          <title>Fastpath Web Chat</title>
          <script language="JavaScript" type="text/javascript" src="http://www.faqee.com:7080/webchat2/jivelive.jsp"></script>
          </head>
          <body>
          <script>
                showChatButton('demo@workgroup.nb.faqee.com');
           
          </script>
          </body>
          </html>
          但點(diǎn)擊在線客服圖標(biāo)時(shí),如下圖:

          客服端使用Spark接受來自訪客的請求的,點(diǎn)擊Accept,如下圖:


          我們?yōu)槟峁┝?個(gè)客服賬號,請用Spark登陸,嵌入的訪客代碼見博客,有興趣的朋友可以測試一下:)
          服務(wù)器填入:nb.faqee.com
          客服賬號:vms01/vms01,vms02/vms02,……,vms09/vms09
          訪客嵌入代碼測試地址:
          http://code.faqee.com/interface/fastpath.jsp

          posted @ 2011-03-09 12:51 徐靈 閱讀(8206) | 評論 (12)編輯 收藏

          2014年5月30日

          高可用性服務(wù)端的設(shè)計(jì)與實(shí)現(xiàn)

          本文的客戶端基于我們的GQT開源項(xiàng)目:http://cxlh.iteye.com/blog/2021463

           

          本人拙見,如有不同意見,歡迎拍磚,同時(shí)獻(xiàn)給特別有對服務(wù)端跨語言需求的程序猿們!

          客戶端(GQT Demo V3(服務(wù)端配套版).rar)太大請挪步到QQ群下載(群號:101189702),注明:GQT或Java,C++等;

          Java工程代碼請挪步下載:http://cxlh.iteye.com/blog/2074307 


          總體設(shè)計(jì)思路: 

           

          1. 高可用性:每個(gè)業(yè)務(wù)服務(wù)端都是獨(dú)立的個(gè)體,任何一個(gè)業(yè)務(wù)服務(wù)器Crash時(shí),都不會影響服務(wù),并且業(yè)務(wù)服務(wù)器可以按需增加,業(yè)務(wù)服務(wù)端使用Java代碼實(shí)現(xiàn),主要是為了考慮更好的數(shù)據(jù)庫操作,更好的事務(wù)支持,更好的社區(qū)支持以及可用更多的開源服務(wù),提高開發(fā)效率;
          2. 自動負(fù)載均衡:當(dāng)某個(gè)接口頻繁調(diào)用,增加的響應(yīng)服務(wù)器自動分流接口調(diào)用壓力,也就說我們的異步的請求/響應(yīng)模式下,有一個(gè)Broker仲裁程序決定客戶端發(fā)來的請求交由哪個(gè)Java業(yè)務(wù)服務(wù)器來處理,這個(gè)Broker程序我們采用C++代碼實(shí)現(xiàn);
          3. 客戶端(包括桌面或移動端)網(wǎng)關(guān):根據(jù)策略選取遠(yuǎn)程Socket服務(wù)器連接,Socket服務(wù)器與服務(wù)器之間的消息通訊通過地址尋址遠(yuǎn)程路由,以便連在不同Socket服務(wù)器上的用戶之間可以相互通訊,典型的應(yīng)用就是聊天程序;
          4. Sub/Pub類消息:客戶端訂閱服務(wù)端的服務(wù),服務(wù)端有多個(gè)Pub服務(wù)器(Java編寫),交由Socket服務(wù)器將客戶端Sub的消息Push給Client,此時(shí)Socket服務(wù)只作為Proxy用;

            好了,其實(shí)這里只有2個(gè)C++核心組件(Socket服務(wù)器,Broker仲裁程序)和N個(gè)Java業(yè)務(wù)服務(wù)器(請求處理服務(wù)器,Pub服務(wù)器),以下介紹用法(需要一定的客戶端編程知識和一些腳本只是):

          客戶端發(fā)送請求,異步收取,編寫業(yè)務(wù)代碼步驟:

           

          編寫Java服務(wù)端,比如我們編寫一個(gè)按關(guān)鍵字讀取股票列表等接口(依賴注入用的Spring):

          @Repository @CacheNamespace(implementation = org.mybatis.caches.ehcache.EhcacheCache.class, readWrite = true) public interface StockDao { 	@Select("select SYMBOL,SHORT_NAME from `master`") 	public List<Map> listStock(); 	 	@Select("select SYMBOL,SHORT_NAME from `master` where SHORT_NAME like '%${k}%' or SPELL_NAME like '%${k}%' or SYMBOL like '%${k}%' limit 0,10") 	public List<Map> listStockByKeyword(Map<String,String> map); 	 	@Select("select SYMBOL,SHORT_NAME from `master` where exch_id=8") 	public List<Map> listAllSh(Map<String,String> map); 	 	@Select("select SYMBOL,SHORT_NAME from `master` where trade_date=#dt#") 	public List<Map> listStockByDate(Map<String,String> map); }

          編寫Java服務(wù)就這么簡單:

          package com.gqt.demo;

          import java.io.File;
          import java.io.FileInputStream;
          import java.io.InputStream;
          import java.util.Properties;
          import java.util.ResourceBundle;

          import org.apache.logging.log4j.LogManager;
          import org.apache.logging.log4j.Logger;

          import com.gqt.server.BaseReqServer;
          import com.gqt.server.ReqCallBack;

          public class StockServer extends BaseReqServer {
              private static Logger logger = LogManager.getLogger(StockServer.class.getName());
              
              final static Properties prop = new Properties();
              static{
                  InputStream is = null
                  try {
                      String c_path = StockServer.class.getResource("/").getPath();
                      logger.info("c_path:{}",c_path);
                      is = new FileInputStream(new File(c_path+"config.properties"));
                      prop.load(is);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }

              }
              public StockServer(String ip, String port, ReqCallBack callback) {
                  super(ip, port, callback);
              }
              public static void main(String[] args) {
                  logger.info("=============StockServer========");
                  new Thread(){
                      @Override
                      public void run() {
                          ReqCallBack callback = new StockCallBack();
                          String ip = prop.getProperty("gqt-reqserver-ip");
                          String port = prop.getProperty("gqt-reqserver-port");
                          final StockServer ss = new StockServer(ip,port,callback);
                          ss.startServer();
                      }
                  }.start();
              }
          }

          編寫客戶端C++或腳本:

          gw.req("命令代碼"."命令代碼對應(yīng)的參數(shù)列表"); //回調(diào)函數(shù) gw.s_cb_gw.connect(function(trcode,msg){ 	log("-----------------------------------------------------------------"); 	log("<p>gqt server異步方式獲取數(shù)據(jù),回調(diào)信息:trcode=" + trcode + ",msg=" + msg+"</p>"); });

           

          效果如下:

           

           

           

           

          這樣做的好處:

           

          1. 桌面或移動的客戶端再也不用編寫繁瑣的網(wǎng)絡(luò)通信相關(guān)的程序,只需要發(fā)送請求/訂閱,處理響應(yīng)/訂閱數(shù)據(jù)包即可,也不用關(guān)心底層的數(shù)據(jù)分包合包,客戶端代理,網(wǎng)絡(luò)傳輸?shù)募咏饷芎蛪嚎s等;
          2. 客戶端開發(fā)人員也幾乎不用和服務(wù)端程序員溝通,通過JSON解析請求透傳給Java,Java響應(yīng)的數(shù)據(jù)帶上包頭和響應(yīng)給客戶端,客戶端解析JSON即可;
          3. 跨語言的服務(wù)端雖然會損失一定的性能,但似乎這點(diǎn)ZeroMQ已做的足夠好;

           

          Demo程序部署步驟:

           

          1. 創(chuàng)建一個(gè)MySQL Demo數(shù)據(jù)庫,數(shù)據(jù)庫名:stock,utf-8編碼,導(dǎo)入output下的stock.sql;
          2. 配置output下的config.properties文件,指定機(jī)器IP,配置jdbc.properties,確保數(shù)據(jù)庫配置正確;
          3. 點(diǎn)擊runStockServer.bat,運(yùn)行stock的Java Demo服務(wù)器,可以開任意個(gè);
          4. 配置gqt-server-communicator(cpp)下的config_ims.ini文件,IP地址全部換成機(jī)器IP;
          5. 啟動ss_server.exe,ss_zserver.exe;
          6. 點(diǎn)擊客戶端GQT程序,配置config_ims.ini中的IP地址,切換到gateway的標(biāo)簽頁,enjoy it!


           

          posted @ 2014-05-30 16:15 徐靈 閱讀(1235) | 評論 (0)編輯 收藏

          2014年3月20日

          也談基于Web的含工作流項(xiàng)目的一般開發(fā)流程

          該項(xiàng)目包含的通用模塊代碼等我有時(shí)間一并剝離貢獻(xiàn)出來(基于WebSocket的通知引擎,工作流整合模塊,自定義表單(詳見這里),基于RBAC權(quán)限設(shè)計(jì)),最近太忙了,Web項(xiàng)目有一段時(shí)間沒碰,有點(diǎn)生疏的感覺,主要在忙GQT項(xiàng)目,一套基于桌面開發(fā)的框架,詳見這里,寫代碼寫的有點(diǎn)手酸的感覺。

           

          基于Web的含工作流的項(xiàng)目看起來并不如想象的那么簡單,主要需求:

          1. 靈活定制工作流,并跟蹤流程進(jìn)度;
          2. 每個(gè)Order含有歷史軌跡記錄,可在歷史中查看;
          3. 工作流的Action靈活,認(rèn)領(lǐng)任務(wù)不一定非要先提取表單,因?yàn)楹芏喙?jié)點(diǎn)都只有幾個(gè)動作,直接按鈕操作即可;
          4. 待辦事宜列表在不刷新頁面情況下也能變動;

          項(xiàng)目要求:

          1. 操作簡單高效;
          2. 權(quán)限細(xì)節(jié)到按鈕級別;
          3. 并發(fā)數(shù)少,不超過3000個(gè)在線用戶;

          主要可能使用到技術(shù):

          1. 工作流引擎,我這里選用Activiti5,很靈活好用;
          2. 權(quán)限使用Spring Security,基于標(biāo)簽式管理權(quán)限很方便;
          3. 通知引擎使用WebSocket,基于Flash實(shí)時(shí)通信,基于socket.io;
          4. 權(quán)限粒度基于經(jīng)典的RBAC;
          5. 總體框架Spring MVC+Mybatis;

          實(shí)現(xiàn)的WebSocket的總體思路:

          1. WebSocket Server獨(dú)立于Web項(xiàng)目,Web Server與WebSocket Server之間的局域網(wǎng)通信基于簡單的Socket通信,這樣這個(gè)組件可以完全解耦和通用;
          2. 當(dāng)Web項(xiàng)目要Push消息到Client時(shí),通過Web Server的Socket Client向WebSocket Server的Socker Server發(fā)送消息,然后WebSocket Server收到消息后解碼,廣播到所有瀏覽器;

          我們實(shí)現(xiàn)的事件通知非常簡單,設(shè)定全局變量并讓瀏覽器偵聽:

          var G_WebSocket=false; 
          var EVENT_ORDER_CHANGE_STATUS = "orderChange";
          var EVENT_ORDER_CHANGE_AMOUNT = "amountChange";
          var EVENT_ORDER_CHANGE_REFUND = "refundChange";
          WebSocket.init = function(callbackFunc){
          socket = io.connect(connUrl, connOptions);
          socket.on('connect', function() {
          G_WebSocket=true;
          callbackFunc("connect",null);
          });
          socket.on('disconnect', function() {
          G_WebSocket=false;
          callbackFunc("disconnect",null);
          });
          socket.on('clientQuit', function(obj){
          G_WebSocket=false;
          callbackFunc("clientQuit",obj);
          });
          socket.on('broadcast', function(obj) {
          callbackFunc("broadcast",obj);
          });
          };

           

          在需要偵聽WebSocket接受Web Server推送消息的地方加上一個(gè)函數(shù)即可:

          	WebSocket.init(function(command,jsonObj){ 		
          if(command=="broadcast"){
          if(jsonObj.e == EVENT_ORDER_CHANGE_STATUS){
          //TODO:write your code here
          }else if(jsonObj.e == EVENT_ORDER_CHANGE_AMOUNT){
          //TODO:write your code here
          }else if(jsonObj.e == EVENT_ORDER_CHANGE_REFUND){
          //TODO:write your code here
          }
          }
          });

           這樣的結(jié)構(gòu)要擴(kuò)展推送服務(wù)很簡單,比如按頻道推送等,都可以很容易的擴(kuò)展。

          再看看看工作流,我們實(shí)現(xiàn)了activiti通用的申請?zhí)峤蝗蝿?wù)流程和自定義表單功能,提取跟蹤流程圖功能等,這樣你要設(shè)計(jì)一個(gè)新流程也變得非常簡單,只需要在eclipse里劃上工作流圖,在后臺發(fā)布,然后通過SpringMVC的RestAPI啟動實(shí)例流程,申領(lǐng)完成任務(wù)等,如下圖:



           流程走到了分支的兩個(gè)節(jié)點(diǎn)上,這樣對后續(xù)新增的工作流提供了極大的遍歷。

          最后說說Spring Security,基于RBAC的權(quán)限體系搭建好后(可以用在任何管理系統(tǒng)中),要在頁面中訪問一個(gè)資源,首先判斷一下是否有權(quán)限,如下HTML:

          <sec:authorize ifAllGranted="r_pd"> 
          <a href="#">resource access here</a>
          </sec:authorize>

           

          <sec:authorize url="/XXX/XXX/XXX.html"> 	
          <a href="XXX/XXX/XXX.html'">
          <span>XXX功能</span>
          </a>
          </sec:authorize>

            

          前臺由于項(xiàng)目比較小,沒有用到j(luò)s的MVC框架,如backbone等,這里就不再記錄了。

           

           

          posted @ 2014-03-20 12:48 徐靈 閱讀(1677) | 評論 (6)編輯 收藏

          2011年3月9日

          Openfire 3.7.0提供的優(yōu)秀開源在線客服系統(tǒng)

          Openfire 3.7.0開始官方為我們提供了一套優(yōu)秀的在線客服系統(tǒng),你可以按如下步驟安裝使用這套在線客服系統(tǒng):
          1. 安裝和部署Openfire 3.7.0
          2. 安裝fastpath插件
          3. 從openfire的svn上下載webchat源碼,webchat導(dǎo)入到eclipse中的工程如下圖:
           
          這套系統(tǒng)為我們提供了嵌入到客戶端代碼的源碼,客戶端只需要簡單的嵌入如下代碼,即可顯示在線客服圖標(biāo):<html>
          <head>
          <title>Fastpath Web Chat</title>
          <script language="JavaScript" type="text/javascript" src="http://www.faqee.com:7080/webchat2/jivelive.jsp"></script>
          </head>
          <body>
          <script>
                showChatButton('demo@workgroup.nb.faqee.com');
           
          </script>
          </body>
          </html>
          但點(diǎn)擊在線客服圖標(biāo)時(shí),如下圖:

          客服端使用Spark接受來自訪客的請求的,點(diǎn)擊Accept,如下圖:


          我們?yōu)槟峁┝?個(gè)客服賬號,請用Spark登陸,嵌入的訪客代碼見博客,有興趣的朋友可以測試一下:)
          服務(wù)器填入:nb.faqee.com
          客服賬號:vms01/vms01,vms02/vms02,……,vms09/vms09
          訪客嵌入代碼測試地址:
          http://code.faqee.com/interface/fastpath.jsp

          posted @ 2011-03-09 12:51 徐靈 閱讀(8206) | 評論 (12)編輯 收藏

          2010年10月12日

          Flash開發(fā)開源工具推薦—FlashDevelop

          偶玩的版本是3.3.1,簡單而華麗的外表,界面截圖如下:


          ?

          安裝FD,你首先需要安裝:

          1. JDK 1.6以上版本
          2. .Net運(yùn)行環(huán)境
          繼而你就可以一路Next完成安裝了……

          安裝完成后,你必須去adobe官方網(wǎng)站下載開源的Flex SDK,我這邊下載的版本是:flex_sdk_3.5.0.12683_mpl

          下載完成后,解壓到某個(gè)目錄下即可,如:F:\flex_sdk_3.5.0.12683_mpl

          然后在FD中設(shè)置Flex SDK,如下圖:



          ?
          我們這邊以O(shè)pen Flash Chart為例,導(dǎo)入項(xiàng)目工程,點(diǎn)擊運(yùn)行,如下圖:



          ?
          你可以設(shè)置斷點(diǎn),運(yùn)行表達(dá)式,使用起來非常方便,強(qiáng)烈推薦給大家使用!


          已有 1 人發(fā)表留言,猛擊->>這里<<-參與討論


          JavaEye推薦



          posted @ 2010-10-12 08:43 徐靈 閱讀(257) | 評論 (0)編輯 收藏

          2010年10月7日

          國慶度假小記

          10月5,6日去寧波附近的度假村旅游了一下,一家3人出發(fā)了,由于兒子還比較小,怕他累著,所以這次就去了九龍湖開元名都大酒店度假村,5星級的酒店,住了一晚,有點(diǎn)小貴,協(xié)議價(jià)后也得880元一晚,不過是無敵湖景房,超大陽臺,陽臺上就可以看到整個(gè)九龍湖,甚是壯觀,兒子玩的開心的不得了,在酒店的花園里滑滑板車,5日早上出發(fā),6日中午回來,在回來的路上,順便小逛了一下慈城古鎮(zhèn),到寧波吃了點(diǎn)飯,到家就該兒子的睡覺時(shí)間了……這個(gè)國慶節(jié)3日就簡單的陪兒子在東錢湖上座了下船,他很喜歡坐船的……其實(shí)時(shí)間都在不知不覺中度過,國慶長假結(jié)束了……

          ?

          PS:附上酒店小圖一張,以之紀(jì)念……

          ?





          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          JavaEye推薦



          posted @ 2010-10-07 20:29 徐靈 閱讀(130) | 評論 (0)編輯 收藏

          2010年9月28日

          利用Spring 3實(shí)現(xiàn)Rest配置與開發(fā)

          最近項(xiàng)目要用到Rest,選擇了Spring 3,關(guān)于Rest的介紹:

          ?

          ?

          ?REST關(guān)鍵原則
          REST定義了應(yīng)該如何正確地使用(這和大多數(shù)人的實(shí)際使用方式有很大不同)Web標(biāo)準(zhǔn),例如HTTP和URI。如果你在設(shè)計(jì)應(yīng)用程序時(shí)能堅(jiān)持REST原則,那就預(yù)示著你將會得到一個(gè)使用了優(yōu)質(zhì)Web架構(gòu)(這將讓你受益)的系統(tǒng)。總之,五條關(guān)鍵原則列舉如下:

          1. 為所有“事物”定義ID
          2. 將所有事物鏈接在一起
          3. 使用標(biāo)準(zhǔn)方法
          4. 資源多重表述
          5. 無狀態(tài)通信

          ?

          Spring 3.0開始將全面支持Rest,而且配置實(shí)現(xiàn)起來也相當(dāng)簡單,利用Spring MVC在web.xml定義片段:

          ?

          ?

          	<servlet>  
                  <servlet-name>mydemo</servlet-name>  
                  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
                  <load-on-startup>1</load-on-startup>  
              </servlet>  
                
              <servlet-mapping>  
                  <servlet-name>mydemo</servlet-name>  
                  <url-pattern>/</url-pattern>  
              </servlet-mapping> 

          ?

          繼而在Web-INF目錄下增加mydemo-servlet.xml,內(nèi)容如下:

          ?

          ?

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
          	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          	xmlns:p="http://www.springframework.org/schema/p"
          	xmlns:context="http://www.springframework.org/schema/context"
          	xsi:schemaLocation="http://www.springframework.org/schema/beans
          		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          		http://www.springframework.org/schema/context
          		http://www.springframework.org/schema/context/spring-context-3.0.xsd">
          	
          	<!-- Auto scan, declare the location path -->  
          	<context:component-scan base-package="com.mydemo.springmvc.rest" />  
          
          	<!-- Using annontation -->  
          	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 
          	
          	<!-- Resolve the view, declare the prefix and suffix -->  
          	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"  
          		p:prefix="/view/" p:suffix=".jsp" p:viewClass="org.springframework.web.servlet.view.JstlView" />  
          	 
          	<bean id="multipartResolver"  
          		class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  
          		p:defaultEncoding="utf-8" /> 
          </beans>

          ?

          這里我們定義了JSP文件的標(biāo)簽庫用jstl,并啟動了注解功能,并自動掃描com.mydemo.springmvc.rest下的controller,接著我們就可以在com.mydemo.springmvc.rest包下編寫controller代碼

          并可以使用注解功能,如類似的代碼如下:

          ?

          ?

          @Controller
          public class MyDemoController {
          	private CommonDAO commonDAO;
          	@Autowired
          	public void setCommonDAO(CommonDAO commonDAO) {
          		this.commonDAO = commonDAO;
          	}
          
          	private MyDemoController (){}
          	
          	@RequestMapping(value="/home", method=RequestMethod.GET)
          	public String welcome(){
          		return "/home";
          	}
          }
          ?

          然后就可以在view目錄下通過增加home.jsp來實(shí)現(xiàn)顯示層代碼的編寫工作,所有的步驟就以上這些,接下去你就可以通過類似:http://localhost:8080/mydemo/home,來訪問了(這里Controller通過注解的方式注入DAO以便進(jìn)行數(shù)據(jù)庫的訪問)



          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          JavaEye推薦



          posted @ 2010-09-28 13:19 徐靈 閱讀(577) | 評論 (0)編輯 收藏

          2010年9月16日

          上海出差整整一周

          最近一周都在上海出差,終于還是決定到新公司發(fā)展,希望能在新的環(huán)境有另一番作為吧

          ?

          本周主要在上海探討產(chǎn)品架構(gòu),以及針對需求的概要設(shè)計(jì),將公司的新產(chǎn)品有概念轉(zhuǎn)化為產(chǎn)品,雖然新公司是個(gè)剛起步的公

          ?

          司,但作為產(chǎn)品還是相當(dāng)有市場潛力的,而且目前國內(nèi)做同類產(chǎn)品的相對很少,希望能做出點(diǎn)成績,也作為而立之年的小小

          ?

          考驗(yàn),加油……



          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          JavaEye推薦



          posted @ 2010-09-16 08:46 徐靈 閱讀(130) | 評論 (0)編輯 收藏

          2010年9月9日

          愛要大聲說出來……

          今天看到首頁博客上看到“喜歡一個(gè)人的理由”博文,深有感觸,特別是干我們這行的,往往都比較內(nèi)向,也從來不向心儀的女孩表白占了多數(shù),讀工科的總是木訥些,當(dāng)初的我也一樣。


          我也是其中一員,曾經(jīng)心儀的高中女生,自我讀大學(xué)后,我也跟她保持的書信來往,記得第一次寫信地址還是通過校友錄知道的,很快我們成為了“筆友”,相對來說,我和寫那篇博文的作者差不多,自身?xiàng)l件并不怎么優(yōu)越,170的身高,還要打個(gè)99折,她算是個(gè)“全優(yōu)女生”,成績好,長相也不錯(cuò),所以我始終沒有表白,也是怕最后連“筆友”也沒得做,一直維持著大學(xué)結(jié)束,她讀醫(yī)的,所以比我多讀一年,工作后,“筆友”變成了“話友”,短信IP電話時(shí)時(shí)騷擾,在大學(xué)期間,我還為她和我的經(jīng)歷虛構(gòu)寫成了一篇偵探小說,但我比寫博客的作者幸運(yùn)的是,我在最后的時(shí)刻還是表白了,她沒馬上答復(fù)我,一周后,她成為了我的女友,2年后,她成為了我的妻子……


          愛要大聲說出來,要不然就會連最后的希望都沒有……男女單純的友誼能維持多久呢……我想都是用來忽悠的吧,所以應(yīng)該抓住每一次機(jī)會,愛要大聲說出來……



          已有 5 人發(fā)表留言,猛擊->>這里<<-參與討論


          JavaEye推薦



          posted @ 2010-09-09 11:13 徐靈 閱讀(221) | 評論 (1)編輯 收藏

          2010年9月6日

          JDBC操控Oracle XMLDB

          現(xiàn)在XML數(shù)據(jù)庫大行其道,特別在數(shù)據(jù)交換領(lǐng)域,由于XML數(shù)據(jù)庫本身的特點(diǎn),可以大顯身手,那么JDBC如何來操作XMLDB呢,我們舉幾個(gè)簡單的例子拋磚引玉一下吧

          ?

          ?

          • 在數(shù)據(jù)庫中獲取XMLType類型的列值,比如存儲過程返回XmlType等,代碼如下:
          public static String getOracleXMlType2String(Object obj){
          		try{
          			if(obj instanceof OPAQUE){
          				StringBuffer sb = new StringBuffer();
          				OPAQUE op =(OPAQUE)obj; 
          				if(op!=null){
          					XMLType poxml = XMLType.createXML(op);
          					if(poxml!=null){
          						sb.append(poxml.getStringVal());
          					}
          				}
          				return sb.toString();
          			}
          			return obj.toString();
          		}catch(Exception ex){
          			return null;
          		}
          	}?

          執(zhí)行存儲過程代碼:
           Object[] res = DbUtils.ExecuteSP("{call 存儲過程名(?,?)}", new Object[]{
          		new SpParameter(Types.VARCHAR, "IN", "in參數(shù)", "in參數(shù)值")
          		,new SpParameter(OracleTypes.OPAQUE,"OUT","x",null)}, conn);
          ?

          ?

          • 可以通過XmlType列的clob值,代碼如下:
          select x.sys_nc_rowinfo$.getclobval() as column_value	from xmltypeTable
          ?
          • 執(zhí)行存錯(cuò)過程(存儲過程中含XmlTYPE返回值)
          	public static final Object[] ExecuteSP(String stmt, Object[] inparams,
          			Connection connection) {
          		int i = 1;
          		CallableStatement st = null;
          		SpParameter sp = null;
          		SpParameter outp = null;
          		int DataType;
          		String Direction;
          		String Name;
          		String DataValue;
          
          		try {
          			st = connection.prepareCall(stmt);
          
          			int oupcount = 0;
          
          			for (i = 0; i < inparams.length; i++) {
          				if (inparams[i] instanceof SpParameter) {
          					sp = (SpParameter) inparams[i];
          
          					if (sp.GetDirection().toUpperCase().equals("IN")) {
          						switch (sp.GetDataType()) {
          						case Types.FLOAT:
          						case Types.INTEGER:
          							st
          									.setLong(i + 1, Long.parseLong(sp
          											.GetDataValue()));
          							break;
          
          						case Types.DATE:
          							st.setDate(i + 1, java.sql.Date.valueOf(sp
          									.GetDataValue()));
          							break;
          						case Types.SQLXML:
          							st.setSQLXML(i + 1, null);
          							break;
          						default:
          							st.setString(i + 1, sp.GetDataValue());
          							break;
          						}
          					} else {
          						if(sp.getDataType() == OracleTypes.OPAQUE){
          							st.registerOutParameter (i+1, OracleTypes.OPAQUE,"SYS.XMLTYPE");
          						}else
          							st.registerOutParameter(i + 1, sp.GetDataType());
          						oupcount = oupcount + 1;
          					}
          				} else
          					st.setObject(i + 1, inparams[i]);
          			}
          
          			st.execute();
          			i = 1;
          
          			if (oupcount > 0) {
          				Object[] outps = new Object[oupcount];
          				int j = 0;
          				for (i = 0; i < inparams.length; i++) {
          					if (!(inparams[i] instanceof SpParameter))
          						continue;
          
          					sp = (SpParameter) inparams[i];
          
          					if (!sp.GetDirection().toUpperCase().equals("IN")) {
          						DataType = sp.GetDataType();
          						Direction = sp.GetDirection();
          						Name = sp.GetName();
          
          						switch (DataType) {
          						case Types.FLOAT:
          							DataValue = String.valueOf(st.getLong(i + 1));
          							break;
          
          						case Types.INTEGER:
          							DataValue = String.valueOf(st.getInt(i + 1));
          							break;
          
          						case Types.DATE:
          							DataValue = st.getDate(i + 1).toString();
          							break;
          
          						case OracleTypes.OPAQUE:
          							DataValue = getOracleXMlType2String(st.getObject(i+1));
          							break;
          						default:
          							DataValue = st.getString(i + 1);
          							break;
          						}
          
          						sp.setDataValue(DataValue);
          						outps[j++] = DataValue;
          
          						// res.addElement(new SpParameter(DataType, Direction,
          						// Name,
          						// DataValue));
          					}
          				}
          
          				return outps;
          			} else {
          				return null;
          			}
          		} catch (SQLException ex) {
          			
          		} finally {
          			if (st != null) {
          				try {
          					st.close();
          				} catch (Exception ex) {
          					log.error(ex);
          				}
          
          			}
          		}
          	}
          ?


          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          JavaEye推薦



          posted @ 2010-09-06 13:21 徐靈 閱讀(297) | 評論 (0)編輯 收藏

          成龍大哥,麻煩請不要以這種方式再高調(diào)做善事……

          ?

          我很疑惑,作為知名的華人演員,在“咋捐門”出來后,還要寫封信給北川同學(xué),在信中還

          ?

          在一個(gè)勁的解釋“為什么還沒捐”,而且還冠冕堂皇的不會給你任何承諾錢何時(shí)能到賬,號

          ?

          稱原則問題,搞個(gè)“國家·愛”大型主題活動還在一個(gè)勁的重復(fù)著唱自己的歌“國家”,越看這

          ?

          封信就覺得越變扭!


          咱能不能也和中國首善陳光標(biāo)一樣,做善事可以高調(diào),但不能再高調(diào)的背后炒作,宣傳自

          ?

          己商業(yè)產(chǎn)品或在當(dāng)?shù)?/span>搞投資啥的……這點(diǎn)偶很看好陳光標(biāo)同志,瞻仰一下!

          新聞引用 寫道
          親愛的同學(xué)們:
          你們好嗎?!
          雖然相隔遙遠(yuǎn),但此時(shí)此刻,在我眼前浮現(xiàn)的是你們一張張純真、質(zhì)樸而可愛的臉龐。曾幾何時(shí),那場突如其來的足可詛咒的天災(zāi),奪去了你們中的許多親人,毀了你們的家園和校園。每每想起這些我就心痛,而你們在災(zāi)難中堅(jiān)強(qiáng)挺立,奮發(fā)讀書,又讓我心生感動。你們不愧是龍的傳人,是國家的驕傲!
          令我感到無比欣慰的是,短短兩年多時(shí)間,一個(gè)新的北川拔地而起,一座新的校園又飄蕩起朗朗讀書聲。我從網(wǎng)上圖片中看到,新北川中學(xué)很氣派,很現(xiàn)代,很漂亮。我由衷地為你們感到高興。這也再一次驗(yàn)證了天災(zāi)不可怕,心齊力量大。人間有情,大愛無疆!
          同學(xué)們還記得去年5月我們在一起時(shí)的情景嗎?那一天,不,準(zhǔn)確地說是兩天,全校同學(xué)放下功課,從臨時(shí)校舍里趕到那片地震殘留的廢墟上,全情出演由我主導(dǎo)的“國家·愛”大型主題活動,以紀(jì)念地震一周年。那真是一個(gè)激動人心的場景:我和你們1000名同學(xué),一起將重400公斤、面積5000平方米的巨幅國旗緩緩展開,此舉打破了一項(xiàng)吉尼斯紀(jì)錄大全。我們還一起放聲歌唱《國家》,“國是我的國,家是我的家,我愛我的國,我愛我的家……”當(dāng)時(shí)你們專注凝重的表情,還有不少同學(xué)眼眶噙滿淚水,都深深印刻在我的心里。當(dāng)天內(nèi)地和香港許多媒體記者來到現(xiàn)場,競相采訪報(bào)道這一盛況,讓愛傳遍四方,讓暖流溢滿人間。
          作為一名華人知名演員,我時(shí)刻牢記自己承擔(dān)的一份社會責(zé)任,因此一直把慈善公益事業(yè)放在重要地位。此次在北川的主題活動,就是由我親自構(gòu)思設(shè)計(jì),我相信此舉一定能夠引發(fā)全社會的共鳴,吸引更多人關(guān)注災(zāi)區(qū)的重建。而我深知光有這些是不夠的,我還得為大家做點(diǎn)實(shí)實(shí)在在的事情。所以我當(dāng)場做出一個(gè)重要決定并鄭重宣布:將捐獻(xiàn)我的新作《大兵小將》部分票房援建北川中學(xué)!同學(xué)們對我所做愛心承諾報(bào)以熱烈的掌聲,我還深深記得。
          但是同學(xué)們,時(shí)間過去了一年多,新北川中學(xué)在政府等方面的努力下已經(jīng)建起來了,而我的新片子也早已上市,我承諾的捐款卻并沒有到位,這是實(shí)情。近些天媒體紛紛指責(zé)我,甚至用上了“詐捐”這樣難聽的詞匯。我當(dāng)然很冤,當(dāng)然是事出有因。我會是言而無信的人嗎?我會是說大話使小錢或者干脆拿不出錢的人嗎?我很氣憤,很悲哀。對于個(gè)別媒體率先造謠的行為我將采取法律手段,維護(hù)自己的聲譽(yù)和權(quán)益。
          不過就此事我必須親自向同學(xué)們做以解釋,因?yàn)槲也辉试S當(dāng)初面對我做下承諾時(shí)你們那1000雙熱切期待的眼神中產(chǎn)生絲毫的疑慮,那樣我將于心難安。其實(shí)我的主要解釋已經(jīng)通過我的助手向外界發(fā)布過了,我認(rèn)為是完全合乎邏輯和情理的。第一,我發(fā)布捐款承諾時(shí),《大兵小將》還沒上映呢,而任何一部片子都有一個(gè)風(fēng)險(xiǎn)問題,票房是掙是賠不好說,如果票房賠了,我拿什么捐,是吧!所以我當(dāng)時(shí)主要是表達(dá)一個(gè)奉獻(xiàn)愛心的心情與希望,并沒有說絕對會捐出多少數(shù)額,這個(gè)相信大家能夠理解;第二,《大兵小將》最終票房賣了1.5億多,是賺錢了,但是屬于我的那部分分紅我還沒有拿到手,還需要一個(gè)過程,而這個(gè)過程有可能需要兩三年,所以我當(dāng)初承諾時(shí)也沒有說具體的落實(shí)時(shí)間,其實(shí)就是考慮到了這個(gè)因素;第三,有居心不良者說我既然是答應(yīng)捐款“重建”北川中學(xué),而片子分紅又沒下來,就不可以從別的地方抽調(diào)資金先救建校之急嗎?我說不可以。我們搞慈善不能太隨意,必須實(shí)行專項(xiàng)封閉運(yùn)行。我許諾捐出電影部分票房,那就一言廄出駟馬難追,必須按這個(gè)辦,不好中途更改的。并且我理解重建不單指蓋學(xué)校,比如為學(xué)校重新建立校園安全系統(tǒng),不也是重建嗎?這樣的錢年年都要花,所以我的捐款什么時(shí)間到位,與我的承諾沒有必然聯(lián)系。
          好了,我也解釋清楚了。總之請同學(xué)們放心,我成龍做了那么多慈善項(xiàng)目,跨國的都做了不少,動用金額成百上千萬的難以計(jì)數(shù),豈會在牽涉地震災(zāi)害的捐款活動中背信棄義,讓人所不恥。所以我一定會兌現(xiàn)承諾,大家只要關(guān)心接下來的動作就可以了。不過如前所述,有些原則性的東西我還是要堅(jiān)持,也就是此項(xiàng)捐款還得等我《大兵小將》的結(jié)算下來,所以還是需要一段時(shí)間。希望大家懷著美好的心情,慢慢等待。如果有提前畢業(yè)的同學(xué)看不到我兌現(xiàn)承諾的那一刻,也請永遠(yuǎn)記住我的一片愛心,我愛你們!
          最后,讓我們從頭再唱一遍《國家》,我起頭:“一玉口中國,一瓦頂成家,都說國很大,其實(shí)一個(gè)家……”
          同學(xué)們加油!

          ?

          ?



          已有 6 人發(fā)表留言,猛擊->>這里<<-參與討論


          JavaEye推薦



          posted @ 2010-09-06 08:20 徐靈 閱讀(191) | 評論 (0)編輯 收藏

          僅列出標(biāo)題  下一頁

          導(dǎo)航

          友情鏈接

          最新評論

          主站蜘蛛池模板: 成武县| 阿巴嘎旗| 专栏| 永和县| 东乌| 米泉市| 从化市| 乡城县| 滨海县| 龙口市| 镇康县| 昌都县| 白银市| 侯马市| 密云县| 娱乐| 区。| 泸州市| 望奎县| 黄骅市| 城步| 忻城县| 平原县| 罗城| 盐边县| 土默特左旗| 婺源县| 沙田区| 获嘉县| 苏尼特右旗| 哈巴河县| 渝中区| 大港区| 饶河县| 巧家县| 渭南市| 平乡县| 东光县| 郓城县| 德州市| 舞阳县|