zoukankan      html  css  js  c++  java
  • java新知识系列 三

    1:trycatch中需要注意的地方.
    2:ServletConfig以及ServletContext对象.
    3: Spring事务属性的种类:   传播行为、隔离级别、只读和事务超时.
    5:关于程序继承的报错.
    6:java数组具有协变性,而java集合不是协变的.
    8:常见类的线程安全属性,以及如何去判断一个类是否是线程安全的方法以及源码实例;
    9:   java的移位运算符;
    10:JSP九大内置对象
     
     
    1:trycatch中需要注意的地方
    • finally中return语句会覆盖try-catch中的return语句
     
    2:ServletConfig以及ServletContext对象:
     
    1. ServletContext对象:servlet容器在启动时会加载web应用,并为每个web应用创建唯一的servlet context对象,可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据。ServletContext对象是真正的一个全局对象,凡是web容器中的Servlet都可以访问。整个web应用只有唯一的一个ServletContext对象
    2. servletConfig对象:用于封装servlet的配置信息。从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对servlet自身有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
     
     
    3: Spring事务属性的种类:   传播行为、隔离级别、只读和事务超时
     
    a)   传播行为定义了被调用方法的事务边界。
     
    传播行为
    意义
    PROPERGATION_MANDATORY
    表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常
    PROPAGATION_NESTED
    表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和PROPAGATION_REQUIRED 看起来没什么俩样
    PROPAGATION_NEVER
    表示方法不能运行在一个事务中,否则抛出异常
    PROPAGATION_NOT_SUPPORTED
    表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起
    PROPAGATION_REQUIRED
    表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务
    PROPAGATION_REQUIRES_NEW
    表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起
    PROPAGATION_SUPPORTS
    表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中
     
     
     
     
    b)   隔离级别
    在操作数据时可能带来 3 个副作用,分别是脏读、不可重复读、幻读。为了避免这 3 中副作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在SQL 中定义的 4 种隔离级别,如下:
    隔离级别
    意义
    ISOLATION_DEFAULT
    使用后端数据库默认的隔离级别
    ISOLATION_READ_UNCOMMITTED
    允许读取未提交的数据(对应未提交读),可能导致脏读、不可重复读、幻读
    ISOLATION_READ_COMMITTED
    允许在一个事务中读取另一个已经提交的事务中的数据(对应已提交读)。可以避免脏读,但是无法避免不可重复读和幻读
    ISOLATION_REPEATABLE_READ
    一个事务不可能更新由另一个事务修改但尚未提交(回滚)的数据(对应可重复读)。可以避免脏读和不可重复读,但无法避免幻读
    ISOLATION_SERIALIZABLE
    这种隔离级别是所有的事务都在一个执行队列中,依次顺序执行,而不是并行(对应可序列化)。可以避免脏读、不可重复读、幻读。但是这种隔离级别效率很低,因此,除非必须,否则不建议使用。
     
    c)    只读
    如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ) , 这样更有利于数据库进行优化 。
    因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为(PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事务标记成只读才有意义。
    如果使用 Hibernate 作为持久化机制,那么将事务标记为只读后,会将 Hibernate 的 flush 模式设置为FULSH_NEVER, 以告诉 Hibernate 避免和数据库之间进行不必要的同步,并将所有更新延迟到事务结束。
    d)   事务超时
    如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设
    置“只读”属性一样,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记成只读才有意义。
    5:关于程序继承的报错:
    在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用"super(参数或无参数)"指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错。
    6:java数组具有协变性,而java集合不是协变的;7
    几个例子:
    1. 假设有一个函数 fun(Animal animal),如果我们传入一个Dog d 对象进去,编译器是不会报错的,这是多态的概念;
    2. 假设有一个函数 fun(Animal[] animals),如果我们传如一个Dog[] dogs数组进去,编译器也不会报错,这就是数组的协变性;
    3. 假设有一个函数 fun(List<Animal>  animal), 如果我们传如一个List <Dog>  dog 集合进去,编译器就会报错了,这就是集合泛型的不变性;
    那么该怎么办呢?我们可以将泛型改成这样 fun (List <? extends Animal> ),这样之后,当我们再 传入一个List <Dog>  dog 集合进去,编译器就就不会报错了。也就是说可以传入包含Animal的子类的List了。
    List<Object>:点; List<?>/ List<? extends Object>:范围
    1.不同的点之间不能互相赋值
    2.小范围可以赋值给大范围,反之则不行
    3.小点可以赋值给大范围(点在范围之内),范围不能赋值给点
    注意:List list; 如果这样定义list的话,那么list可以赋值给任何点或范围。编译器不会报错,但是会警告(警告示例:Type safety: The expression of type List needs unchecked conversion to conform to List<A>)
     
    EL 全名为Expression Language,就是为了替代<%= %>脚本表达式。
     
    在j2ee1.4以前默认是不支持el,如果需要需要指定page指令[isELIgnored="true | false" ]为false,j2ee4.0后默认支持el
     
    其主要作用为:
    EL主要作用:
    1、获取数据:
    EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
    2、执行运算:
    利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
    3、获取web开发常用对象
    EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
    4、调用Java方法
    EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
     
    8:常见类的线程安全属性,以及如何去判断一个类是否是线程安全的方法以及源码实例;
    • 常见类的是否线程安全
    安全                不安全
    Vector            ArrayList
    HashTable      HashMap
    StringBuffer   StringBuilder
    • 如何去判断一个类是否是线程安全的?
    []java中的线程安全是什么:
    就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
    []什么叫线程安全:
    如果代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 
    或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。线程安全问题都是由全局变量及静态变量引起的。
    若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
    看过vector源码的会知道他的许多操作都是加了synchronized修饰的比如他的添加元素。
     
    public synchronized void addElement(E obj) {  modCount++;
           ensureCapacityHelper(elementCount + 1);  elementData[elementCount++] = obj;
    }
     
     
    而HashMap的所有操作都没有加synchronized修饰 ,put源码
    public V put(K key, V value) {
         if (key == null)
             return
          putForNullKey(value);
          int hash = hash(key.hashCode());
          int i = indexFor(hash, table.length);
          for(Entry<K,V> e = table[i]; e != null; e = e.next) {
             Object k;
             if (e.hash == hash &&((k = e.key) == key || key.equals(k))) {
                 V oldValue = e.value;
                 e.value = value;
                 e.recordAccess(this);
                 return
                 oldValue;    }
         }
         modCount++;
         addEntry(hash, key, value, i);
         return null;
    }
     
    ArrayList的add方法的源码
     
    public boolean add(E e) {
         ensureCapacity(size + 1);  // Increments modCount!!
         elementData[size++] = e;
         return true;
    }
     
     
    StringBuffer的append源码,他是有synchronized修饰的
     
    public synchronized StringBuffer append(String str) {
         super.append(str);
         return this;
    }

    最后是Properties的setProperty方法,有synchronized修饰的
    public synchronized Object setProperty(String key, String value) {
          return
          put(key, value);
    }
    9:   java的移位运算符;
    >>为带符号右移,右移后左边的空位被填充为符号位
    >>>为不带符号右移,右移后左边的空位被填充为0
    没有<<< 因为<<后右边总是补0
    10:JSP九大内置对象
    1.request对象
         客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
    2.response对象
         response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
    3.session对象
         session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
    4.out对象
         out对象是JspWriter类的实例,是向客户端输出内容常用的对象
    5.page对象
         page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
    6.application对象
         application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
    7.exception对象
       exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
    8.pageContext对象
    pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
    9.config对象
    config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)

  • 相关阅读:
    SSH框架学习笔记(六)----hibernate关联映射注解
    1. Elasticsearch startup on local
    Oracle PL/SQL 入门
    单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)
    单例模式中用volatile和synchronized来满足双重检查锁机制
    Java反射机制可以动态修改实例中final修饰的成员变量吗?
    left join 条件区别
    Java应用程序项目的打包与发行(run.bat形式)
    Eclipse调试常用技巧(转)
    PhoneGap: Android 自定义组件
  • 原文地址:https://www.cnblogs.com/liguo-wang/p/9736651.html
Copyright © 2011-2022 走看看