国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java后端支付大雜燴之core.common、utils(異常,ID,日期,字符串等工具類)(一)

huayeluoliuhen / 934人閱讀

摘要:但,結果同樣重要,加油。。而且可明確提出錯誤信息。業務異常的自定義封裝類實現和一樣,為了空間就不展示了。數據庫異常在看兩個類,驗證信息異常。那就是字符串工具類。字符串處理及轉換工具類,。

PayMap

PayMap是一個使用Java語言集成三方支付的小Demo,現已集成支付寶(國內、國際、移動端、PC端)、微信、銀聯(ACP、UPOP)、光大(網關、網頁)、郵政支付,采用的技術棧為:SpringMVC+Spring+MyBatis+Shiro+RabbitMQ+Redis。

特性

支持前面提到的各種**支付

支付請求調用支持HTTP和異步MQ

控制層統一異常處理

LogBack日志記錄

Redis緩存機制

Shiro安全機制

MyBatis代碼自動生成

HTTP請求日志記錄

RESTful APIs

說明

1、本文項目來自Martin404,自己只是臨摹大佬的項目。

2、重要的是學習過程,而不是結果。但,結果同樣重要,加油。gogogo。

3、框架搭建就略過了。配置文件太多。遇到的時候貼出來。也收藏起來,留著備用。

4、Gist、Insight.io for GitHub必備吧,劃詞翻譯不懂的單詞劃一劃。

5、在IDEA中我會注重代碼規范,但是這里為了節約地方,能省的就省略了。還請諒解。

6、代碼提交到這里了GitHub。根據提交記錄找自己想要的類庫。

7、重要的在后面,一切都只只是剛剛開始(希望不要被屏蔽)??!gogogo

1、核心包~common

因為沒有文檔,只能根據自己之前的經驗。先把必備的配置文件,包弄好。項目跑不起來,沒關系。重要的是學習,先從核心包,common開始學習。配置文件就不貼了。需要的可以到GitHub去找。

我們先整體看一下結構

1、就先從異常開始吧,首先是定義,BaseException。為什么要這么定義呢?不知道大家有沒有見過BaseDao、BaseAction。主要原因是為了方便擴展,父類不能實現的,在子類中加強。

回過頭來我們在看下整體繼承關系圖,Throwable應該還有個Error錯誤。兩者的區別在于后者是不可恢復的。這里的是運行時異常。 還有一種區分是受檢查和非檢查的。比如數據庫連接關閉就是受檢查異常,數組越界異常是非檢查的。還有try{}catch{}finally{}這里不展開了。在Spring框架中可以受檢查的包裝成非受檢查的。而且可明確提出錯誤信息。

public class BaseException extends RuntimeException {

    public BaseException(String message) {
        super(message,new Throwable(message));
    }

    public BaseException(Throwable cause) {
        super(cause);
    }
    public BaseException(String message,Throwable cause) {
        super(message,cause);
    }
}

2、接下來就是定義它的子類。

/**
 * Created by guo on 3/2/2018.
 * 系統類異常
 */
public class SystemException extends BaseException {
    //實現和BaseException一樣,構造方法名字換下。為了空間就不展示了。
}
---------------------------------------------------------
/**
 * 業務異常的自定義封裝類
 */
public class BusinessException extends BaseException {
    //實現和BaseException一樣,為了空間就不展示了。
}
---------------------------------------------------------
/**
 * 數據庫異常
 */
public class DBException extends BaseException {

}

3、在看兩個類,驗證信息異常。后者估計大家用得著。我不會告訴你們Gist了。什么?你不懂?快去GItHub看看。收藏代碼的好地方。

/**
 * 驗證異常,用于封裝
 */
public class ValidationError {
    private String objectName;
    private String fieldName;
    private String defaultMessage;
  //  Constructor 、Setter 、Getter 、ToString 略。為了節約地方。
}

----------------------------------------------------------------
/**
 * Created by guo on 3/2/2018.
 * 異常返回碼
 */
public enum ResultCode {
    /**
     * 成功. ErrorCode : 0
     */
    SUCCESS("0", "成功"),
    /**
     * 未知異常. ErrorCode : 01
     */
    UnknownException("01", "未知異常"),
    /**
     * 系統異常. ErrorCode : 02
     */
    SystemException("02", "系統異常"),
    /**
     * 業務錯誤. ErrorCode : 03
     */
    BusinessException("03", "業務錯誤"),
    /**
     * 提示級錯誤. ErrorCode : 04
     */
    InfoException("04", "提示級錯誤"),
    /**
     * 數據庫操作異常. ErrorCode : 020001
     */
    DBException("020001", "數據庫操作異常"),
    /**
     * 參數驗證錯誤. ErrorCode : 040001
     */
    ParamException("040001", "參數驗證錯誤"),

    SystemMaintainException("11", "系統正在維護");

    private String _code;
    private String _msg;
    //  Constructor、Getter略
    public static ResultCode getByCode(String code) {
        for (ResultCode ec : ResultCode.values()) {
            if (ec.getCode().equals(code)) {
                return ec;
            }
        }
        return null;
    }
}

4、接下來看一些默認設置。

public class ActionConstants {
    /**
     * 默認值 - 執行時失敗時ReturnContext的ReturnMsg
     */
    public static final String DEFAULT_FAILED_RETURNMSG = "執行失敗";
    /**
     * 默認值key - 執行成功時ReturnContext的Returning
     */
    public static final String DEFAULT_SUCCESS_RETURNMSG ="執行成功";
}
-------------------------------------------------------------------------
/**
 * 從SpringApplicationContext中設置的系統參數
 */
public class SystemConfig {
    //系統默認的游客用戶名
    private static String guestUsername = "";
    private SystemConfig() {}   //注意這里被私有化了。

    public static void setGuestUsername(String guestUsername) {
        SystemConfig.guestUsername = guestUsername;
    }
}
-------------------  -------注意bean------------------------------------

    
        ${shiro.guest.username}
    

5、這個也很重要,局部刷新。首先看下實現了Serializable,為什么呢?因為它要在網絡中傳輸,所以需要序列成二進制格式的。還有當我們需要網絡上的一個對象時,可以進行反序列化,在創建對象?;蛘呦氚褍却嬷械膶ο蟊4嬖跀祿熘谢蛘咭粋€文件中。這里涉及ObjectOutputStream類的writeObject()方法、ObjectInputStream類的writeObject()方法。還有需要serialvUID,但不是必須的,最好加上。

/**
 * AJAX調用返回對象
 */
public class AjaxResult implements Serializable {
    //請求結果是否為成功
    private String ErrorCode = ResultCode.SUCCESS.getCode();
    //請求返回信息
    private String Message = ActionConstants.DEFAULT_SUCCESS_RETURNMSG;
    //請求結果
    private Object Date = null;
   //Setter、Getter、toString....
    /**
     * 獲取正確結果模板
     *                                     //標準是這樣寫的
     * @param message  請求返回信息
     * @param obj      請求結果
     * @return   AjaxResult
     */
    public static AjaxResult getOK(String message,Object obj) {
        AjaxResult result = new AjaxResult();
        result.setMessage(message);
        result.setDate(obj);
        return   result;
    }
    /**
     * 獲取正確結果模板
     */
    public static AjaxResult getOK(Object obj) {
        AjaxResult result = new AjaxResult();
        result.setMessage(ActionConstants.DEFAULT_SUCCESS_RETURNMSG);
        result.setDate(obj);
        return  result;
    }
    /**
     * 獲取正確結果模板
     */
    public static AjaxResult getOK() {
        return getOK(ActionConstants.DEFAULT_SUCCESS_RETURNMSG,null);
    }
    /**
     * 獲取錯誤結果模板
     */
    public static AjaxResult getError(ResultCode errorCode,String message,Object obj) {
        AjaxResult result = new AjaxResult();
        result.setErrorCode(errorCode.getCode());
        result.setMessage(message);
        result.setDate(obj);
        return result;
    }
    /**
     * 獲取錯誤結果模板
     *
     * @return AjaxResult
     */
    public static final AjaxResult getError(ResultCode resultCode) {
        AjaxResult result = new AjaxResult();
        return getError(resultCode,resultCode.getMsg(),null);
    }
}
2、核心包~util

1、接下來我們看工具類,這個幾個非常有用。自己也收集了一些。先看日期吧,會拿出部分作為介紹。

(1)、首先我們看到DateUtils繼承了ProperyEditorSuppert。為什么要這么做?看名字叫屬性編輯支持。在Spring中我們可以使用屬性編輯器來將特定的字符串轉為對象:String-->Object.在JDK中用于將XML文件中字符串轉為特定的類型,同時提供了一個實現類,是他是他就是PropertEditorSuppert。在Spring注入式,遇到類型不一致,則回去調用相應的屬性編輯器進行轉換。如:setAsText(String str)、setValue().不然getValue()方法拿不到處理后的對象。

import org.joda.time.format.DateTimeFormat;      //注意包名,大佬的付出


public class DateUtils extends PropertyEditorSupport {
    public static final DateTimeFormatter standard = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    public static final DateTimeFormatter yy_MM_dd = DateTimeFormat.forPattern("yyyy-MM-dd");
    public static final DateTimeFormatter date_sdf_wz = DateTimeFormat.forPattern("yyyy年MM月dd日");
    //還有需要轉換格式
    ...................................常用的,其實有很多.............................................
    /**
     * 字符串轉為日期
     */
    public static Date str2Date(String str,DateTimeFormatter sdf) {
        if (str == null || "".equals(str)) {
            return null;
        }
        DateTime date;
        try {
            date = sdf.parseDateTime(str);
            return date.toDate();
        } catch (IllegalArgumentException e) {
          String errorMessage = "yyyy-MM-dd HH:mm:ss";
          if (sdf.equals(yy_MM_dd)) {
              errorMessage = "yyyy-MM-dd";
          }
          throw new BusinessException("輸入的日期格式有誤,因為"" + errorMessage + ""格式");  //異常直接給自定義的。
        }
    }
    /**
     * 指定日期的默認顯示,具體格式為:年-月-日
     * @param date 指定的日期
     * @return 指定日期按“年-月-日”顯示
     */
    public static String formatDate(Date date) {
        return standard.print(date.getTime());
    }
    /**
     * 返回UNIX時間戳-1970年至今的秒數(注意單位-不是毫秒)
     * @param str    the str
     * @param format the format
     * @return the long
     */
    public static long getUnixTimestamp(String str, DateTimeFormatter format) {
        DateTime dateTime = format.parseDateTime(str);
        return dateTime.getMillis() / 1000;
    }
    /**
     * 獲取給定日期之間的日期
     */
    public static List getRangeDates(Long startTime, Long endTime) {
        List dateList = new ArrayList<>();
        DateTime startDt = new DateTime(startTime * 1000);
        DateTime endDt = new DateTime(endTime * 1000);
        endDt = endDt.withTimeAtStartOfDay();
        //因為查詢結束時間不包含邊界,特殊處理一下
        if (endTime * 1000 == endDt.getMillis()) {
            endDt = endDt.minusDays(1);
        }
        dateList.add(getTime(startTime, date_sdf_wz));
        while (endDt.isAfter(startDt)) {
            startDt = startDt.plusDays(1);
            dateList.add(getTime(startDt.getMillis() / 1000, date_sdf_wz));
        }
        return dateList;
    }
    /**
     * 返回時間間隔天數
     */
    public static int getDateDiff(Long beginTime, Long endTime) {
        DateTime dateTime1 = new DateTime(beginTime * 1000);
        DateTime dateTime2 = new DateTime(endTime * 1000);
        return Days.daysBetween(dateTime1, dateTime2).getDays();
    }
}

(2)接下來我們看下ID生產策略,注意靜態代碼塊,還有這里用到了重入鎖ReentrantLock(),對資源進行加鎖,同一時刻只會有一個線程能夠占有鎖.當前鎖被線程占有時,其他線程會進入掛起狀態,直到該鎖被釋放,其他掛起的線程會被喚醒并開始新的競爭.,AtomicInteger并發條件下原子自增運算。保證一致性。友情提示

/**
 * ID生成策略
 */
public class IDGenerator {
    private static final DateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    private static final Random r = new Random();
    private static char[] A2Z = null;

    static {
        int j = 0;
        A2Z = new char[26];
        for (int i = 65; i < 91; i++) {
            A2Z[j] = (char)i;
            j++;
        }
    }
    public static String getTargetId() {
        char[] temp = new char[5];
        for (int i = 0; i < 5; i++) {
            temp[i] = A2Z[r.nextInt(26)];
        }
        String string = new String(temp);
        Integer max = 999999;
        Integer min = 10000;
        int s = r.nextInt(max) % (max - min + 1) + min;
        return string + s;

    }

    public static String getTranSid() {
        Lock lock = new ReentrantLock();
        lock.lock();
        String temp = null;
        AtomicInteger atomicInteger = new AtomicInteger();
        try {
            String currDate = format.format(new Date());
            Integer max = 999;
            Integer min = 100;
            int s = r.nextInt(max) % (max - min + 1) + min;
            temp = currDate + String.valueOf(s);

        } finally {
            lock.unlock();
        }
        return temp;
    }


    public static String getIcbcTimeStamp() {
        DateFormat dateFormatStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Lock lock = new ReentrantLock();
        lock.lock();
        String temp = null;
        AtomicInteger atomicInteger = new AtomicInteger();
        try {
            String currDate = dateFormatStamp.format(new Date());
            Integer max = 999999;
            Integer min = 100000;
            int s = r.nextInt(max) % (max - min + 1) + min;
            temp = currDate + "." + String.valueOf(s);
        } finally {
            lock.unlock();
        }
        return temp;
    }
}

(3)、看一個加載配置文件的工具類

需要注意的是這里同樣用到了靜態代碼塊,在啟動的時候就加載。還有就是反射機制,在這里用的是類的加載器完成的。其他可以用getClass(),Claass.forName();

還有一點就是Properties類,繼承自Hashtable,實現Map接口,可以和IO對象組合使用,實現數據的持久存儲。存儲鍵值對,根據key找Value。

/**
 * Properties文件加載工具
 */
public class PropertiedsUtil {
    public static Properties properties = new Properties();
    public static List configFile = Arrays.asList(
            "server_config.properties", "sys_config.properties");

    static {
        try {
            for (String fileName : configFile) {
                InputStream in = PropertiedsUtil.class.getClassLoader().getResourceAsStream(fileName);
                properties.load(in);
            }
        }catch (IOException e) {
            throw new BusinessException("讀取配置文件錯誤");
        }
    }
    public static String getValue(String key) {
        return properties.getProperty(key, "");
    }
}

(4)、SqlSessionFactoryBean工具類
在 MyBatis 中,使用 SqlSessionFactoryBuilder創建SqlSessionFactory ,進而來創建 SqlSession。一旦你獲得一個 session 之后,你可以使用它來執行映射語句,提交或回滾連接,最后,當不再需要它的時候, 你可以關閉 session。

/**
 * Created by guo on 3/2/2018.
 * SqlSession工廠bean
 */
public class SqlSessionFactoryBeanUtil extends SqlSessionFactoryBean {
    //這里使用了日志記錄,方便查看。
    private static Logger logger = LoggerFactory.getLogger(SqlSessionFactoryBeanUtil.class);

    @Override
    protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
        try {
            return super.buildSqlSessionFactory();    //調用父類
        }catch (NestedIOException e) {
            logger.error("ex:{}",e.getMessage());
            throw new NestedIOException("Faild to parse mapping resource: " + e);
        }finally {
            ErrorContext.instance().reset();
        }
    }
}

(5)、最重要的一般壓低出現。那就是字符串工具類。這個有些多,挑常用的羅列出來。

/**
 * Created by guo on 3/2/2018.
 * 字符串處理及轉換工具類
 */
public class StringUtil {
    private static Pattern numericPattern = Pattern.compile("^[0-9-]+$");
    private static Pattern numericStringPattern = Pattern.compile("^[0-9--]+$");
    private static Pattern floatNumericPattern = Pattern.compile("^[0-9-.]+$");
    private static Pattern abcPattern = Pattern.compile("^[a-z|A-Z]+$");
    public static final String splitStrPattern = ",|,|;|;|、|.|。|-|_|(|)|[|]|{|}||/| | |"";
    private static Logger logger = LoggerFactory.getLogger(StringUtil.class);

    /**
     * 判斷是否數字表示
     * @param src 源字符串
     * @return 是否數字的標志
     */
    public static boolean isNumeric(String src) {
        boolean return_value = false;
        if (src != null && src.length() > 0) {
            Matcher m = numericPattern.matcher(src);
            if (m.find()) {
                return_value = true;
            }
        }
        return return_value;
    }
    /**
     * 判斷是否純字母組合
     * @param src 源字符串
     * @return 是否純字母組合的標志
     */
    public static boolean isABC(String src) {
        boolean return_value = false;
        if (src != null && src.length() > 0) {
            Matcher m = abcPattern.matcher(src);
            if (m.find()) {
                return_value = true;
            }
        }
        return return_value;
    }

    /**
     * 判斷是否浮點數字表示
     */
    public static boolean isFloatNumeric(String src) {}
-------------------------------截取------------------------------------------------------------
    /**
     * 把string array or list用給定的符號symbol連接成一個字符串
     */
    public static String joinString(List array, String symbol) {
        String result = "";
        if (array != null) {
            for (int i = 0; i < array.size(); i++) {
                String temp = array.get(i).toString();
                if (temp != null && temp.trim().length() > 0)
                    result += (temp + symbol);
            }
            if (result.length() > 1)
                result = result.substring(0, result.length() - 1);
        }
        return result;
    }
    /**
     * 截取字符,不轉碼
     */
    public static String subStrNotEncode(String subject, int size) {
        if (subject.length() > size) {
            subject = subject.substring(0, size);
        }
        return subject;
    }
    /**
        * 取得字符串的實際長度(考慮了漢字的情況)
        */
       public static int getStringLen(String SrcStr) {
           int return_value = 0;
           if (SrcStr != null) {
               char[] theChars = SrcStr.toCharArray();
               for (int i = 0; i < theChars.length; i++) {
                   return_value += (theChars[i] <= 255) ? 1 : 2;
               }
           }
           return return_value;
       }
---------------------------------分割、替換和轉換-------------------------------------------
       /**
        * 根據指定的字符把源字符串分割成一個數組
        */
       public static List parseString2ListByCustomerPattern(String pattern, String src) {
           if (src == null)
               return null;
           List list = new ArrayList();
           String[] result = src.split(pattern);
           for (int i = 0; i < result.length; i++) {
               list.add(result[i]);
           }
           return list;
       }
       /**
        * 字符串替換
        */
       public static String stringReplace(String str, String sr, String sd) {
           String regEx = sr;
           Pattern p = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
           Matcher m = p.matcher(str);
           str = m.replaceAll(sd);
           return str;
       }
       /**
        * 格式化一個float
        */
       public static String formatFloat(float f, String format) {
           DecimalFormat df = new DecimalFormat(format);
           return df.format(f);
       }
       /**
        * 把 名=值 參數表轉換成字符串 (a=1,b=2 =>a=1&b=2)
        */
       public static String linkedHashMapToString(LinkedHashMap map) {
           if (map != null && map.size() > 0) {
               String result = "";
               Iterator it = map.keySet().iterator();
               while (it.hasNext()) {
                   String name = (String) it.next();
                   String value = (String) map.get(name);
                   result += (result.equals("")) ? "" : "&";
                   result += String.format("%s=%s", name, value);
               }
               return result;
           }
           return null;
       }
       /**
        * 轉換編碼
        */
       public static String changCoding(String s, String fencode, String bencode) {
           String str;
           try {
               if (StringUtil.isNotEmpty(s)) {
                   str = new String(s.getBytes(fencode), bencode);
               } else {
                   str = "";
               }
               return str;
           } catch (UnsupportedEncodingException e) {
               return s;
           }
       }

下面的是轉換,具體的用到了再說。

/**
 * 將字符串轉換成十六進制編碼
 */
public static String toHexString(String str) throws UnsupportedEncodingException {
    // 根據默認編碼獲取字節數組
    String hexString = "0123456789ABCDEF";
    byte[] bytes = str.getBytes("GB2312");
    StringBuilder sb = new StringBuilder(bytes.length * 2);
    // 將字節數組中每個字節拆解成2位16進制整數
    for (byte b : bytes) {
        sb.append(Integer.toHexString(b + 0x800).substring(1));
    }
    return sb.toString();
}
/**
 * unicode 轉字符串
 */
public static String unicode2String(String unicode) {
    StringBuffer string = new StringBuffer();
    String[] hex = unicode.split("u");
    for (int i = 1; i < hex.length; i++) {
        // 轉換出每一個代碼點
        int data = Integer.parseInt(hex[i], 16);
        // 追加成string
        string.append((char) data);
    }
    return string.toString();
}

gogogo...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68641.html

相關文章

  • Java后端支付雜燴sps.controller(支付請求入口,配置文件)(五)

    摘要:重要的是學習過程,而不是結果。但,結果同樣重要,加油。。在這提一點,由于網絡原因等異常情況支付平臺可能出現多次發送支付結果的情況,通知回調接口商戶要注意做好接口冪等,其余的不再多說。 7、sps.controller.base,front. 說明 如果有幸能看到,其實只為自己記錄,回頭復習用 1、本文項目來自Martin404,自己只是臨摹大佬的項目。 2、重要的是學習過程,而不是結...

    Joyven 評論0 收藏0
  • Java后端支付雜燴core.dao,service,web(重點是接口的設計)(二)

    摘要:是一個使用語言集成三方支付的小,現已集成支付寶國內國際移動端端微信銀聯光大網關網頁郵政支付,采用的技術棧為。系統初始化監聽器在系統啟動時運行進行一些初始化工作加載銀聯配置文件緩存初始化忽略過濾器我們先看關于日志的,真心看不懂,后面有一大堆。 PayMap PayMap是一個使用Java語言集成三方支付的小Demo,現已集成支付寶(國內、國際、移動端、PC端)、微信、銀聯(ACP、UPO...

    sourcenode 評論0 收藏0
  • react中后臺管理界面

    摘要:是一個用開發的一個企業級中后臺管理包含常用的業務,組件,及數據流轉方案,前后端分離的開發方式,按業務劃分的目錄結構,可以大大提高我們的開發效率下面是整體的介紹,感興趣的同學可以去官網詳加了解。 dva-boot-admin 是一個用React開發的一個企業級中后臺管理UI,包含常用的業務,組件,及數據流轉方案,前后端分離的開發方式,按業務劃分的目錄結構,可以大大提高我們的開發效率 下面...

    dongfangyiyu 評論0 收藏0
  • Java 文章 - 收藏集 - 掘金

    摘要:而調用后端服務就應用了的高級特分布式配置管理平臺后端掘金輕量的分布式配置管理平臺。關于網絡深度解讀后端掘金什么是網絡呢總的來說,網絡中的容器們可以相互通信,網絡外的又訪問不了這些容器。 在 Java 路上,我看過的一些書、源碼和框架(持續更新) - 后端 - 掘金簡書 占小狼轉載請注明原創出處,謝謝!如果讀完覺得有收獲的話,歡迎點贊加關注 物有本末,事有終始,知所先后,則近道矣 ......

    RayKr 評論0 收藏0
  • 必看!java后端,亮劍誅仙(最全知識點)

    摘要:鑒于目前大多數服務器環境都是,提前接觸能夠相輔相成。正則也是必須要掌握的一個知識點。有多種創建多線程的方式,不過目前使用線程池的多一些。 原創:小姐姐味道(微信公眾號ID:xjjdog),歡迎分享,轉載請保留出處。 你可能有所感悟。零散的資料讀了很多,但是很難有提升。到處是干貨,但是并沒什么用,簡單來說就是缺乏系統化。另外,噪音太多,雷同的框架一大把,我不至于全都要去學了吧。 這里,我...

    陳江龍 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<