11.22

11.22笔记(今天熟悉部门数据库,表结构,字段,自己做一个加密签名的东西联系)

部门支付数据库

172.16.136.253:1521/otestdb
query
query_on

 

主要两个用户:

OTS用户   OBM用户

 

OTS主要两个表:

orderdata 生成订单表

 

pay_orderdata 流水表

 

主要是这两张表,用户支付时先生成订单,再调流水表

 

支付业务:

短款(我们收到100笔交易,银行收到99笔)

长款(我们收到99笔交易,银行收到100笔,银行在今天打给我们100笔的钱,相当于多给了,每天结算时会出现问题,解决方法是余款存移(貌似是这个名字),就是昨天多给我们一笔订单的钱,今天就会少给一笔,,然后正好吻合就可以了)

短款:例如我们公司11.22收到100笔交易,银行收到99笔,我们比银行多一笔,多发生在前一天凌晨,用户发起订单在星期一23:59:59,支付成功在星期二0:0:1,银行内部规定不同,有的会算到周一,有的算到周二,这时候就会有长款和短款

 

java中如何将SimpleDateFormat类型转换成Date类型

try {
String dateString = "2009-08-02 13:43:00";
DateFormat df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = df.parse(dateString);
} catch(Exception ex) {
}

 

format 将日期转化为字符串

 

 

 

JSONObject put,accumulate,element的区别

2014-01-22 10:09 32811人阅读 评论(3) 收藏 举报

public Object put (Object key, Object value) 将value映射到key下。如果此JSONObject对象之前存在一个value在这个key下,当前的value会替换掉之前的value

Associates the specified value with the specified key in this map(optional operation). If the map previously contained . a mapping for this key, the old value is replaced by the specified value. (A map m is said to contain a mapping for a key k if and only if m.containsKey(k) would return true .))

 

public JSONObject accumulate (String key, Object value) 累积value到这个key下。这个方法同element()方法类似,特殊的是,如果当前已经存在一个value在这个key下那么一个JSONArray将会存储在这个key下来保存所有累积的value。如果已经存在一个JSONArray,那么当前的value就会添加到这个JSONArray中

。相比之下replace方法会替代先前的value

Accumulate values under a key. It is similar to the element method except that if there is already an object stored 

under the key then a JSONArray is stored under the key to hold all of the accumulated values. If there is already a 

JSONArray, then the new value is appended to it. In contrast, the replace method replaces the previous value.

 

public JSONObject element (String key, Object value) 将键/值对放到这个JSONObject对象里面。如果当前value为空(null),那么如果这个key存在的话,这个key就会移除掉。如果这

个key之前有value值,那么此方法会调用accumulate()方法。

Put a key/value pair in the JSONObject. If the value is null, then the key will be removed from the JSONObject if it is 

present. If there is a previous value assigned to the key, it will call accumulate.

 

 

java中import机制(指定import和import *的区别)

 

java中有两种包的导入机制,总结如下:

单类型导入(single-type-import),              例如 import java.io.File;

按需类型导入(type-import-on-demand),例如 import java.io.*;

这里分析一下这两种导入类型的大致工作原理供大家参考。

单类型导入比较好理解,仅仅导入一个public类或者接口。

对于按需类型导入(  import java.io.*;   ),有人误解为导入一个包下的所有类,其实不然,看名字就知道,他只会按需导入,也就是说它并非导入整个包,而仅仅导入当前类需要使用的类。

既然如此是不是就可以放心的使用按需类型导入呢?非也,非也。

因为单类型导入和按需类型导入对类文件的定位算法是不一样的。java编译器会从启动目录(bootstrap),扩展目录(extension)和用户类路径下去定位需要导入的类,而这些目录进仅仅是给出了类的顶层目录。编译器的类文件定位方法大致可以理解为如下公式:

顶层路径名 \ 包名 \ 文件名.class = 绝对路径

对于单类型导入很简单,因为包明和文件名都已经确定,所以可以一次性查找定位。

对于按需类型导入则比较复杂,编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类文件查找定位。例如:

package com;

import java.io.*;

import java.util.*;

当你的类文件中用到了File类,那么可能出现File类的地方如下

File                      \\  File类属于无名包,就是说File类没有package语句,编译器会首先搜索无名包

com.File             \\  File类属于当前包

java.lang.File     \\  编译器会自动导入java.lang包

java.io.File

java.util.File

需要注意的地方就是,编译器找到java.io.File类之后并不会停止下一步的寻找,而要把所有的可能性都查找完以确定是否有类导入冲突。假设此时的顶层路径有三个,那么编译器就会进行3*5=15次查找。

注意:如果在查找完成后,编译器发现了两个同名的类,那么就会报错。要删除你不用的那个类,然后再编译。

了解以上原理之后,我们可以得出这样的结论:按需类型导入是绝对不会降低Java代码的执行效率的,但会影响到Java代码的编译速度。

查看JDK的源代码就知道SUN的软件工程师一般不会使用按需类型导入。因为使用单类型导入至少有以下两点好处:

1。提高编译速度。

2。避免命名冲突。(例如:当你import java.awt.*;import java.util.*后,使用List的时候编译器将会出编译错误)

当然,使用单类型导入会使用你的import语句看起来很长。

 

 

maven中jar和war的区别

原创 2016年07月11日 15:49:19

jar文件包括java普通类、资源文件和普通文件,在maven中即是打包src/main/java和src/main/resources资源文件夹下的所有文件。在打包的时候会自动生成MATA-INF文件夹,用于存储maven的pom信息和MANIFEST.MF文件。例如:





war文件包含全部的web应用程序,即所有的java类,配置信息和jsp、js等静态资源。但是需要注意war引用war的时候会将应用war的资源全部拷贝到当前war的相同文件下,重名的文件会被替换。例如:


war包依赖:

[html] view plain copy

  1. <dependency>  
  2.       <groupId>com.my.module</groupId>  
  3.       <artifactId>module1</artifactId>  
  4.       <version>0.0.1-SNAPSHOT</version>  
  5.       <type>war</type>  
  6. </dependency>  


module4依赖于module1,编译后module1类文件拷贝到了module4中classes文件下,jsp拷贝到了对应jsp目录下。



 

 

P2P金融

 编辑

P2P金融又叫P2P信贷,是互联网金融(ITFIN)的一种。意思是:点对点。

P2P金融指不同的网络节点之间的小额借贷交易(一般指个人),需要借助电子商务专业网络平台帮助借贷双方确立借贷关系并完成相关交易手续。借款者可自行发布借款信息,包括金额、利息、还款方式和时间,自行决定借出金额实现自助式借款

 

 

现在想在实现类中的每个方法执行前、后、以及是否发生异常等信息打印出来,需要把日志信息抽取出来,写到对应的切面的类中 LoggingAspect.java  
要想把一个类变成切面类,需要两步, 
① 在类上使用 @Component 注解 把切面类加入到IOC容器中 
② 在类上使用 @Aspect 注解 使之成为切面类

下面直接上完整代码,用@Aspect注解方式来实现前置通知、返回通知、后置通知、异常通知、环绕通知。

package com.qcc.beans.aop;
 
import java.util.Arrays;
 
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
 
/**
 * 日志切面
 * 
 * @author QianChaoChen 00002336<br>
 * @date 2017年3月3日 下午3:03:29
 */
@Component
@Aspect
public class LoggingAspect {
 
    /**
     * 前置通知:目标方法执行之前执行以下方法体的内容 
     * @param jp
     */
    @Before("execution(* com.qcc.beans.aop.*.*(..))")
    public void beforeMethod(JoinPoint jp){
        String methodName = jp.getSignature().getName();
        System.out.println("【前置通知】the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
    }
 
    /**
     * 返回通知:目标方法正常执行完毕时执行以下代码
     * @param jp
     * @param result
     */
    @AfterReturning(value="execution(* com.qcc.beans.aop.*.*(..))",returning="result")
    public void afterReturningMethod(JoinPoint jp, Object result){
        String methodName = jp.getSignature().getName();
        System.out.println("【返回通知】the method 【" + methodName + "】 ends with 【" + result + "】");
    }
 
    /**
     * 后置通知:目标方法执行之后执行以下方法体的内容,不管是否发生异常。
     * @param jp
     */
    @After("execution(* com.qcc.beans.aop.*.*(..))")
    public void afterMethod(JoinPoint jp){
        System.out.println("【后置通知】this is a afterMethod advice...");
    }
 
    /**
     * 异常通知:目标方法发生异常的时候执行以下代码
     */
    @AfterThrowing(value="execution(* com.qcc.beans.aop.*.*(..))",throwing="e")
    public void afterThorwingMethod(JoinPoint jp, NullPointerException e){
        String methodName = jp.getSignature().getName();
        System.out.println("【异常通知】the method 【" + methodName + "】 occurs exception: " + e);
    }
 
//  /**
//   * 环绕通知:目标方法执行前后分别执行一些代码,发生异常的时候执行另外一些代码
//   * @return 
//   */
//  @Around(value="execution(* com.qcc.beans.aop.*.*(..))")
//  public Object aroundMethod(ProceedingJoinPoint jp){
//      String methodName = jp.getSignature().getName();
//      Object result = null;
//      try {
//          System.out.println("【环绕通知中的--->前置通知】:the method 【" + methodName + "】 begins with " + Arrays.asList(jp.getArgs()));
//          //执行目标方法
//          result = jp.proceed();
//          System.out.println("【环绕通知中的--->返回通知】:the method 【" + methodName + "】 ends with " + result);
//      } catch (Throwable e) {
//          System.out.println("【环绕通知中的--->异常通知】:the method 【" + methodName + "】 occurs exception " + e);
//      }
//      
//      System.out.println("【环绕通知中的--->后置通知】:-----------------end.----------------------");
//      return result;
//  }
 
}

 

 

1.1     通用报文头

通用报文头描述的是报文通用的内容信息。

1.1.1  请求报文头

字段

字段名

必填

类型长度

说明

version

版本号

M

n15

当前版本是2.0.0,该字段不参与签名

mercNo

合作商户号

M

n15

随行付分配给合作商户的编号

reqId

报文跟踪码

M

n32

报文跟踪码用于双方接受异常时网络抓包用的唯一标识,对于每次请求都要保证reqId唯一

tranCd

交易服务码

M

an5

平台提供的交易服务,请参考“交易接口列表”

reqDate

请求日期

M

n14

合作方请求日期时间,格式为yyyyMMddHHmmss

reqData

业务报文体

M

o

不同交易的业务数据,请求方需要进行加密操作。

sign

签名字段

M

ans

签名字段,校验签名字段防止报文被篡改

msgExt

备用字段

M

ans

报文头备用字段,响应报文原样返回,该字段不参与签名

1.1.2  响应报文头

字段

字段名

必填

类型长度

说明

version

版本号

M

n15

当前版本是2.0.0,该字段不参与签名

mercNo

合作商户号

M

n15

同请求报文

reqId

报文跟踪码

M

n32

同请求报文

tranCd

交易服务码

M

an5

同请求报文

reqDate

请求日期

M

n14

同请求报文

resCode

响应码

M

n6

成功:000000

失败:请参考附录“响应码表”

resMsg

响应描述

M

ans

对应响应码的描述

resData

响应业务报文体

M

o

平台方的回执信息,包含业务数据。

sign

签名字段

M

ans

签名字段,校验签名字段防止报文被篡改

msgExt

备用字段

M

ans

同请求报文,该字段不参与签名

 

 

 

 

spring @component的作用

博客分类: 

 

 

1、@controller 控制器(注入服务)
2、@service 服务(注入dao)
3、@repository dao(实现dao访问)
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)
  @Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。 
下面写这个是引入component的扫描组件 
<context:component-scan base-package=”com.mmnc”>    

其中base-package为需要扫描的包(含所有子包) 
       1、@Service用于标注业务层组件 
       2、@Controller用于标注控制层组件(如struts中的action) 
       3、@Repository用于标注数据访问组件,即DAO组件. 
       4、@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。    
           @Service public class UserServiceImpl implements UserService { } 
           @Repository public class UserDaoImpl implements UserDao { } getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“***”)               这样来指定,这种bean默认是单例的,如果想改变,可以使用@Service(“beanName”) 
           @Scope(“prototype”)来改变。可以使用以下方式指定初始化方法和销毁方法(方法名任意): @PostConstruct public void init() { } 

 

 

 

 

@ModelAttribute使用详解

1.@ModelAttribute注释方法 
    例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
    
    (1)@ModelAttribute注释void返回值的方法 
    

[java] view plain copy

  1. <span style="font-size:12px;">@Controller  
  2.     public class HelloWorldController {  
  3.   
  4.         @ModelAttribute  
  5.         public void populateModel(@RequestParam String abc, Model model) {  
  6.            model.addAttribute("attributeName", abc);  
  7.         }  
  8.   
  9.         @RequestMapping(value = "/helloWorld")  
  10. 10.         public String helloWorld() {  
  11. 11.            return "helloWorld";  
  12. 12.         }  
  13. 13.     }</span>  

14. <span style="font-size:12px;">  

15. </span>  



    这个例子,在获得请求/helloWorld 后,populateModel方法在helloWorld方法之前先被调用,它把请求参数(/helloWorld?abc=text)加入到一个名为attributeName的model属性中,在它执行后helloWorld被调用,返回视图名helloWorld和model已由@ModelAttribute方法生产好了。
这个例子中model属性名称和model属性对象有model.addAttribute()实现,不过前提是要在方法中加入一个Model类型的参数。
    当URL或者post中不包含次参数时,会报错,其实不需要这个方法,完全可以把请求的方法写成,这样缺少此参数也不会出错

 

 

log 的 debug()、 error()、 info()方法的区别

原创 2016年04月05日 11:00:11

  • 标签:
  • log
    • 16850

软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:
    × Debug
    × Info
    × Warn
    × Error
    × Fatal
        一个等级比一个高,但是在具体开发中,关于应该如何选择适应的等级,却没有找到好的文章进行说明。记录一下自己的一些看法,以便日后使用吧。

=== Debug ===
        这个级别最低的东东,一般的来说,在系统实际运行过程中,一般都是不输出的。


        因此这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。


        当然,在每一个 Debug 调用之前,一定要加上 If 判断。

=== Info ===
        这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。


        从某种角度上说,Info 输出的信息可以看作是软件产品的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。

=== Warn、Error、Fatal ===
        警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别,要区分还真不是那么简单的事情。我大致是这样区分的:


        所谓警告,应该是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。


        所谓错误,就是说可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。

        所谓Fatal,那就是相当严重的了,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。

        也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。

 

 

 


@PathVariable和@RequestParam的区别

 
1、 @PathVariable 
当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。
示例代码:

@Controller 
@RequestMapping("/owners/{ownerId}") 
public class RelativePathUriTemplateController { 
 
  @RequestMapping("/pets/{petId}") 
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {     
    // implementation omitted   
  } 

上面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable("name")指定uri template中的名称。

2、 @RequestHeader、@CookieValue

@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。

示例代码:

这是一个Request 的header部分:

Host                    localhost:8080 
Accept                  text/html,application/xhtml+xml,application/xml;q=0.9 
Accept-Language         fr,en-gb;q=0.7,en;q=0.3 
Accept-Encoding         gzip,deflate 
Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive              300 
@RequestMapping("/displayHeaderInfo.do") 
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding, 
                              @RequestHeader("Keep-Alive") long keepAlive)  { 

上面的代码,把request header部分的 Accept-Encoding的值,绑定到参数encoding上了, Keep-Alive header的值绑定到参数keepAlive上。

@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。

例如有如下Cookie值:

JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
参数绑定的代码:

@RequestMapping("/displayHeaderInfo.do") 
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  { 

即把JSESSIONID的值绑定到参数cookie上。

3、@RequestParam, @RequestBody

@RequestParam
A) 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String--> 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值;
B)用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;

C) 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;
示例代码:

@Controller 
@RequestMapping("/pets") 
@SessionAttributes("pet") 
public class EditPetForm { 
    @RequestMapping(method = RequestMethod.GET) 
 public String setupForm(@RequestParam("petId") int petId, ModelMap model) { 
       Pet pet = this.clinic.loadPet(petId); 
   model.addAttribute("pet", pet); 
   return "petForm"; 
   } 
@RequestBody

该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;

它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。

因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api;

 

 

posted @ 2017-11-22 23:26  lttwjt  阅读(108)  评论(0编辑  收藏  举报