cd /home/app/sxpservice/logs/apps && ll && tail -200f server.log 查看日誌javascript
|
11.24html
策略模式前端
在策略模式(Strategy Pattern)中,一個類的行爲或其算法能夠在運行時更改。這種類型的設計模式屬於行爲型模式。java
在策略模式中,咱們建立表示各類策略的對象和一個行爲隨着策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法。mysql
介紹linux
意圖:定義一系列的算法,把它們一個個封裝起來, 而且使它們可相互替換。算法
主要解決:在有多種算法類似的狀況下,使用 if...else 所帶來的複雜和難以維護。spring
什麼時候使用:一個系統有許多許多類,而區分它們的只是他們直接的行爲。sql
如何解決:將這些算法封裝成一個一個的類,任意地替換。數據庫
關鍵代碼:實現同一個接口。
應用實例: 一、諸葛亮的錦囊妙計,每個錦囊就是一個策略。 二、旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。 三、JAVA AWT 中的 LayoutManager。
優勢: 一、算法能夠自由切換。 二、避免使用多重條件判斷。 三、擴展性良好。
缺點: 一、策略類會增多。 二、全部策略類都須要對外暴露。
使用場景: 一、若是在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式能夠動態地讓一個對象在許多行爲中選擇一種行爲。 二、一個系統須要動態地在幾種算法中選擇一種。 三、若是一個對象有不少的行爲,若是不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。
注意事項:若是一個系統的策略多於四個,就須要考慮使用混合模式,解決策略類膨脹的問題。
實現
咱們將建立一個定義活動的 Strategy 接口和實現了 Strategy 接口的實體策略類。Context 是一個使用了某種策略的類。
StrategyPatternDemo,咱們的演示類使用 Context 和策略對象來演示 Context 在它所配置或使用的策略改變時的行爲變化。
步驟 1
建立一個接口。
Strategy.java
public interface Strategy {
public int doOperation(int num1, int num2);
}
步驟 2
建立實現接口的實體類。
OperationAdd.java
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
OperationSubstract.java
public class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
OperationMultiply.java
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
步驟 3
建立 Context 類。
Context.java
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
步驟 4
使用 Context 來查看當它改變策略 Strategy 時的行爲變化。
StrategyPatternDemo.java
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
步驟 5
驗證輸出。
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。是計算機普遍使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言廣泛已有MD5實現。將數據(如漢字)運算爲另外一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD二、MD3和MD4。普遍用於加密和解密技術,經常使用於文件校驗。校驗?無論文件多大,通過MD5後都能生成惟一的MD5值。比如如今的ISO校驗,都是MD5校驗。怎麼用?固然是把ISO通過MD5後產生MD5的值。通常下載linux-ISO的朋友都見過下載連接旁邊放着MD5的串。就是用來驗證文件是否一致的。 java實現代碼: package com.cn.單向加密;
import java.math.BigInteger; import java.security.MessageDigest; /* MD5(Message Digest algorithm 5,信息摘要算法) 一般咱們不直接使用上述MD5加密。一般將MD5產生的字節數組交給BASE64再加密一把,獲得相應的字符串 Digest:彙編 */ public class MD5 { public static final String KEY_MD5 = "MD5";
public static String getResult(String inputStr) { System.out.println("=======加密前的數據:"+inputStr); BigInteger bigInteger=null;
try { MessageDigest md = MessageDigest.getInstance(KEY_MD5); byte[] inputData = inputStr.getBytes(); md.update(inputData); bigInteger = new BigInteger(md.digest()); } catch (Exception e) {e.printStackTrace();} System.out.println("MD5加密後:" + bigInteger.toString(16)); return bigInteger.toString(16); }
public static void main(String args[]) { try { String inputStr = "簡單加密8888888888888888888"; getResult(inputStr); } catch (Exception e) { e.printStackTrace(); }
}
} MD5算法具備如下特色: 一、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
|
StringUtils經常使用的方法
1. 檢查字符串是否爲空:
static boolean isBlank(CharSequence str) 判斷字符串是否爲空或null;
StringUtils.isBlank("a");
2. 縮進字符串:
static String abbreviate(String str, int maxWidth) 縮進字符串,第二個參數至少爲4(包括...)
StringUtils.abbreviate("abcdefg", 20); StringUtils.abbreviate("abcdefg", 4);
3. 首字母大寫:
static String capitalize(String str) 首字母大寫
StringUtils.capitalize("abcdefg");
4. 字符串顯示在一個大字符串的位置:
static String center(String str, int size); 默認以空格填充 StringUtils.center("abcdefg", 20); StringUtils.center("abcdefg", 20,"*_"); StringUtils.leftPad("abc", 10, "*");
5. 重複字符串次數
static String repeat(String str, int repeat);
StringUtils.repeat("abc", 5);
6. 是否全是大寫,是否全是小寫(3.0版本)
public static boolean isAllLowerCase(String str);
StringUtils.isAllLowerCase("abC");
7. 是否都是由字母組成:
public static boolean isAlpha(String str); 只由字母組成
StringUtils.isAlpha("a2bdefg");
8. 小字符串在大字符串中的匹配次數
public static int countMatches(String str,String sub);
StringUtils.countMatches("ababsssababa", "ab");
9. 字符串倒轉
public static String reverse(String str);
StringUtils.reverse("abcdef");
10. 大小寫轉換,空格不動 public static String swapCase(String str);
StringUtils.swapCase("I am a-A*a")
|
ArrayUtils是專門用來處理數組的工具類,提供不少有用的方法,下面是其一個方法藍圖: ArrayUtils.png 添加方法add(boolean[] array,boolean element)等等 add(T[] array,int index,T element)等等 addAll(boolean[] array1,boolean... array2)等等 //添加元素到數組中 ArrayUtils.add([true, false], true) = [true, false, true] //將元素插入到指定位置的數組中 ArrayUtils.add(["a"], 1, null) = ["a", null] ArrayUtils.add(["a"], 1, "b") = ["a", "b"] ArrayUtils.add(["a", "b"], 3, "c") = ["a", "b", "c"] ArrayUtils.add(["a", "b"], ["c", "d"]) = ["a", "b", "c","d"] 克隆方法clone(boolean[] array)等等 ArrayUtils.clone(newint[] { 3, 2, 4 }); = {3,2,4} 包含方法contains(boolean[] array,boolean valueToFind) // 查詢某個Object是否在數組中 ArrayUtils.contains(newint[] { 3, 1, 2 }, 1); = true 獲取長度方法getLength(Object array) ArrayUtils.getLength(["a", "b", "c"]) = 3 獲取索引方法indexOf(boolean[] array,boolean valueToFind) indexOf(boolean[] array,boolean valueToFind,int startIndex) //查詢某個Object在數組中的位置,能夠指定起始搜索位置,找不到返回-1 //從正序開始搜索,搜到就返回當前的index不然返回-1 ArrayUtils.indexOf(newint[] { 1, 3, 6 }, 6); = 2 ArrayUtils.indexOf(newint[] { 1, 3, 6 }, 2); = -1 //從逆序開始搜索,搜到就返回當前的index,不然返回-1 ArrayUtils.lastIndexOf(newint[] { 1, 3, 6 }, 6); = 2 //從逆序索引爲2開始搜索,,搜到就返回當前的index,不然返回-1 ArrayUtils.lastIndexOf(new Object[]{"33","yy","uu"}, "33",2 ) = 0 判空方法isEmpty(boolean[] array)等等 isNotEmpty(T[] array) //判斷數組是否爲空(null和length=0的時候都爲空) ArrayUtils.isEmpty(newint[0]); = true ArrayUtils.isEmpty(new Object[] { null }); = false 長度相等判斷方法isSameLength(boolean[] array1,boolean[] array2) //判斷兩個數組的長度是否相等 ArrayUtils.isSameLength(new Integer[] { 1, 3, 5 }, new Long[] { "1", "3", "5"}); = true 空數組轉換nullToEmpty(Object[] array)等等 //講null轉化爲相應數組 int [] arr1 = null; int [] arr2 = ArrayUtils.nullToEmpty(arr1); 刪除元素方法remove(boolean[] array,int index)等等 removeElement(boolean[] array,boolean element) removeAll(T[] array,int... indices) removeElements(T[] array,T... values) //刪除指定下標的元素 ArrayUtils.remove([true, false], 1) = [true] ArrayUtils.remove([true, true, false], 1) = [true, false] //刪除第一次出現的元素 ArrayUtils.removeElement([true, false], false) = [true] ArrayUtils.removeElement([true, false, true], true) = [false, true] //刪除全部出現的下標的元素 ArrayUtils.removeAll(["a", "b", "c"], 0, 2) = ["b"] ArrayUtils.removeAll(["a", "b", "c"], 1, 2) = ["a"] //刪除數組出現的全部元素 ArrayUtils.removeElements(["a", "b"], "a", "c") = ["b"] ArrayUtils.removeElements(["a", "b", "a"], "a") = ["b", "a"] ArrayUtils.removeElements(["a", "b", "a"], "a", "a") = ["b"] 反轉方法reverse(boolean[] array)等等 reverse(boolean[] array,int startIndexInclusive,int endIndexExclusive) //反轉數組 int[] array =newint[] { 1, 2, 5 }; ArrayUtils.reverse(array);// {5,2,1} //指定範圍的反轉數組,排除endIndexExclusive的 int[] array =new int[] {1, 2, 5 ,3,4,5,6,7,8}; ArrayUtils.reverse(array,2,5); System.out.println(ArrayUtils.toString(array)); = {1,2,4,3,5,5,6,7,8} 截取數組subarray(boolean[] array,int startIndexInclusive,int endIndexExclusive) //截取數組 ArrayUtils.subarray(newint[] { 3, 4, 1, 5, 6 }, 2, 4); = {1,5} //起始index爲2(即第三個數據)結束index爲4的數組 ArrayUtils.subarray(newint[] { 3, 4, 1, 5, 6 }, 2, 10); = {1,5,6} //若是endIndex大於數組的長度,則取beginIndex以後的全部數據 打印數組方法toString(Object array) toString(Object array,String stringIfNull) //打印數組 ArrayUtils.toString(newint[] { 1, 4, 2, 3 }); = {1,4,2,3} ArrayUtils.toString(new Integer[] { 1, 4, 2, 3 }); = {1,4,2,3} //若是爲空,返回默認信息 ArrayUtils.toString(null, "I'm nothing!"); = I'm nothing! 數組類型轉換toPrimitive(Boolean[] array,boolean valueForNull) Boolean[] toObject(boolean[] array) Map<Object,Object> toMap(Object[] array) <T> T[] toArray(T... items) //基本數據類型數組與外包型數據類型數組互轉 ArrayUtils.toObject(new int[] { 1, 2 }); = new Integer[]{Integer,Integer} ArrayUtils.toPrimitive(new Integer[] { new Integer(1), new Integer(2) }); = new int[]{1,2} //將二維數組轉換爲Map對象,數組類型必須爲Map.Entry or an Array這種類型,一個做爲key,一個做爲value Map colorMap = ArrayUtils.toMap(new Object[][] { {"RED", "#FF0000"}, {"GREEN", "#00FF00"}, {"BLUE", "#0000FF"}} ); //根據傳入的參數,轉換爲對應的數組 String[] array = ArrayUtils.toArray("1", "2"); //建立String或者Number類型的數組 String[] emptyArray = ArrayUtils.<String>toArray(); Number[] emptyArray2 = ArrayUtils.<Number>toArray();
|
@responsebody表示該方法的返回結果直接寫入HTTP response body中。
@responsebody表示該方法的返回結果直接寫入HTTP response body中 通常在異步獲取數據時使用,在使用@RequestMapping後,返回值一般解析爲跳轉路徑,加上@responsebody後返回結果不會被解析爲跳轉路徑,而是直接寫入HTTP response body中。好比異步獲取json數據,加上@responsebody後,會直接返回json數據。
|
Java 同步和異步交換數據 同步:A跟B說給我一杯水,B去倒水,A等着,B倒完水,給A拿來,A喝水,A繼續作其餘事情
交互模型就是Ajax在Browser端引入一個執行引擎,它一邊應付user的請求,一邊把某些必須交給服務器處理的東西背地裏傳送給服務器,同時背地裏把結果準備好(接受服務器端的數據),展示給客戶的技術模式。Ajax加強了用戶的操做性。
|
Spring-jdbc:JdbcTemplate使用簡介 原創 2016年08月16日 11:18:14
爲了使 JDBC 更加易於使用,Spring 在 JDBCAPI 上定義了一個抽象層, 以此創建一個JDBC存取框架. 做爲 SpringJDBC 框架的核心, JDBC 模板的設計目的是爲不一樣類型的JDBC操做提供模板方法. 每一個模板方法都能控制整個過程,並容許覆蓋過程當中的特定任務.經過這種方式,能夠在儘量保留靈活性的狀況下,將數據庫存取的工做量降到最低. JdbcTemplate主要提供如下五類方法: 使用示例: 在數據庫中先準備兩張表:
和
在java工程中建立兩個對應類: [java] view plain copy
[java] view plain copy
37. }
jdbc.properties文件內容以下: [plain] view plain copy
[html] view plain copy
14. </bean>
[html] view plain copy
接下來建立一個測試類對JdbcTemplate的方法進行測試: [java] view plain copy
11. public class JDBCTest {
15. // private EmployeeDao employee;
90. }
好比,建立一個EmployeeDao類以下: [java] view plain copy
19. }
因爲這裏使用了註解來配置bean以及bean的自動裝配,因此還須要在xml文件中添加(要先導入context命名空間): [html] view plain copy
測試一下EmployeeDao: [java] view plain copy
總結:JdbcTemplate是Spring框架自帶的對JDBC操做的封裝,目的是提供統一的模板方法使對數據庫的操做更加方便、友好,效率也不錯。可是功能仍是不夠強大(好比不支持級聯屬性),在實際應用中還須要和hibernate、mybaties等框架混合使用。 |