个人笔记4

来源:互联网 发布:apache 安装版下载 编辑:程序博客网 时间:2024/06/03 13:25

2017-08-29 静态代码块、构造代码块、构造函数执行顺序和作用分析

从词面上我们就可以看出他们的区别。 静态代码块,静态,其作用级别为类;构造代码块、构造函数,构造,其作用级别为对象。

1、 静态代码块,它是随着类的加载而被执行,只要类被加载了就会执行,而且只会加载一次,主要用于给类进行初始化。

2、 构造代码块,每创建一个对象时就会执行一次,依赖于构造函数且优先于构造函数,主要用于初始化不同对象共性的初始化内容和初始化实例环境。

3、 构造函数,每创建一个对象时就会执行一次。同时构造函数是给特定对象进行初始化,而构造代码是给所有对象进行初始化,作用区域不同。
通过上面的分析,他们三者的执行顺序应该为:静态代码块 > 构造代码块 > 构造函数。当存在父类构造器的时候 还是先执行父类构造器的内容. 即 静态代码块->父类构造器->构造代码块->构造函数执行顺序

public class Test {      /**       * 静态代码块       */      static{          System.out.println("执行静态代码块...");      }      /**       * 构造代码块       */      {          System.out.println("执行构造代码块...");      }      /**       * 无参构造函数       */      public Test(){          System.out.println("执行无参构造函数...");      }      /**       * 有参构造函数       * @param id       */      public Test(String id){          System.out.println("执行有参构造函数...");      }      public static void main(String[] args) {          System.out.println("----------------------");          new Test();          System.out.println("----------------------");          new Test("1");      }  }  -----------  Output:  执行静态代码块...  ----------------------  执行构造代码块...  执行无参构造函数...  ----------------------  执行构造代码块...  执行有参构造函数...  



2017-08-29 将数组复制到一个新的数组中用的方法(数组扩容):Arrays.copyOf([], 数组长度);

 public static <T> T[] expandCapacity(T[] datas){      //扩容原始数组的1.5倍        int newLen = (datas.length * 3) / 2;           //生成一个新的数组       return Arrays.copyOf(datas, newLen);      }  



2017-08-30 请求的url如果有中文,会带%的原因?

比如请求url为: http://127.0.0.1:8080/perbank/我是cm?name=我是cm

则在浏览器中显示为:
这里写图片描述

至于为什么会加上%,这是因为URL的编码规范规定浏览器将ASCII字符非 ASCII 字符按照某种编码格式编码成 16 进制数字然后将每个
16 进制表示的字节前加上“%”。
实际的编码为:
这里写图片描述



2017-08-30 不同方式提交的乱码问题分析
表单GET
我们知道通过URL方式提交数据是很容易产生乱码问题的,所以我们更加倾向于通过表单形式。当用户点击submit提交表单时,浏览器会更加设定的编码来编码数据传递给服务器。通过GET方式提交的数据都是拼接在URL后面(可以当做query String??)来提交的,所以tomcat服务器在进行解码过程中URIEncoding就起到作用了。tomcat服务器会根据设置的URIEncoding来进行解码,如果没有设置则会使用默认的ISO-8859-1来解码。假如我们在页面将编码设置为UTF-8,而URIEncoding设置的不是或者没有设置,那么服务器进行解码时就会产生乱码。这个时候我们一般可以通过new String(request.getParameter(“name”).getBytes(“iso-8859-1”),”utf-8”) 的形式来获取正确数据。
表单POST
对于POST方式,它采用的编码也是由页面来决定的即contentType。当我通过点击页面的submit按钮来提交表单时,浏览器首先会根据ontentType的charset编码格式来对POST表单的参数进行编码然后提交给服务器,在服务器端同样也是用contentType中设置的字符集来进行解码(这里与get方式就不同了),这就是通过POST表单提交的参数一般而言都不会出现乱码问题。当然这个字符集编码我们是可以自己设定的:request.setCharacterEncoding(charset) 。


2017-08-30 JSP转换为servlet过程中下面一段代码起到至关重要的作用

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK" %> 

在上面代码中有两个地方存在编码:pageEncoding、contentType的charset。其中pageEncoding是jsp文件本身的编码,而contentType的charset是指服务器发送给客户端时的内容编码。
jsp在转换为Servlet的过程中是需要经过主要的三次编码转换过程(除去数据库编码转换、页面参数输入编码转换):
第一次:转换为.java文件;
第二次:转换为.class文件;
第三次:业务逻辑处理后输出。
第一阶段
JVM将JSP编译为.jsp文件。在这个过程中pageEncoding就起到作用了,JVM首先会获取pageEncoding的值,如果该值存在则采用它设定的编码来编译,否则则采用file.encoding编码来编译。
第二阶段
JVM将.java文件转换为.class文件。在这个过程就与任何编码的设置都没有关系了,不管JSP采用了什么样的编码格式都将无效。经过这个阶段后.jsp文件就转换成了统一的Unicode格式的.class文件了。
第三阶段
后台经过业务逻辑处理后将产生的结果输出到客户端。在这个过程中contentType的charset就发挥了功效。如果设置了charset则浏览器就会使用指定的编码格式进行解码,否则采用默认的ISO-8859-1编码格式进行解码处理。



2017-08-30 前后台解决传参乱码问题

主要使用javascript编码的三个方法:escape()、encodeURI()、encodeURIComponent()。

escape
escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如“我是cm”的结果为%u6211%u662Fcm,其中“我”对应的编码为6211,“是”的编码为662F,“cm”编码为cm。
注意,escape()不对”+”编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。
encodeURI
对整个URL进行编码,它采用的是UTF-8格式输出编码后的字符串。不过encodeURI除了ASCII编码外对于一些特殊的字符也不会进行编码如:! @ # $& * ( ) = : / ; ? + ‘。
这里写图片描述
encodeURIComponent
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。相对于encodeURI,encodeURIComponent会更加强大,它会对那些在encodeURI()中不被编码的符号(; / ? : @ & = + $ , #)统统会被编码。但是encodeURIComponent只会对URL的组成部分进行个别编码,而不用于对整个URL进行编码。对应解码函数方法decodeURIComponent。
当然我们一般都是使用encodeURI方来进行编码操作。所谓的javascript两次编码后台两次解码就是使用该方法。javascript解决该问题有一次转码、两次转码两种解决方法。
一次转码

    var url = '<s:property value="webPath" />/ShowMoblieQRCode.servlet?name=我是cm';  window.location.href = encodeURI(url);  
转码后的URL:`http://127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%E6%88%91%E6%98%AFcm`后台处理:
String name = request.getParameter("name");  System.out.println("前台传入参数:" + name);  name  = new String(name.getBytes("ISO-8859-1"),"UTF-8");  System.out.println("经过解码后参数:" + name);  

输出结果:
前台传入参数:??????cm
经过解码后参数:我是cm

二次转码

var url = '<s:property value="webPath" />/ShowMoblieQRCode.servlet?name=我是cm';  window.location.href = encodeURI(encodeURI(url)); 

转码后的url:http://127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%25E6%2588%2591%25E6%2598%25AFcm
后台处理:
String name = request.getParameter(“name”);
System.out.println(“前台传入参数:” + name);
name = URLDecoder.decode(name,”UTF-8”);
System.out.println(“经过解码后参数:” + name);
输出结果:
前台传入参数:E68891E698AFcm
经过解码后参数:我是cm



2017-09-01 文件(excel)后台操作依赖的jar
只要引入这个一个就可以了,对应的poi jar包如下:

<!-- poi依赖引入 -->        <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi-ooxml</artifactId>            <version>3.9</version>        </dependency>

这里写图片描述



2017-09-02 分页sql用到的分页数据limit nowPage,pageSize意思
好久不分页了,sql都忘了。

select * from table where  1=1 limit nowPage,pageSize

nowPage:当前页是第几页的数据
pageSize:每页显示多少条数据的数据