<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yxhxj2006

    常用鏈接

    統(tǒng)計

    最新評論

    2015年4月4日 #

    jQuery 插件autocomplete 應(yīng)用

    項目中有時會用到自動補(bǔ)全查詢,就像Google搜索框、淘寶商品搜索功能,輸入漢字或字母,則以該漢字或字母開頭的相關(guān)條目會顯示出來供用戶選擇, autocomplete插件就是完成這樣的功能。

      autocomplete官網(wǎng) : http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ (可下載jQuery autocomplete插件)。

      淘寶商品搜索功能 效果:

      下面來使用 autocomplete插件來實現(xiàn)類似效果。

    1. 創(chuàng)建 AjaxPage.aspx 頁面,在其中定義 WebMethod 方法來返回 搜索頁面需要的輸入框所有提示條目。 后臺代碼如下:

    復(fù)制代碼
     1 using System.Collections.Generic;
    2 using System.IO;
    3 using System.Runtime.Serialization.Json;
    4 using System.Web.Services;
    5
    6 public partial class AjaxPage : System.Web.UI.Page
    7 {
    8 [WebMethod]
    9 public static string GetAllHints()
    10 {
    11 Dictionary<string, string> data = new Dictionary<string, string>();
    12 data.Add("蘋果4代iphone正品", "21782");
    13 data.Add("蘋果4代 手機(jī)套", "238061");
    14 data.Add("蘋果4", "838360");
    15 data.Add("蘋果皮", "242721");
    16 data.Add("蘋果筆記本", "63348");
    17 data.Add("蘋果4s", "24030");
    18 data.Add("戴爾筆記本", "110105");
    19 data.Add("戴爾手機(jī)", "18870");
    20 data.Add("戴爾鍵盤", "30367");
    21
    22 DataContractJsonSerializer serializer = new DataContractJsonSerializer(data.GetType());
    23
    24 using (MemoryStream ms = new MemoryStream())
    25 {
    26 serializer.WriteObject(ms, data);
    27 return System.Text.Encoding.UTF8.GetString(ms.ToArray());
    28 }
    29 }
    30 }
    復(fù)制代碼

      注:該方法返回的數(shù)據(jù)格式為json字符串。

    2. 創(chuàng)建搜索頁面 Index.aspx, 前臺代碼如下:

    復(fù)制代碼
     1 <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Index.aspx.cs" Inherits="_Default" %>
    2
    3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4
    5 <html xmlns="http://www.w3.org/1999/xhtml">
    6 <head runat="server">
    7 <title></title>
    8 <link rel="Stylesheet" href="Styles/jquery.autocomplete.css" />
    9 <script type="text/javascript" src="Scripts/jquery-1.4.1.js"></script>
    10 <script type="text/javascript" src="Scripts/jquery.autocomplete.js"></script>
    11 <script type="text/javascript">
    12 var v = 1;
    13 $(document).ready(function () {
    14 $.ajax({
    15 type: "POST",
    16 contentType: "application/json",
    17 url: "AjaxPage.aspx/GetAllHints",
    18 data: "{}",
    19 dataType: "json",
    20 success: function (msg) {
    21 var datas = eval('(' + msg.d + ')');
    22 $("#txtIput").autocomplete(datas, {
    23 formatItem: function (row, i, max) {
    24 return "<table width='400px'><tr><td align='left'>" + row.Key + "</td><td align='right'><font style='color: #009933; font-family: 黑體; font-style: italic'>約" + row.Value + "個寶貝</font>&nbsp;&nbsp;</td></tr></table>";
    25 },
    26 formatMatch: function(row, i, max){
    27 return row.Key;
    28 }
    29 });
    30 }
    31 });
    32 });
    33 </script>
    34 </head>
    35 <body>
    36 <form id="form1" runat="server">
    37 <div>
    38 <center>
    39 <asp:TextBox ID="txtIput" runat="server" Width="400px"></asp:TextBox>
    40 </center>
    41 </div>
    42 </form>
    43 </body>
    44 </html>
    復(fù)制代碼

      實現(xiàn)效果如下:

    3. autocomplete 參數(shù)說明

    * minChars (Number)
        在觸發(fā)autoComplete前用戶至少需要輸入的字符數(shù).Default: 1,如果設(shè)為0,在輸入框內(nèi)雙擊或者刪除輸入框內(nèi)內(nèi)容時顯示列表
    * width (Number)
        指定下拉框的寬度. Default: input元素的寬度
    * max (Number)
        autoComplete下拉顯示項目的個數(shù).Default: 10
    * delay (Number)
        擊鍵后激活autoComplete的延遲時間(單位毫秒).Default: 遠(yuǎn)程為400 本地10
    * autoFill (Boolean)
        要不要在用戶選擇時自動將用戶當(dāng)前鼠標(biāo)所在的值填入到input框. Default: false
    * mustMatch (Booolean)
        如果設(shè)置為true,autoComplete只會允許匹配的結(jié)果出現(xiàn)在輸入框,所有當(dāng)用戶輸入的是非法字符時將會得不到下拉框.Default: false
    * matchContains (Boolean)
        決定比較時是否要在字符串內(nèi)部查看匹配,如ba是否與foo bar中的ba匹配.使用緩存時比較重要.不要和autofill混用.Default: false
    * selectFirst (Boolean)
        如果設(shè)置成true,在用戶鍵入tab或return鍵時autoComplete下拉列表的第一個值將被自動選擇,盡管它沒被手工選中(用鍵盤或鼠標(biāo)).當(dāng)然如果用戶選中某個項目,那么就用用戶選中的值. Default: true
    * cacheLength (Number)
        緩存的長度.即對從數(shù)據(jù)庫中取到的結(jié)果集要緩存多少條記錄.設(shè)成1為不緩存.Default: 10
    * matchSubset (Boolean)
        autoComplete可不可以使用對服務(wù)器查詢的緩存,如果緩存對foo的查詢結(jié)果,那么如果用戶輸入foo就不需要再進(jìn)行檢索了,直接使用緩存.通常是打開這個選項以減輕服務(wù)器的負(fù)擔(dān)以提高性能.只會在緩存長度大于1時有效.Default: true
    * matchCase (Boolean)
        比較是否開啟大小寫敏感開關(guān).使用緩存時比較重要.如果你理解上一個選項,這個也就不難理解,就好比foot要不要到FOO的緩存中去找.Default: false
    * multiple (Boolean)
        是否允許輸入多個值即多次使用autoComplete以輸入多個值. Default: false
    * multipleSeparator (String)
        如果是多選時,用來分開各個選擇的字符. Default: ","
    * scroll (Boolean)
        當(dāng)結(jié)果集大于默認(rèn)高度時是否使用卷軸顯示 Default: true
    * scrollHeight (Number)
        自動完成提示的卷軸高度用像素大小表示 Default: 180  
    * formatItem (Function)
        為每個要顯示的項目使用高級標(biāo)簽.即對結(jié)果中的每一行都會調(diào)用這個函數(shù),返回值將用LI元素包含顯示在下拉列表中. Autocompleter會提供三個參數(shù)(row, i, max): 返回的結(jié)果數(shù)組, 當(dāng)前處理的行數(shù)(即第幾個項目,是從1開始的自然數(shù)), 當(dāng)前結(jié)果數(shù)組元素的個數(shù)即項目的個數(shù). Default: none, 表示不指定自定義的處理函數(shù),這樣下拉列表中的每一行只包含一個值.
    * formatResult (Function)
        和formatItem類似,但可以將將要輸入到input文本框內(nèi)的值進(jìn)行格式化.同樣有三個參數(shù),和formatItem一樣.Default: none,表示要么是只有數(shù)據(jù),要么是使用formatItem提供的值.
    * formatMatch (Function)
        對每一行數(shù)據(jù)使用此函數(shù)格式化需要查詢的數(shù)據(jù)格式. 返回值是給內(nèi)部搜索算法使用的. 參數(shù)值row
    * extraParams (Object)
        為后臺(一般是服務(wù)端的腳本)提供更多的參數(shù).和通常的作法一樣是使用一個鍵值對對象.如果傳過去的值是{ bar:4 },將會被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假設(shè)當(dāng)前用戶輸入了foo). Default: {}
    * result (handler)
        此事件會在用戶選中某一項后觸發(fā),參數(shù)為:
        event: 事件對象. event.type為result.
        data: 選中的數(shù)據(jù)行.
        formatted:formatResult函數(shù)返回的值
        例如:
        $("#singleBirdRemote").result(function(event, data, formatted) {
            //如選擇后給其他控件賦值,觸發(fā)別的事件等等
        });

     

    posted @ 2016-06-17 17:54 奮斗成就男人 閱讀(282) | 評論 (0)編輯 收藏

    防止重復(fù)登錄請求

    過頁頭生成Token,進(jìn)行請求驗證,解決Ajax請求安全問題。目前為止我做的最多的防止ajax請求攻擊的就是添加驗證碼、添加隨機(jī)Token,限制同一請求在規(guī)定時間內(nèi)的最大請求數(shù)。

    下面重點(diǎn)說說添加隨機(jī)Token限制:
    token是為了防止表單重復(fù)提交,token 原理大致為:

    1:顯示表單的那個 action 中使用 createToken() 生成一個隨機(jī)的 token值,并存放在服務(wù)端(session或者cache中),并且傳遞一份到頁面中

    2:表單頁面使用一個隱藏表單域獲取后端傳過來的 token值,該表單頁面提交時會將此 token 值一同提交到后端

    3:在表單頁面提交到的 actioin 中使用 validateToken() 將服務(wù)端與表單隱藏域中的 token 值進(jìn)行對比,如果服務(wù)端存在 token值并且與表單提交過來的值相等,證明是第一次提交。

    4:每次校驗過后服務(wù)端的 token 值會立即被清除,所以當(dāng)用戶重復(fù)提交時,后面的提交校驗都再也無法通過。從而實現(xiàn)了防止重復(fù)提交的功能,validateToken 是在 synchronized 塊中執(zhí)行的保障了多線程下的安全性。

        token 會優(yōu)先存入 me.setTokenCache(ITokenCache) 指定的 TokenCache 中,如果未指定則默認(rèn)使用 session 來存放

    但是這種機(jī)制是有問題的,比如我是用ajax提交表單,提交完成以后表單頁面并不刷新,然后我修改了部分?jǐn)?shù)據(jù)以后再次提交頁面,那么token還是之前的那個token,后臺會以為這個為重復(fù)提交不能通過校驗,那么請求就不能完成,數(shù)據(jù)無法得到正確的處理。我認(rèn)為合理的機(jī)制應(yīng)該是這樣的:

    1:顯示表單的那個 action 中使用 createToken() 生成一個隨機(jī)的 token值,并且傳遞一份到頁面中

    2:表單頁面使用一個隱藏表單域獲取后端傳過來的 token值,該表單頁面提交時會將此 token 值一同提交到后端

    3:將提交過來的token值放入session或者cache中,然后執(zhí)行controller中的代碼,代碼全部執(zhí)行完以后,再把存入session或cache中的token值刪除掉;驗證用戶是否為重復(fù)提交只需要驗證提交過來的token是否存在于session或cache中,有則為重復(fù)提交,無則為正常提交。

    4:該邏輯應(yīng)該可以寫成一個Interceptor,在需要的地方加上,或者直接設(shè)為全局?jǐn)r截器都是可以的,簡單,快捷;

    posted @ 2015-12-03 16:03 奮斗成就男人 閱讀(496) | 評論 (0)編輯 收藏

    在Java中直接調(diào)用js代碼

    JDK1.6版添加了新的ScriptEngine類,允許用戶直接執(zhí)行js代碼。

    在Java中直接調(diào)用js代碼

    不能調(diào)用瀏覽器中定義的js函數(shù),會拋出異常提示ReferenceError: “alert” is not defined。

     
    package com.sinaapp.manjushri; 
    import javax.script.ScriptEngine; 
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;   /**  * 直接調(diào)用js代碼  */
    public class ScriptEngineTest {    
    public static void main(String[] args) { 
      ScriptEngineManager manager = new ScriptEngineManager();
      ScriptEngine engine = manager.getEngineByName("javascript");
         try{                engine.eval("var a=3; var b=4;print (a+b);");           // engine.eval("alert(\"js alert\");");    // 不能調(diào)用瀏覽器中定義的js函數(shù) // 錯誤,會拋出alert引用不存在的異常
     }catch(ScriptException e){   e.printStackTrace();  }  }    }

    輸出結(jié)果:7

    在Java中綁定js變量

    在調(diào)用engine.get(key);時,如果key沒有定義,則返回null

     
    package com.sinaapp.manjushri;     import javax.script.Bindings;   import javax.script.ScriptContext;   import javax.script.ScriptEngine;   import javax.script.ScriptEngineManager;   import javax.script.ScriptException;     public class ScriptEngineTest2 {    public static void main(String[] args) {    ScriptEngineManager manager = new ScriptEngineManager();    ScriptEngine engine = manager.getEngineByName("javascript");    engine.put("a", 4);    engine.put("b", 3);    Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);   try {                          // 只能為Double,使用Float和Integer會拋出異常      Double result = (Double) engine.eval("a+b");         System.out.println("result = " + result);     engine.eval("c=a+b");      Double c = (Double)engine.get("c");      System.out.println("c = " + c);         } catch (ScriptException e) {     e.printStackTrace();         }      }   }

    輸出:
    result = 7.0
    c = 7.0

    在Java中調(diào)用js文件中的function,傳入調(diào)用參數(shù),并獲取返回值

    js文件中的merge函數(shù)將兩個參數(shù)a,b相加,并返回c。

     
    // expression.js 
    function merge(a, b) { 
     c = a * b; 
     return c; 
    }

    在Java代碼中讀取js文件,并參數(shù)兩個參數(shù),然后回去返回值。

     
    package com.sinaapp.manjushri;     import java.io.FileReader;    import javax.script.Invocable;   import javax.script.ScriptEngine;   import javax.script.ScriptEngineManager;    /**  * Java調(diào)用并執(zhí)行js文件,傳遞參數(shù),并活動返回值  *   * @author manjushri  */   public class ScriptEngineTest {      public static void main(String[] args) throws Exception {    ScriptEngineManager manager = new ScriptEngineManager();    ScriptEngine engine = manager.getEngineByName("javascript");       String jsFileName = "expression.js";   // 讀取js文件     FileReader reader = new FileReader(jsFileName);   // 執(zhí)行指定腳本    engine.eval(reader);     if(engine instanceof Invocable) {     Invocable invoke = (Invocable)engine;    // 調(diào)用merge方法,并傳入兩個參數(shù)      // c = merge(2, 3);      Double c = (Double)invoke.invokeFunction("merge", 2, 3);      System.out.println("c = " + c);    }     reader.close();      } }

    輸出結(jié)果:
    c = 5.0


    java調(diào)用腳本語言筆記(jython,jruby,groovy)

     有兩種方法
    1.java se 6以后實現(xiàn)了jsr 223規(guī)范
    java代碼:

    [java]
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("javascript");//或者"js"  
    3. scriptEngine.eval(code);//執(zhí)行一段腳本,code是js代碼  


     很方便調(diào)用腳本

    2.可以使用腳本語方本身提供的與java的集成手段

    jython集成
    使用jsr223:
    前提下載jython的包,已實現(xiàn)jsr223
    (建議在官網(wǎng)上下載,在安裝目錄下有jython.jar,http://repo2.maven.org/maven2/org/python/jython/2.5.0/ 這里也有,但是這個包里沒有jsr223的實現(xiàn),看包下存不存在org.python.jsr223)

    [java]
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"  
    3. scriptEngine.eval(code);  


    使用PythonInterpreter,可以調(diào)用exec(String code)方法:

    [java]
    1. PythonInterpreter interpreter = new PythonInterpreter();  
    2. interpreter.exec(code);  

    訪問數(shù)據(jù)庫
    使用jdbc:

    [python] 
    1. from oracle.jdbc.driver import OracleDriver  
    2. from java.sql import DriverManager  
    3.   
    4. username = 'hr'  
    5. password = '123456'  
    6. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    7. driver = OracleDriver()  
    8. DriverManager.registerDriver(driver)  
    9. conn = DriverManager.getConnection(url, username, password)  
    10. stmt = conn.createStatement()  
    11. sql = "select salary from EMPLOYEES t where t.salary<2300"  
    12. rs = stmt.executeQuery(sql)  
    13. while (rs.next()):  
    14.  print rs.getInt('salary')  
    15. rs.close()  
    16. stmt.close()  


     結(jié)果:
    2200
    2100
    2200

    使用zxJDBC :

    [python] 
    1. from com.ziclix.python.sql import zxJDBC  
    2.   
    3. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    4. username = 'hr'  
    5. password = '123456'  
    6. driverName = 'oracle.jdbc.driver.OracleDriver'  
    7. mysqlConn = zxJDBC.connect(url,username, password,driverName)  
    8. cursor = mysqlConn.cursor()       
    9. cursor.execute("select last_name from EMPLOYEES t where t.salary<2300");  
    10. #print cursor.fetchone()  
    11. list = cursor.fetchall()  
    12. for record in list:  
    13.     print "name:"+record[0]  
    14. #print cursor.description[0]  
    15. #print cursor.description[1]  


     結(jié)果:
    name:麥克
    name:Olson
    name:Philtanker

    從數(shù)據(jù)庫中查出的中文內(nèi)容正常的。
    而在代碼里面的中文全部是亂碼或拋異常,未解決。

    與jruby集成
    使用jsr223:Java代碼

    [java]
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("jruby");//或者"ruby"  
    3. scriptEngine.eval(code);  

     訪問數(shù)據(jù)庫

    Ruby代碼

    [ruby] 
    1. require 'java'  
    2.   
    3. module JavaLang  
    4.   include_package "java.lang"  
    5. end  
    6.   
    7. module JavaSql  
    8.   include_package 'java.sql'  
    9. end  
    10.   
    11. begin  
    12.  username = 'hr'  
    13.  password = '123456'  
    14.  url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    15.  driverName = 'oracle.jdbc.driver.OracleDriver'  
    16.  JavaLang::Class.forName(driverName).newInstance  
    17.  conn = JavaSql::DriverManager.getConnection(url, username, password)  
    18.  stmt = conn.createStatement  
    19.  sql = "select last_name from EMPLOYEES t where t.salary<2300"  
    20.  rs = stmt.executeQuery(sql)  
    21.  while (rs.next) do  
    22.   puts "名字:"+rs.getString("last_name")  
    23.  end  
    24.  rs.close  
    25.  stmt.close  
    26.  conn.close()  
    27. rescue JavaLang::ClassNotFoundException  
    28.  puts "ClassNotFoundException"  
    29. rescue JavaSql::SQLException  
    30.  puts "SQLException"  
    31. end  


     

     結(jié)果:
    名字:楹﹀厠
    名字:Olson
    名字:Philtanker

     

    從數(shù)據(jù)庫中查出的中文內(nèi)容為亂碼的。
    而在代碼里面的中文正常。

     

    與groovy集成
    使用jsr223:

    Java代碼

    [java] 
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("groovy");//或者"Groovy"  
    3. scriptEngine.eval(code);  


     使用GroovyShell:

    Java代碼

    [java] 
    1. GroovyShell shell = new GroovyShell();  
    2. Script script = shell.parse(code);  
    3. Object result = script.run();  


    訪問數(shù)據(jù)庫

    Groovy代碼

     

    1. import groovy.sql.Sql  
    2.   
    3. def username = 'hr'  
    4. def password = '123456'  
    5. def url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    6. def driverName = 'oracle.jdbc.driver.OracleDriver'  
    7. def sql = Sql.newInstance(url, username, password, driverName)  
    8.   
    9. sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {  
    10.  println "名字:${it.last_name}"  
    11. }  

    結(jié)果:
    名字:麥克
    名字:Olson
    名字:Philtanker

     

    在使用groovy過程中碰到了一個異常
    Exception in thread "main" java.lang.VerifyError: (class: groovy/runtime/metaclass/java/util/ArrayListMetaClass, method: super$2$invokeMethod signature: (Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;ZZ)Ljava/lang/Object;) Illegal use of nonvirtual function call
    這個異常解決花了很長時間
    是因為在原來項目中存在json-lib-2.1.jar(有可能名稱為json-lib-2.1-jdk15.jar),這個包是用來處理json的,與groovy1.7.5存在沖突,更新為json-lib-2.3.jar即可
    (json-lib里有一些groovy運(yùn)行時處理的內(nèi)容)

    posted @ 2015-11-19 00:25 奮斗成就男人 閱讀(2928) | 評論 (0)編輯 收藏

    Java導(dǎo)入證書的問題(PKIX:unable to find valid certification path to requested target 的問題)

    這兩天Java服務(wù)器上忽然遇到這樣的異常:

    avax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    問題的根本是:

    缺少安全證書時出現(xiàn)的異常。

    解決問題方法:

    將你要訪問的webservice/url....的安全認(rèn)證證書導(dǎo)入到客戶端即可。


    以下是獲取安全證書的一種方法,通過以下程序獲取安全證書:

    /*
     * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *   - Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *
     *   - Redistributions in binary form must reproduce the above copyright
     *     notice, this list of conditions and the following disclaimer in the
     *     documentation and/or other materials provided with the distribution.
     *
     *   - Neither the name of Sun Microsystems nor the names of its
     *     contributors may be used to endorse or promote products derived
     *     from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     
    */

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.security.KeyStore;
    import java.security.MessageDigest;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;

    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLException;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;

    public class InstallCert {

        public static void main(String[] args) throws Exception {
            String host;
            int port;
            char[] passphrase;
            if ((args.length == 1) || (args.length == 2)) {
                String[] c = args[0].split(":");
                host = c[0];
                port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
                String p = (args.length == 1) ? "changeit" : args[1];
                passphrase = p.toCharArray();
            } else {
                System.out
                        .println("Usage: java InstallCert <host>[:port] [passphrase]");
                return;
            }

            File file = new File("jssecacerts");
            if (file.isFile() == false) {
                char SEP = File.separatorChar;
                File dir = new File(System.getProperty("java.home") + SEP + "lib"
                        + SEP + "security");
                file = new File(dir, "jssecacerts");
                if (file.isFile() == false) {
                    file = new File(dir, "cacerts");
                }
            }
            System.out.println("Loading KeyStore " + file + "");
            InputStream in = new FileInputStream(file);
            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
            ks.load(in, passphrase);
            in.close();

            SSLContext context = SSLContext.getInstance("TLS");
            TrustManagerFactory tmf = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(ks);
            X509TrustManager defaultTrustManager = (X509TrustManager) tmf
                    .getTrustManagers()[0];
            SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
            context.init(nullnew TrustManager[] { tm }, null);
            SSLSocketFactory factory = context.getSocketFactory();

            System.out
                    .println("Opening connection to " + host + ":" + port + "");
            SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
            socket.setSoTimeout(10000);
            try {
                System.out.println("Starting SSL handshake");
                socket.startHandshake();
                socket.close();
                System.out.println();
                System.out.println("No errors, certificate is already trusted");
            } catch (SSLException e) {
                System.out.println();
                e.printStackTrace(System.out);
            }

            X509Certificate[] chain = tm.chain;
            if (chain == null) {
                System.out.println("Could not obtain server certificate chain");
                return;
            }

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    System.in));

            System.out.println();
            System.out.println("Server sent " + chain.length + " certificate(s):");
            System.out.println();
            MessageDigest sha1 = MessageDigest.getInstance("SHA1");
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            for (int i = 0; i < chain.length; i++) {
                X509Certificate cert = chain[i];
                System.out.println(" " + (i + 1) + " Subject "
                        + cert.getSubjectDN());
                System.out.println("   Issuer  " + cert.getIssuerDN());
                sha1.update(cert.getEncoded());
                System.out.println("   sha1    " + toHexString(sha1.digest()));
                md5.update(cert.getEncoded());
                System.out.println("   md5     " + toHexString(md5.digest()));
                System.out.println();
            }

            System.out
                    .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
            String line = reader.readLine().trim();
            int k;
            try {
                k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
            } catch (NumberFormatException e) {
                System.out.println("KeyStore not changed");
                return;
            }

            X509Certificate cert = chain[k];
            String alias = host + "-" + (k + 1);
            ks.setCertificateEntry(alias, cert);

            OutputStream out = new FileOutputStream("jssecacerts");
            ks.store(out, passphrase);
            out.close();

            System.out.println();
            System.out.println(cert);
            System.out.println();
            System.out
                    .println("Added certificate to keystore 'jssecacerts' using alias '"
                            + alias + "'");
        }

        private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

        private static String toHexString(byte[] bytes) {
            StringBuilder sb = new StringBuilder(bytes.length * 3);
            for (int b : bytes) {
                b &= 0xff;
                sb.append(HEXDIGITS[b >> 4]);
                sb.append(HEXDIGITS[b & 15]);
                sb.append(' ');
            }
            return sb.toString();
        }

        private static class SavingTrustManager implements X509TrustManager {

            private final X509TrustManager tm;
            private X509Certificate[] chain;

            SavingTrustManager(X509TrustManager tm) {
                this.tm = tm;
            }

            public X509Certificate[] getAcceptedIssuers() {
                throw new UnsupportedOperationException();
            }

            public void checkClientTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
                throw new UnsupportedOperationException();
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
                this.chain = chain;
                tm.checkServerTrusted(chain, authType);
            }
        }

    }

    編譯InstallCert.java,然后執(zhí)行:java InstallCert hostname,比如:
    java InstallCert www.twitter.com
    會看到如下信息:

    java InstallCert www.twitter.com
    Loading KeyStore /usr/java/jdk1.6.0_16/jre/lib/security/cacerts
    Opening connection to www.twitter.com:443
    Starting SSL handshake

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038)
        at InstallCert.main(InstallCert.java:63)
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
        at sun.security.validator.Validator.validate(Validator.java:203)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
        at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158)
        at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839)
         7 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)
         13 more

    Server sent 2 certificate(s):

     1 Subject CN=www.twitter.com, O=example.com, C=US
       Issuer  CN=Certificate Shack, O=example.com, C=US
       sha1    2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7 
       md5     dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54 

     2 Subject CN=Certificate Shack, O=example.com, C=US
       Issuer  CN=Certificate Shack, O=example.com, C=US
       sha1    fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6 
       md5     72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68 

    Enter certificate to add to trusted keystore or 'q' to quit: [1]


    輸入1,回車,然后會在當(dāng)前的目錄下產(chǎn)生一個名為“ssecacerts”的證書。

    將證書拷貝到$JAVA_HOME/jre/lib/security目錄下,或者通過以下方式:
    System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts證書路徑");



    注意:因為是靜態(tài)加載,所以要重新啟動你的Web Server,證書才能生效。


    試了以上的方法,后來發(fā)現(xiàn)還不行。最后突然心血來潮:我把Myeclipse關(guān)閉,直接啟動Tomcat,然后運(yùn)行,居然就可以了。具體原因沒有找到。估計是
    我的Myeclipse引用的JDK引用不對。后來就沒有具體找原因了。

    posted @ 2015-10-30 15:06 奮斗成就男人 閱讀(1410) | 評論 (0)編輯 收藏

    常用的MySQL語句寫法

    MySQLSQL語句寫法,除了那些基本的之外,還有一些也算比較常用的,這里記錄下來,以便以后查找。
        好記性不如爛筆頭,這話說的太有道理了,一段時間不寫它,還真容易忘記。大家不要糾結(jié)這些SQL語句包含的業(yè)務(wù)或是其它問題,本文只是一篇筆記而已。

        將數(shù)據(jù)從T1表導(dǎo)入到T2
    INSERT INTO T2 (C1,C2) SELECT C1,C2 FROM T1 [WHERE C1 = XX AND C2 = XX ORDER BY C1]

        使用T2表的NAME來更新T1表的NAME
    UPDATE T1 AS A, T2 AS B SET A.NAME = B.NAME WHERE A.TID = B.ID

        兩表的關(guān)聯(lián)更新
    UPDATE T_ROLE_USER AS A,
     (
        SELECT
            ID
        FROM
            T_USER
        WHERE
            DEPARTID IN (
                SELECT
                    ID
                FROM
                    T_DEPART
                WHERE
                    LENGTH(ORG_CODE) = 9
            )
    AS B
    SET A.ROLEID = '123456'
    WHERE
        A.USERID = B.ID

        自己和自己關(guān)聯(lián)更新
    UPDATE T_DEPART AS A,
     (
        SELECT
            ID,
            SUBSTRING(ORG_CODE, 16) ORG_CODE
        FROM
            T_DEPART
        WHERE
            LENGTH(ORG_CODE) = 8
        AND PARENT_DEPART_ID IS NOT NULL
    AS B
    SET A.PARENT_DEPART_ID = B.ID
    WHERE
        SUBSTRING(A.ORG_CODE, 16= B.ORG_CODE

        兩表關(guān)聯(lián)刪除,將刪除兩表中有關(guān)聯(lián)ID并且T2NAME為空的兩表記錄
    DELETE A,B FROM T1 AS A LEFT JOIN T2 AS B ON A.TID = B.ID WHERE B.NAME IS NULL

        將統(tǒng)計結(jié)果插入到表
    INSERT INTO SE_STAT_ORG (
        RECORD_DATE,
        ORG_ID,
        ORG_NAME,
        SIGN_CONT_COUNT,
        SIGN_ARRI_CONT_COUNT,
        SIGN_CONT_MONEY,
        SIGN_ARRI_CONT_MONEY,
        TOTAL_ARRI_CONT_COUNT,
        TOTAL_ARRI_MONEY,
        PUBLISH_TOTAL_COUNT,
        PROJECT_COUNT
    SELECT
        *
    FROM
        (
            SELECT
                '2012-06-09' RECORD_DATE,
                PARENT_ORG_ID,
                PARENT_ORG_NAME,
                SUM(SIGN_CONT_COUNT) SIGN_CONT_COUNT,
                SUM(SIGN_ARRI_CONT_COUNT) SIGN_ARRI_CONT_COUNT,
                SUM(SIGN_CONT_MONEY) SIGN_CONT_MONEY,
                SUM(SIGN_ARRI_CONT_MONEY) SIGN_ARRI_CONT_MONEY,
                SUM(TOTAL_ARRI_CONT_COUNT) TOTAL_ARRI_CONT_COUNT,
                SUM(TOTAL_ARRI_MONEY) TOTAL_ARRI_MONEY,
                SUM(PUBLISH_TOTAL_COUNT) PUBLISH_TOTAL_COUNT,
                SUM(PROJECT_COUNT) PROJECT_COUNT,
            FROM SE_STAT_USER
            WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
            GROUP BY PARENT_ORG_ID
        ) M

        三表關(guān)聯(lián)更新
    UPDATE SE_STAT_USER A,
     (
        SELECT
            USER_ID,
            SUM(INVEST_ORG_COUNT + FINANCIAL_ORG_COUNT + INTERMEDIARY_ORG_COUNT + ENTERPRISE_COUNT) AS COMMON_COUNT
        FROM SE_STAT_USER
        WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
        GROUP BY USER_ID
    ) B,
     (
        SELECT
            USER_ID,
            SUM(ESTABLISH_COUNT + STOCK_COUNT + MERGER_COUNT + ACHIEVE_COUNT) AS PROJECT_COUNT
        FROM SE_STAT_USER
        WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
        GROUP BY USER_ID
    ) C
    SET A.COMMON_COUNT = B.COMMON_COUNT, A.PROJECT_COUNT = C.PROJECT_COUNT
    WHERE A.USER_ID = B.USER_ID
    AND A.USER_ID = C.USER_ID
    AND DATE_FORMAT(A.RECORD_DATE, '%Y-%m-%d'= '2012-06-09'

        帶條件的關(guān)聯(lián)更新
    UPDATE SE_STAT_USER A,
     (
        SELECT
            P.CHANNEL,
            COUNT(P.CONT_ID) AS CONT_COUNT,
            C.CUST_MGR_ID
        FROM
            (
                SELECT
                    CHANNEL,
                    CONT_ID
                FROM SK_PROJECT
                WHERE PROJECT_STATUS = 6
                AND DATE_FORMAT(AUDIT_TIME, '%Y-%m-%d'= '2012-06-11'
            ) p
        INNER JOIN SE_CONTRACT C ON P.CONT_ID = C.CONT_ID
        GROUP BY P.CHANNEL, C.CUST_MGR_ID
    ) B
    SET
        A.STOCK_COUNT = CASE WHEN B.CHANNEL = 2 THEN B.CONT_COUNT ELSE 0 END,
        A.ESTABLISH_COUNT = CASE WHEN B.CHANNEL = 3 THEN B.CONT_COUNT ELSE 0 END,
        A.ACHIEVE_COUNT = CASE WHEN B.CHANNEL = 4 THEN B.CONT_COUNT ELSE 0 END
        A.BRAND_COUNT = CASE WHEN B.CHANNEL = 5 THEN B.CONT_COUNT ELSE 0 END,
        A.MERGER_COUNT = CASE WHEN B.CHANNEL = 6 THEN B.CONT_COUNT ELSE 0 END
    WHERE
        A.USER_ID = B.CUST_MGR_ID
    AND DATE_FORMAT(A.RECORD_DATE, '%Y-%m-%d'= '2012-06-11'

        加索引
    ALTER TABLE PROJECT ADD INDEX INDEX_USER_ID (USER_ID),
            ADD INDEX INDEX_PROJECT_STATUS (PROJECT_STATUS);

        刪除列
    ALTER TABLE PROJECT DROP COLUMN PROJECT_STATUS,
            DROP COLUMN EXPECT_RETURN,DROP COLUMN CURRENCY;

        增加列
    ALTER TABLE PROJECT 
            ADD COLUMN DICT_ID INT DEFAULT NULL COMMENT 'xxx' AFTER PROJECT_SITE,
            ADD COLUMN INTRODUCE TEXT DEFAULT NULL COMMENT 'xx' AFTER DICT_ID,
            ADD COLUMN STAGE INT DEFAULT NULL COMMENT 'xx' AFTER ID,
            ADD COLUMN ATTACH_URI VARCHAR(8DEFAULT NULL COMMENT 'xxx' AFTER INTRODUCE;

        修改列,一般用MODIFY修改數(shù)據(jù)類型,CHANGE修改列名
    ALTER TABLE PROJECT CHANGE DICT_ID DICT_ID1 INT NOT NULL,
            MODIFY PROJECT_STATUS TINYINT NOT NULL COMMENT 'xxx';

    posted @ 2015-08-09 23:31 奮斗成就男人 閱讀(394) | 評論 (0)編輯 收藏

    程序員必看的書

    做為一名程序員,如果你只顧得寫代碼,那是不行的,要抽出一下時間來豐富自己的知識,多看看書,在這里我將為程序員們推薦一些不錯的書。能夠給程序員們帶來幫助。

    大數(shù)據(jù)時代

    5487a5bd00010d2903120426

    《大數(shù)據(jù)時代》是國外大數(shù)據(jù)研究的先河之作,本書作者維克托•邁爾•舍恩伯格被譽(yù)為"大數(shù)據(jù)商業(yè)應(yīng)用第一人",擁有在哈佛大學(xué)、牛津大學(xué)、耶魯大學(xué)和新加坡國立大學(xué)等多個互聯(lián)網(wǎng)研究重鎮(zhèn)任教的經(jīng)歷,早在2010年就在《經(jīng)濟(jì)學(xué)人》上發(fā)布了長達(dá)14頁對大數(shù)據(jù)應(yīng)用的前瞻性研究。

    維克托•邁爾•舍恩伯格在書中前瞻性地指出,大數(shù)據(jù)帶來的信息風(fēng)暴正在變革我們的生活、工作和思維,大數(shù)據(jù)開啟了一次重大的時代轉(zhuǎn)型,并用三個部分講述了大數(shù)據(jù)時代的思維變革、商業(yè)變革和管理變革。

    維克托最具洞見之處在于,他明確指出,大數(shù)據(jù)時代最大的轉(zhuǎn)變就是,放棄對因果關(guān)系的渴求,而取而代之關(guān)注相關(guān)關(guān)系。也就是說只要知道"是什么",而不需要知道"為什么"。這就顛覆了千百年來人類的思維慣例,對人類的認(rèn)知和與世界交流的方式提出了全新的挑戰(zhàn)。

     淘寶技術(shù)這十年

    5487a5c800013dae03030438

    《淘寶技術(shù)這十年》內(nèi)容簡介:任何網(wǎng)站的發(fā)展都不是一蹴而就的。它在發(fā)展過程中會遇到各種各樣的問題和業(yè)務(wù)帶來的壓力。正是這些問題和壓力推動著技術(shù)的進(jìn)步和發(fā)展,而技術(shù)的發(fā)展反過來又會促進(jìn)業(yè)務(wù)的更大提升。如今淘寶網(wǎng)的流量排名已是全球前15名、國內(nèi)前3名,其系統(tǒng)服務(wù)器也從一臺發(fā)展到萬臺以上。

    《淘寶技術(shù)這十年》從工程師的角度講述淘寶這個超大規(guī)模互聯(lián)網(wǎng)系統(tǒng)的成長歷程,及其所有主動和被動的技術(shù)變革的前因后果。書中有幕后故事、產(chǎn)品經(jīng)驗、架構(gòu)演進(jìn)、技術(shù)啟蒙,也有大牛成長、業(yè)內(nèi)八卦、失敗案例、勵志故事。《淘寶技術(shù)這十年》文風(fēng)流暢,有技術(shù)人員特有的幽默感;內(nèi)容積極正面,有現(xiàn)場感,全部是作者親身經(jīng)歷。

    白帽子講Web安全

    5487a7b90001fa2303030438

    《白帽子講Web安全》內(nèi)容簡介:在互聯(lián)網(wǎng)時代,數(shù)據(jù)安全與個人隱私受到了前所未有的挑戰(zhàn),各種新奇的攻擊技術(shù)層出不窮。如何才能更好地保護(hù)我們的數(shù)據(jù)?《白帽子講Web安全》將帶你走進(jìn)Web安全的世界,讓你了解Web安全的方方面面。黑客不再變得神秘,攻擊技術(shù)原來我也可以會,小網(wǎng)站主自己也能找到正確的安全道路。大公司是怎么做安全的,為什么要選擇這樣的方案呢?你能在《白帽子講Web安全》中找到答案。詳細(xì)的剖析,讓你不僅能"知其然",更能"知其所以然"。

    重構(gòu):改善既有代碼的設(shè)計

    5487a7c400010cce04000400

    《重構(gòu):改善既有代碼的設(shè)計》清晰地揭示了重構(gòu)的過程,解釋了重構(gòu)的原理和最佳實踐方式,并給出了何時以及何地應(yīng)該開始挖掘代碼以求改善。書中給出了70多個可行的重構(gòu),每個重構(gòu)都介紹了一種經(jīng)過驗證的代碼變換手法的動機(jī)和技術(shù)。《重構(gòu):改善既有代碼的設(shè)計》提出的重構(gòu)準(zhǔn)則將幫助你一次一小步地修改你的代碼,從而減少了開發(fā)過程中的風(fēng)險。

    《重構(gòu):改善既有代碼的設(shè)計》適合軟件開發(fā)人員、項目管理人員等閱讀,也可作為高等院校計算機(jī)及相關(guān)專業(yè)師生的參考讀物。

    代碼整潔之道

    5487a7cf000167fd03240408

    軟件質(zhì)量,不但依賴于架構(gòu)及項目管理,而且與代碼質(zhì)量緊密相關(guān)。這一點(diǎn),無論是敏捷開發(fā)流派還是傳統(tǒng)開發(fā)流派,都不得不承認(rèn)。《代碼整潔之道》提出一種觀念:代碼質(zhì)量與其整潔度成正比。干凈的代碼,既在質(zhì)量上較為可靠,也為后期維護(hù)、升級奠定了良好基礎(chǔ)。

    作為編程領(lǐng)域的佼佼者,《代碼整潔之道》作者給出了一系列行之有效的整潔代碼操作實踐。這些實踐在《代碼整潔之道》中體現(xiàn)為一條條規(guī)則(或稱"啟示"),并輔以來自現(xiàn)實項目的正、反兩面的范例。只要遵循這些規(guī)則,就能編寫出干凈的代碼,從而有效提升代碼質(zhì)量。

    《代碼整潔之道》閱讀對象為一切有志于改善代碼質(zhì)量的程序員及技術(shù)經(jīng)理。書中介紹的規(guī)則均來自作者多年的實踐經(jīng)驗,涵蓋從命名到重構(gòu)的多個編程方面,雖為一"家"之言,然誠有可資借鑒的價值。

    設(shè)計模式之禪 (第2版)


    549ccdfa00018b6503630363

      本書是設(shè)計模式領(lǐng)域公認(rèn)的3本經(jīng)典著作之一,"極具趣味,容易理解,但講解又極為嚴(yán)謹(jǐn)和透徹"是本書的寫作風(fēng)格和方法的最大特點(diǎn)。第1版2010年出版,暢銷至今,廣受好評,是該領(lǐng)域的里程碑著作。深刻解讀6大設(shè)計原則和28種設(shè)計模式的準(zhǔn)確定義、應(yīng)用方法和最佳實踐,全方位比較各種同類模式之間的異同,詳細(xì)講解將不同的模式組合使用的方法。第2版在第1版的基礎(chǔ)上有兩方面的改進(jìn),一方面結(jié)合讀者的意見和建議對原有內(nèi)容中的瑕疵進(jìn)行了修正和完善,另一方面增加了4種新的設(shè)計模式,希望這一版能為廣大程序員們奉上一場更加完美的設(shè)計模式盛宴!

    程序員修煉之道

    549cce040001ee3b03150420

      《程序員修煉之道》由一系列的獨(dú)立的部分組成,涵蓋的主題從個人責(zé)任、職業(yè)發(fā)展,直到用于使代碼保持靈活、并且易于改編和復(fù)用的各種架構(gòu)技術(shù)。利用許多富有娛樂性的奇聞軼事、有思想性的例子以及有趣的類比,全面闡釋了軟件開發(fā)的許多不同方面的最佳實踐和重大陷阱。無論你是初學(xué)者,是有經(jīng)驗的程序員,還是軟件項目經(jīng)理,本書都適合你閱讀。

    平臺戰(zhàn)略:正在席卷全球的商業(yè)模式革命

    549cce0e00012ad003120426

    《平臺戰(zhàn)略:正在席卷全球的商業(yè)模式革命》內(nèi)容簡介:平臺商業(yè)模式的精髓,在于打造一個完善的、成長潛能強(qiáng)大的"生態(tài)圈"。它擁有獨(dú)樹一幟的精密規(guī)范和機(jī)制系統(tǒng),能有效激勵多方群體之間互動,達(dá)成平臺企業(yè)的愿景。縱觀全球許多重新定義產(chǎn)業(yè)架構(gòu)的企業(yè),我們往往就會發(fā)現(xiàn)它們成功的關(guān)鍵——建立起良好的"平臺生態(tài)圈",連接兩個以上群體,彎曲、打碎了既有的產(chǎn)業(yè)鏈。

    平臺生態(tài)圈里的一方群體,一旦因為需求增加而壯大,另一方群體的需求也會隨之增長。如此一來,一個良性循環(huán)機(jī)制便建立了,通過此平臺交流的各方也會促進(jìn)對方無限增長。而通過平臺模式達(dá)到戰(zhàn)略目的,包括規(guī)模的壯大和生態(tài)圈的完善,乃至對抗競爭者,甚至是拆解產(chǎn)業(yè)現(xiàn)狀、重塑市場格局。

    互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄

    549cce170001475203030438

    《互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄》是一部互聯(lián)網(wǎng)公司的創(chuàng)業(yè)指南,內(nèi)容涉及網(wǎng)站創(chuàng)業(yè)的現(xiàn)狀和機(jī)遇、創(chuàng)業(yè)公司價值、平臺選擇、工具和群組、資金的籌集、管理和盈利、社會化媒體環(huán)境、行動執(zhí)行管理、開發(fā)人員方法論和工作效率、創(chuàng)始人的角色等方面,既有綱領(lǐng)和指導(dǎo)性理論,又有具體操作方法。書中大量對互聯(lián)網(wǎng)創(chuàng)業(yè)成功人士的訪談介紹,以及創(chuàng)業(yè)公司的成功案例,更可以作為初次創(chuàng)業(yè)者的良好借鑒。

    《互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄》主要寫給想自己創(chuàng)業(yè)的程序員,但同樣適合非技術(shù)人員,適合網(wǎng)絡(luò)創(chuàng)業(yè)者、大學(xué)生創(chuàng)業(yè)者、網(wǎng)絡(luò)營銷人員及一切有志創(chuàng)業(yè)者。做網(wǎng)絡(luò)不一定要懂技術(shù),互聯(lián)網(wǎng)的成功是可以借鑒和延伸的!

    程序員健康指南

    549cce2600015a5003600369

    本書是為程序員量身制作的健康指南,針對頭痛、眼部疲勞、背部疼痛和手腕疼痛等常見的問題,簡要介紹了其成因、測試方法,并列出了每天的行動計劃,從運(yùn)動、飲食等方面給出詳細(xì)指導(dǎo),幫助程序員在不改變工作方式的情況下輕松擁有健康。

    本書適合程序員、長期伏案工作的其他人群以及所有關(guān)心健康的人士閱讀。

    結(jié)網(wǎng)@改變世界的互聯(lián)網(wǎng)產(chǎn)品經(jīng)理

    54aa4f680001268603060435

    本書以如何創(chuàng)建、發(fā)布、推廣互聯(lián)網(wǎng)產(chǎn)品為主線,介紹了互聯(lián)網(wǎng)產(chǎn)品經(jīng)理的工作內(nèi)容以及應(yīng)對每一部分工作所需的方法和工具。為用戶創(chuàng)造價值是產(chǎn)品經(jīng)理的第一要務(wù),產(chǎn)品經(jīng)理的工作是圍繞用戶及具體任務(wù)展開的,本書豐富的案例和透徹的分析道出了從發(fā)現(xiàn)用戶到最終滿足用戶這一過程背后的玄機(jī)。

    本書面向現(xiàn)在正在從事及未來將要從事互聯(lián)網(wǎng)相關(guān)工作的創(chuàng)業(yè)者和產(chǎn)品經(jīng)理,也可以作為互聯(lián)網(wǎng)產(chǎn)品策劃人員或相關(guān)專業(yè)學(xué)生的參考書。新版完善了各章節(jié),增加了優(yōu)雅降級等內(nèi)容,讀者也可從中更深地去感受一名產(chǎn)品經(jīng)理的感悟。

    程序員面試邏輯題解析

    54aa4f7800016ca403240408

    程序員面試邏輯題解析》共分為3個部分。第一部分從有趣且鍛煉頭腦的謎題入手,繼而給出解題思路和詳細(xì)答案,更有"熱身問題"給大家提供充分的思考空間。第二部分綜合了不同類型的謎題,如數(shù)獨(dú)、調(diào)度問題及概率題等。神秘的第三部分帶領(lǐng)大家不斷歷險,開動腦筋,解決大量密碼及銀行賬戶等方面的問題。幾十道簡潔的小謎題不僅充分鍛煉了我們的思維方式,更為提高面試成功率奠定了基礎(chǔ)。

        《程序員面試邏輯題解析》不僅適合程序員閱讀,更是謎題愛好者的饕餮盛宴。

    程序員,你傷不起

    54aa4f8d000171b703060435

    本書是作者博客文章的精選集。是作者作為老牌程序員、現(xiàn)在的IT 創(chuàng)業(yè)者15 年軟件開發(fā)生涯的心路歷程和經(jīng)驗總結(jié)。涉及程序人生、開發(fā)經(jīng)驗、職業(yè)規(guī)劃、創(chuàng)業(yè)心得。對任何的軟件開發(fā)者和IT 從業(yè)人員都有借鑒價值。作者語言風(fēng)趣幽默,讀起來津津有味。字里行間充滿了不屈不撓的碼農(nóng)正能量。

    像程序員一樣思考

    54aa4f9800013e1e03270405

    編程的真正挑戰(zhàn)不是學(xué)習(xí)一種語言的語法,而是學(xué)習(xí)創(chuàng)造性地解決問題,從而構(gòu)建美妙的應(yīng)用。《像程序員一樣思考》分析了程序員解決問題的方法,并且教授你其他圖書所忽略的一種能力,即如何像程序員一樣思考。

    全書分為8章。第1章通對幾個經(jīng)典的算法問題切入,概括了問題解決的基本技巧和步驟。第2章通過實際編寫C++代碼來解決幾個簡單的問題,從而讓讀者進(jìn)一步體會到問題解決的思路和應(yīng)用。第3到7章是書中的主體部分,分別探討了用數(shù)組、指針和動態(tài)內(nèi)存、類、遞歸和代碼復(fù)用來解決問題的途徑和實際應(yīng)用。最后,第8章從培養(yǎng)程序員思維的角度,進(jìn)行了總結(jié)和概括,告訴讀者如何才能像程序員一樣思考。

    編寫可讀代碼的藝術(shù)

    54aa4fbf0001a7c103180417

    細(xì)節(jié)決定成敗,思路清晰、言簡意賅的代碼讓程序員一目了然;而格式凌亂、拖沓冗長的代碼讓程序員一頭霧水。除了可以正確運(yùn)行以外,優(yōu)秀的代碼必須具備良好的可讀性,編寫的代碼要使其他人能在最短的時間內(nèi)理解才行。本書旨在強(qiáng)調(diào)代碼對人的友好性和可讀性。

    本書關(guān)注編碼的細(xì)節(jié),總結(jié)了很多提高代碼可讀性的小技巧,看似都微不足道,但是對于整個軟件系統(tǒng)的開發(fā)而言,它們與宏觀的架構(gòu)決策、設(shè)計思想、指導(dǎo)原則同樣重要。編碼不僅僅只是一種技術(shù),也是一門藝術(shù),編寫可讀性高的代碼尤其如此。如果你要成為一位優(yōu)秀的程序員,要想開發(fā)出高質(zhì)量的軟件系統(tǒng),必須從細(xì)處著手,做到內(nèi)外兼修,本書將為你提供有效的指導(dǎo)。

    posted @ 2015-06-13 00:03 奮斗成就男人 閱讀(429) | 評論 (0)編輯 收藏

    Oracle分析函數(shù)入門

    一、Oracle分析函數(shù)入門

    分析函數(shù)是什么?
    分析函數(shù)是Oracle專門用于解決復(fù)雜報表統(tǒng)計需求的功能強(qiáng)大的函數(shù),它可以在數(shù)據(jù)中進(jìn)行分組然后計算基于組的某種統(tǒng)計值,并且每一組的每一行都可以返回一個統(tǒng)計值。

              

    分析函數(shù)和聚合函數(shù)的不同之處是什么?
    普通的聚合函數(shù)用group by分組,每個分組返回一個統(tǒng)計值,而分析函數(shù)采用partition by分組,并且每組每行都可以返回一個統(tǒng)計值。

                  

    分析函數(shù)的形式
    分析函數(shù)帶有一個開窗函數(shù)over(),包含三個分析子句:分組(partition by), 排序(order by), 窗口(rows) ,他們的使用形式如下:over(partition by xxx order by yyy rows between zzz)。
    注:窗口子句在這里我只說rows方式的窗口,range方式和滑動窗口也不提

        

    分析函數(shù)例子(在scott用戶下模擬)

    示例目的:顯示各部門員工的工資,并附帶顯示該部分的最高工資。

    復(fù)制代碼
    --顯示各部門員工的工資,并附帶顯示該部分的最高工資。
    SELECT E.DEPTNO,
    E.EMPNO,
    E.ENAME,
    E.SAL,
    LAST_VALUE(E.SAL)
    OVER(PARTITION BY E.DEPTNO
    ORDER BY E.SAL ROWS
    --unbounded preceding and unbouned following針對當(dāng)前所有記錄的前一條、后一條記錄,也就是表中的所有記錄
    --unbounded:不受控制的,無限的
    --preceding:在...之前
    --following:在...之后
    BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL
    FROM EMP E;
    復(fù)制代碼

    運(yùn)行結(jié)果:

                   

    示例目的:按照deptno分組,然后計算每組值的總和

    SELECT EMPNO,
    ENAME,
    DEPTNO,
    SAL,
    SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME) max_sal
    FROM SCOTT.EMP;

    運(yùn)行結(jié)果:

         

    示例目的:對各部門進(jìn)行分組,并附帶顯示第一行至當(dāng)前行的匯總

    復(fù)制代碼
    SELECT EMPNO,
    ENAME,
    DEPTNO,
    SAL,
    --注意ROWS BETWEEN unbounded preceding AND current row 是指第一行至當(dāng)前行的匯總
    SUM(SAL) OVER(PARTITION BY DEPTNO
    ORDER BY ENAME
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_sal
    FROM SCOTT.EMP;
    復(fù)制代碼

    運(yùn)行結(jié)果:

       

    示例目標(biāo):當(dāng)前行至最后一行的匯總

    復(fù)制代碼
    SELECT EMPNO,
    ENAME,
    DEPTNO,
    SAL,
    --注意ROWS BETWEEN current row AND unbounded following 指當(dāng)前行到最后一行的匯總
    SUM(SAL) OVER(PARTITION BY DEPTNO
    ORDER BY ENAME
    ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) max_sal
    FROM SCOTT.EMP;
    復(fù)制代碼

    運(yùn)行結(jié)果:

       

     示例目標(biāo):當(dāng)前行的上一行(rownum-1)到當(dāng)前行的匯總

    復(fù)制代碼
    SELECT EMPNO,
    ENAME,
    DEPTNO,
    SAL,
    --注意ROWS BETWEEN 1 preceding AND current row 是指當(dāng)前行的上一行(rownum-1)到當(dāng)前行的匯總
    SUM(SAL) OVER(PARTITION BY DEPTNO
    ORDER BY ENAME ROWS
    BETWEEN 1 PRECEDING AND CURRENT ROW) max_sal
    FROM SCOTT.EMP;
    復(fù)制代碼

    運(yùn)行結(jié)果:

        

    示例目標(biāo):   當(dāng)前行的上一行(rownum-1)到當(dāng)前行的下輛行(rownum+2)的匯總     

    復(fù)制代碼
    SELECT EMPNO,
    ENAME,
    DEPTNO,
    SAL,
    --注意ROWS BETWEEN 1 preceding AND 1 following 是指當(dāng)前行的上一行(rownum-1)到當(dāng)前行的下輛行(rownum+2)的匯總
    SUM(SAL) OVER(PARTITION BY DEPTNO
    ORDER BY ENAME
    ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) max_sal
    FROM SCOTT.EMP;
    復(fù)制代碼

    運(yùn)行結(jié)果:


    posted @ 2015-05-13 00:46 奮斗成就男人 閱讀(372) | 評論 (0)編輯 收藏

    常見分析函數(shù)詳解

         摘要: 三、常見分析函數(shù)詳解為了方便進(jìn)行實踐,特將演示表和數(shù)據(jù)羅列如下:一、創(chuàng)建表create table t( bill_month varchar2(12) , area_code number, net_type varchar(2), local_fare number );      二、插入數(shù)據(jù)insert i...  閱讀全文

    posted @ 2015-05-13 00:46 奮斗成就男人 閱讀(409) | 評論 (0)編輯 收藏

    ORACLE 常用函數(shù)

      這個系列我將整理一些日常我們經(jīng)常使用到的ORACLE函數(shù),鑒于篇幅太長,我大體會按下面分類來整理、匯總這些常用的ORACLE函數(shù),如果有些常用函數(shù)沒有被整理進(jìn)來,也希望大家指點(diǎn)一二。

     1: 聚合函數(shù)

    2: 日期函數(shù)
    3: 字符串函數(shù)
    4: 格式化函數(shù)
    5: 類型轉(zhuǎn)換函數(shù)
    6: 加密函數(shù)
    7: 控制流函數(shù)
    8: 數(shù)學(xué)函數(shù)
    9: 系統(tǒng)信息函數(shù)
    10:分析函數(shù)

    ------------------------------------------聚合函數(shù)---------------------------------------------
    --1:   AVG(DISTINCT|ALL)

    ALL表示對所有的值求平均值,DISTINCT只對不同的值求平均值
    SELECT AVG(SAL) FROM SCOTT.EMP;
    SELECT AVG(DISTINCT SAL) FROM SCOTT.EMP;
    --2:   MAX(DISTINCT|ALL)

    求最大值,ALL表示對所有的值求最大值,DISTINCT表示對不同的值求最大值,相同的只取一次

    (加不加查詢結(jié)果一致,不知DISTINCT有什么用途,不同于AVG等聚合函數(shù))
    SELECT MAX(DISTINCT SAL) FROM SCOTT.EMP;
    SELECT MAX(SAL) FROM SCOTT.EMP
    --3:   MIN(DISTINCT|ALL)
    求最小值,ALL表示對所有的值求最小值,DISTINCT表示對不同的值求最小值,相同的只取一次
    SELECT MIN(SAL) FROM SCOTT.EMP;
    SELECT MIN(DISTINCT SAL) FROM SCOTT.EMP;

    --4:  STDDEV(distinct|all)
    求標(biāo)準(zhǔn)差,ALL表示對所有的值求標(biāo)準(zhǔn)差,DISTINCT表示只對不同的值求標(biāo)準(zhǔn)差
    SELECT STDDEV(SAL) FROM SCOTT.EMP;
    SELECT STDDEV(DISTINCT SAL) FROM SCOTT.EMP;

    --5:   VARIANCE(DISTINCT|ALL)
    求協(xié)方差  ALL表示對所有的值求協(xié)方差,DISTINCT表示只對不同的值求協(xié)方差
    SELECT VARIANCE(SAL) FROM SCOTT.EMP;
    SELECT VARIANCE(DISTINCT SAL) FROM SCOTT.EMP;

    --6:  SUM(DISTINCT|ALL)
    求和  ALL表示對所有值求和,DISTINCT表示只對不同值求和(相同值只取一次)
    SELECT SUM(SAL) FROM SCOTT.EMP;
    SELECT SUM(DISTINCT SAL) FROM SCOTT.EMP;


    --7:COUNT(DISTINCT|ALL)
    求記錄、數(shù)據(jù)個數(shù)。 ALL對所有記錄,數(shù)組做統(tǒng)計, DISTINCT只對不同值統(tǒng)計(相同值只取一次)
    SELECT COUNT(SAL) FROM SCOTT.EMP;
    SELECT COUNT(DISTINCT SAL) FROM SCOTT.EMP;  
     
    ----8: MEDIAN
    求中位數(shù)
    SELECT MEDIAN(SAL) FROM SCOTT.EMP;
    SELECT MEDIAN(DISTINCT SAL) FROM SCOTT.EMP;  --錯誤:DISTINCT 選項在此函數(shù)中禁用。
    ----------------------------------------------------------------------------------------------

    posted @ 2015-05-13 00:37 奮斗成就男人 閱讀(340) | 評論 (0)編輯 收藏

    如何判斷PHP空間是否支持curl, gzip等功能

    在使用PHP時,我們需要將自己寫好的php文件上傳到已申請的php空間。由于租用或申請的php空間是不允許用戶進(jìn)行配置的,那么對于php的一些功能是否開啟,如curl, allow_url_fopen, gzip,就需要提前判斷,而不是等寫完代碼后發(fā)現(xiàn)不能使用時,那樣改動就大了。

    方法/步驟

    1. 其實判斷功能是否開啟,很簡單,我們只需要寫一個php文件上傳之php空間服務(wù)器中。v.php的源代碼如圖。

      如何判斷PHP空間是否支持curl, gzip等功能
    2. 其含義很簡單,就是傳入一個函數(shù)的名字,服務(wù)器判斷是否存在這個函數(shù),如果存在則表示支持該函數(shù)對應(yīng)的功能,輸出“支持”,反之輸出“不支持”。將文件上傳至php空間中。

      如何判斷PHP空間是否支持curl, gzip等功能
    3. 再通過訪問空間,地址+v.php?f=+要測試的功能所包括的函數(shù),比如curl功能可以是v.php?f=curl_init,allow_url_fopen功能可以用v.php?f=fopen來測試。

    posted @ 2015-04-22 00:04 奮斗成就男人 閱讀(306) | 評論 (0)編輯 收藏

    從程序員到CTO的Java技術(shù)路線圖

      在技術(shù)方面無論我們怎么學(xué)習(xí),總感覺需要提升自已不知道自己處于什么水平了。但如果有清晰的指示圖供參考還是非常不錯的,這樣我們清楚的知道我們大概處于那個階段和水平。 

     

    Java程序員

    高級特性

                  反射、泛型、注釋符、自動裝箱和拆箱、枚舉類、可變

                  參數(shù)、可變返回類型、增強(qiáng)循環(huán)、靜態(tài)導(dǎo)入

            核心編程

                 IO、多線程、實體類、

                 集合類、正則表達(dá)式、

                 XML和屬性文件

                 圖形編程

                 AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace

            網(wǎng)路編程

                Applet、Socket/TCP/UDP、NIO、RMI、CORBA

           Java語法基礎(chǔ)

               類、抽象類、接口、最終類、靜態(tài)類、匿名類、內(nèi)部類、異常類、編碼規(guī)范

          Java開發(fā)環(huán)境

              JDK、JVM、Eclipse、Linux

    Java核心編程技術(shù)

    Java,設(shè)計而又非常精巧的語言。學(xué)習(xí)Java,須從Java開發(fā)環(huán)境開始,到Java語法,再到Java的核心API。

            1.Java開發(fā)入門:Java開發(fā)環(huán)境的安裝與使用,包括JDK命令、EclipseIDE、Linux下Java程序的開發(fā)和部署等。

            2.Java語法基礎(chǔ):基于JDK和Eclipse環(huán)境,進(jìn)行Java核心功能開發(fā),掌握J(rèn)ava面向?qū)ο蟮恼Z法構(gòu)成,包括類、抽象類、接口、最終類、靜態(tài)類、匿名類、內(nèi)部類、異常的編寫。

            3.Java核心API:基于JDK提供的類庫,掌握三大核心功能:

            A。Java核心編程:包括Java編程的兩大核心功能——Java輸入/輸出流和多線程,以及常用的輔助類庫——實體類、集合類、正則表達(dá)式、XML和屬性文件。

            B。Java圖形編程:包括Sun的GUI庫AWT(Java2D、JavaSound、JMF)和Swing,IBM和GUI庫SWT和Jface;

            C. Java網(wǎng)路編程:Applet組件編程,Socket編程,NIO非阻塞Socket編程、RMI和CORBA分布式開發(fā)。

            4.Java高級特性:掌握J(rèn)DK1.4、JDK5.0、JDK6.0中的Java高級特性,包括反射、泛型、注釋,以及java高級特性——自動裝箱和拆箱、枚舉類、可變參數(shù)、可變返回類型、增強(qiáng)循環(huán)、靜態(tài)導(dǎo)入等。

    JavaEE初級軟件工程師

    JSF框架開發(fā)技術(shù)

           配置文件(頁面導(dǎo)航、后臺Bean)、JSF組件庫(JSF EL語言、HTML標(biāo)簽、事件處理、)、JSF核心庫(格式轉(zhuǎn)換、輸入驗證、國際化)

    Javaweb核心開發(fā)技術(shù)       

           開發(fā)環(huán)境(Eclipse、Linux)

           三大組件(JSP、JavaBean、Servlet)

           擴(kuò)展技術(shù)(EL、JSTL、Taglib)

    網(wǎng)頁開發(fā)技術(shù)

           HTML、XML、CSS、JavaScript、AJAX

           數(shù)據(jù)庫設(shè)計技術(shù)

           SQL、MySql、Oracle、SQLServer、JDBC

    Web服務(wù)器(Tomcat/Jetty/Resin/JBossWeb)

    JavaWeb核心技術(shù):

            JavaWeb項目開發(fā)的全過程可以分解為:

           網(wǎng)頁開發(fā)+數(shù)據(jù)庫設(shè)計——>JavaWeb項目開發(fā),其中,javaWeb由6項基本技術(shù)組成:JSP+JavaBean+Servlet+EL+JSTL+Taglib,而JSF正是將這6種技術(shù)進(jìn)行有機(jī)結(jié)合的技術(shù)框架:

    JavaEE中級軟件工程師

    四種經(jīng)典架構(gòu)SSH1、SSI1、SSH2、SSI2

            Struts1表現(xiàn)層框架

          入門配置、核心組件、標(biāo)簽庫、國際化、數(shù)據(jù)檢驗、數(shù)據(jù)庫開發(fā)、Sitemesh集成、集成Hibernate/iBATIS

            Struts2表現(xiàn)層框架

                   入門配置、核心組件、標(biāo)簽庫、國際化、數(shù)據(jù)校驗、Sitemesh集成轉(zhuǎn)換器、攔截器、集成Hibernate/iBATIS

            Spring業(yè)務(wù)層框架

                  入門配置、IoC容器、MVC、標(biāo)簽庫、國際化、數(shù)據(jù)校驗、數(shù)據(jù)庫開發(fā)

            Hibernate持久層框架

                MySQL、Oracle、SQLServer iBATIS持久層框架

                MySQL、Oracle、SQLServer

    Web服務(wù)器(Tomcat/Jetty/Resin/JBossWeb)

    Java高級軟件工程師

    javaWeb開源技術(shù)與框架

            工作流、

    規(guī)則引擎

    搜索引擎、

    緩存引擎 、

            任務(wù)調(diào)度、

    身份認(rèn)證

            報表服務(wù)、

    系統(tǒng)測試、

            集群、

    負(fù)載平衡、

    故障轉(zhuǎn)移

    JavaWeb分布式開發(fā)技術(shù)

    JTA(Java事物管理)

          JAAS(Java驗證和授權(quán)服務(wù))

          JNDI(Java命名和目錄服務(wù))

          JavaMail(Java郵件服務(wù))

    JMS(java信息服務(wù))

    WebService(web服務(wù))

    JCA(java連接體系)

    JMS(java管理體系)

    應(yīng)用服務(wù)器(JBossAS/WebLogic/WebSphere)

    JavaEE系統(tǒng)架構(gòu)師

            面向云架構(gòu)(COA)

                COA、SaaS、網(wǎng)格計算、集群計算、分布式計算、云計算

            面向資源架構(gòu)(ROA)

                ROA、RESI

            面向web服務(wù)架構(gòu)(SOA)

               WebService、SOA、SCA、ESB、OSGI、EAI

            Java設(shè)計模式

              創(chuàng)建式模式:抽象工廠/建造者/工廠方法/原型/單例

              構(gòu)造型模式:適配器/橋接/組合/裝飾/外觀/享元/代理

              行為型模式:責(zé)任鏈/命令/解釋器/迭代子/中介者/備忘錄/觀察者/狀態(tài)/策略/模板方法/訪問者

           Java與UML建模

              對象圖、用例圖、組件圖、部署圖、序列圖、交互圖、活動圖、正向工程與逆向工程

    CTO首席技術(shù)官

             發(fā)展戰(zhàn)略

             技術(shù)總監(jiān)

             團(tuán)隊提升

             團(tuán)隊建設(shè)

             項目管理

             產(chǎn)品管理

    企業(yè)級項目實戰(zhàn)(帶源碼)地址http://zz563143188.iteye.com/blog/1825168


    收集五年的開發(fā)資料下載地址:  http://pan.baidu.com/share/home?uk=4076915866&view=share

     

     

     

     

     下面的更深入的有興趣可以了解一下,我的目的不是要大家掌握下面的知識,只是希望擴(kuò)展自己的思維,摘自牛人的技術(shù)博客。

    /**************************************************牛人必看*****************************************************************/

     

     

     

    系統(tǒng)后臺框架:

     

     

    前端工程師技能:

     

     

     

    B2C電子商務(wù)基礎(chǔ)系統(tǒng)架構(gòu)解析
    運(yùn)營B2C日 久,越來越深刻的意識到IT系統(tǒng)對確保規(guī)范化業(yè)務(wù)流轉(zhuǎn),支撐消費(fèi)者端的均一服務(wù)有著決定性的作用。于是,一直想好好整理下相關(guān)的系統(tǒng)架構(gòu),怎奈俗務(wù)纏身, 一直拖到今日,猛然發(fā)現(xiàn)下周娃很可能就要出生,拖無可拖,快馬加筆,居然整出來了。本文的重點(diǎn)是理清系統(tǒng)的邏輯關(guān)系,詳細(xì)的功能模塊請參見結(jié)尾附上的系統(tǒng) 架構(gòu)圖。
    首先,聊下對系統(tǒng)邏輯架構(gòu)的看法;我個人始終堅持認(rèn)為,系統(tǒng)的開發(fā)與演化,前臺嚴(yán)格follow消費(fèi)者的購買流程,后臺則盯牢訂單流轉(zhuǎn),牢牢抓住這兩條主線,才能高屋建瓴的看清B2C的邏輯鏈和數(shù)據(jù)流,更深刻的規(guī)劃功能模塊,從而更有效支撐實際業(yè)務(wù)的流轉(zhuǎn)。
    前臺系統(tǒng)包括:商品展示,內(nèi)容展示,訂單確認(rèn),支付系統(tǒng),用戶中心四大模塊
    一,商品展示
    按照Ebay的內(nèi)部分類,任何將商品以單個或批量的方式展示給消費(fèi)者的功能均應(yīng)歸入此系統(tǒng)。因此,該系統(tǒng)至少包括:
    A,站內(nèi)搜索(搜索提示,搜索規(guī)則,搜索成功頁,搜索不成功頁,相似推薦)
    B,導(dǎo)航(頻道導(dǎo)航,其他導(dǎo)航如銷售排行,廣告位,推薦位,文字鏈,Also buy等)
    C,商品分類(品牌分類,品類分類,屬性分類如剪裁形式)
    D, 登陸頁(商品列表頁,商品詳細(xì)頁,商品活動頁)
    這里的訪問邏輯是:A /B/C分流消費(fèi)者去往相對個性化的頁面,由登陸頁體現(xiàn)商家的核心訴求和價值傳遞,完成call-to-action的第一步。
    二,內(nèi)容展示
    內(nèi)容展示較為簡單,對純購物品牌而言包括:
    A,公告區(qū)
    B,幫助中心
    C,論壇(如需商城與論壇發(fā)生交互,則需自行開發(fā),否則可集成discuz做同步登陸即可)
    大家都知道,就不多說了。
    三,訂單確認(rèn)
    訂單確認(rèn),就是幫助消費(fèi)者正確提交訂單信息的環(huán)節(jié),看似簡單,實則非常復(fù)雜,需要對很多信息邏輯判斷和處理,一般由2個部分組成:
    A,購物車(購物車浮層,購物車頁面,無注冊購買)
    無注冊購買是需要慎用的功能,除非刻意追求用戶的短平快下單,如團(tuán)購/換購,一般不推薦使用,會造成系統(tǒng)異常復(fù)雜,開發(fā)量也很大。
    B,訂單提交(返回購物車,收貨地址&地址薄,支付方式判斷,配送方式,發(fā)票,訂單標(biāo)記,實付金額計算等等)
    值得一提的是,幾乎大多數(shù)的促銷邏輯運(yùn)算在這個環(huán)節(jié)完成,充分考慮各種促銷方式之間的互斥與重疊是系統(tǒng)設(shè)計的核心,需要充分考慮各種情況,避免出現(xiàn)邏輯漏洞。
    四,支付系統(tǒng)
    與一般的想象不同,支付系統(tǒng)其實并不簡單等于第三方支付工具接入:
    A,外部支付系統(tǒng)(支付寶將接口,財付通接口,網(wǎng)銀直聯(lián)端口,信用ka分期端口)
    B,內(nèi)部支付系統(tǒng)(賬戶余額,積分,禮品卡,優(yōu)惠券)
    支付系統(tǒng)的邏輯設(shè)計不但需要考慮到各種極端情況的發(fā)生(如一張訂單先用禮品卡,再用積分,最后網(wǎng)銀支付),還要預(yù)留財務(wù)做賬所需的相關(guān)字段,并充分考慮訂單取消之后如何回滾各類內(nèi)部賬戶。
    五,用戶中心
    用戶中心的實質(zhì)是用戶自助功能的dashboard,一般4個部分組成:
    A,注冊&登陸(快速注冊,完整注冊,注冊有禮,推薦注冊,密碼找回,主站id登陸,open-id登陸如QQ,新浪微博等)
    B,訂單中心(歷史訂單狀態(tài),中間狀態(tài)訂單修改,物流追蹤)
    C,服務(wù)中心(各類自助服務(wù)如退款申請,退換貨申請,建議與投訴等)
    D, 信息管理(用戶基本信息管理和賬戶信息管理)
    用戶中心的價值在于:盡可能引導(dǎo)用戶自行獲取所需的信息并提交所需的服務(wù),在提升服務(wù)準(zhǔn)確率,及時性的同時降低對人工成本。
    后臺系統(tǒng)包括:商品&促銷,CRM,訂單處理,WMS,采購管理,財務(wù)管理,報表管理,系統(tǒng)設(shè)置,WA系統(tǒng)9大模塊
    一, 商品&促銷
    商品&促銷模塊的核心在于確保消費(fèi)者下單之前,前臺內(nèi)容所見即所得
    A, 商品管理(品類管理,品牌管理,單品管理)
    B, 促銷管理(活動管理和自定義活動模板管理)
    在上述模塊中,最重要的是2個部分:單品管理中的批量產(chǎn)品生成的自動程序和活動管理中“共享與互斥”管理。前者用于大幅提升上新速度,后者避免促銷活動失控。
    二, CRM
    CRM是對B2C核心資源—會員的管理,服務(wù)與再營銷系統(tǒng),包括如下部分:
    A,會員管理(會員信息的增刪改查和到其他系統(tǒng)的鏈接)
    B,用戶關(guān)懷(條件觸發(fā)和人工觸發(fā)相關(guān)EDM & 短信 & OB)
    C,定向營銷(會員分組和營銷活動管理)
    D, 客服管理(內(nèi)容非常多,集成所有需前臺與后臺交互的功能,詳情還是看圖吧)
    E, 呼叫中心(IVR,坐席管理,統(tǒng)計報表,參數(shù)傳遞與窗口嵌入)
    值得注意的,EDM和短信通道市面上已經(jīng)有成熟的外包服務(wù)商,一般都會外包;呼叫中心和在線客服自行開發(fā)成本太高,特別是呼叫中心系統(tǒng),業(yè)務(wù)初期也都是外包的。
    三, 訂單處理
    訂單處理是在訂單未正式進(jìn)入倉儲部門處理之前,對訂單的前置性處理環(huán)節(jié)。
    A,訂單錄入(電話訂購,網(wǎng)上下單,外部團(tuán)購訂單,無金額訂單錄入如禮品單)
    B,訂單審核(自動審核和人工審核)
    C,RMA處理(RMA申請單和RMA處理單)
    RMA的邏輯也異常復(fù)雜,需要在效率和成本之間找平衡,確保在不拖垮倉儲部門的正常出入庫的前提下對消費(fèi)者端快速有效close工單;對內(nèi)部則需要控制成本,貨損不能超過預(yù)算上限。
    四, WMS(Warehouse Management system倉庫管理系統(tǒng))
    WMS的流程很長,功能模塊也很多,大致分為入庫管理,庫存管理,出庫管理和票據(jù)管理4個模塊四個模塊,細(xì)細(xì)道來就是另外一篇文章了,各位可以參考 我這篇文章:庖丁解牛—B2C倉儲內(nèi)部運(yùn)作解密(上,中,下)http://blog.sina.com.cn/wangxida0855
    五, 采購管理
    采購管理的核心是有效跟進(jìn)采購合同/發(fā)票的狀態(tài),大貨的采購入庫/退庫,財務(wù)結(jié)算和在倉庫存查詢和處理。
    A,供應(yīng)商管理(供應(yīng)商信息管理,合同發(fā)票管理)
    B,采購單管理(PO單管理,負(fù)PO單管理)
    C,庫存管理(庫存查詢,庫存占用單,庫存變動log)
    六, 財務(wù)管理
    B2C的財務(wù)管理,主要是對供應(yīng)商,渠道和內(nèi)部費(fèi)用支出的成本控制。
    A,供應(yīng)商結(jié)算
    B,渠道結(jié)算
    C,配送結(jié)算
    D, 內(nèi)部結(jié)算
    說實在的,哥對財務(wù)這塊也不算很了解,大家將就看看,圖片上有明細(xì)。
    七, 報表管理
    報表是B2C業(yè)務(wù)的宏觀表現(xiàn),理論上說,每個部門的KPI都應(yīng)該從中找到。
    A,搜索報表(站內(nèi)搜索量查詢)
    B,銷售報表(多個維度銷量查詢,優(yōu)惠券使用情況,報表導(dǎo)出)
    C,財務(wù)報表
    D, 客服報表(客服日報和坐席報表)
    前者反映與消費(fèi)者發(fā)生的日常交互(包括正常與異常),后者考核客服的工作績效
    E, 倉儲物流報表
    這幾塊報表,是業(yè)務(wù)運(yùn)作的核心,涉及到公司機(jī)密,就不能寫的太細(xì)了,見諒。
    八, 系統(tǒng)設(shè)置
    這塊大家都知道是干嘛的,也就不多說了,分成三塊。
    A,基礎(chǔ)設(shè)置(和業(yè)務(wù)有關(guān)的一些字段值)
    B,權(quán)限設(shè)置(不同賬號的操作權(quán)限和操作記錄)
    C,其他設(shè)置
    九, WA系統(tǒng)(Web Analytcis)
    網(wǎng)站分析系 統(tǒng),幾乎全是外購,很少有能夠自建的,即使自建,最多做幾個簡單的模塊。用于實戰(zhàn)的,要么是免費(fèi)的GA(Google Analytics),要么是昂貴的Omniture。這塊的知識,細(xì)細(xì)說來也是另外一篇文章了,有興趣的同學(xué)可以看我這篇科普文章:揭秘—我所知道的網(wǎng) 站分析(上,下) http://blog.sina.com.cn/wangxida0855
    最后,上全系統(tǒng)大圖,再感慨一句,B2C系統(tǒng),真是一個大工程啊。

     

    fr  http://blog.sina.com.cn/s/blog_59d6717c0100syh3.html

    posted @ 2015-04-11 13:41 奮斗成就男人 閱讀(248) | 評論 (0)編輯 收藏

    ajax+json+Struts2實現(xiàn)list傳遞(轉(zhuǎn)載)

         摘要: ajax+json+Struts2實現(xiàn)list傳遞(轉(zhuǎn)載)一、首先需要下載JSON依賴的jar包。它主要是依賴如下:      json-lib-2.2.2-jdk15      ezmorph-1.0.4       commons-logging-1.0.4&nbs...  閱讀全文

    posted @ 2015-04-04 01:17 奮斗成就男人 閱讀(352) | 評論 (0)編輯 收藏

    iBatis簡單入門教程

         摘要: Batis 簡介:iBatis 是apache 的一個開源項目,一個O/R Mapping 解決方案,iBatis 最大的特點(diǎn)就是小巧,上手很快。如果不需要太多復(fù)雜的功能,iBatis 是能夠滿足你的要求又足夠靈活的最簡單的解決方案,現(xiàn)在的iBatis 已經(jīng)改名為Mybatis 了。官網(wǎng)為:http://www.myb...  閱讀全文

    posted @ 2015-04-04 01:16 奮斗成就男人 閱讀(199) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 色视频在线观看免费| 在线A级毛片无码免费真人| 亚洲中文字幕久久精品无码喷水| 亚洲精品无码中文久久字幕| 国产精品酒店视频免费看| 亚洲色大成网站www永久| 三年片免费高清版 | 亚洲性无码一区二区三区| 99re6在线视频精品免费下载| 亚洲宅男天堂在线观看无病毒| 青青草国产免费国产是公开| 国产精品深夜福利免费观看| 在线观看亚洲AV日韩A∨| 69堂人成无码免费视频果冻传媒| 久久精品国产亚洲AV无码偷窥| 暖暖在线视频免费视频| 国产亚洲一区二区手机在线观看| 国产成人高清精品免费观看| 亚洲国产精品激情在线观看| 野花视频在线官网免费1| 国产免费拔擦拔擦8x| 亚洲.国产.欧美一区二区三区| 免费高清在线爱做视频| 亚洲国产精品成人AV在线| 在线观看无码的免费网站| 亚洲高清有码中文字| 毛片免费视频在线观看| 亚洲最大的成人网| 成人免费无码大片A毛片抽搐| 亚洲AV男人的天堂在线观看| 午夜网站免费版在线观看| 亚洲av永久无码精品网址| 国产青草视频免费观看97| 亚洲乱码国产乱码精华| 永久在线毛片免费观看| 亚洲欧美在线x视频| 亚洲成?Ⅴ人在线观看无码| 国产日韩在线视频免费播放| 亚洲精品高清国产一线久久| 久久精品乱子伦免费| 久久精品a亚洲国产v高清不卡|