• 日记整理---->2016-11-21


      2016-11-21简单的总结一下学到的知识点。作为一个目标而存在的东西,总是那么美丽而优雅。

    一、PE中事务的编写

    getTransactionTemplate().execute(new TransactionCallback() {
       public Object doInTransaction(TransactionStatus arg0) {
              getSqlMap().update("mt.updateSystemLimit",context.getDataMap());// 更新个人限额表
              getSqlMap().update("mt.updateSystemLimitEnt",context.getDataMap());// 更新企业限额表
              if(!"".equals(MinGuaranteeLimit)&&MinGuaranteeLimit!=null&&!"".equals(EarlyWarningLimit)&&EarlyWarningLimit!=null){
                getSqlMap().update("mt.updateSystemLimitEnt",map2);// 更新企业垫资限额和保底限额
              }
            return null;
         }
    }

    二、日志的控制级别

    error>warn>info>debug。

    在spring中,若要打印框架内部的日志。需要将jcl的日志框架改成slf能够识别的日志规范。在spring中使用logback,需要以下的jar包。

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback-version}</version>
    </dependency>
    
    <dependency>
        <groupId>org.logback-extensions</groupId>
        <artifactId>logback-ext-spring</artifactId>
        <version>${logback-spring-version}</version>
    </dependency>
    
    <!-- 添加这个,可以打印spring内部的日志 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.21</version>
    </dependency>

    三、Vue中的v-bind:value和v-model

    首先v-model只是一种语法糖,以下两种写法是等价的。

    <input v-model="something">
    <input v-bind:value="something" v-on:input="something = $event.target.value">

    以下是一个例子,便于理解:value和v-model的区别。html部分的代码:

    <div id="app">
        <input :value="username" @input="updateUsername"><br>
        <input v-model="username"><br>
        <div>{{username}}</div>
    </div>
    • js的代码如下:
    var password = "huhx";
    new Vue({
        el: "#app",
        data: {
            username: password,
        },
        methods: {
            updateUsername: function(e) {
                password = "name is huhx";
            }
        }
    });

    运行的效果如下:password的改变并不影响this.username,也就是输入框的内容。

    如果在updateUsername方法中,加上this.username = e.target.value;那么第一个输入框的修改,会影响所有的内容显示。这也就是上述所说的v-model类似

    • 如果加上以下的内容:
    computed: {
        username: function() {
            return password + ", name";
        }
    }, 

    运行的效果如下:修改两个输入框的内容,不改变this.username,而且this.username内容始终为:huhx, name。这说明了在渲染数据的时候,先是data里面的username,然后调用computed里面的username的get方法。

     四、关于pe加载文件的部分笔稿

    XmlBeanDefinitionReader 这个不一样,这里开始了重写。
    XmlBeanDefinitionReader
    ApplicationConfigParser这个是解析的类
    
     EntityResolver entityResolver = (EntityResolver)constructor0.newInstance(new Object[] { "pe-config.dtd", "/com/csii/pe/config/"})
     tag-definitions.xml定义了pe的核心。
     loadTagDefinitions
     
    Class parserClass0 = Class.forName("com.csii.pe.config.ApplicationConfigParser");
        setParserClass(parserClass0);
        Class class0 = Class.forName("com.csii.pe.config.DtdResolver");
        Constructor constructor0 = class0.getConstructor(new Class[] {
            java.lang.String.class, java.lang.String.class
        });
        EntityResolver entityResolver = (EntityResolver)constructor0.newInstance(new Object[] {
            "pe-config.dtd", "/com/csii/pe/config/"
        });
        setEntityResolver(entityResolver);
        logger.info("using entity resolver:" + entityResolver);
    }

     五、对于js中装包的理解

    首先js的代码如下:

    function funTest() {
        var outerParam = "huhx";
        innner("123456");
        function innner(str) {
            console.log("hello world " + outerParam + ", " + str);
        }
        return function() {
            innner("linux");
            outerParam = "chenhui";
            console.log(outerParam);
        }
    }
    • funTest():
    hello world huhx, 123456
    • funTest()():
    hello world huhx, 123456
    hello world huhx, linux
    chenhui
    • var test = new funTest(); test();
    hello world huhx, 123456
    hello world huhx, linux
    chenhui

    六、伪元素的基本使用

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style type="text/css">
            span:before {
                content: "I love you, "
            }
            span:after {
                content: "I hate you.";
                color: red;
            }
        </style>
    </head>
    <body>
        <p><span id="test">周长风</span></p>
        <script type="text/javascript">
            var ele = document.getElementById("test").innerText; // 周长风
            alert(ele);
        </script>
    </body>
    </html>

    页面显示效果:

    七、toString和String强制转换的区别

    Object obj = null;
    System.out.println(obj.toString()); // 抛出空指针异常:java.lang.NullPointerException
    System.out.println((String)obj); // null

    八、 抢火车票程序思路

    1、访问12306网站,查询余票。通过console可以得到请求的url以及请求数据。
    
    2、在项目中通过okhttp发送请求,可以得到返回的数据。
    
    3、转换成json对象,对数据进行解析处理。
    
    4、得到你想要的信息,根据要求判断是否发送邮件通知。
    
    5、开启一个定时任务,不断的轮询火车票的状态,重复上述的操作。

    一、访问12306网站:在console里面得到url为:参数2017-01-17是出发日,SHH是出发地上海,WHN是目的地武汉,ADULT是单选框选中的普通。

    https://kyfw.12306.cn/otn/leftTicket/queryA?leftTicketDTO.train_date=2017-01-17&leftTicketDTO.from_station=SHH&leftTicketDTO.to_station=WHN&purpose_codes=ADULT

     

    对url进行组装:

    final String path = url + "queryA?leftTicketDTO.train_date=" + time + "&leftTicketDTO.from_station=" + from + "&leftTicketDTO.to_station=" + to + "&purpose_codes=" + purpose;

    返回的数据在12306上显示大概如下:

    二、通过okhttp发送的get请求,得到返回的数据:

    Runnable runnable = new Runnable() {
        @SuppressWarnings("deprecation")
        @Override
        public void run() {
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            List<InputStream> inputStreams = new ArrayList<>();
            inputStreams.add(new ByteArrayInputStream(CER_12306.getBytes()));
            SSLSocketFactory sslSocketFactory = getSocketFactory(inputStreams);
            builder.sslSocketFactory(sslSocketFactory);
            OkHttpClient client = builder.build();
            Request request = new Request.Builder().url(path).build();
            try {
                Response response = client.newCall(request).execute();
                ResponseBody body = response.body();
                String string = body.string(); // 请求返回的数据
                // 对返回的数据进行分析处理
                getInfoFromResponse(string);
                System.out.println("string " + string);
                body.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };

    三、对返回的数据做解析处理。

    private static void getInfoFromResponse(String string) {
        boolean isEmailSend = true;
        JSONObject jsonObject = JSONObject.parseObject(string);
        String httpStatus = jsonObject.getString("httpstatus");
        StringBuilder builder = new StringBuilder();
        if (StringUtils.isEmpty(httpStatus) || !httpStatus.equals("200")) {
            return;
        }
        @SuppressWarnings("unchecked")
        List<Map<String, Map<String, String>>> dataObject = (List<Map<String, Map<String, String>>>) jsonObject.get("data");
        System.out.println(dataObject.size());
        builder.append(getInfoMessage(dataObject, isEmailSend));
        if (isEmailSend) {
            SendMailUtils.sendMail(emailTo, "<span>" + builder.toString() + "</span>");
        }
    }

    四、针对解析处理的结果,看是否要发送邮件通知。

    public static void sendMail(String to, String message) {
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.qq.com");
        props.put("mail.smtp.port", 465); // 这个需要
        props.put("mail.smtp.auth", "true");
        props.put("mail.from", EMAIL_SEND_FROM);
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        Session session = Session.getInstance(props, auth);
        MimeMessage msg = new MimeMessage(session);
        Address address;
        try {
            address = new InternetAddress(EMAIL_SEND_FROM);
            msg.setFrom(address);
            msg.setRecipients(Message.RecipientType.TO, to);
            msg.setSubject("胡红翔");
            msg.setSentDate(new Date());
            String html = "<html><body>" + message + "</body></html>";
            msg.setText(html, "utf-8", "html");
            Transport.send(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    五、开启定时任务

    // 定时任务
    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    service.scheduleAtFixedRate(runnable, 0, watiTime, TimeUnit.MINUTES);

    六、接收的邮件通知如下:不够人性化,但是数据都有,后续处理好说。

    七、过程中遇到的问题

    1、使用okhttp发送https请求时,会涉及到证书的知识。这方面不是很了解
    
    2、线程中关于是否发送邮箱的变量isEmailSend有些不好把握,关于线程方面有待提高。

    八、过程中学到的知识:

    1、okhttp发送https请求,了解了一些关于证书的知识
    
    2、定时任务的另外一种写法。

      

    友情链接

  • 相关阅读:
    iOS开发基础知识--碎片7
    python---ORM之SQLAlchemy(3)外键与relationship的关系
    python---ORM之SQLAlchemy(2)外键使用
    python---ORM之SQLAlchemy(1)
    python---自定义字段验证
    mysql -- 慢日志使用
    mysql -- 索引补充
    mysql -- 动态获取结果集(重点)
    mysql -- 逻辑语句
    mysql -- 事务
  • 原文地址:https://www.cnblogs.com/huhx/p/basediary20161121.html
Copyright © 2020-2023  润新知