自由飞翔

我在仰望,java之上

统计

留言簿(2)

我关注的blog

阅读排行榜

评论排行榜

2011年8月24日 #

编码至高法则-高内聚低耦合

     摘要: 此法则适合所有语言,咱们以JavaScript和Java两个角度分析一下这个东东。 一、javascript 有这样的一个页面,js、css代码都写在html页面中。 例如:gnj.html v1版本Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-...  阅读全文

posted @ 2019-09-11 15:59 GavinMiao 阅读(218) | 评论 (0)编辑 收藏

Jgoodies FormLayout 小结


一、列与行的参数都由三个部分组成:对齐方式、固定尺寸、调整方式。
1.对齐方式:
1)列对齐有left, center, right, fill.默认fill
2)行对齐有:top, center, bottom, fill. 其中fill表示填充至整个区域。默认center。
2.固定尺寸:
pref表示preferred size,适当大小,即首选尺寸大小。
min表示minimum size,
dlu 表示dialog units,
px, pt, in, mm, cm)分别表示Pixel, Points, Inches, Millimeter, Centimeter。
3. 调整方式:
二、CellConstraints:
cc.xywh(3, 1, 3, 1):表示3列,1行,colspan=3,rowspan=1
三、FormLayout:
  1.FormLayout layout = new FormLayout(
   new ColumnSpec[]{
     FormSpecs.DEFAULT_COLSPEC,
     FormSpecs.GLUE_COLSPEC,
     FormSpecs.DEFAULT_COLSPEC,
     FormSpecs.GLUE_COLSPEC,
     FormSpecs.DEFAULT_COLSPEC,
     FormSpecs.GLUE_COLSPEC},
   new RowSpec[]{
     FormSpecs.DEFAULT_ROWSPEC,
     FormSpecs.GLUE_ROWSPEC,
     FormSpecs.DEFAULT_ROWSPEC,
     FormSpecs.GLUE_ROWSPEC,
     FormSpecs.DEFAULT_ROWSPEC,
     FormSpecs.GLUE_ROWSPEC
   }
  );
2.

FormLayout layout = new FormLayout( 
        "right:pref, 6dlu, 50dlu, 4dlu, center:50dlu", // columns
        "pref, 3dlu, pref, 3dlu, pref"); // rows   





参考文章:
http://hi.baidu.com/lijunwyf/item/a18d95f719ff01da6225d26f

posted @ 2012-09-29 11:29 GavinMiao 阅读(1314) | 评论 (0)编辑 收藏

Vector浅见

例子:
import java.util.*;
public class TestVector{
 public static void main(String[] args){
  Vector v = new Vector();
  v.add(null);
  v.add(new Integer(1));
  v.add("123");
  
  for(Enumeration e = v.elements();e.hasMoreElements();){
   System.out.println(e.nextElement());
  }
  v.insertElementAt("insert",2);
  v.setElementAt("insert",0);
  
  for(Enumeration e = v.elements();e.hasMoreElements();){
   System.out.println(e.nextElement());
  }
  
 }
}

结果:
null
1
123

insert
1
insert
123
 
结论:
vector中可以放入null;
vector可以放入不同类型的对象;
vector是同步的容量自增长的向量;

posted @ 2012-09-24 08:49 GavinMiao 阅读(308) | 评论 (0)编辑 收藏

火车票订票好办法

一、前提须知:
1.北京铁路局:
直属站15个:北京站北京西站天津站天津西站丰台站丰台西站南仓站塘沽站唐山站石家庄站石家庄南站、邯郸站、阳泉站、北京南站、天津西站。
2.郑州铁路局:
直属车站11个:郑州站、郑州北站、郑州东站、洛阳站、新乡站、开封站、商丘站、月山站、长治北站、长治站。
二、
北京电话订票窍门:1、座机打!;2.用手机加区号打!北京铁路局管内,如唐山区号:打0315-95105105,手机打95105105的有效区号:河北省邯郸0310石家庄0311保定0312张家口0313承德0314唐山0315廊坊0316沧州0317衡水0318邢台0319秦皇岛0335山东德州0534山西阳泉0353天津022。订好之后可以在北京取票!!

posted @ 2012-09-18 07:55 GavinMiao 阅读(369) | 评论 (0)编辑 收藏

异常积累:org.hibernate.StaleStateException

ERROR - Exception executing batch: 
org.hibernate.StaleStateException: Batch update returned unexpected row count fr
om update [0]; actual row count: 0; expected: 1

ERROR - Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count fr
om update [0]; actual row count: 0; expected: 1


不注意的话,还真的有点无所适从,Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
这个异常是由于主键设置为自增长,而在我们插入记录的时候设置了ID的值导致的。看下我的Hibernate映射文件中ID的定义:

参考文章:http://hi.baidu.com/shirdrn/blog/item/adec1e82d067ddb86c81191c.html

posted @ 2012-04-18 15:33 GavinMiao 阅读(10571) | 评论 (0)编辑 收藏

java.lang.IllegalStateException: Cannot forward after response has been committed

现象:
页面报500.
原因:
在request.getRequestDispatcher("/success.html").forward(request, response);
后面还有未执行的代码,但是已经提交了响应。

posted @ 2012-04-14 09:08 GavinMiao 阅读(472) | 评论 (0)编辑 收藏

UML初接触

1.UML:unified modeling Language(统一建模语言)
2.草图与蓝图:
前者指:手工绘制的、规范度较低的UML模型;
后者指:case工具绘制的正式的、规范的UML模型;
3.不同可视性的符号:
“+”:public   “#”:protected  “-”:private  “~”:package
4.UML主要包含三种图:静态图、动态图、物理图
5.关联关系:用来表示一个对象持有另外一个对象的引用,或是调用另外一个对象的方法
6.类图:


7.类图之间的关联:
—▷▷  —>持有

posted @ 2012-04-13 11:34 GavinMiao 阅读(313) | 评论 (0)编辑 收藏

面试题(互联网网上商城行业)

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-04-12 22:39 GavinMiao 阅读(108) | 评论 (0)编辑 收藏

不用临时变量交换两个数

方法1:
a=a^b;
b=a^b;
a=a^b;
方法2:
a=a+b;
b=a-b;
a=a-b;

posted @ 2012-04-12 11:27 GavinMiao 阅读(403) | 评论 (0)编辑 收藏

易宝支付面试题(根据网上总结)

1.public class TestKnowleage5 {
public static void main(String[] args){
String strValue = "ABCDEFG";
strValue.substring(3);
System.out.println("result1"+strValue);
strValue.concat("123");
System.out.println("result2"+strValue);
String value = new String("ABCDEFG");
System.out.println(strValue==value);
}
}

运行结果:
result1ABCDEFG
result2ABCDEFG
false
2.public class Test{
    public static void main(String[] args){
         int x = 100;
int y = 200;
if(x == y)
System.out.println("not equal");
else
System.out.println("equal");
    }
}

运行结果:
equal

3.public class TestKnowleage5 {
public static void main(String[] args){
try{
new TestKnowleage5().methodA(5);
}catch(IOException e){
System.out.println("caught IOException");
}catch(Exception e){
System.out.println("caught Exception");
}finally{
System.out.println("no Exception");
}
}
public void methodA(int i) throws IOException{
if(i%2 != 0){
throw new IOException("methodA IOException");
}
}
}

运行结果:
caught IOException
no Exception

4.public class TestKnowleage5 {
static boolean isTrue(){
System.out.println("isTrue");
return true;
}
static boolean isFalse(){
System.out.println("isFalse");
return false;
}
public static void main(String[] args){
if(isTrue() || isFalse()){
System.out.println("|| operate return true");
}
if(isFalse() & isTrue()){
System.out.println("& operate return true");
}
}
}

运行结果:
isTrue
|| operate return true
isFalse
isTrue

5.public class TestKnowleage5{
public static void main(String args[]){
MyThread t = new MyThread();
t.run();
t.start();
System.out.println("A");
}
}
class MyThread extends Thread{
public void run(){
try{
Thread.currentThread().sleep(3000);
}catch(InterruptedException e){
}
System.out.println("B");
}
}
运行结果:
BBA或
BAB
6.class A{
void fun1(){
System.out.println(fun2());
}
int fun2(){
return 123;
}
}
public class TestKnowleage5  extends A{
int fun2(){
return 456;
}
public static void main(String[] args){
A a;
TestKnowleage5 b = new TestKnowleage5();
b.fun1();
a = b;
a.fun1();
}
}

运行结果:
456
456
7.class A{
int val;
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
}
public class TestKnowleage5{
public static void main(String[] args){
A data = new A();
ArrayList list = new ArrayList();
for(int i=100;i<103;i++){
data.setVal(i);
list.add(data);
}
int j = 0;
while(j<list.size()){
A tmp = (A)list.get(j);
System.out.println("list("+j+")="+tmp.getVal());
j++;
}
}
}

运行结果:
list(0)=102
list(1)=102
list(2)=102

8.hibernate导入大量数据时,为了避免内存中产生大量对象,在编码时注意什么,如何去除?

9.视图与表的区别
10.触发器有哪几种类型
11.
事务操作有那几个步骤
12.写出对应正则表达式:
1)1-6位字母或数字;
[a-zA-Z0-9]{1,6}
2)手机号(只能是139或159开头,11位数字)
1[35][9][0-9]{8}
13.字符串反转:new StringBuilder(str).reverse().toString();
14.写程序:1+2²+3²+...+n²
int func(int n){
    return n==1?1:func(n-1)+n*n
}

15.写一个延迟加载的单例模式:
public class SingleTon{
    private static  SingleTon  instance = null;
    private SingleTon(){}
    public static SingleTon getInstance(){
        if(instance == null){
                synchronized(""){
                    if(instance == null){return new SingleTon();}
                }
        }
        return instance;
    }
}

16.
JSP的9种内置对象:
request:
HttpServletRequest类的实例,
客户端的请求信息被封装在request对象中
response:
HttpServletResponse类的实例,
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。
out:
out对象是JspWriter类的实例,是向客户端输出内容常用的对象
session:
session对象指的是客户端与服务器的一次会话,从客户端连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例
page:
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
application:
ServletContext类的实例,
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭
exception:
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
pageContext:
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext
config:
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
17.session和cookie的区别?
18.JDBC的操作步骤?

posted @ 2012-04-11 11:32 GavinMiao 阅读(1534) | 评论 (0)编辑 收藏

面试题(移动通信方面)

1.方法重载与多态,简述;
2.什么是设计模式?使用过哪些?
3.列出熟悉的java开源项目及简述;
4.一组radio,用alert弹出当前所选的是第几个radio?用原生javascript;
5.function showme(){
Book.prototype.abc = function(){
alert('456');
}
var abook = new Book(1,2);
Book.abc = function(){
alert('123');
}
abook.abc();
Book.abc();
abc();//此方法调用浏览器会报错,未定义
}
function Book(a,b){
this.a = a;
this.b = b;
Book.abc = function(){
alert('def');
}
this.abc = function(){
alert('xyz');
}
abc = function(){
alert('@@@@@@');
}
var abc = function(){
alert('$$$$$$');
}
}

点击按钮调用showme(),页面显示结果为:
第一个弹出框:xyz
第二个弹出框:123

6.线程的四种状态?
7.ext有哪些组件?ext如何与后台交互?
8.HashMap放入、查找、删除,将所有value放入一个数组,得到map中所有内容;List添加、查找、删除;
9.List<Student> student(name,age) 比较oldList<Student>和newList<student>,按名字比较,获得新增的、修改的、删除学生列表;
10.使用过哪些xml技术?怎么实现的?
11.java异常:throws、throw、try、catch、finally,举例,如何处理异常
12.字符串反转:
public class TestKnowleage5 {
public static void main(String[] args){
System.out.println(reverse("abc"));
System.out.println(reverse2("abc"));
System.out.println(reverse3("abc"));
}
public static String reverse(String str){
return new StringBuffer(str).reverse().toString();
}
public static String reverse2(String str){
char[] chs = str.toCharArray();
char[] re = new char[chs.length];
for(int i = 0 ; i<chs.length;i++){
re[i] = chs[chs.length - i - 1]; 
}
return new String(re);
}
public static String reverse3(String str){
char[] chs = str.toCharArray();
String re = ""; 
for(int i = 0;i<chs.length;i++){
re += chs[chs.length - 1 -i];
}
return re;
}
}

posted @ 2012-04-10 22:39 GavinMiao 阅读(524) | 评论 (0)编辑 收藏

面试题(ERP行业)

//此句,编译无法通过,Cannot make a static reference to the non-static field b
1.arrayList、linkedList、vector的区别
2.
写几种J2EE规范并简要描述
3.什么是设计模式?用过哪些设计模式?
4.OO的四大特性是哪些?并简要描述
5.方法重载、多态概念及简要描述;
6.sql常用的优化方法有哪些?
7.sleep()与wait()的区别?
8.
public class TestException {
public static void main(String[] args) {
int i = 1;
switch(i){
case 0:
System.out.println(0);
break;
case 1:
System.out.println(1);
default:
System.out.println(4);
case 2:
System.out.println(2);
case 3:
System.out.println(3);
}
}
}
运行结果:
1
4
2
3
9.HashTable和HashMap的区别
10.怎样理解mvc模式?
11.抽象类、接口的区别?
12.智力题:
有1-7号,7块地,S、U、V、W、X 5个遗产继承者,
S若继承2号,不能继承3号;
3号和4号不能同时继承;
S若继承一块或多块地,则U不能继承
1块地不能被2人合分;

问:若S继承2号地,剩余3个人中,不能同时哪2块地?
A:1和6 B:1和7 c:3和7 d:1和5 e:1和3
13.
public class TestKnowleage5 {
static int a;
int b,c=0;
public static void main(String[] args){
a++;
b++;//此句,编译无法通过,Cannot make a static reference to the non-static field b
c++; //此句,编译无法通过,cannot make a static reference to the non-static field c
}
}


参考文章:

posted @ 2012-04-10 21:59 GavinMiao 阅读(513) | 评论 (0)编辑 收藏

用友面试题(参考网上总结而出)

1,有三个jsp页面:a.jsp b.jsp c.jsp,流程是a.jsp--> b.jsp--> c.jsp,其中a.jsp提交的数据要在c.jsp中访问,用最简单的办法怎么做?不用session。
在b.jsp中放N个hidden隐藏域保存a.jsp中的数据,一起提交到c.jsp,在c.jsp中取出。2.sql server支持集群么?
支持,不过属于热备份类型,不能做负载均衡。不过符合你的条件
首先系统做集群,数据库文件放到磁盘阵列里,双机或多机共同访问磁盘阵列,就可以了,可以集群后做负载均衡;
3.HashTable与HashMap的区别:
1)HashMap非线程安全,HashTable线程安全;
2)HashMap可放一条key为空的记录,任意记录的value可为空,hashTable不可以;
3)hashMap去掉了contains方法,增加了containsKey和containsValue方法;
4.如何理解mvc模式:
mvc是sun提出的model2开发模式,将控制、视图、模型进行了分离;提高了可维护性、扩展性、可移植性、组件的可复用性;
5.SingleTon:
6.对象序列化的含义:
java序列化技术可以使你将一个对象的状态写入一个byte流里,并且可以从其它地方把该byte流里的数据读出来,重新构造一个相同的对象。
这种机制允许你将对象通过网络传播,并且随时可以把对象持久化到数据库、文件等系统里,java的序列化技术是RMI、EJB等技术的基础;
实现方法:implements Serializable标记为可序列化,然后用ObjectOutputStream和ObjectInputStream读写;
7.数据库中的锁包含哪些?
排它锁和共享锁
8.jsp和servlet的区别:
1)简单来说:jsp就是含有java代码的html,servlet就是含有html的java代码;
2)jsp最终被解释成servlet,编译再执行,jsp不过是servlet的另一种编写形式;
3)jsp擅长表示,servlet擅长数据处理,在mvc中jsp处于视图层,servlet处于控制层;
9.oracle在数据库中的交集怎么表示:
1)用intersect操作符 2)用in 语句
9.JNDI、JMS、JTA、RMI:

JNDI:java naming and directory interface java命名目录接口
JMS:java messing service java消息服务
JTA:java transaction api java事务api
RMI:
Remote Method Invocation 远程方法调用

10.事务:

1)ACID属性:
A:atomic 原子性
C:consistent 一致性
I:isolation 隔离性
D:duration 持久性
2)概念:事务就是一系列操作,它们完成一项任务。只要这些操作里有一项没成功,事务就操作失败,发生回滚事件。即撤销前面的操作,这样可以保证数据的一致性。而且可以把操作放在缓存里,等所有操作都成功就提交数据库,这样保证费时的操作都是有效操作。
3)隔离级别 4)传播行为
参考文档:http://wenku.baidu.com/view/56a532eb856a561252d36f81.html

posted @ 2012-04-09 11:32 GavinMiao 阅读(1066) | 评论 (0)编辑 收藏

面试题(某呼叫中心)

1.String b = new String("1"+"2"); -->4个
2.Customer(id,name,phone,country);每个客户均有地区(country)属性,每个地区可有1或多个客户,查询拥有超过10名客户的地区的列表;
3.public interface TreeNode{
    String getName();
    List getChildren();
}
 写一个print()方法,打印各级节点名称.

4.String与StringBuffer的区别?
String
5.ajax名词解释,它的核心价值及原理;
6.事务的概念及名词解释;
7.数据库表之间有几种关系,并举例;
8.Filter的原理,常见用例;
9.视图与表的区别?触发器类型有哪些类型?
10.建表及各种约束;
11.hibernate导入大量数据时,为了避免内存中产生大量对象,在编码时注意什么,如何去除?

posted @ 2012-04-07 00:14 GavinMiao 阅读(752) | 评论 (0)编辑 收藏

String面试题

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-04-06 18:26 GavinMiao 阅读(81) | 评论 (0)编辑 收藏

面试题(通信行业公司)

一、unix:
1.ps -ef|grep tomcat
2.mkdir dir
3.打tar包:tar -cvf XXX.tar XXX
4.解压tar包:tar -xvf XXX.tar
二、java
1.HashMap和HashTable的区别:
HashMap不是线程安全的,
HashTable是线程安全的
HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
HashTable使用Enumeration,HashMap使用Iterator。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
Hashtable是基于陈旧的Dictionary类,完成了Map接口;HashMap是Java 1.2引进的Map接口的一个实现(HashMap继承于AbstractMap,AbstractMap完成了Map接口)。
HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
哈希值的使用不同,HashTable直接使用对象的hashCode。
2.什么是java的序列化?如何实现java的序列化:

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

3.什么是java的单例模式?写一个单例模式;
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

  代码清单1:饿汉式单例类

public class EagerSingleton 

    private static final EagerSingleton m_instance = new EagerSingleton(); 

   /** 
   * 私有的默认构造方法 
   */
 
   private EagerSingleton() { } 

   /** 
   * 静态方法获得单例 
   */ 
   public static EagerSingleton getInstance() 
   {
      return m_instance; 
   }
}

代码清单2:懒汉式单例类

package com.javapatterns.singleton.demos;
public class LazySingleton
{
    private static LazySingleton m_instance = null;


    /**
    * 私有的默认构造方法,保证外界无法直接实例化
    */
    private LazySingleton() { }


    /**
    * 静态方法,返还此类的惟一实例
    */
    public synchronized static LazySingleton getInstance()
    {
        if (m_instance == null)
        {
            m_instance = new LazySingleton();
        }
        return m_instance;
    }
}

4.静态块与构造器在继承中的执行顺序:

public class TestExeuteOrder {

public static void main(String[] args) {
Parent p = new ChildTest();
p = new ChildTest();

}

}
class ChildTest extends Parent{
static{
System.out.println("in child static");
}
public ChildTest(){
System.out.println("in child construtor");
}
}

class Parent{
static{
System.out.println("in parent static");
}
public Parent(){
System.out.println("in parent construtor");
}
}
运行结果:
in parent static
in child static
in parent construtor
in child construtor
in parent construtor
in child construtor
5.成员内部类:
public class TestExeuteOrder{
class Inner{
void test(){
if(TestExeuteOrder.this.flag){
System.out.println("what a funny");
}
}
}
private boolean flag = true;
public TestExeuteOrder(){
new Inner().test();
}
public static void main(String[] args){
new TestExeuteOrder();
}
}
运行结果:
what a funny
6.参数传递:
public class TestExeuteOrder{

public static void main(String[] args){
String a = "ello";
TestExeuteOrder t = new TestExeuteOrder();
t.change(a);
System.out.println(a);
}
public void change(String str){
str += "H";
}
}
结果:
ello
7.参数传递2:
public class TestExeuteOrder{

public static void main(String[] args){
StringBuffer x = new StringBuffer("A");
StringBuffer y = new StringBuffer("B");
change(x,y);
System.out.println(x+" "+y);
}
public static void change(StringBuffer a,StringBuffer b){
a.append(b);
b = a;
}
}
结果为:
AB B
8.

public class TestExeuteOrder{
public static void main(String[] args){
String a = "good";
char[] b = new char[]{'a','b','c'};
method(a,b);
System.out.println("a="+a+"------>b="+new String(b));
}
public static void method(String a,char[] b){
a = "Test ok";
b[0] = 'g';
}
}
结果:
a=good------>b=gbc
三、SQL:

 

1.存储过程与函数的区别:
1)前者,程序头部声明用的是procedure;后者,程序头部声明用的是function;
2)前者,不需要描述返回类型,后者需要;
3)前者可以作为一个独立的pl/sql语句来执行;后者不能独立运行,必须作为表达式的一部分条用;
4)sql语句中不可调用procedure,但可以调用function;
2.查询student表中name重复的记录:

select * from student where name in(select name from student group by sname having count(*) >1);

3.table表中有两列A,B,如果A>B选择A,如果A<B,选择B:

select( case when s1.A>s1.B then s1.A  when s1.A<s1.B then s1.B end) re from student s1;

 

posted @ 2012-03-30 16:00 GavinMiao 阅读(733) | 评论 (0)编辑 收藏

异常积累:NoClassDefFoundError: org/hibernate/ConnectionReleaseMode Error creating bean with name 'sessionFactory'

jar包不全,更新lib目录后,不再报错。

posted @ 2012-03-28 16:06 GavinMiao 阅读(388) | 评论 (0)编辑 收藏

公司口碑及待遇评价的网站

1.公司速查手册 :http://www.b1.tooyard.com/
2.分智网:http://www.fenzhi.com/  
3.我评it:http://wopingit.com/   
4.企业点评网:http://www.71dp.com/   
5.中国企业评价网: http://www.ceea.net.cn/  
6.公司点评网:http://www.gsdpw.com/  
7.企业付费邀请面试:http://www.tradecv.com/

posted @ 2012-03-27 23:13 GavinMiao 阅读(1048) | 评论 (1)编辑 收藏

ftp-java实现

一、利用框架:
1.jre下的rt.jar中sun.net.ftpClient
2.common net 中的ftp包
二、ftp协议认识:
参考规范:RFC 959
1.文件传输协议:file transfer protocol (ftp)
2.名词解释:
DTP:
数据传输过程
EOR:记录尾
PI:协议解释器
NTV:
网络虚拟终端
NVFS:
网络虚拟文件系统
3.
控制连接是建立在USER-PIT和SERVER-PI之间用于交换命令与应答的通信链路。
4.
数据连接是传输数据的全双工连接。传输数据可以发生在服务器DTP和用户DTP之间也可以发生在两个服务器DTP之间。
5.
数据连接只传输数据,控制连接传送命令和响应。
6.
FTP使用Telnet协议进行控制连接
7.




参考文章:http://blog.csdn.net/williamzhou/article/details/215293 

posted @ 2012-03-26 18:03 GavinMiao 阅读(377) | 评论 (0)编辑 收藏

ssh集成中session的管理(转载)

     摘要: 文章来源:http://www.iteye.com/topic/7339711.通过getSession()方法获得session进行操作 Java代码  public class Test  extends HibernateDaoSupport{      ...  阅读全文

posted @ 2012-03-23 15:33 GavinMiao 阅读(4713) | 评论 (0)编辑 收藏

spring2.0学习笔记

一、setter DI:
<bean>
    <property name="">
        <ref bean="bean的name或id"/>
    </property>
    <property name="">
        <!--内部bean-->
        <bean></bean>
    </property>
    <property name="">
        <ref local="只能是同一文件的bean的id"/>
    </property>
    <!--idref元素用来引用其它bean的id,spring会验证id是否存在-->
    <property name="">
        <idref bean=""/>
    </property>
    <!--idref元素的local属性用来引用其它bean的id,spring会验证id是否存在,并且验证与引用的bean是否在同一文件-->
    <property name="">
        <idref local=""/>
    </property>
    <property name="">
        <value></value>
    </property>
    <property name="" ref=""/>
    <property name="" value=""/>
    <property name="">
        <null/>
    </property>
    <property name="">
            <props>
                <prop key=""></prop>
                 <prop key=""></prop>
            </props>
    </property>

    <property name="">
        <list>
            <value></value>
            <ref bean=""/>    
        </list>
    </property>

    <property name="">
        <set>
            <value></value>
            <ref bean=""/>    
        </set>
    </property>

    <property name="">
        <map>
            <entry>
                <key>
                    <value></value>
                </key>
                <value></value>
            </entry>
            <entry key="" value=""/><!--推荐-->
            <entry key="">
                <value>
                </value>
            </entry>
            <entry key-ref="" value-ref=""/>
            <entry>
                <key>
                    <value></value>
                </key>
                <ref bean=""/>
            </entry>
        </map>
    </property>
</bean>
二、contructor DI:
<bean>
    <constructor-arg>
        <ref bean=""/>
    </constructor-arg>
    <constructor-arg ref="bean的name或id"/>
    <constructor-arg value=""/>
    <constructor-arg type="" value=""/>
    <constructor-arg index="" value=""/><!--首选-->
</bean>

posted @ 2012-03-22 17:52 GavinMiao 阅读(338) | 评论 (0)编辑 收藏

spring1.1学习笔记

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-03-21 17:34 GavinMiao 阅读(60) | 评论 (0)编辑 收藏

spring2.5新特性

1.spring2.5完全支持java1.6
2.完全支持Java EE 5
3.spring2.5提供了完整的annotation集合:@Autowired,以及对JSR-250注解@Resource,@PostConstruct,@PreDestroy
4.在classpath中自动搜索带有annotation的组件。
5.spring2.5加入了对bean(...)pointcut元素的支持,在spring定义的bean命名中对指定的命名进行匹配
6.在spring应用中使用AspectJ加载时织入context:load-time-weaver
7.增加,通过context:load-time-weaver和tx:annotation-driven mode="aspectj"联合使用的注解驱动的事务管理
8.对JPA,升级到支持Open JPA1.0
9.2.5显著的扩充了SimpleJdbcTemplate的功能,引入了SimpleJdbcCall和SimpleJdbcInsert操作对象
10,web层,增加了基于注解的Controller
11.spring2.5引入了基于annotation的MVC编程模型,使用@RequestMapping、@RequestParam、@ModelAttribute等等
12.增加对tiles2的支持
13.引入了sping TestContext Framework,它提供了注解驱动的单元和集成测试支持

posted @ 2012-03-20 17:57 GavinMiao 阅读(539) | 评论 (0)编辑 收藏

spring2.0新特性

1.
引入request scope、session scope和可自定义的scope(hooks)
2.
引入了XML 
Schema的namespace,
简化了配置,包括了对bean属性的各种简化,AOP配置的简化,事务配置的简化,JNDI配置的简化等方面
3.spring2.0集成了AspectJ切入点(pointcut)语言和@AspectJ切面(aspect)声明类型
4.支持@AspectJ注解定义切面
5.提供了JPA的抽象层
6.对于JMS,spring2.0提供异步接受消息
7.对于jdbc,增加了NamedParameterJdbcTemplate、SimpleJdbcTemplate
8.对java1.5的支持,结合AspectJ使用@Transactional、使用AspectJ来为domain object进行依赖注入、@AspectJ、@Required、SimpleJdbcTemplate

posted @ 2012-03-20 17:37 GavinMiao 阅读(291) | 评论 (0)编辑 收藏

window下dos窗口中文乱码解决办法


进入注册表:
HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe
新建DWORD值,然后重命名为:CodePage,修改其值为十进制的936

posted @ 2012-03-20 11:16 GavinMiao 阅读(534) | 评论 (0)编辑 收藏

java中的位运算应用

1, a & 0xff 可得到a对应而二进制的最后8位;
2,左移n位--》表示乘以2的N次方
3,  右移n位-->表示除以2的N次方

posted @ 2012-03-19 16:36 GavinMiao 阅读(361) | 评论 (0)编辑 收藏

spring整合struts2

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-03-16 14:55 GavinMiao 阅读(21) | 评论 (0)编辑 收藏

spring2.0整合struts1(转载)

     摘要: 文章来源:http://hi.baidu.com/liuzhe041/blog/item/e12251dcf2ffe053ccbf1ad2.htmlspring 和struts整合 有3种方式,推荐用第三种。下面一一介绍,不管使用哪种方式,都需要在web.xml 中配置 spring的 监听器Java代码 <context-param>   &n...  阅读全文

posted @ 2012-03-16 10:14 GavinMiao 阅读(276) | 评论 (0)编辑 收藏

spring整合hibernate(annotation方式)

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-03-15 11:08 GavinMiao 阅读(72) | 评论 (0)编辑 收藏

spring整合hibernate

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-03-14 17:42 GavinMiao 阅读(67) | 评论 (0)编辑 收藏

java播放wav的基础代码(转载)

 文章来源:http://hi.baidu.com/breezedancer/blog/item/7eebb499680d8f086e068cb9.html 

import javax.sound.sampled.*;
import java.io.*;
public class TestMusic{
 
 private AudioFormat format;
    private byte[] samples;
 
 public static void main(String args[])throws Exception{
  TestMusic sound =new TestMusic("1.wav");
  InputStream stream =new ByteArrayInputStream(sound.getSamples());
        // play the sound
        sound.play(stream);
        // exit
        System.exit(0);
 }
 
    public TestMusic(String filename) {
        try {
            // open the audio input stream
            AudioInputStream stream =AudioSystem.getAudioInputStream(new File(filename));
            format = stream.getFormat();
            // get the audio samples
            samples = getSamples(stream);
        }
        catch (UnsupportedAudioFileException ex) {
            ex.printStackTrace();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
   }
   
   public byte[] getSamples() {
        return samples;
    }
   
     private byte[] getSamples(AudioInputStream audioStream) {
        // get the number of bytes to read
        int length = (int)(audioStream.getFrameLength() * format.getFrameSize());

        // read the entire stream
        byte[] samples = new byte[length];
        DataInputStream is = new DataInputStream(audioStream);
        try {
            is.readFully(samples);
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }

        // return the samples
        return samples;
    }
 
 public void play(InputStream source) {

        // use a short, 100ms (1/10th sec) buffer for real-time
        // change to the sound stream
        int bufferSize = format.getFrameSize() *
            Math.round(format.getSampleRate() / 10);
        byte[] buffer = new byte[bufferSize];

        // create a line to play to
        SourceDataLine line;
        try {
            DataLine.Info info =
                new DataLine.Info(SourceDataLine.class, format);
            line = (SourceDataLine)AudioSystem.getLine(info);
            line.open(format, bufferSize);
        }
        catch (LineUnavailableException ex) {
            ex.printStackTrace();
            return;
        }

        // start the line
        line.start();

        // copy data to the line
        try {
            int numBytesRead = 0;
            while (numBytesRead != -1) {
                numBytesRead =
                    source.read(buffer, 0, buffer.length);
                if (numBytesRead != -1) {
                   line.write(buffer, 0, numBytesRead);
                }
            }
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }

        // wait until all data is played, then close the line
        line.drain();
        line.close();

    }


}

posted @ 2012-03-14 14:30 GavinMiao 阅读(1464) | 评论 (0)编辑 收藏

informix小知识

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-03-13 17:05 GavinMiao 阅读(62) | 评论 (0)编辑 收藏

延迟加载

也叫延迟检索或懒加载
一.实现方式:
1.*hbm.xml中的class元素的lazy属性设置为true;
2.*hbm.xml中的set元素的lazy属性设置为true;
3.
@[One|Many]ToOne](fetch=FetchType.LAZY) @LazyToOne(PROXY) @Fetch(SELECT)
@[One|Many]ToOne](fetch=FetchType.EAGER) @LazyToOne(FALSE) @Fetch(JOIN)
@ManyTo[One|Many](fetch=FetchType.LAZY) @LazyCollection(TRUE)@Fetch(SELECT)
@ManyTo[One|Many](fetch=FetchType.EAGER) @LazyCollection(FALSE) @Fetch(JOIN)

参考文章:

posted @ 2012-03-13 10:46 GavinMiao 阅读(345) | 评论 (0)编辑 收藏

hibernate注意点

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-03-13 09:53 GavinMiao 阅读(63) | 评论 (0)编辑 收藏

commit()与flush()的区别

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-03-13 09:23 GavinMiao 阅读(74) | 评论 (0)编辑 收藏

load与get的区别

1.如果数据库没有匹配的记录,load()方法可能会抛出无法恢复的异常(unrecoverable exception);get()方法会返回null;
2.load可以使用延迟加载;get不可以;


load与get的工作原理:
get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;
若设置了lazy=true,load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库;
未设置lazy=true时,与get方法相同;
注意:
到底使用谁:如果不确定是否有匹配的行存在,应该使用get方法。

posted @ 2012-03-13 09:02 GavinMiao 阅读(265) | 评论 (0)编辑 收藏

Linux系统参数查询命令

查看操作系统版本:
head -n 1 /etc/issue
Red Hat Enterprise Linux Server release 6.0 (Santiago)
查看cpu信息:
cat /proc/cpuinfo
model name      : Intel(R) Xeon(R) CPU           E5450  @ 3.00GHz
查看内存使用情况:
free -m
查看各分区使用情况:
df -h 
查看指定目录的大小
du -sh <目录名>
查看内存总量:
grep MemTotal /proc/meminfo
查看空闲内存量:
grep MemFree /proc/meminfo
查看实时的内存情况:
top

posted @ 2012-03-12 15:06 GavinMiao 阅读(607) | 评论 (0)编辑 收藏

呼叫中心企业

参考:http://www.ctiforum.com/expo/2012/ccec2012spring/010.htm 

华为技术有限公司
阿尔卡特朗讯
Genesys,阿尔卡特朗讯旗下公司
Dialogic公司
中国联通
中国电信集团号百信息服务有限公司
北京英立讯科技有限公司
杭州远传通信技术有限公司
奥迪坚通讯系统(上海)有限公司
缤特力贸易(苏州)有限公司
新太科技股份有限公司
深圳市东进通讯技术股份有限公司
Teleopti
广州市毅航通信技术有限公司
潮流网络技术有限公司
杭州三汇信息工程有限公司
亿迅(中国)软件有限公司
大唐高鸿数据网络技术股份有限公司
深圳市友邻通讯设备有限公司
北京易才博普奥管理顾问有限公司
北京天润融通科技有限公司
广州市杰音通讯科技有限公司
北京直真信通科技有限公司
广州市北恩电声技术有限公司
北京七星蓝图科技有限公司
北京科特尔泰讯科技有限公司
北京云端时代科技有限公司
北京宏盛高新技术有限公司
北京纽曼腾飞科技有限公司

posted @ 2012-03-09 15:26 GavinMiao 阅读(278) | 评论 (0)编辑 收藏

javascript面向对象

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-03-09 11:14 GavinMiao 阅读(85) | 评论 (0)编辑 收藏

不同厂商JDK下载网址



各厂商JDK官网下载地址: 
1、Oracle JDK,介质分32位和64位,分Linux、Solaris、Windows平台 
http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html 
2、HP JDK,介质不分32位和64位,分PA和IA平台 
https://h20392.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumber=HPUXJDKJRE60 
3、IBM JDK,介质分32位和64位 
https://www.ibm.com/developerworks/java/jdk/aix/service.html#i1 


参考文章:
http://shuwen.iteye.com/blog/1149992

posted @ 2012-03-08 15:30 GavinMiao 阅读(866) | 评论 (0)编辑 收藏

转载:Response.ContentType 详细列表

文章来源:http://www.cnblogs.com/chenghm2003/archive/2008/10/19/1314703.html

不同的ContentType 会影响客户端所看到的效果.默认的ContentType为 text/html 也就是网页格式.
代码如:
<% response.ContentType ="text/html" %> 
<!--#i nclude virtual="/ContentType.html" -->

显示的为网页,而
<% response.ContentType ="text/plain" %> 
<!--#i nclude virtual="/sscript/ContentType.html" -->

则会显示html原代码.

以下为一些常用的 ContentType
GIF images 
<% response.ContentType ="image/gif" %> 
<!--#i nclude virtual="/myimage.gif" -->

JPEG images 
<% response.ContentType ="image/jpeg" %> 
<!--#i nclude virtual="/myimage.jpeg" -->

TIFF images 
<% response.ContentType ="image/tiff" %> 
<!--#i nclude virtual="/myimage.tiff" -->

MICROSOFT WORD document 
<% response.ContentType ="application/msword" %> 
<!--#i nclude virtual="/myfile.doc" -->

RTF document 
<% response.ContentType ="application/rtf" %> 
<!--#i nclude virtual="/myfile.rtf" -->

MICROSOFT EXCEL document 
<% response.ContentType ="application/x-excel" %> 
<!--#i nclude virtual="/myfile.xls" -->

MICROSOFT POWERPOINT document 
<% response.ContentType ="application/ms-powerpoint" %> 
<!--#i nclude virtual="/myfile.pff" -->

PDF document 
<% response.ContentType ="application/pdf" %> 
<!--#i nclude virtual="/myfile.pdf" -->

ZIP document 
<% response.ContentType ="application/zip" %> 
<!--#i nclude virtual="/myfile.zip" -->



下面是更详细的ContentType
'ez' => 'application/andrew-inset', 
'hqx' => 'application/mac-binhex40', 
'cpt' => 'application/mac-compactpro', 
'doc' => 'application/msword', 
'bin' => 'application/octet-stream', 
'dms' => 'application/octet-stream', 
'lha' => 'application/octet-stream', 
'lzh' => 'application/octet-stream', 
'exe' => 'application/octet-stream', 
'class' => 'application/octet-stream', 
'so' => 'application/octet-stream', 
'dll' => 'application/octet-stream', 
'oda' => 'application/oda', 
'pdf' => 'application/pdf', 
'ai' => 'application/postscript', 
'eps' => 'application/postscript', 
'ps' => 'application/postscript', 
'smi' => 'application/smil', 
'smil' => 'application/smil', 
'mif' => 'application/vnd.mif', 
'xls' => 'application/vnd.ms-excel', 
'ppt' => 'application/vnd.ms-powerpoint', 
'wbxml' => 'application/vnd.wap.wbxml', 
'wmlc' => 'application/vnd.wap.wmlc', 
'wmlsc' => 'application/vnd.wap.wmlscriptc', 
'bcpio' => 'application/x-bcpio', 
'vcd' => 'application/x-cdlink', 
'pgn' => 'application/x-chess-pgn', 
'cpio' => 'application/x-cpio', 
'csh' => 'application/x-csh', 
'dcr' => 'application/x-director', 
'dir' => 'application/x-director', 
'dxr' => 'application/x-director', 
'dvi' => 'application/x-dvi', 
'spl' => 'application/x-futuresplash', 
'gtar' => 'application/x-gtar', 
'hdf' => 'application/x-hdf', 
'js' => 'application/x-javascript', 
'skp' => 'application/x-koan', 
'skd' => 'application/x-koan', 
'skt' => 'application/x-koan', 
'skm' => 'application/x-koan', 
'latex' => 'application/x-latex', 
'nc' => 'application/x-netcdf', 
'cdf' => 'application/x-netcdf', 
'sh' => 'application/x-sh', 
'shar' => 'application/x-shar', 
'swf' => 'application/x-shockwave-flash', 
'sit' => 'application/x-stuffit', 
'sv4cpio' => 'application/x-sv4cpio', 
'sv4crc' => 'application/x-sv4crc', 
'tar' => 'application/x-tar', 
'tcl' => 'application/x-tcl', 
'tex' => 'application/x-tex', 
'texinfo' => 'application/x-texinfo', 
'texi' => 'application/x-texinfo', 
't' => 'application/x-troff', 
'tr' => 'application/x-troff', 
'roff' => 'application/x-troff', 
'man' => 'application/x-troff-man', 
'me' => 'application/x-troff-me', 
'ms' => 'application/x-troff-ms', 
'ustar' => 'application/x-ustar', 
'src' => 'application/x-wais-source', 
'xhtml' => 'application/xhtml+xml', 
'xht' => 'application/xhtml+xml', 
'zip' => 'application/zip', 
'au' => 'audio/basic', 
'snd' => 'audio/basic', 
'mid' => 'audio/midi', 
'midi' => 'audio/midi', 
'kar' => 'audio/midi', 
'mpga' => 'audio/mpeg', 
'mp2' => 'audio/mpeg', 
'mp3' => 'audio/mpeg', 
'aif' => 'audio/x-aiff', 
'aiff' => 'audio/x-aiff', 
'aifc' => 'audio/x-aiff', 
'm3u' => 'audio/x-mpegurl', 
'ram' => 'audio/x-pn-realaudio', 
'rm' => 'audio/x-pn-realaudio', 
'rpm' => 'audio/x-pn-realaudio-plugin', 
'ra' => 'audio/x-realaudio', 
'wav' => 'audio/x-wav', 
'pdb' => 'chemical/x-pdb', 
'xyz' => 'chemical/x-xyz', 
'bmp' => 'image/bmp', 
'gif' => 'image/gif', 
'ief' => 'image/ief', 
'jpeg' => 'image/jpeg', 
'jpg' => 'image/jpeg', 
'jpe' => 'image/jpeg', 
'png' => 'image/png', 
'tiff' => 'image/tiff', 
'tif' => 'image/tiff', 
'djvu' => 'image/vnd.djvu', 
'djv' => 'image/vnd.djvu', 
'wbmp' => 'image/vnd.wap.wbmp', 
'ras' => 'image/x-cmu-raster', 
'pnm' => 'image/x-portable-anymap', 
'pbm' => 'image/x-portable-bitmap', 
'pgm' => 'image/x-portable-graymap', 
'ppm' => 'image/x-portable-pixmap', 
'rgb' => 'image/x-rgb', 
'xbm' => 'image/x-xbitmap', 
'xpm' => 'image/x-xpixmap', 
'xwd' => 'image/x-xwindowdump', 
'igs' => 'model/iges', 
'iges' => 'model/iges', 
'msh' => 'model/mesh', 
'mesh' => 'model/mesh', 
'silo' => 'model/mesh', 
'wrl' => 'model/vrml', 
'vrml' => 'model/vrml', 
'css' => 'text/css', 
'html' => 'text/html', 
'htm' => 'text/html', 
'asc' => 'text/plain', 
'txt' => 'text/plain', 
'rtx' => 'text/richtext', 
'rtf' => 'text/rtf', 
'sgml' => 'text/sgml', 
'sgm' => 'text/sgml', 
'tsv' => 'text/tab-separated-values', 
'wml' => 'text/vnd.wap.wml', 
'wmls' => 'text/vnd.wap.wmlscript', 
'etx' => 'text/x-setext', 
'xsl' => 'text/xml', 
'xml' => 'text/xml', 
'mpeg' => 'video/mpeg', 
'mpg' => 'video/mpeg', 
'mpe' => 'video/mpeg', 
'qt' => 'video/quicktime', 
'mov' => 'video/quicktime', 
'mxu' => 'video/vnd.mpegurl', 
'avi' => 'video/x-msvideo', 
'movie' => 'video/x-sgi-movie', 
'ice' => 'x-conference/x-cooltalk' 


posted @ 2012-03-07 13:13 GavinMiao 阅读(243) | 评论 (0)编辑 收藏

throws与throw的区别

1.throw是语句抛出一个异常,throws是方法抛出异常;
2.throws可声明多个异常,用逗号分割;
3.throws可单独使用,throw必须与try-catch-finally或throws搭配使用;
4.throws表示可能抛出哪些异常,throw是必定抛出这个异常;

posted @ 2012-03-06 09:48 GavinMiao 阅读(338) | 评论 (0)编辑 收藏

flex入门知识


一、
1、下载flex SDK:
http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK 
2、将flexSDK_home/bin加入path环境变量
3、创建mxml文件
4、编译mxml文件:
dos 命令:mxmlc --strict=true --file-specs exer.mxml
5、运行SWF文件:
用Adope flash player运行;

注意:
要查看编译时生成as文件,可使用命令:
mxmlc --keep-generated-actionscript --strict=true --file-specs exer.mxml
二、

posted @ 2012-03-02 15:14 GavinMiao 阅读(315) | 评论 (0)编辑 收藏

java.lang.NoSuchFieldError: deferredExpression

java.lang.NoSuchFieldError: deferredExpression at org.apache.taglibs.standard.tag.common.core.ForEachSupport.release(ForEachSupport.java:178) at org.apache.jasper.runtime.TagHandlerPool.release(TagHandlerPool.java:166) at org.apache.jsp.index_jsp._jspDestroy(index_jsp.java:31)
java ee 5 libraries带了一个jstl-1.2.jar
Reference Libraries里面还有jstl-1.1.2.jar
删除一个就OK

posted @ 2012-02-29 17:23 GavinMiao 阅读(1832) | 评论 (0)编辑 收藏

java小知识注意项

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2012-02-22 17:35 GavinMiao 阅读(39) | 评论 (0)编辑 收藏

CLASS_PATH认识

作用:JRE按CLASS_PATH指定的路径搜索类文件;
注意:
1.一般设置:
CLASS_PATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
2.jdk 1.5以上版本可以不用设置此环境变量;

posted @ 2012-02-22 13:51 GavinMiao 阅读(299) | 评论 (0)编辑 收藏

POI学习

POI所有组件:


posted @ 2012-02-22 10:01 GavinMiao 阅读(286) | 评论 (0)编辑 收藏

tomcat对jsp、servlet版本要求

Apache Tomcat version 5.5 implements the Servlet 2.4 and JavaServer Pages 2.0 specifications  
Apache Tomcat version 6.0 implements the Servlet 2.5 and JavaServer Pages 2.1 specifications 
Apache Tomcat version 7.0 implements the Servlet 3.0 and JavaServer Pages 2.2 
specifications




如果某jar包的META-INF目录下存在对应的tld文件,那么对于JSP1.2+的web 容器,
若把此jar包放在WEB-INF/lib目录下,可以直接引用标签,
不用再web.xml里面配置taglib;

posted @ 2012-02-14 16:31 GavinMiao 阅读(234) | 评论 (0)编辑 收藏

(转载)hiernate 参数

原文地址:http://www.ideagrace.com/html/doc/2007/01/30/08608.html

属性名用途
hibernate.dialect一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.classname.of.Dialect
hibernate.show_sql输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个log category设为debug。 eg. true | false
hibernate.format_sql在log和console中打印出更漂亮的SQL。 取值 true | false
hibernate.default_schema在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. 取值 SCHEMA_NAME
hibernate.default_catalog在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. 取值 CATALOG_NAME
hibernate.session_factory_nameSessionFactory创建后,将自动使用这个名字绑定到JNDI中. 取值 jndi/composite/name
hibernate.max_fetch_depth为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取. 取值 建议在03之间取值
hibernate.default_batch_fetch_size为Hibernate关联的批量抓取设置默认数量. 取值 建议的取值为48, 和16
hibernate.default_entity_mode为由这个SessionFactory打开的所有Session指定默认的实体表现模式. 取值 dynamic-mapdom4jpojo
hibernate.order_updates强制Hibernate按照被更新数据的主键,为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 取值 true | false
hibernate.generate_statistics如果开启, Hibernate将收集有助于性能调节的统计数据. 取值 true | false
hibernate.use_identifer_rollback如果开启, 在对象被删除时生成的标识属性将被重设为默认值. 取值 true | false
hibernate.use_sql_comments如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为false取值 true | false

表 3.4.  Hibernate JDBC和连接(connection)属性

属性名用途
hibernate.jdbc.fetch_size非零值,指定JDBC抓取数量的大小 (调用Statement.setFetchSize()).
hibernate.jdbc.batch_size非零值,允许Hibernate使用JDBC2的批量更新. 取值 建议取530之间的值
hibernate.jdbc.batch_versioned_data如果你想让你的JDBC驱动从executeBatch()返回正确的行计数 , 那么将此属性设为true(开启这个选项通常是安全的). 同时,Hibernate将为自动版本化的数据使用批量DML. 默认值为falseeg. true | false
hibernate.jdbc.factory_class选择一个自定义的Batcher. 多数应用程序不需要这个配置属性. eg. classname.of.Batcher
hibernate.jdbc.use_scrollable_resultset允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时,这个选项才是必要的, 否则Hibernate会使用连接的元数据. 取值 true | false
hibernate.jdbc.use_streams_for_binary在JDBC读写binary (二进制)serializable (可序列化) 的类型时使用流(stream)(系统级属性). 取值 true | false
hibernate.jdbc.use_get_generated_keys在数据插入数据库之后,允许使用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题,请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. 取值 true|false
hibernate.connection.provider_class自定义ConnectionProvider的类名, 此类用来向Hibernate提供JDBC连接. 取值 classname.of.ConnectionProvider
hibernate.connection.isolation设置JDBC事务隔离级别. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. 取值 1, 2, 4, 8
hibernate.connection.autocommit允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). 取值 true | false
hibernate.connection.release_mode指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用after_statement, 这样在每次JDBC调用后,都会主动的释放连接. 对于非JTA的连接, 使用after_transaction在每个事务结束时释放连接是合理的. auto将为JTA和CMT事务策略选择after_statement, 为JDBC事务策略选择after_transaction取值 on_close | after_transaction | after_statement | auto
hibernate.connection.<propertyName>将JDBC属性propertyName传递到DriverManager.getConnection()中去.
hibernate.jndi.<propertyName>将属性propertyName传递到JNDI InitialContextFactory中去.

表 3.5.  Hibernate缓存属性

属性名用途
hibernate.cache.provider_class自定义的CacheProvider的类名. 取值 classname.of.CacheProvider
hibernate.cache.use_minimal_puts以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中,这个设置对的集群缓存非常有用, 对集群缓存的实现而言,默认是开启的. 取值 true|false
hibernate.cache.use_query_cache允许查询缓存, 个别查询仍然需要被设置为可缓存的. 取值 true|false
hibernate.cache.use_second_level_cache能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<cache>的类,会默认开启二级缓存. 取值 true|false
hibernate.cache.query_cache_factory自定义实现QueryCache接口的类名, 默认为内建的StandardQueryCache取值 classname.of.QueryCache
hibernate.cache.region_prefix二级缓存区域名的前缀. 取值 prefix
hibernate.cache.use_structured_entries强制Hibernate以更人性化的格式将数据存入二级缓存. 取值 true|false

表 3.6.  Hibernate事务属性

属性名用途
hibernate.transaction.factory_class一个TransactionFactory的类名, 用于Hibernate Transaction API (默认为JDBCTransactionFactory). 取值 classname.of.TransactionFactory
jta.UserTransaction一个JNDI名字,被JTATransactionFactory用来从应用服务器获取JTA UserTransaction取值 jndi/composite/name
hibernate.transaction.manager_lookup_class一个TransactionManagerLookup的类名 - 当使用JVM级缓存,或在JTA环境中使用hilo生成器的时候需要该类. 取值 classname.of.TransactionManagerLookup
hibernate.transaction.flush_before_completion如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。取值 true | false
hibernate.transaction.auto_close_session如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。取值 true | false

表 3.7.  其他属性

属性名用途
hibernate.current_session_context_class为"当前" Session指定一个(自定义的)策略。eg. jta | thread | custom.Class
hibernate.query.factory_class选择HQL解析器的实现. 取值 org.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory
hibernate.query.substitutions将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). 取值 hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
hibernate.hbm2ddl.autoSessionFactory创建时,自动检查数据库结构,或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时,将drop掉数据库schema. 取值 validate | update | create | create-drop
hibernate.cglib.use_reflection_optimizer开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在hibernate.cfg.xml中设置此属性. 取值 true | false

3.4.1.  SQL方言

你应当总是为你的数据库将hibernate.dialect属性设置成正确的 org.hibernate.dialect.Dialect子类. 如果你指定一种方言, Hibernate将为上面列出的一些属性使用合理的默认值, 为你省去了手工指定它们的功夫.

表 3.8.  Hibernate SQL方言 (hibernate.dialect)

RDBMS方言
DB2org.hibernate.dialect.DB2Dialect
DB2 AS/400org.hibernate.dialect.DB2400Dialect
DB2 OS390org.hibernate.dialect.DB2390Dialect
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
MySQLorg.hibernate.dialect.MySQLDialect
MySQL with InnoDBorg.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAMorg.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version)org.hibernate.dialect.OracleDialect
Oracle 9i/10gorg.hibernate.dialect.Oracle9Dialect
Sybaseorg.hibernate.dialect.SybaseDialect
Sybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Serverorg.hibernate.dialect.SQLServerDialect
SAP DBorg.hibernate.dialect.SAPDBDialect
Informixorg.hibernate.dialect.InformixDialect
HypersonicSQLorg.hibernate.dialect.HSQLDialect
Ingresorg.hibernate.dialect.IngresDialect
Progressorg.hibernate.dialect.ProgressDialect
Mckoi SQLorg.hibernate.dialect.MckoiDialect
Interbaseorg.hibernate.dialect.InterbaseDialect
Pointbaseorg.hibernate.dialect.PointbaseDialect
FrontBaseorg.hibernate.dialect.FrontbaseDialect
Firebirdorg.hibernate.dialect.FirebirdDialect

表 3.9.  Hibernate日志类别

类别功能
org.hibernate.SQL在所有SQL DML语句被执行时为它们记录日志
org.hibernate.type为所有JDBC参数记录日志
org.hibernate.tool.hbm2ddl在所有SQL DDL语句执行时为它们记录日志
org.hibernate.pretty在session清洗(flush)时,为所有与其关联的实体(最多20个)的状态记录日志
org.hibernate.cache为所有二级缓存的活动记录日志
org.hibernate.transaction为事务相关的活动记录日志
org.hibernate.jdbc为所有JDBC资源的获取记录日志
org.hibernate.hql.AST在解析查询的时候,记录HQL和SQL的AST分析日志
org.hibernate.secure为JAAS认证请求做日志
org.hibernate为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助)

表 3.10. JTA TransactionManagers

Transaction工厂类应用程序服务器
org.hibernate.transaction.JBossTransactionManagerLookupJBoss
org.hibernate.transaction.WeblogicTransactionManagerLookupWeblogic
org.hibernate.transaction.WebSphereTransactionManagerLookupWebSphere
org.hibernate.transaction.WebSphereExtendedJTATransactionLookupWebSphere 6
org.hibernate.transaction.OrionTransactionManagerLookupOrion
org.hibernate.transaction.ResinTransactionManagerLookupResin
org.hibernate.transaction.JOTMTransactionManagerLookupJOTM
org.hibernate.transaction.JOnASTransactionManagerLookupJOnAS
org.hibernate.transaction.JRun4TransactionManagerLookupJRun4
org.hibernate.transaction.BESTransactionManagerLookupBorland ES

posted @ 2012-02-14 15:07 GavinMiao 阅读(349) | 评论 (0)编辑 收藏

(转载)System.getProperty()

     摘要: 文章来源:http://www.blogjava.net/javafield/archive/2008/01/05/172952.htmlSystem.getProperty() 1public class Information {    2    public st...  阅读全文

posted @ 2012-02-13 16:52 GavinMiao 阅读(375) | 评论 (0)编辑 收藏

ibatis扩展example类对数据库分页的实现(转载)

     摘要: 文章来源:http://blog.csdn.net/lu_yongchao/article/details/6209166mysql:sql代码:select  *  from   user   where ... order   by ....  阅读全文

posted @ 2012-02-03 10:05 GavinMiao 阅读(3188) | 评论 (0)编辑 收藏

异常积累:org.hibernate.hql.ast.QuerySyntaxError: User is not mapped. [from User where username=?]

org.hibernate.hql.ast.QuerySyntaxError: User is not mapped. [from User where username=?]
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:63)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:196)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:130)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)
at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)
at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:834)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:603)
at com.demo.hibernate.dao.UserDAOImpl.select(UserDAOImpl.java:19)
at com.demo.hibernate.service.UserServiceImpl.login(UserServiceImpl.java:21)
at com.demo.hibernate.test.UserServiceTest.testLogin(UserServiceTest.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by:  User is not mapped.
at org.hibernate.hql.ast.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:85)
at org.hibernate.hql.ast.FromElementFactory.addFromElement(FromElementFactory.java:77)
at org.hibernate.hql.ast.FromClause.addFromElement(FromClause.java:67)
at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:217)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:2830)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2719)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:513)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:371)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:201)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:151)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:189)
... 28 more
原因:

hibernate.cfg.xml映射.<mapping resource=""/>的配置

类似原因还可能有:
 
hql是写的是table名,不是POJO对象

posted @ 2012-01-19 11:02 GavinMiao 阅读(6134) | 评论 (0)编辑 收藏

java相关下载网址

hibernate:
http://sourceforge.net/projects/hibernate/files/
struts
1:
http://archive.apache.org/dist/struts/  
struts2:

posted @ 2012-01-18 11:35 GavinMiao 阅读(318) | 评论 (0)编辑 收藏

异常积累: HttpURLConnection POST 出现 java.io.FileNotFoundException错误

原因:url未加“\”转义。url格式不正确导致。

posted @ 2012-01-13 13:44 GavinMiao 阅读(750) | 评论 (0)编辑 收藏

Flex入门学习


第一步:看http://www.deepcast.net/wiki/flex  
第二步:看http://www.why100000.com/_articles/show_a_article.asp?tab=tabOtherLanguage&autoid=5(Mcromedia Flex标记语言)
Flex学习网站:
1.
Adobe Flex 2 Component Explorer: 官方的,展示了各种组件的用法,入门必看。   http://examples.adobe.com/flex2/inproduct/sdk/explorer/explorer.html 
2.
很好的一个Flex资源站点 http://www.cflex.net/ 主要看右边一栏
3.http://flexbox.mrinalwadhwa.com/ 
一个收集了网上很多开源组件的站点,是进阶学习的好帮手
4.http://code.google.com/p/flexlib/ 
也是一个开源Flex组件站点,不过与FlexBox不同的是,这个是原创,而FlexBox只是收集。
5.http://www.adobe.com/devnet/flex.html 
Adobe Flex开发者中心,经常会有一些好的教程出现。
6.http://labs.adobe.com/
7.
Flex.org:http://www.flex.org/  官方的,基本上应有尽有。
8.
http://examples.adobe.com/flex2/consulting/styleexplorer/Flex2StyleExplorer.html 
用来设计程序样式风格的工具,很好用,现在源代码已经可以下载。
9.http://www.merhl.com/flex2_samples/filterExplorer/ 
用来调节各种滤镜(filter),非官方的,源代码提供下载。
10.http://wenku.baidu.com/view/739d962e453610661ed9f4c5.html


参考文章:http://blog.csdn.net/microrain/article/details/1601303





posted @ 2011-12-29 10:34 GavinMiao 阅读(277) | 评论 (0)编辑 收藏

转载:在JavaScript中调用Flex方法

文章来源:http://www.cnblogs.com/liuzhong/archive/2011/06/27/2091294.html
一、在JavaScript中调用Flex方法
在Flex中可以用ExternalInterface来调用Flex的方法,途径是
1.通过在Flex应用可调用方法列表中添加指定的公用方法。 在Flex应用中通过调用addCallback()可以把一个方法添加到此列表中。addCallback将一个ActionScript的方法注册为一个JavaScript和VBScript可以调用的方法。
addCallback()函数的定义如下:
addCallback(function_name:String, closure:Function):void
function_name参数就是在Html页面中脚本调用的方法名。closure参数是要调用的本地方法,这个参数可以是一个方法也可以是对象实例。

举个例子:
<mx:Script>
    import flash.external.*;
    public function myFunc():Number {
        return 42;
    }
    public function initApp():void {
        ExternalInterface.addCallback("myFlexFunction",myFunc);
    }
</mx:Script>

2.那么在Html页面中,先获得SWF对象的引用,也就是用<object .../>声明的Swf的Id属性 ,比如说是MyFlexApp。然后就可以用以下方式调用Flex中的方法。
<SCRIPT language='JavaScript' charset='utf-8'>
    function callApp() {
        var x = MyFlexApp.myFlexFunction(); 
        alert(x);
    }
</SCRIPT>
<button onclick="callApp()">Call App</button>



二、在Flex中调用 JavaScript
你可以调用Html页面中的JavaScript,通过与JavaScript的交互,可以改变Style,调用远程方法。还可以将数据传递给Html页面,处理后再返回给Flex,完成这样的功能主要有两种方法:ExternalInterface()和navigateToUrl()。
在Flex中调用JavaScript最简单的方法是使用ExternalInterface(),可以使用此API调用任意JavaScript,传递参数,获得返回值,如果调用失败,Flex抛出一个异常。
ExternalInterface封装了对浏览器支持的检查,可以用available属性来查看。
ExternalInterface的使用非常简单,语法如下:
flash.external.ExternalInterface.call(function_name: String[, arg1, ...]):Object;
参数function_name是要调用的JavaScript的函数名,后面的参数是JavaScript需要的参数。
举个例子说明如何调用JavaScript函数
Flex应用中,添加如下方法:
<mx:Script>
<?xml version="1.0" encoding="iso-8859-1"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        import flash.external.*;
    
        public function callWrapper():void {
            var f:String = "changeDocumentTitle";
            var m:String = ExternalInterface.call(f,"New Title");
            trace(m); 
        }
    </mx:Script>
    <mx:Button label="Change Document Title" click="callWrapper()"/>
</mx:Application>
Html页面中有如下函数定义:
<SCRIPT LANGUAGE="JavaScript">
    function changeDocumentTitle(a) {
        window.document.title=a;
        return "successful";
    }
</SCRIPT>

posted @ 2011-12-29 00:51 GavinMiao 阅读(369) | 评论 (0)编辑 收藏

转载:http响应码介绍

文章来源:


HTTP 1.1状态代码及其含义

100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)

101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)

200 OK 一切正常,对GET和POST请求的应答文档跟在后面。

201 Created 服务器已经创建了文档,Location头给出了它的URL。

202 Accepted 已经接受请求,但处理尚未完成。

203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。

204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。

205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。

206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。

300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。

302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。
出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。

注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。

严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。

304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。

307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新)

400 Bad Request 请求出现语法错误。

401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。

405 Method Not Allowed 请求方法(GET、POST、HEAD、Delete、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)

406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。

407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)

408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)

409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)

410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)

411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)

412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。

413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。

414 Request URI Too Long URI太长(HTTP 1.1新)。

416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)

500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。

501 Not Implemented 服

posted @ 2011-12-22 14:39 GavinMiao 阅读(1019) | 评论 (0)编辑 收藏

jquery插件编写参考

(function($){
    $.fn.yourName = function(options){
        //各种属性、参数
        }
        var options = $.extend(defaults, options);
        this.each(function(){
        //插件实现代码
        });
    };
})(jQuery);

参考文章:

posted @ 2011-12-13 15:32 GavinMiao 阅读(301) | 评论 (0)编辑 收藏

MyEclipse修改项目名称

项目上右击鼠标-->Properties-->MyEclipse-->Web-->Content Root-->Web content-root-->改成你想要的项目名 即可

posted @ 2011-12-03 23:37 GavinMiao 阅读(7620) | 评论 (1)编辑 收藏

mysql设置编码格式

ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE `tableName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE `tableName` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL 
create table()ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='哈喽啦'
show variables like 'collation_%';
SHOW VARIABLES LIKE 'character%';
SET character_set_client = utf8 ; 
set character_set_server = utf8;
set character_set_connection = utf8;
set character_set_database = utf8;
set character_set_results = utf8;
set character_set_system = utf8;

set collation_connection='utf8_general_ci';
set collation_database=
'utf8_general_ci';
set collation_server='utf8_general_ci';

posted @ 2011-12-01 21:52 GavinMiao 阅读(928) | 评论 (0)编辑 收藏

mysql重启命令

/etc/rc.d/init.d/mysql restart 

posted @ 2011-12-01 21:20 GavinMiao 阅读(269) | 评论 (0)编辑 收藏

rpm及liunx下mysql安装及卸载

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-12-01 13:24 GavinMiao 阅读(66) | 评论 (0)编辑 收藏

liunx解压、打包

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-12-01 13:09 GavinMiao 阅读(79) | 评论 (0)编辑 收藏

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

解决办法:
cd /etc/init.d
mysqld --user=root start

参考文章:
http://apps.hi.baidu.com/share/detail/854577 
今天服务器遇到了一个很熟悉的问题输入#mysql -u root -pERROR 2002 (HY000):Can't connect to local MySQL server随即上网找寻答案根据大家提供的方法我逐一尝试
方案1.
1.#ps -A|grep mysql 显示类似:1829 ? 00:00:00 mysqld_safe
1876 ? 00:00:31 mysqld
2.#kill -9 1829 
3.#kill -9 1876
4.#/etc/init.d/mysql restart
5.#mysql -u root -p 他的麻烦解决了,我的还没解决!
继续找方案2
先查看 /etc/rc.d/init.d/mysqld status 看看m y s q l 是否已经启动.
另外看看是不是权限问题.
------------------------------------------------------------------------------------
[root@localhost beinan]#chown -R mysql:mysql /var/lib/mysql
[root@localhost beinan]# /etc/init.d/mysqld start
启动 MySQL: [ 确定 ]
[root@localhost lib]# mysqladmin -uroot password '123456'
[root@localhost lib]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 4.1.11

Type 'help;' or '\h' for help. Type '\c' to clear the buffe他的也解决了,我的麻烦还在继续,依然继续寻找
方案3
问题解决了,竟然是max_connections=1000 他说太多了,然后改成500也说多,无奈删之问题解决了。还是不行
方案4 /var/lib/mysql 所有文件权限 改成mysql.mysql 不行不行方案5
摘要:解决不能通过mysql.sock连接MySQL问题 这个问题主要提示是,不能通过 '/tmp/mysql.sock'连到服务器,而php标准配置正是用过'/tmp/mysql.sock',但是一些mysql安装方法将 mysql.sock放在/var/lib/mysql.sock或者其他的什么地方,你可以通过修改/etc/my.cnf文件来修正它,打开文件,可 以看到如下的东东:
[mysqld] 
socket=/var/lib/mysql.sock 
改一下就好了,但也会引起其他的问题,如mysql程序连不上了,再加一点: 
[mysql] 
socket=/tmp/mysql.sock 
或者还可以通过修改php.ini中的配置来使php用其他的mysql.sock来连,这个大家自己去找找

或者用这样的方法:
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

成功了,就是这样ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

OK!



以上资料是网上的资料
我今天遇到的情况是我使用的mysqld_safe --user=mysql &重启mysql发现无法启动mysql,最后用
/etc/init.d/mysqld start启动成功

posted @ 2011-12-01 11:46 GavinMiao 阅读(13985) | 评论 (1)编辑 收藏

转载:tomcat各种配置及编码设置

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-12-01 10:49 GavinMiao 阅读(73) | 评论 (0)编辑 收藏

XP 用命令查看和杀死进程

1:查看8080端口占用情况:
C:\Documents and Settings\Administrator>netstat -aon | findstr "8080"
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       3608

2:查看进程

C:\Documents and Settings\Administrator>tasklist | findstr "3608"
javaw.exe                   3608 Console                 0     69,484 K

3.杀进程:
tskill 3608

posted @ 2011-11-28 15:28 GavinMiao 阅读(567) | 评论 (0)编辑 收藏

页面utf-8,jsp提交中文action中乱码

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-11-25 15:11 GavinMiao 阅读(85) | 评论 (0)编辑 收藏

转载:java断言Assertion

     摘要: 文章来源:http://www.cnblogs.com/woodslee/articles/165669.html 一、 Assertion的语法和语义J2SE 1.4在语言上提供了一个新特性,就是assertion(断言)功能,它是该版本在Java语言方面最大的革新。在软件开发中,assertion是一种经典的调试、测试方式,本文将深入解析assertion功能的使用以及其设...  阅读全文

posted @ 2011-11-25 13:20 GavinMiao 阅读(770) | 评论 (0)编辑 收藏

tree和menu控件

Xtree
download及demo页面:http://webfx.eae.net/dhtml/xtree/index.html
api页面:
http://webfx.eae.net/dhtml/xtree/api.html 

参考文章:
http://apps.hi.baidu.com/share/detail/45745962
大量开源menu控件:http://www.open-open.com/ajax/Menu.htm
easy
ui Menu及ext tree等;

posted @ 2011-11-24 15:22 GavinMiao 阅读(285) | 评论 (0)编辑 收藏

iframe页面调用父页面的js函数 (转载)


假若iframe所在的页面here.html有个JS函数为:wode(),它位于页面的<script></script>这个节

然后iframe的src,即里面的页面为:other.html,那么我们在other.html里面就可以如下调用here.html里面的wode这个函数:window.parent.wode();


对于父页面的控件的引用就如法炮制:window.parent.document.getElementById('xxxx')
来自: http://hi.baidu.com/%D3%DA%EA%BB%CC%ED/blog/item/a8384000e1ddec0f1c9583e6.html

posted @ 2011-11-24 12:03 GavinMiao 阅读(816) | 评论 (0)编辑 收藏

mysql导入导出表结构及表数据及执行sql文件

在mysql中执行sql文件的命令 : source  d:\myprogram\database\db.sql;
连接MYSQL:
mysql -h主机地址 -u用户名 -p用户密码
修改密码:
mysqladmin -u用户名 -p旧密码 password 新密码

从数据库导出数据库文件:

1.将数据库mydb导出到e:\MySQL\mydb.sql文件中:

打开开始->运行->输入cmd 进入命令行模式

  1. c:\>MySQLdump -h localhost -u root -p mydb >e:\MySQL\mydb.sql 

然后输入密码,等待一会导出就成功了,可以到目标文件中检查是否成功。

2.将数据库mydb中的mytable导出到e:\MySQL\mytable.sql文件中:

  1. c:\>MySQLdump -h localhost -u root -p mydb mytable>e:\MySQL\mytable.sql 

3.将数据库mydb的结构导出到e:\MySQL\mydb_stru.sql文件中:

  1. c:\>MySQLdump -h localhost -u root -p mydb --add-drop-table >e:\MySQL\mydb_stru.sql 

-h localhost可以省略,其一般在虚拟主机上用

四.从外部文件MySQL导入数据到数据库中:

从e:\MySQL\mydb2.sql中将文件中的SQL语句导入数据库中:

1.从命令行进入MySQL,然后用命令CREATE DATABASE mydb2;创建数据库mydb2。

2.退出MySQL 可以输入命令exit;或者quit;

3.在CMD中输入下列命令:

  1. c:\>MySQL -h localhost -u root -p mydb2 < e:\MySQL\mydb2.sql 

然后输入密码,就OK了。

五.下面谈一下关于导入文件大小限制问题的解决:

默认情况下:MySQL导入文件大小有限制的,最大为2M,所以当文件很大时候,直接无法导入,下面就这个问题的解决列举如下:

1.在php.ini中修改相关参数:

影响MySQL导入文件大小的参数有三个:

  1. memory_limit=128M,upload_max_filesize=2M,post_max_size=8M 

修改upload_ ......

参考文章:
http://database.51cto.com/art/201005/200739.htm

posted @ 2011-11-22 10:54 GavinMiao 阅读(8820) | 评论 (0)编辑 收藏

转载:解决 java.util.MissingResourceException: Can't find bundle for base name com...config, locale zh_CN 错误

文章来源:http://blog.csdn.net/nickshen3/article/details/1698261 
ResourceBundle.getBundle("com.cheng.scrap.config") tells the classloader to load a resource named "config" with package "com.cheng.scrap."  Its fully-qualified-resource-name is"com.cheng.scrap.config"


posted @ 2011-11-17 15:28 GavinMiao 阅读(3618) | 评论 (0)编辑 收藏

MyEclipse + Tomcat项目重命名

文章来源:
问题描述:
原来项目名称是shopping,部署到tomcat后直接输入地址端口后加项目名http://localhost:8080/shopping就可以浏览主页了,后来我把项目名改成shoppingCar,重新部署到tomcat后发现部署过去的项目还是shopping而不是shoppingCar
解决方案:
在MyEclipse里面只把项目重命名是不行的,还要修改以下内容:
项目→properties→MyEclipse→Web下修改Web Context-root的名字为重命名之后的名字即可。

posted @ 2011-11-15 15:09 GavinMiao 阅读(426) | 评论 (0)编辑 收藏

转载:在项目中使用多个数据源-多sessionFactory方案

适用范围:适合SSH架构访问多个数据库,数据库的类型和表结构不必相同,且没有跨库事务的情况(跨库事务最好用分布式事务处理)。

文章来源:http://apps.hi.baidu.com/share/detail/15756344

实现方式:我们可以在spring的配置文件中配置多个sessionFactory,如:
<bean id="aDataSource"
   class="org.apache.commons.dbcp.BasicDataSource"
   destroy-method="close">
   <property name="driverClassName">
    <value>${adriver}</value>
   </property>
   <property name="url">
    <value>${aurl}</value>
   </property>
   <property name="username">
    <value>${ausername}</value>
   </property>
   <property name="password">
    <value>${apassword}</value>
   </property>
</bean>
<bean id="bDataSource"
   class="org.apache.commons.dbcp.BasicDataSource"
   destroy-method="close">
   <property name="driverClassName">
    <value>${bdriver}</value>
   </property>
   <property name="url">
    <value>${burl}</value>
   </property>
   <property name="username">
    <value>${busername}</value>
   </property>
   <property name="password">
    <value>${bpassword}</value>
   </property>
</bean>
<bean id="cDataSource"
   class="org.apache.commons.dbcp.BasicDataSource"
   destroy-method="close">
   <property name="driverClassName">
    <value>${cdriver}</value>
   </property>
   <property name="url">
    <value>${curl}</value>
   </property>
   <property name="username">
    <value>${cusername}</value>
   </property>
   <property name="password">
    <value>${cpassword}</value>
   </property>
</bean>

 

<!-- Hibernate SessionFactorys -->
<bean id="aSessionFactory"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   <property name="dataSource">
    <ref local="aDataSource" />
   </property>
   <property name="mappingResources">
    <list>
     <value>
      .hbm.xml文件
     </value>
    </list>
   </property>
   <property name="hibernateProperties">
    <props>
     <prop key="hibernate.dialect">
      ${ahibernate.dialect}
     </prop>
     <prop key="hibernate.show_sql">true</prop>
     <prop key="format_sql">true</prop>
    </props>
   </property>
</bean>

<bean id="bSessionFactory"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   <property name="dataSource">
    <ref local="bDataSource" />
   </property>
   <property name="mappingResources">
    <list>
     <value>
      .hbm.xml文件
     </value>
    </list>
   </property>
   <property name="hibernateProperties">
    <props>
     <prop key="hibernate.dialect">
      ${bhibernate.dialect}
     </prop>
     <prop key="hibernate.show_sql">true</prop>
     <prop key="format_sql">true</prop>
    </props>
   </property>
</bean>

<bean id="cSessionFactory"
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
   <property name="dataSource">
    <ref local="cDataSource" />
   </property>
   <property name="mappingResources">
    <list>
     <value>
       .hbm.xml文件
     </value>
    </list>
   </property>
   <property name="hibernateProperties">
    <props>
     <prop key="hibernate.dialect">
      ${chibernate.dialect}
     </prop>
     <prop key="hibernate.show_sql">true</prop>
     <prop key="format_sql">true</prop>
    </props>
   </property>
</bean>

<bean id="sessionFactory" class="com.cintel.dcp.datasource.MultiSessionFactory">
   <property name="sessionFactory"><ref local="aSessionFactory"/></property>
</bean>
注意:最后一个com.cintel.dcp.datasource.MultiSessionFactory要自己实现,它实现了SessionFactory接口和ApplicationContext接口,如下:
package com.cintel.dcp.datasource;

import java.io.Serializable;
import java.sql.Connection;
import java.util.Map;
import java.util.Set;

import javax.naming.NamingException;
import javax.naming.Reference;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Interceptor;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import org.hibernate.classic.Session;
import org.hibernate.engine.FilterDefinition;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata;
import org.hibernate.stat.Statistics;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class MultiSessionFactory implements SessionFactory, ApplicationContextAware {
private static final long serialVersionUID = 2064557324203496378L;
private static final Log log = LogFactory.getLog(MultiSessionFactory.class);
private ApplicationContext applicationContext = null;
private SessionFactory sessionFactory = null;

public ApplicationContext getApplicationContext() {
   return applicationContext;
}

public void setApplicationContext(ApplicationContext applicationContext) {
   this.applicationContext = applicationContext;
}

public SessionFactory getSessionFactory(String sessionFactoryName) {
   log.debug("sessionFactoryName:"+sessionFactoryName);
   try{
    if(sessionFactoryName==null||sessionFactoryName.equals("")){
     return sessionFactory;
    }
    return (SessionFactory)this.getApplicationContext().getBean(sessionFactoryName);
   }catch(NoSuchBeanDefinitionException ex){
    throw new RuntimeException("There is not the sessionFactory <name:"+sessionFactoryName+"> in the applicationContext!");
   }
}

public SessionFactory getSessionFactory() {
   String sessionFactoryName = CustomerContextHolder.getCustomerType();
   return getSessionFactory(sessionFactoryName);
}

public void setSessionFactory(SessionFactory sessionFactory) {
   this.sessionFactory = sessionFactory;
}


/* (non-Javadoc)
* @see org.hibernate.SessionFactory#close()
*/
public void close() throws HibernateException {
   getSessionFactory().close();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#evict(java.lang.Class)
*/
public void evict(Class persistentClass) throws HibernateException {
   getSessionFactory().evict(persistentClass);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#evict(java.lang.Class, java.io.Serializable)
*/
public void evict(Class persistentClass, Serializable id) throws HibernateException {
   getSessionFactory().evict(persistentClass, id);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#evictCollection(java.lang.String)
*/
public void evictCollection(String roleName) throws HibernateException {
   getSessionFactory().evictCollection(roleName);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#evictCollection(java.lang.String, java.io.Serializable)
*/
public void evictCollection(String roleName, Serializable id) throws HibernateException {
   getSessionFactory().evictCollection(roleName, id);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#evictEntity(java.lang.String)
*/
public void evictEntity(String entityName) throws HibernateException {
   getSessionFactory().evictEntity(entityName);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#evictEntity(java.lang.String, java.io.Serializable)
*/
public void evictEntity(String entityName, Serializable id) throws HibernateException {
   getSessionFactory().evictEntity(entityName, id);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#evictQueries()
*/
public void evictQueries() throws HibernateException {
   getSessionFactory().evictQueries();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#evictQueries(java.lang.String)
*/
public void evictQueries(String cacheRegion) throws HibernateException {
   getSessionFactory().evictQueries(cacheRegion);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getAllClassMetadata()
*/
public Map getAllClassMetadata() throws HibernateException {
   return getSessionFactory().getAllClassMetadata();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getAllCollectionMetadata()
*/
public Map getAllCollectionMetadata() throws HibernateException {
   return getSessionFactory().getAllCollectionMetadata();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getClassMetadata(java.lang.Class)
*/
public ClassMetadata getClassMetadata(Class persistentClass) throws HibernateException {
   return getSessionFactory().getClassMetadata(persistentClass);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getClassMetadata(java.lang.String)
*/
public ClassMetadata getClassMetadata(String entityName) throws HibernateException {
   return getSessionFactory().getClassMetadata(entityName);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getCollectionMetadata(java.lang.String)
*/
public CollectionMetadata getCollectionMetadata(String roleName) throws HibernateException {
   return getSessionFactory().getCollectionMetadata(roleName);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getCurrentSession()
*/
public Session getCurrentSession() throws HibernateException {
   return getSessionFactory().getCurrentSession();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getDefinedFilterNames()
*/
public Set getDefinedFilterNames() {
   return getSessionFactory().getDefinedFilterNames();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getFilterDefinition(java.lang.String)
*/
public FilterDefinition getFilterDefinition(String filterName) throws HibernateException {
   return getSessionFactory().getFilterDefinition(filterName);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#getStatistics()
*/
public Statistics getStatistics() {
   return getSessionFactory().getStatistics();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#isClosed()
*/
public boolean isClosed() {
   return getSessionFactory().isClosed();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#openSession()
*/
public Session openSession() throws HibernateException {
   return getSessionFactory().openSession();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#openSession(java.sql.Connection)
*/
public Session openSession(Connection connection) {
   return getSessionFactory().openSession(connection);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#openSession(org.hibernate.Interceptor)
*/
public Session openSession(Interceptor interceptor) throws HibernateException {
   return getSessionFactory().openSession(interceptor);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#openSession(java.sql.Connection, org.hibernate.Interceptor)
*/
public Session openSession(Connection connection, Interceptor interceptor) {
   return getSessionFactory().openSession(connection, interceptor);
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#openStatelessSession()
*/
public StatelessSession openStatelessSession() {
   return getSessionFactory().openStatelessSession();
}
/* (non-Javadoc)
* @see org.hibernate.SessionFactory#openStatelessSession(java.sql.Connection)
*/
public StatelessSession openStatelessSession(Connection connection) {
   return getSessionFactory().openStatelessSession(connection);
}
/* (non-Javadoc)
* @see javax.naming.Referenceable#getReference()
*/
public Reference getReference() throws NamingException {
   return getSessionFactory().getReference();
}
}


然后我用一个常量类来标识sessionFactory
public class DynamicDataSourceType {
public static final String A= "aSessionFactory";
public static final String B= "bSessionFactory";
public static final String C= "cSessionFactory";
}

最后一个关键类:用来存放当前正在使用的sessionFactory
public class CustomerContextHolder {

private static final ThreadLocal contextHolder = new ThreadLocal();

public static void setCustomerType(String customerType) {
   Assert.notNull(customerType, "customerType cannot be null");
   contextHolder.set(customerType);
}

public static String getCustomerType() {
   return (String) contextHolder.get();
}

public static void clearCustomerType() {
   contextHolder.remove();
}
}

可以在action、service、dao中进行数据库切换,切换方式:
CustomerContextHolder.setCustomerType(DynamicDataSourceType.A);

以上思路来自javaEye论坛的一个高手,在此标识感谢

posted @ 2011-11-14 16:11 GavinMiao 阅读(848) | 评论 (0)编辑 收藏

转载:动态切换数据源(spring+hibernate)

文章来源:

起因:在当前我手上的一个项目中需要多个数据源,并且来自于不同类型的数据库... 因为很多历史原因.这个项目的住数据源是MySQL,整个系统的CURD都是操作的这个数据库.

但是还有另外两个用于数据采集的数据库: MSSQL,ACCESS.还好只是用于数据采集,在事务上可以不要跨数据库了,这一点节省了好多的工作量.环境:我搭建的测试环境是 spring2.5.6+hibernate3.2
思路:动态切换数据源确切的来说是在同一类型数据库的情况下的。意思就是说 , 在系统中的使用的数据库分布在多台数据库服务器或者在同台服务器上的多个数据库. 在运行时期间根据某种标识符来动态的选择当前操作的数据库.     1.数据源是相同类型的数据库: 一个SessionFactory+动态数据源+一个事务管理器     2.数据源是不同类型的数据库: 根据类型 配置多套SessionFactory模拟:两个mysql数据源+一个Access数据源
实现
1.切换数据源需要标识符,标识符是Object类型
package lhp.example.context;
public enum DBType {
dataSource1, dataSource2;
}

2.然后创建一个用于切换数据源(设置或者获得上下文)的工具类
package lhp.example.context;

public class ContextHolder {
private static final ThreadLocal<Object> holder = new ThreadLocal<Object>();

public static void setDbType(DBType dbType) {
holder.set(dbType);
}

public static DBType getDbType() {
return (DBType) holder.get();
}

public static void clearDbType() {
holder.remove();
}
}

3.创建动态数据源类,继承org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource这个类.
package lhp.example.context;

import java.util.logging.Logger;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {
public static final Logger logger = Logger.getLogger(DynamicDataSource.class.toString());

@Override
protected Object determineCurrentLookupKey() {
DBType key = ContextHolder.getDbType();//获得当前数据源标识符
//logger.info("当前数据源 :" + key);
return key;
}

}

4.然后配置多个数据源
<!-- 数据源1 : mysql -->
<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/dec" />
<property name="user" value="root" />
<property name="password" value="" />
</bean>
<!-- 数据源2 : mysql -->
<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/lms" />
<property name="user" value="root" />
<property name="password" value="" />
</bean>

<!-- 数据源3 : access -->
<bean id="dataSource3" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="sun.jdbc.odbc.JdbcOdbcDriver" />
<property name="jdbcUrl" value="jdbc:odbc:accessTest" />
<property name="user" value="administrator" />
<property name="password" value="XLZX0309" />
</bean>

<!-- mysql 动态数据源设置-->
<bean id="mysqlDynamicDataSource" class="lhp.example.context.DynamicDataSource">
<property name="targetDataSources">
<!-- 标识符类型 -->
<map key-type="lhp.example.context.DBType">
<entry key="dataSource1" value-ref="dataSource1" />
<entry key="dataSource2" value-ref="dataSource2" />
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1" />
</bean>

5.配置sessionFactory
<!-- mysql sessionFactory -->
<bean id="mysqlSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="mysqlDynamicDataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop><!--create validate -->
<prop key="hibernate.query.substitutions">true 1, false 0</prop>
</props>
</property>
</bean>

<!-- access sessionFactory -->
<bean id="aceessSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource3" />
<property name="hibernateProperties">
<props>
<!-- access 语法和MSSQL相似 所以用的MSSQL方言,或者可以使用第三方方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.jdbc.batch_size">30</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop><!--create validate -->
<prop key="hibernate.query.substitutions">true 1, false 0</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<!-- <prop key="hibernate.cache.use_second_level_cache">true</prop> -->
<!-- <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> -->
<!-- <prop key="hibernate.cache.use_query_cache">true</prop> -->
<!-- <prop key="hibernate.generate_statistics">true</prop> -->
<!-- <prop key="hibernate.cache.provider_configuration_file_resource_path">classpath:ehcache.xml</prop> -->
</props>
</property>
</bean>

6.测试用例
package lhp.example.junit;

import static org.junit.Assert.*;
import java.sql.DatabaseMetaData;
import lhp.example.context.ContextHolder;
import lhp.example.context.DBType;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ServiceTest {
private ApplicationContext context;
//三个数据源的URL
private String dataSource1_URL = "jdbc:mysql://127.0.0.1:3306/dec";
private String dataSource2_URL = "jdbc:mysql://127.0.0.1:3306/lms";
private String dataSource3_URL = "jdbc:odbc:accessTest";
private SessionFactory mysqlSessionFactory;
private SessionFactory aceessSessionFactory;

@Before
public void setUp() throws Exception {
// 选择数据源初始化spring
ContextHolder.setDbType(DBType.dataSource1);
//
String[] xmlFiles = new String[] {
"applicationContext-dataSource.xml",
"applicationContext-hibernate.xml",
"applicationContext-spring.xml" };
//
context = new ClassPathXmlApplicationContext(xmlFiles);
//
mysqlSessionFactory = (SessionFactory) context.getBean("mysqlSessionFactory");
aceessSessionFactory = (SessionFactory) context.getBean("aceessSessionFactory");
}

@SuppressWarnings("deprecation")
@Test
public void mysqlDataSourceTest() {
try {

Session mysqlSession = mysqlSessionFactory.openSession();
// 获得数据库元数据
DatabaseMetaData meatData = mysqlSession.connection().getMetaData();

// 默认启动数据源 dataSource1
//断言当前数据源URL是否是dataSource1的URL
assertEquals(dataSource1_URL, meatData.getURL());

// 切换到数据源 dataSource2
ContextHolder.setDbType(DBType.dataSource2);
mysqlSession = mysqlSessionFactory.openSession();
meatData = mysqlSession.connection().getMetaData();
//断言当前数据源URL是否是dataSource2的URL
assertEquals(dataSource2_URL, meatData.getURL());

} catch (Exception e) {
e.printStackTrace();
}
}

@SuppressWarnings("deprecation")
@Test
public void accessDataSourceTest() {
try {
Session accessSession = aceessSessionFactory.openSession();
// 获得数据库元数据
DatabaseMetaData meatData = accessSession.connection().getMetaData();
//断言当前数据源URL是否是dataSource3的URL
assertEquals(dataSource3_URL, meatData.getURL());


} catch (Exception e) {
e.printStackTrace();
}
}

}

posted @ 2011-11-14 15:37 GavinMiao 阅读(787) | 评论 (0)编辑 收藏

liunx版本查询、创建用户及用户组

1.liunx版本查询:
lsb_release -a或者
 cat /etc/issue或者
cat /etc/redhat-release 
2.
创建用户

useradd
-u  uid,例如:500
-G  附加组
-g  主要组 
-d  家目录 /home/mysql
-s  默认登录shell 例如:/bin/bash
eg:useradd -u 500 -g majorGroup -G  minorGroup -d  /home/username -s /bin/bash USERNAME
userdel -r(连同家目录一起删了)
eg2:useradd -g mysql  -d  /home/test -s /bin/bash test
3.创建组:groupadd

posted @ 2011-11-10 12:08 GavinMiao 阅读(321) | 评论 (0)编辑 收藏

异常积累:java.lang.UnsupportedOperationException (转载)

文章来源:http://hi.baidu.com/%C2%CC%B0%D3%D0%C4%C9%F1%B2%BB%C4%FE/blog/item/139b9b17a3c3b44621a4e935.html    
在使用Arrays.asList()后调用add,remove这些method时出 现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等 method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(),add()等,所以throw UnsupportedOperationException。
例如:

String[] s = {
"one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten",
};

List a = Arrays.asList(s);

解决办法:List b = new ArrayList(a);然后再去执行add和remove;

posted @ 2011-11-08 20:13 GavinMiao 阅读(1125) | 评论 (0)编辑 收藏

查询:informix数据库端口

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-11-08 14:55 GavinMiao 阅读(63) | 评论 (0)编辑 收藏

转载:解决org.hibernate.exception.GenericJDBCException: Cannot open connection

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-11-07 12:36 GavinMiao 阅读(31) | 评论 (0)编辑 收藏

异常积累:java.lang.IllegalStateException: No value for key [com.gavin.datasource.M ultiSessionFactory@19fc33d] bound to thread [http-8080-10]

原因:有一个请求将 session .close;
解决办法:
将getSession().close();改为releaseSession(getSession());

posted @ 2011-10-28 09:55 GavinMiao 阅读(3130) | 评论 (1)编辑 收藏

异常积累:org.hibernate.exception.SQLGrammarException: could not execute query-hibernate解释后的sql语句有问题

错误信息
Hibernate: 
    select
        first 0 agentstate0_.id as id2_,
        agentstate0_.agentid as agentid2_,
        agentstate0_.agentpassword as agentpas3_2_,
        agentstate0_.agenttype as agenttype2_,
        agentstate0_.apptype as apptype2_,
        agentstate0_.autoidle as autoidle2_,
        agentstate0_.autoworkinterval as autowork7_2_,
        agentstate0_.autoworkon as autoworkon2_,
        agentstate0_.devicenumber as devicenu9_2_,
        agentstate0_.donotdistribute as donotdi10_2_,
        agentstate0_.group_id as group11_2_,
        agentstate0_.phonetype as phonetype2_ 
    from
        cts_agentinfo agentstate0_ 
    where
        agentstate0_.group_id='999999'
WARN - SQL Error: -201, SQLState: 42000
ERROR - A syntax error has occurred.
ERROR - Error:
org.hibernate.exception.SQLGrammarException: could not execute query
原因1:hibernate方言有问题
原因2:hibernate设置分页的first与max为0;

posted @ 2011-10-27 14:33 GavinMiao 阅读(9287) | 评论 (1)编辑 收藏

异常积累:org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFact ory (Locale not supported.)

tomcat启动时报错,原因如下:
url=jdbc:informix-sqli://192.168.2.114:8888/test:INFORMIXSERVER=testdb1;NEWLOCALE=en_us;NEWCODESET=zh_cn.gb;
中的字符集错误,应改为:
url=jdbc:informix-sqli://192.168.2.114:8888/test:INFORMIXSERVER=testdb1;NEWLOCALE=GB2312,en_us;NEWCODESET=GB2312,8859-1,819;

posted @ 2011-10-26 10:13 GavinMiao 阅读(8842) | 评论 (0)编辑 收藏

informix 命令积累1

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-10-26 09:58 GavinMiao 阅读(59) | 评论 (0)编辑 收藏

tomcat 调内存

一、java.lang.OutOfMemoryError: PermGen space 错误解决办法:
修改TOMCAT_HOME/bin/catalina.sh 
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: 
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 
二、java.lang.OutOfMemoryError: Java heap space 错误解决办法:
解决方法:手动设置Heap size 
修改TOMCAT_HOME/bin/catalina.sh 
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: 
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

注意:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 

posted @ 2011-10-26 09:51 GavinMiao 阅读(334) | 评论 (0)编辑 收藏

异常积累:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (转载)

  1. 转载:文章来源:http://lucky16.iteye.com/blog/673903

    此异常是由于Spring提供的Open Session In View而引起的。
    开启OpenSessionInViewFilter这个过滤器的时候FlushMode就已经被默认设置为了MANUAL,如果FlushMode是MANUAL或NEVEL,在操作过程中 hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现该错误 
    <
    filter>  
  2.        <filter-name>hibernateFilter</filter-name>  
  3.        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
  4.           <init-param>  
  5.                <param-name>flushMode</param-name>  
  6.                <param-value>AUTO</param-value>  
  7.            </init-param> 
  8.        <init-param>  
  9.            <param-name>singleSession</param-name>  
  10.            <param-value>true</param-value>  
  11.        </init-param>  
  12.    </filter>  
  13.    <filter-mapping>  
  14.        <filter-name>hibernateFilter</filter-name>  
  15.        <url-pattern>/*</url-pattern>  
  16.    </filter-mapping> 

posted @ 2011-10-21 11:38 GavinMiao 阅读(9859) | 评论 (2)编辑 收藏

异常积累: nested exception is org.hibernate.SessionException: Session is closed解决方案

参考文章:http://blog.csdn.net/xiangsuixinsheng/article/details/6451752
这种方式获得的session在方法执行结束之后不会自动关闭连接,也就是说我们必须通过session.close()或者releaseSession(session)来手动进行关闭,否则会造成内存泄露或者连接耗尽等问题。手动关闭: 

之后,如果对某方法进行事务控制,那么spring框架会自动为我们关闭session,此种情况(session.close())下再执行上述代码,会抛出如下异常:org.springframework.orm.hibernate3.HibernateSystemException:
 Session is closed; nested exception is org.hibernate.SessionException: Session is closed 
提示session已经关闭。但是如果在代码中通过releaseSession(session)的方法来关闭session,则不会抛出异常。

posted @ 2011-10-21 11:20 GavinMiao 阅读(2651) | 评论 (1)编辑 收藏

spring事务--注解--片段

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-10-21 01:07 GavinMiao 阅读(64) | 评论 (0)编辑 收藏

转载:Hibernate Annotation 联合主键三种写法

     摘要: 文章来源:http://laodaobazi.iteye.com/blog/903236 Hibernate Annotation 联合主键有三种写法 :第一种:Jlee01.java代码:Java代码  package com.jlee03.compositeId;    import java.io.Se...  阅读全文

posted @ 2011-10-20 19:21 GavinMiao 阅读(63) | 评论 (0)编辑 收藏

linux:统计指定文件中包含某字符串的行数、字数和字节数

  1.  grep  'bb' example | wc       

     结果:2       7      21 

posted @ 2011-10-20 11:41 GavinMiao 阅读(1019) | 评论 (0)编辑 收藏

sql面试题

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-10-20 11:34 GavinMiao 阅读(81) | 评论 (0)编辑 收藏

转载:mysql表连接总结

文章来源:http://blog.sina.com.cn/s/blog_3d48dbb70100hyz4.html
作者:涛涛
首先my sql 不支持oracle的(+) 
内连接: 只连接匹配的行
左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
交叉连接  生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个
行都一一匹配
举个例子吧。
表A
id   name 
1    张
2    李
3    王
表B
id   address   A_id
1    北京      1
2    上海      3
3    南京      10
包容性:A表包容B表,左连接左表是全的.(left join 或 left outer join )
SQL语句如下:
SELECT A.name, B.address
FROM A
LEFT JOIN B ON A.id = B.A_id
查询结果为:
name     address
张     北京
李     NULL
王     上海
包容性:B表包容A表,右连接右表是全的.(right join 或 right outer join )
SQL语句如下:
SELECT A.name, B.address
FROM A
RIGHT JOIN B ON A.id = B.A_id
查询结果为:
name     address
张     北京
王     上海
NULL     南京
排他性:A,B表中至少有1个匹配时,才返回行。两表的交集
SQL语句如下:
select A.name,B.address from A
inner join B
on A.id = B.A_id
查询结果为:
name     address
张     北京
王     上海
inner join  内连接等价于下面的sql:
SELECT A.name, B.address
FROM A, B
WHERE A.id = B.A_id
注释:全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于
对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集
。(full join 或 full outer join )
SQL语句如下:
select * from A
full join B
查询结果为:
id     name     id     address A_id
1     张     1     北京     1
2     李     1     北京     1
3     王     1     北京     1
1     张     2     上海     3
2     李     2     上海     3
3     王     2     上海     3
1     张     3     南京     10
2     李     3     南京     10
3     王     3     南京     10
注释:返回3*3=9条记录,即笛卡尔积
SQL语句如下:
SELECT * FROM A
CROSS JOIN B
查询结果为:
id     name     id     address A_id
1     张     1     北京     1
2     李     1     北京     1
3     王     1     北京     1
1     张     2     上海     3
2     李     2     上海     3
3     王     2     上海     3
1     张     3     南京     10
2     李     3     南京     10
3     王     3     南京     10
CROSS JOIN等价于:
select * from A,B
注意:
1. on A.id = B.id 等同于 using(id)//这里字段名要相同
2. 当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。  
如果 EXPLAIN 显示 MySQL 使用了可能的索引列表中错误的索引,这个特性将是很有用的。  
通过指定 USE INDEX (key_list),你可以告诉 MySQL 使用可能的索引中最合适的一个索引在表中查找记录行。  
可选的二选一句法 IGNORE INDEX (key_list) 可被用于告诉 MySQL 不使用特定的索引。    
效率问题:
1.inner join比left join快
注:inner join  内连接等价于下面的sql: SELECT A.name, B.address FROM A, B WHERE A.id = B.A_id
所以一般要用一般的连接就可以了.
2.连接字段建索引
多表外连接
select   A.*,B.f1,B.f2,B.fn,C.f1,C.f2,C.fn   from   A    
  left   join   B   on   A.id=B.id    
  left   join   C   on   C.id=A.id  
  where .......

posted @ 2011-10-20 11:24 GavinMiao 阅读(6481) | 评论 (1)编辑 收藏

异常积累:java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-10-14 15:54 GavinMiao 阅读(78) | 评论 (0)编辑 收藏

异常积累:java.lang.IllegalArgumentException: element is limited to 1 occ urrence

此异常表示:同一个元素只能出现一次,
<session-config>在xml中出现了多次。

posted @ 2011-10-13 11:20 GavinMiao 阅读(636) | 评论 (0)编辑 收藏

操控pdf

hehe,待续........

posted @ 2011-09-30 01:29 GavinMiao 阅读(230) | 评论 (0)编辑 收藏

操控xls

sorry,今天列个提纲,待续....

posted @ 2011-09-30 01:29 GavinMiao 阅读(248) | 评论 (0)编辑 收藏

操控word

解析word........

posted @ 2011-09-30 01:28 GavinMiao 阅读(194) | 评论 (0)编辑 收藏

操作json

json认识:
待续.......

posted @ 2011-09-30 01:27 GavinMiao 阅读(298) | 评论 (0)编辑 收藏

操作properties

properties解析.....

posted @ 2011-09-30 01:27 GavinMiao 阅读(251) | 评论 (0)编辑 收藏

操作xml

待续........

posted @ 2011-09-30 01:25 GavinMiao 阅读(236) | 评论 (0)编辑 收藏

转载:JAVA异常机制介绍/如何正确的进行JAVA异常处理

 文章来源:
 作者:Maverick
 blog:http://blog.csdn.net/zhaohuabing  

1  引言
在JAVA语言出现以前,传统的异常处理方式多采用返回值来标识程序出现的异常情况,这种方式虽然为程序员所熟悉,但却有多个坏处。首先,一个API可以返回任意的返回值,而这些返回值本身并不能解释该返回值是否代表一个异常情况发生了和该异常的具体情况,需要调用API的程序自己判断并解释返回值的含义。其次,并没有一种机制来保证异常情况一定会得到处理,调用程序可以简单的忽略该返回值,需要调用API的程序员记住去检测返回值并处理异常情况。这种方式还让程序代码变得晦涩冗长,当进行IO操作等容易出现异常情况的处理时,你会发现代码的很大部分用于处理异常情况的switch分支,程序代码的可读性变得很差。
上面提到的问题,JAVA的异常处理机制提供了很好的解决方案。通过抛出JDK预定义或者自定义的异常,能够表明程序中出现了什么样的异常情况;而且JAVA的语言机制保证了异常一定会得到恰当的处理;合理的使用异常处理机制,会让程序代码清晰易懂。
2 JAVA异常的处理机制
    当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序,try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块,在所有的finally块代码被执行和当前线程的所属的ThreadGroup的uncaughtException方法被调用后,遇到异常的当前线程被中止。
3 JAVA异常的类层次
JAVA异常的类层次如下图所示:

图1 JAVA异常的类层次
Throwable是所有异常的基类,程序中一般不会直接抛出Throwable对象,Exception和Error是Throwable的子类,Exception下面又有RuntimeException和一般的Exception两类。可以把JAVA异常分为三类:
        第一类是Error,Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一种unchecked Exception,编译器不会检查Error是否被处理,在程序中不用捕获Error类型的异常;一般情况下,在程序中也不应该抛出Error类型的异常。
        第二类是RuntimeException, RuntimeException 是一种unchecked Exception,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出RuntimeException类。RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。
        第三类是一般的checked Exception,这也是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是checked Exception,如图1中的IOException和ClassNotFoundException。JAVA 语言规定必须对checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。checked Exception用于以下的语义环境:

(1) 该异常发生后是可以被恢复的,如一个Internet连接发生异常被中止后,可以重新连接再进行后续操作。
(2) 程序依赖于不可靠的外部条件,该依赖条件可能出错,如系统IO。
(3) 该异常发生后并不会导致程序处理错误,进行一些处理后可以继续后续操作。

4 JAVA异常处理中的注意事项
合理使用JAVA异常机制可以使程序健壮而清晰,但不幸的是,JAVA异常处理机制常常被错误的使用,下面就是一些关于Exception的注意事项:

1. 不要忽略checked Exception
请看下面的代码:
try
{
  method1();  //method1抛出ExceptionA
}
catch(ExceptionA e)
{
    e.printStackTrace();
}
上面的代码似乎没有什么问题,捕获异常后将异常打印,然后继续执行。事实上在catch块中对发生的异常情况并没有作任何处理(打印异常不能是算是处理异常,因为在程序交付运行后调试信息就没有什么用处了)。这样程序虽然能够继续执行,但是由于这里的操作已经发生异常,将会导致以后的操作并不能按照预期的情况发展下去,可能导致两个结果:
一是由于这里的异常导致在程序中别的地方抛出一个异常,这种情况会使程序员在调试时感到迷惑,因为新的异常抛出的地方并不是程序真正发生问题的地方,也不是发生问题的真正原因;
另外一个是程序继续运行,并得出一个错误的输出结果,这种问题更加难以捕捉,因为很可能把它当成一个正确的输出。
那么应该如何处理呢,这里有四个选择:

(1) 处理异常,进行修复以让程序继续执行。
(2) 重新抛出异常,在对异常进行分析后发现这里不能处理它,那么重新抛出异常,让调用者处理。
(3) 将异常转换为用户可以理解的自定义异常再抛出,这时应该注意不要丢失原始异常信息(见5)。
(4) 不要捕获异常。

因此,当捕获一个unchecked Exception的时候,必须对异常进行处理;如果认为不必要在这里作处理,就不要捕获该异常,在方法体中声明方法抛出异常,由上层调用者来处理该异常。

2. 不要一次捕获所有的异常
请看下面的代码:
try
{
  method1();  //method1抛出ExceptionA
    method2();  //method1抛出ExceptionB
    method3();  //method1抛出ExceptionC
}
catch(Exception e)
{
    ……
}
这是一个很诱人的方案,代码中使用一个catch子句捕获了所有异常,看上去完美而且简洁,事实上很多代码也是这样写的。但这里有两个潜在的缺陷,一是针对try块中抛出的每种Exception,很可能需要不同的处理和恢复措施,而由于这里只有一个catch块,分别处理就不能实现。二是try块中还可能抛出RuntimeException,代码中捕获了所有可能抛出的RuntimeException而没有作任何处理,掩盖了编程的错误,会导致程序难以调试。
下面是改正后的正确代码:
try
{
  method1();  //method1抛出ExceptionA
    method2();  //method1抛出ExceptionB
    method3();  //method1抛出ExceptionC
}
catch(ExceptionA e)
{
    ……
}
catch(ExceptionB e)
{
    ……
}
catch(ExceptionC e)
{
    ……
}


3. 使用finally块释放资源
    finally关键字保证无论程序使用任何方式离开try块,finally中的语句都会被执行。在以下三种情况下会进入finally块:
(1) try块中的代码正常执行完毕。
(2) 在try块中抛出异常。
(3) 在try块中执行return、break、continue。
因此,当你需要一个地方来执行在任何情况下都必须执行的代码时,就可以将这些
代码放入finally块中。当你的程序中使用了外界资源,如数据库连接,文件等,必须将释放这些资源的代码写入finally块中。
必须注意的是,在finally块中不能抛出异常。JAVA异常处理机制保证无论在任何情况下必须先执行finally块然后在离开try块,因此在try块中发生异常的时候,JAVA虚拟机先转到finally块执行finally块中的代码,finally块执行完毕后,再向外抛出异常。如果在finally块中抛出异常,try块捕捉的异常就不能抛出,外部捕捉到的异常就是finally块中的异常信息,而try块中发生的真正的异常堆栈信息则丢失了。
请看下面的代码:

Connection  con = null;
try
{
    con = dataSource.getConnection();
    ……
}
catch(SQLException e)
{
    ……
    throw e;//进行一些处理后再将数据库异常抛出给调用者处理
}
finally
{
    try
    {
        con.close();
    }
    catch(SQLException e)
{
    e.printStackTrace();
    ……
}
}
运行程序后,调用者得到的信息如下
java.lang.NullPointerException
 at myPackage.MyClass.method1(methodl.java:266)
而不是我们期望得到的数据库异常。这是因为这里的con是null的关系,在finally语句中抛出了NullPointerException,在finally块中增加对con是否为null的判断可以避免产生这种情况。

4. 异常不能影响对象的状态
异常产生后不能影响对象的状态,这是异常处理中的一条重要规则。 在一个函数
中发生异常后,对象的状态应该和调用这个函数之前保持一致,以确保对象处于正确的状态中。
如果对象是不可变对象(不可变对象指调用构造函数创建后就不能改变的对象,即
    创建后没有任何方法可以改变对象的状态),那么异常发生后对象状态肯定不会改变。如果是可变对象,必须在编程中注意保证异常不会影响对象状态。有三个方法可以达到这个目的:
(1) 将可能产生异常的代码和改变对象状态的代码分开,先执行可能产生异常的代码,如果产生异常,就不执行改变对象状态的代码。
(2) 对不容易分离产生异常代码和改变对象状态代码的方法,定义一个recover方法,在异常产生后调用recover方法修复被改变的类变量,恢复方法调用前的类状态。
(3) 在方法中使用对象的拷贝,这样当异常发生后,被影响的只是拷贝,对象本身不会受到影响。

5. 丢失的异常
请看下面的代码:
public void method2()
{
try
{
    ……
    method1();  //method1进行了数据库操作
}
catch(SQLException e)
{
    ……
    throw new MyException(“发生了数据库异常:”+e.getMessage);
}
}
public void method3()
{
    try
{
    method2();
}
catch(MyException e)
{
    e.printStackTrace();
    ……
}
}
上面method2的代码中,try块捕获method1抛出的数据库异常SQLException后,抛出了新的自定义异常MyException。这段代码是否并没有什么问题,但看一下控制台的输出:
MyException:发生了数据库异常:对象名称 'MyTable' 无效。
at MyClass.method2(MyClass.java:232)
at MyClass.method3(MyClass.java:255)
原始异常SQLException的信息丢失了,这里只能看到method2里面定义的MyException的堆栈情况;而method1中发生的数据库异常的堆栈则看不到,如何排错呢,只有在method1的代码行中一行行去寻找数据库操作语句了,祈祷method1的方法体短一些吧。
JDK的开发者们也意识到了这个情况,在JDK1.4.1中,Throwable类增加了两个构造方法,public Throwable(Throwable cause)和public Throwable(String message,Throwable cause),在构造函数中传入的原始异常堆栈信息将会在printStackTrace方法中打印出来。但对于还在使用JDK1.3的程序员,就只能自己实现打印原始异常堆栈信息的功能了。实现过程也很简单,只需要在自定义的异常类中增加一个原始异常字段,在构造函数中传入原始异常,然后重载printStackTrace方法,首先调用类中保存的原始异常的printStackTrace方法,然后再调用super.printStackTrace方法就可以打印出原始异常信息了。可以这样定义前面代码中出现的MyException类:
public class MyExceptionextends Exception
{
    //构造函数
    public SMException(Throwable cause)
    {
        this.cause_ = cause;
    }

    public MyException(String s,Throwable cause)
    {
        super(s);
        this.cause_ = cause;
    }
    //重载printStackTrace方法,打印出原始异常堆栈信息
    public void printStackTrace()
    {
        if (cause_ != null)
        {
            cause_.printStackTrace();
        }
        super.printStackTrace(s);
    }

    public void printStackTrace(PrintStream s)
    {
        if (cause_ != null)
        {
            cause_.printStackTrace(s);
        }
        super.printStackTrace(s);
    }

    public void printStackTrace(PrintWriter s)
    {
        if (cause_ != null)
        {
            cause_.printStackTrace(s);
        }
        super.printStackTrace(s);
    }
     //原始异常
     private Throwable cause_;
}

6. 不要使用同时使用异常机制和返回值来进行异常处理
下面是我们项目中的一段代码
try
{
    doSomething(); 
}
catch(MyException e)
{
if(e.getErrcode == -1)
{
    ……
}
if(e.getErrcode == -2)
{
   ……
}
……
}
假如在过一段时间后来看这段代码,你能弄明白是什么意思吗?混合使用JAVA异常处理机制和返回值使程序的异常处理部分变得“丑陋不堪”,并难以理解。如果有多种不同的异常情况,就定义多种不同的异常,而不要像上面代码那样综合使用Exception和返回值。
修改后的正确代码如下:
try
{
    doSomething();  //抛出MyExceptionA和MyExceptionB
}
catch(MyExceptionA e)
{
……
}
catch(MyExceptionB e)
{
    ……
}


7. 不要让try块过于庞大
出于省事的目的,很多人习惯于用一个庞大的try块包含所有可能产生异常的代码,
这样有两个坏处:
阅读代码的时候,在try块冗长的代码中,不容易知道到底是哪些代码会抛出哪些异常,不利于代码维护。
使用try捕获异常是以程序执行效率为代价的,将不需要捕获异常的代码包含在try块中,影响了代码执行的效率。

posted @ 2011-09-30 01:08 GavinMiao 阅读(344) | 评论 (0)编辑 收藏

MyEclipse添加注释模板

     摘要: 参考文章:http://apps.hi.baidu.com/share/detail/34719991  打开MyEclipse1windows-preferences-Java-Code style-Code Templates2然后导入就行了3 注释模板的xml文件解释:例子:<?xml version="1.0" encoding="UTF-8"?><t...  阅读全文

posted @ 2011-09-29 19:59 GavinMiao 阅读(4151) | 评论 (0)编辑 收藏

ActionMessage与ActionError

参考文章:http://hi.baidu.com/develop_skill/blog/item/e09b2d8664cddf2dc75cc36b.html

 如果是想获取error的话,name = org.apache.struts.action.ERROR
 如果是想获取message的话, name = org.apache.struts.action.ACTION_MESSAGE

1.src目录下新建属性文件HtmlErrors.properties,里面有一些key=walue
2.
在struts-config.xml中加入 <message-resources key="HtmlErrors" parameter="HtmlErrors"/>
3.
在action类中声明ActionMessages 属性,并且在setServlet方法 中初始化之 messages = new ActionMessages();
在execute中,添加message:
messages.add("message",new ActionMessage("key")); this.saveErrors(request,messages);//注意此处必须是saveErrors,用saveMessages无效
4.
在jsp文件中加入:
<logic:messagesPresent> <html:errors property="message" bundle="HtmlErrors"> </html:errors> </logic:messagesPresent>

ActionMessages以一个HashMap存储ActionMessage.Map中的key是一个标识,其对应的value是一个List对象,所有的ActionMessage存储在List中.也就是说key标识了一组ActionMessage.

  • ActionMessage 
    • ActionMessage(String key)
      该方法接受一个字符串,字符串是在资源文件种配置的key值,必须在配置文件中进行相关配置.
    • ActionMessage(String key,Object value)
      ActionMessage(String key,Object value0,Object value1)
      ActionMessage(String key,Object value0,Object value1,Object value2)
      ActionMessage(String key,Object value0,Object value1,Object value2,Object value3)
      上面4个方法第一个参数同样是资源文件中配置的key值,同样必须在配置文件中进行相关配置.后面的参数为资源文件中key所对应的信息中需要的参数
    • ActionMessage(String key,Object[] values)
      这种方法第一个参数同上,第二个参数接受一个Object数组,其中保存key在资源文件中对应信息需要的参数.
    • ActionMessage(String msg,false 这个方法显示自定义消息,即消息输出内容为msg。
  • ActionMessages
    • ActionMessages.add(String property,ActionMessage message)
      第一个参数property对应于<html:messages>标签中的property属性
      , property的值一般采用ActionMessages类中的静态常量ActionMessages.GLOBAL_MESSAGE,也可以自己定义一个key.
    • 该方法执行时,先判断ActionMessages中有没有该key,如果没有就新添加对key-List键值对;如果有同样的key,就先获取该key对应的Value并转换为List对象,然后将(ActionMessage)message添加进List对象中.
    • ActionMessages.add(ActionMessages ams)
      该方法将参数中保存的ActionMessage合并到调用ActionMessages中.
  • Action及其所有子类
    • addMessages(HttpServletRequest request,ActionMessages messages)
      该方法首先检查request对象中是否有ActionMessages对象,如果有对象,则将接收的ActionMessages合并到request中,如果没有,用setAttribute(Globals.MESSAGE_KEY,messages)方法将messages添加进去.如果一个Action中需要显示多条错误信息,推荐使用该方法.
      (Globals.MESSAGE_KEY ="org.apache.struts.action.ACTION_MESSAGE")
    • saveMessages(HttpServletRequest request,ActionMessages messages)
      该方法保存messages时,如果request中已经有一个ActionMessages对象,则用新的覆盖原有的.不推荐使用该方法,该方法容易发生丢失信息的情况.
    • addErrors()和saveErrors()
      这两个方法与addMessages()和saveMessages()相似,不过在HttpServletRequest.setAttribute()时的参数不一样,这两个方法是:setAttribute(Globals.ERROR_KEY,messages)添加的.(Globals.ERROR_KEY = "org.apache.struts.action.ERROR")
           在request中添加的ActionMessages在页面显示时,用<html:messages>标签进行显示, <html:messages>
id必须指定id属性.<html:messages>标签作用是遍历ActionMessages对象中的所有     ActionMessage.类似<logic:iterator>,每次循环都定义一个名称为id指定的页面范围的bean,然后用     <bean:write>标签进行输出.
bundle绑定一个MessageResources,不指定的时候从上下文中配置的资源中检索.一般不指定bundle属性.
locale指定本地化信息,不指定时和Session的本地化信息相同,一般不用指定.
name指定ActionMessages对象在request中的key.不指定时,默认用GLOBALS.ERROR_KEY="org.apache.struts.action.ERROR",用Action.addMessages()方法添加的信息将不被显示,用Action.addErrors()方法添加的信息才会被显示.一般不指定.
property指定哪些ActionMessage将被显示,与ActionMessages.addMessage(String property,ActionMessage am)中的property参数相对应.不指定的时候显示所有信息.
header指定一个资源信息key,在显示ActionMessages前打印到页面上,可选.
footer指定一个资源信息key,在显示完ActionMessages后打印到页面上,可选.
message

取值为true/false,默认为false.为false或不指定时,在request中查找key=Globals.ERROR_KEY的ActionMessages bean.当该属性设置为true时,在request中查找key=Globals.MESSAGE_KEY的ActionMessages bean,同时name属性的值将被忽略. 
注:true显示 this.addMessages(request,messages); 里面的消息,
false显示 this.addErrors(request, messages)的消息。

 <html:messages>的message属性如果设定为true,会输出ActionMessages中所储存的讯息,Message表示一个提示讯息,也许使用者输入了不正确的资讯,例如在输入名称与密码时打错了字,程式要提示使用者他们输入了不正确的讯息。 
    <html:messages>的message属性如果不设定为true,会输出ActionErrors中所储存的讯息,Error代表的是一个操作方面的错误,例如错误操作导致使用者名称或密码为空(当然也许也是故意的)。

示例:(struts 1.3)

ActionForm中:

ActionMessages messages = new ActionMessages();
    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("messages.username.required"));
    addMessages(request,messages);
   
    ActionErrors errors = new ActionErrors();
    errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.username.required"));
    addErrors(request,errors);
   
    return mapping.getInputForward();

===========================================================================

JSP页面显示:

<html:messages id="outMessage" message="true" header="messages.header" footer="messages.footer">
    <bean:write name="outMessage"/>
   </html:messages>
   <html:messages id="outError" message="false" header="errors.header" footer="errors.footer">
    <bean:write name="outError"/>
   </html:messages>

============================================================================

ApplicationResources.properties配置文件:

messages.header=<h2><font color="red">
messages.footer=</font></h2>
messages.username.required=ActionMessage:the name is null

errors.header=<h2><font color="blue">
errors.footer=</font></h2>
errors.username.required=ActionError:the name is null


posted @ 2011-09-29 11:59 GavinMiao 阅读(1224) | 评论 (0)编辑 收藏

异常积累:java.lang.IllegalArgumentException

ERROR - Error:
java.lang.IllegalArgumentException: Invalid property name 'userInfoContext'
at org.apache.struts.action.DynaActionForm.getDynaProperty(DynaActionForm.java:
603)
---》错误行:UserInfoContext userInfoContext = (UserInfoContext) domainForm.get("userInfoContext");
原因:struts.xml中有两个UserInfoContext类,引用错误。
参考文章:http://hi.baidu.com/9prior/blog/item/9cabe7fba2cc9e1f6c22eb6c.html
这种异常也有可能是:actionform中的某个属性在form-bean的form-property没有配置。

posted @ 2011-09-28 15:18 GavinMiao 阅读(503) | 评论 (0)编辑 收藏

fmt:message与fmt:fmt:setBundle

参考文章:

http://cainwise.iteye.com/blog/369836

 
<fmt:message
> 
标签属性和说明 

 

 

属性
描述
key
资源配置文件的指定
bundle
若使用 <fmt:setBundle> 保存了资源配置文件,该属性就可以从保存的资源配置文件中进行查找
var
将显示信息保存为一个变量
scope
变量的作用范围

 

<fmt:bundle>  <fmt:setBundle> 标签属性和说明 

 

 

属性
描述
basename
资源配置文件的指定,只需要指定文件名而无须扩展名,二组标签共有的属性
var
 <fmt:setBundle> 独有的属性,用于保存资源配置文件为一个变量
scope
 变量的作用范围

 

eg1:
  1. <body>  
  2.   <%request.setAttribute("language","zh_CN"); %>//这里可以从客户端选择的语言那里获取  
  3.     <fmt:setLocale value="${language}"/>//这里是设置显示页面的语言  
  4.     <fmt:setBundle basename="message" var="messages"/>//这里是获取到国际化文件  
  5.         <fmt:bundle basename="message">  
  6.             <fmt:message key="com.name"/>//获取key第一种方式  
  7.             <br>  
  8.             <fmt:message key="com.name" bundle="${messages}"></fmt:message>//获取key第二种方式  
  9.         </fmt:bundle>  
  10.   </body>  
















posted @ 2011-09-28 14:08 GavinMiao 阅读(5080) | 评论 (0)编辑 收藏

用命令打开windows常用软件

mspaint 画图板 
mstsc 远程桌面连接
notepad 打开记事本
winmsd.exe 查看系统信息
Sndvol32 音量控制程序
diskmgmt.msc 磁盘管理器
cleanmgr 垃圾整理
conf 启动netmeeting聊天工具
cleanmgr.exe 磁盘清理 
calc.exe 计算器
regedt32 注册表编辑器

posted @ 2011-09-28 09:40 GavinMiao 阅读(295) | 评论 (0)编辑 收藏

电脑使用技巧:windows自带定时关机

转载:http://bbs.yhcgo.com/read.php?tid-77128.html

1.Windows XP的定时关机命令是由Shutdown.exe程序来控制的,位于Windows\System32文件夹中。
如果想让Windows 2000也实现同样的效果,可以把Shutdown.exe复制到系统目录下。

系统根目录:C:\windows\下;
2.winows+r打开“运行”输入框,然后输入以下命令:
at 22:00 Shutdown -s           --->无倒计时框,到
22:00点提示关机
shutdown.exe -s -t 3600 -->60分钟后,以
倒计时的方式关机
Shutdown -s -t 1320 -->
指定系统在22分钟后自动关闭
3.
如果想取消的话,可以在运行中输入“shutdown -a”。另外输入“shutdown -i”,则可以打开设置自动关机对话框,对自动关机进行设置。 
4.
Shutdown.exe的参数:
-r:关机并重启
-t 时间:设置关机倒计时
“-s”就表示关闭本地计算机
“-a”表示取消关机操作
-i:显示图形用户界面,但必须是Shutdown的第一个选项

posted @ 2011-09-28 09:16 GavinMiao 阅读(541) | 评论 (0)编辑 收藏

J2EE学习网址积累

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-27 16:29 GavinMiao 阅读(96) | 评论 (0)编辑 收藏

异常积累:java.lang.reflect.InvocationTargetException(java.net.ConnectException: Connection refused: connect)

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-27 15:42 GavinMiao 阅读(72) | 评论 (0)编辑 收藏

informix知识积累1

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-27 14:05 GavinMiao 阅读(60) | 评论 (0)编辑 收藏

异常积累:Connection Reset

参考文章:
http://jayenho.blog.51cto.com/37194/91556
原因:数据库down掉了,或者网络断了,连接connection无效,未验证,抛出此异常。当数据库连接因为某种原因断掉(有可能时网络问题,导致App Server跑了一天后,第二天再跑马上爆错误),再从Connection Pool中获取连接而又不做Validate,这时候取得的Connection实际上已经是无效的了,从而导致程序一跑,马上爆Connect Reset错误。
在Tomcat的Server.xml中添加_testOnBorrow,_testOnReturn,_testWhileIdle,并且都设置为true,同时
validationQuery添加验证语句可避免“Connection Reset”error。

<Resource name="lda/raw"
              type="javax.sql.DataSource"
               password="lda_master"
               driverClassName="oracle.jdbc.driver.OracleDriver"
               maxIdle="30" minIdle="2" maxWait="60000" maxActive="1000" 
               testOnBorrow="true" testWhileIdle="true" validationQuery="select 1 from dual"
               username="lda_master" url="jdbc:oracle:thin:@192.160.100.107:15537:lcststd"/>

posted @ 2011-09-27 09:57 GavinMiao 阅读(378) | 评论 (0)编辑 收藏

获得一个随机数

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-23 10:43 GavinMiao 阅读(102) | 评论 (0)编辑 收藏

birt初认识

官网:http://www.eclipse.org/birt/phoenix/ 
1.
BIRT是一个基于Eclipse的开源Web应用程序 
2.主要用在基于Java和J2EE的web应用程序上;
3.使用birt可以实现:列表、图标、混合报表、交叉表(二维表);
4.安装:
本人用的时MyEclipse6.6,对应的Eclipse3.3.;
   
如果使用的是eclipse3.3版本,你应该用birt-report-framework-2_2_0.zip,
地址:http://archive.eclipse.org/birt/downloads/build.php?build=R-R1-2_2_0-200706261010/birt-report-framework-2_2_0.zip 
 

如果使用的是eclipse3.4,你应该用birt-report-framework-2_3_0.zip。
5.参考文章地址:
http://www.docin.com/p-177563530.html
http://wenku.baidu.com/view/e9414713a216147917112885.html 

posted @ 2011-09-22 00:01 GavinMiao 阅读(265) | 评论 (0)编辑 收藏

Myeclipse update Progress Error解决办法

到MyEclipse的安装目录,之下的“eclipseconfigurationorg.eclipse.update”目录, 
发现有一个,last.config.stamp。 
a) leave myeclipse 
b) delete last.config.stamp 
c) restart myeclipse 

posted @ 2011-09-19 17:33 GavinMiao 阅读(317) | 评论 (0)编辑 收藏

eXtremeComponents总结(转载)

     摘要: 文章来源:http://www.blogjava.net/amigoxie/archive/2008/01/08/173526.html  作者:阿蜜果  1. 简介eXtremeComponents(简称ec)是一系列提供高级显示的开源JSP定制标签,当前的包含的组件为eXtremeTable,用于以表形式显示数据。使用ec需要一定的前提条件,JDK要求1.3或更高...  阅读全文

posted @ 2011-09-16 10:23 GavinMiao 阅读(70) | 评论 (0)编辑 收藏

jquery ready 函数简写


$(document).ready(function(){
});

$(function() {
});


posted @ 2011-09-15 17:26 GavinMiao 阅读(428) | 评论 (0)编辑 收藏

奇偶行区别显示

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-15 15:52 GavinMiao 阅读(106) | 评论 (0)编辑 收藏

select count(*)时,报错java.lang.ClassCastException: java.lang.Long

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-15 15:12 GavinMiao 阅读(74) | 评论 (0)编辑 收藏

数据库小技巧

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-13 14:48 GavinMiao 阅读(38) | 评论 (0)编辑 收藏

谈谈memory leak

参考文章:

malloc/free和new/delete必须成对出现,以防止内存泄露

一、什么时候垃圾回收:
简单说:
当一块内存被jvm通过它自己的认证机制认为不再被调用的时候才会在
它认为合适的时机进行回收;
具体说:

The job of the garbage collector is to find objects that are no longer needed by an application and to remove them when they can no longer be accessed or referenced. The garbage collector starts at the root nodes, classes that persist throughout the life of a Java application, and sweeps through all of the nodes that are referenced. As it traverses the nodes, it keeps track of which objects are actively being referenced. Any classes that are no longer being referenced are then eligible to be garbage collected. The memory resources used by these objects can be returned to the Java virtual machine (JVM) when the objects are deleted.

So it is true that Java code does not require the programmer to be responsible for memory management cleanup, and that it automatically garbage collects unused objects. However, the key point to remember is that an object is only counted as being unused when it is no longer referenced.

垃圾收集器的工作是找到由一个应用程序不再需要的对象,在他们不再被访问或引用将其删除。垃圾收集器从根节点、在整个Java应用的生命中存在的类
开始,并通过扫描所有被引用的节点。由于它遍历的节点,它跟踪哪些对象正在积极引用。任何不再被引用的的类,然后才有资格被垃圾收集。
当对象被删除时,他们所占用的内存资源,才被Java虚拟机(JVM)回收。
二、什么样的java代码容易memory leak?
1.
首先一种情况是collection或者是map一直被put数据,没有机会remove,导致OutOfMemoryError。尤其是当collection或者是map被设计成static变量的时候,它就是个global性质的变量,很可能永远不会被赋为null。这也是不建议使用static变量的一个原因。
2.
在listener的模式下,如果listener一直在注册register而没有机会remove也会导致OutOfMemoryError。其实listener也是一个list的结构,本质上是一样的。很多listener是以匿名类被构造和注册到被监听类上面去的, 而被监听类如果也没有正确remove注册的listener的话也会导致OutOfMemoryError。


待续...........

posted @ 2011-09-07 14:04 GavinMiao 阅读(346) | 评论 (0)编辑 收藏

各数据库数据类型比较

posted @ 2011-09-06 13:01 GavinMiao 阅读(366) | 评论 (0)编辑 收藏

异常总结:MySQL+Hibernate下连接空闲8小时自动断开问题解决方案

mysql﹥ show global variables like 'wait_timeout';

+---------------+---------+

| Variable_name | Value |

+---------------+---------+

| wait_timeout | 28800 |

+---------------+---------+ 

我们只要修改mysql5的配置文件“my.ini”(mysql5 installation dir),增加一行:

wait_timeout=31536000

interactive_timeout=31536000

重启生效,需要同时修改这两个参数。



posted @ 2011-09-06 12:04 GavinMiao 阅读(381) | 评论 (0)编辑 收藏

异常积累:el-api.jar冲突

访问登录jsp时:java.lang.LinkageError: loader constraints violated when linking javax/el/ExpressionFactory class;
参考文章:http://www.cnblogs.com/ztf2008/archive/2009/03/17/1413965.html
解释:
加载时违背约束条件。
错误的原因:
tomcat/lib下的el-api.jar与项目WEB-INF/lib目录下的el-api.jar冲突。
解决方式:
把项目目录下的el-api.jar删除即可。

本人总结原因:项目应部署在tomcat5.5上,部署在tomcat6.0上会报上面的jar包冲突的错误

posted @ 2011-09-06 10:26 GavinMiao 阅读(3028) | 评论 (0)编辑 收藏

mysql错误积累:Data too long for column问题

导入数据的时候,MYSQL 报错:Data too long for column 

解决办法: 

在my.ini里找到(此文件在mysql安装目录下) 
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION” 
把其中的STRICT_TRANS_TABLES,去掉, 
或者把sql-mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

注释掉,然后重启mysql就ok了 !

posted @ 2011-09-05 18:08 GavinMiao 阅读(329) | 评论 (0)编辑 收藏

UE设置java环境

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-05 17:29 GavinMiao 阅读(77) | 评论 (0)编辑 收藏

js计时器

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-04 01:53 GavinMiao 阅读(83) | 评论 (0)编辑 收藏

mysql日期、时间格式

select current_date;
create table test(‘日期’ date);
insert into test values('2011-09-03');
create table test2(日期 date,时间 datetime);
create table test(日期 date,时间 timestamp);
insert into test2 values('2011-09-03','2011-09-03 02:00:00');
insert into test values('2011-09-03','2011-09-03 02:00:00');

mysql插入当前时间

now()函数以`yyyy-mm-dd hh:mm:ss返回当前的日期时间,可以直接存到datetime字段中。 
curdate()以’yyyy-mm-dd’的格式返回今天的日期,可以直接存到date字段中。 
curtime()以’hh:mm:ss’的格式返回当前的时间,可以直接存到time字段中。

 

posted @ 2011-09-03 12:35 GavinMiao 阅读(388) | 评论 (0)编辑 收藏

DWR反转Ajax

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-03 00:15 GavinMiao 阅读(73) | 评论 (0)编辑 收藏

linux查询包含某ip的文件

一、grep命令
grep即 (global search regular expression(RE) and print out the line
eg:grep -F 192.168.1.1 -R ./
二、find结合grep
从根目录开始查找所有文本文件,并找出包含"
192.168.1.1
"的行
find ./ -type f -print | xargs grep 192.168.1.1
从根目录开始查找所有扩展名为.
properties
的文本文件,并找出包含"192"的行
find . -type f -name "*.properties" | xargs grep "192"

posted @ 2011-09-02 11:13 GavinMiao 阅读(368) | 评论 (0)编辑 收藏

JSP、servlet、struts线程安全问题分析

Servlet之所以比CGI效率高就是因为Servlet是多线程的。
Servlet规范已经声明Servlet不是线程安全的.
JSP中使用声明的变量是Servlet的实例变量,不是线程安全的,其他都是线程安全的。

那么怎样才能是Servlet安全呢,凡是多个线程可以共享的就不要使用(实例变量+类变量),就这么简单。也可以使用synchronized同步方法,但是这样效率不高,还可以使用单线程模型,这样的话效率就更低了,100个请求同时来的时候就要实例化100个实例。

方法中的临时变量是不会影响线程安全的,因为他们是在栈上分配空间,而且每个线程都有自己私有的栈空间。

总结:线程安全问题主要是由实例变量造成的,不管在Servlet还是JSP,或者在Struts的Action里面,不要使用实例变量,
任何方法里面都不要出现实例变量,你的程序就是线程安全的。


在Servlet/JSP中的几种变量类型
源自 : http://www.javaresearch.org/article/8465.htm
一、在Servlet/JSP中的几种变量类型
在编写Servlet/JSP程序时,对实例变量一定要小心使用。因为实例变量是非线程安全的。
在Servlet/JSP中,变量可以归为下面的几类:
1. 类变量
request,response,session,config,application,以及JSP页面内置的page, pageContext。
其中除了application外,其它都是线程安全的。
2. 实例变量
实例变量是实例所有的,在堆中分配。在Servlet/JSP容器中,一般仅实例化一个Servlet/JSP实例,
启动多个该实例的线程来处理请求。而实例变量是该实例所有的线程所共享,所以,实例变量不是线程安全的。
3. 局部变量
局部变量在堆栈中分配,因为每一个线程有自己的执行堆栈,所以,局部变量是线程安全的。
二、在Servlet/JSP中的多线程同步问题
在JSP中,使用实例变量要特别谨慎。首先请看下面的代码:
// instanceconcurrenttest.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%!
    //定义实例变量
    String username;
    String password;
    java.io.PrintWriter output;
%>
<%
    //从request中获取参数
    username = request.getParameter("username");
    password = request.getParameter("password");
    output = response.getWriter();
    showUserInfo();    
%>
<%!
    public void showUserInfo() {
        //为了突出并发问题,在这儿首先执行一个费时操作
        int i =0;
        double sum = 0.0;
        while (i++ < 200000000) {
            sum += i;
        }
        
        output.println(Thread.currentThread().getName() + "<br>");
        output.println("username:" + username + "<br>");
        output.println("password:" + password + "<br>");
    }
%>
在这个页面中,首先定义了两个实例变量,username和password。
然后在从request中获取这两个参数,并调用showUserInfo()方法将请求用户的信息回显在该客户的浏览器上。
在一个用户访问是,不存在问题。
但在多个用户并发访问时,就会出现其它用户的信息显示在另外一些用户的浏览器上的问题。这是一个严重的问题。
为了突出并发问题,便于测试、观察,我们在回显用户信息时执行了一个模拟的费时操作,
比如,下面的两个用户同时访问(可以启动两个IE浏览器,或者在两台机器上同时访问):
a:    http://localhost:8080/instanceconcurrenttest.jsp?username=a&password=123
b:    http://localhost:8080/instanceconcurrenttest.jsp?username=b&password=456
如果a点击链接后,b再点击链接,那么,a将返回一个空白屏幕,b则得到a以及b两个线程的输出。请看下面的屏幕截图:
 
从运行结果的截图上可以看到,Web服务器启动了两个线程分别来处理来自a和b的请求,但是在a却得到一个空白的屏幕。这是因为上面程序中的output, username和password都是实例变量,是所有线程共享的。在a访问该页面后,将output设置为a的输出,username,password分别置为a的信息,而在a执行printUserInfo()输出username和password信息前,b又访问了该页面,把username和password置为了b的信息,并把输出output指向到了b。随后a的线程打印时,就打印到了b的屏幕了,并且,a的用户名和密码也被b的取代。请参加下图所示:
而实际程序中,由于设置实例变量,使用实例变量这两个时间点非常接近,
所以,像本例的同步问题并没有这么突出,可能会偶尔出现,但这却更加具有危险性,也更加难于调试。
同样,对于Servlet也存在实例变量的多线程问题,请看上面页面的Servlet版:
// InstanceConcurrentTest.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.PrintWriter;
public class InstanceConcurrentTest extends HttpServlet 
{
    String username;
    String password;
    PrintWriter out;
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException,java.io.IOException
    {
        //从request中获取参数
        username = request.getParameter("username");
        password = request.getParameter("password");
        System.out.println(Thread.currentThread().getName() + 
                     " | set username:" + username);
        out = response.getWriter();
        showUserInfo();    
    }
    public void showUserInfo() {
        //为了突出并发问题,在这儿首先执行一个费时操作
        int i =0;
        double sum = 0.0;
        while (i++ < 200000000) {
            sum += i;
        }
        out.println("thread:" + Thread.currentThread().getName());
        out.println("username:"+ username);
        out.println("password:" + password);
    }
}
三、解决方案
1. 以单线程运行Servlet/JSP
在JSP中,通过设置:<%@ page isThreadSafe="false" %>,在Servlet中,
通过实现javax.servlet.SingleThreadModel,
此时Web容器将保证JSP或Servlet实例以单线程方式运行。
重要提示:在测试中发现,Tomcat 4.1.17不能正确支持isThreadSafe属性,
所以,指定isTheadSafe为false后,在Tomcat 4.1.17中仍然出现多线程问题,这是Tomcat 4.1.17的Bug。在Tomcat 3.3.1和Resin 2.1.5中测试通过。
2. 去除实例变量,通过参数传递
从上面的分析可见,应该在Servlet/JSP中尽量避免使用实例变量。
比如,下面的修正代码,去除了实例变量,通过定义局部变量,并参数进行传递。
这样,由于局部变量是在线程的堆栈中进行分配的,所以是线程安全的。
不会出现多线程同步的问题。代码如下:
<%@ page contentType="text/html;charset=GBK" %>
<%
    //使用局部变量
    String username;
    String password;
    java.io.PrintWriter output;
    //从request中获取参数
    username = request.getParameter("username");
    password = request.getParameter("password");
    output = response.getWriter();
    showUserInfo(output, username, password);    
%>
<%!
    public void showUserInfo(java.io.PrintWriter _output, 
         String _username, String _password) {
        //为了突出并发问题,在这儿首先执行一个费时操作
        int i =0;
        double sum = 0.0;
        while (i++ < 200000000) {
            sum += i;
        }
        
        _output.println(Thread.currentThread().getName() + "<br>");
        _output.println("username:" + _username + "<br>");
        _output.println("password:" + _password + "<br>");
    }
%>
注:有的资料上指出在printUserInfo()方法或者实例变量的相关操作语句上使用synchronized关键字进行同步,
但这样并不能解决多线程的问题。因为,这样虽然可以使对实例变量的操作代码进行同步,
但并不能阻止一个线程使用另外一个线程修改后的“脏的”实例变量。
所以,除了降低运行效率外,不会起到预期效果。


待续...............

posted @ 2011-09-02 10:30 GavinMiao 阅读(1070) | 评论 (0)编辑 收藏

JVM类加载初始化学习笔记(转载)

     摘要: 文章来源:http://developer.51cto.com/art/200906/129346.htm1. Classloader的作用,概括来说就是将编译后的class装载、加载到机器内存中,为了以后的程序的执行提供前提条件。2. 一段程序引发的思考:风中叶老师在他的视频中给了我们一段程序,号称是世界上所有的Java程序员都会犯的错误。诡异代码如下:Java代码package te...  阅读全文

posted @ 2011-09-01 15:09 GavinMiao 阅读(1557) | 评论 (0)编辑 收藏

Java内存溢出的详细解决方案(转载)

文章来源:http://developer.51cto.com/art/200906/129346.htm
一、内存溢出类型
1、java.lang.OutOfMemoryError: PermGen space
JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 
一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况)
set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
2、java.lang.OutOfMemoryError: Java heap space
第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。
注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
垃圾回收GC的角色
JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:
当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。
根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。
为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收,
一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。
二、JVM内存区域组成
简单的说java中的堆和栈
java把内存分两种:一种是栈内存,另一种是堆内存
1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;
2。堆内存用来存放由new创建的对象和数组
在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;
栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。
java堆分为三个区:New、Old和Permanent
GC有两个线程:
新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmn
java栈存放
栈调整:参数有+UseDefaultStackSize -Xss256K,表示每个线程可申请256k的栈空间
每个线程都有他自己的Stack
三、JVM如何设置虚拟内存
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
提示:假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。
简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,
这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了
提示:注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
提示:设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主" GC ,大大降低了性能
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
解决方法:手动设置Heap size
修改TOMCAT_HOME/bin/catalina.bat
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
四、性能检查工具使用
定位内存泄漏:
JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。
1. 应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位;
2. 应用服务器极为不稳定,几乎每两天重新启动一次,有时甚至每天重新启动一次;
3. 应用服务器经常做Full GC(Garbage Collection),而且时间很长,大约需要30-40秒,应用服务器在做Full GC的时候是不响应客户的交易请求的,非常影响系统性能。
因为开发环境和产品环境会有不同,导致该问题发生有时会在产品环境中发生,通常可以使用工具跟踪系统的内存使用情况,在有些个别情况下或许某个时刻确实是使用了大量内存导致out of memory,这时应继续跟踪看接下来是否会有下降,
如果一直居高不下这肯定就因为程序的原因导致内存泄漏。
五、不健壮代码的特征及解决办法
1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。
对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率;
2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;
String str = "aaa";
String str2 = "bbb";
String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调用,那它就会被放在内存中等待Java的gc去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销;
3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的;
4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。
这是一个案例想定供大家警戒
使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误,
检查之后发现问题:组件里的代码
m_totalBytes = m_request.getContentLength();
m_binArray = new byte[m_totalBytes];
问题原因是totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。参考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747
5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。
6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃
7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。

posted @ 2011-09-01 14:46 GavinMiao 阅读(481) | 评论 (0)编辑 收藏

java 内存分配(转载)

文章来源:http://developer.51cto.com/art/201009/225071_1.htm

一般Java在内存分配时会涉及到以下区域:

◆寄存器:我们在程序中无法控制

◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

◆堆:存放用new产生的数据

◆静态域:存放在对象中用static定义的静态成员

◆常量池:存放常量

◆非RAM存储:硬盘等永久存储空间

Java内存分配中的栈

在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
  
当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

Java内存分配中的堆

堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。  引用变量就相当于是 为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。

引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。

实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针
 
常量池 (constant pool)

常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:

◆类和接口的全限定名;

◆字段的名称和描述符;

◆方法和名称和描述符。

虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。

对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引 用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。
在程序执行的时候,常量池 会储存在Method Area,而不是堆中。

堆与栈

Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、 anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存 大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态 分配内存,存取速度较慢。

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是 确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和对象句柄(引用)。

栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

  1. int a = 3;   
  2. int b = 3;  

编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。

这时,如果再令 a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响 到b的值。

要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

总结

栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容

堆中存放使用new关键字创建的对象.

字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。



posted @ 2011-09-01 14:37 GavinMiao 阅读(276) | 评论 (0)编辑 收藏

spring2.5reference笔记

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-31 13:26 GavinMiao 阅读(71) | 评论 (0)编辑 收藏

Jquery取得iframe中元素的几种方法(转载)

     摘要: iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作DOM方法:父窗口操作IFRAME:window.frames["iframeSon"].documentIFRAME操作父窗口: window.parent.documentjquery方法:在父窗口中操作 选中IFRAME中的所有输入框: $(window.frames["iframeSon...  阅读全文

posted @ 2011-08-30 16:34 GavinMiao 阅读(19371) | 评论 (1)编辑 收藏

spring注解

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-30 14:44 GavinMiao 阅读(65) | 评论 (0)编辑 收藏

注解参考

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-29 18:20 GavinMiao 阅读(111) | 评论 (0)编辑 收藏

设置内存大小

tomcat bin catalina.bat
在最上面添加这样一句:
set JAVA_OPTS=-Xms512m-Xmx1024m
set CATALINA_OPTS=-Xms512m-Xmx1024m
加入的位置在rem-----------------------这条语句之后
eg:
原语句: 
set JAVA_OPTS=%JAVA_OPTS%   -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" 
修改后语句: 
set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx512m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" 
添加部分 
set JAVA_OPTS=-Xms256m -Xmx512m
在Eclipse中改tomcat JVM 内存, 运行Eclipse中配置的Tomcat. 
在server配置, tomcat5.x->jdk, 在Java VM arguments 里添加: 
-Xms256m -Xmx512m 达到一样的效果. 

    以下为转载的一篇文章:http://developer.51cto.com/art/201009/228062.htm

如何设置Tomcat的JVM内存大小

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个JVM。JAVA程序启动时JVM都会分配一个初始JVM内存和最大JVM内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明,一般的JAVA程序在运行都可以通过中-Xms-Xmx来调整应用程序的初始内存和最大内存:

这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用JVM内存的最大值的80%。

Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。有以下几种方法可以选用:

第一种方法:

Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:

JAVA_OPTS='-Xms【初始化内存大小】-Xmx【可以使用的最大内存】'

需要把这个两个参数值调大。例如:

JAVA_OPTS='-Xms256m-Xmx512m'

表示初始化内存为256MB,可以使用的最大内存为512MB。

第二种方法:环境变量中设

变量名:JAVA_OPTS

变量值:-Xms512m-Xmx512m

第三种方法:前两种方法针对的是bin目录下有catalina.bat的情况(比如直接解压的Tomcat等),但是有些安装版的Tomcat下没有catalina.bat,这个时候可以采用如下方法,当然这个方法也是最通用的方法:

打开tomcatHome/\bin/\tomcat5w.exe,点击Java选项卡,然后将会发现其中有这么两项:Initialmemorypool和Maximummemorypool.Initialmemorypool这个就是初始化设置的内存的大小。Maximummemorypool这个是最大JVM内存的大小设置完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了。

另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。

如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过3-5秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的80%作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

一个要注意的地方:建议把内存的最高值跟最低值的差值缩小,不然会浪费很多内存的,最低值加大,最高值可以随便设,但是要根据实际的物理内存,如果内存设置太大了,比如设置了512M最大内存,但如果没有512M可用内存,Tomcat就不能启动,还有可能存在内存被系统回收,终止进程的情况。

posted @ 2011-08-29 14:49 GavinMiao 阅读(3433) | 评论 (0)编辑 收藏

java基础知识总结

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-29 13:39 GavinMiao 阅读(93) | 评论 (0)编辑 收藏

struts2面试题汇总

参考文章:http://hi.baidu.com/zrmox/blog/item/35719d386cf07afe3b87cec5.html

一.工作原理
一个请求在Struts2框架中的处理大概分为以下几个步骤 
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 
6 ActionProxy创建一个ActionInvocation的实例。 
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 

基本简要流程如下:1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。 

二、struts2标签分类:
1.表单UI标签
2.非表单UI标签
3.控制标签
4.数据标签
三、为什么使用struts2?
1.开源
2.mvc框架
3.纯pojo的Action
4.更好的标签特性
5.易测试
6.易扩展


待续.........


posted @ 2011-08-29 11:27 GavinMiao 阅读(13797) | 评论 (0)编辑 收藏

ssh与设计模式

参考文章来源:
http://www.docin.com/p-87219490.html  
http://kaixuan489577823.iteye.com/blog/662864  
一、struts1主要用到的设计模式:
1.Straegy策略模式
2.singletom单例模式
3.command命令模式
4.Facade外观模式
5.composite view组成模式
6.decorator装饰模式
7.MVC模式
二、spring主要用到的设计模式:
1.简单工厂即静态工厂模式Static Factory Method
2.工厂模式Factory Method
3.单例模式Singleton
4.适配器Adapter
5.装饰器Decorator
6.代理Proxy
7.观察者Observer
8.策略Strategy
9.模板方法Template Method
三、struts2主要用到的模式:
1.MVC模式
2.command命令模式
3.代理Proxy
4.适配器Adapter
5.单例模式Singleton
6. 职责链模式 Chain of Responsibility 

GoF设计模式的分类: 
根据目的准则分类: 
1. 创建型:creational 与对象的创建有关。 
2. 结构型:Structural 处理类或对象之间的组合。 
3. 行为型:behavioral 描述类或对象如何交互及如何分配职责。


创建型模式

1.抽象工厂模式 AbstractFactory 
2.建造者模式 Builder 
3.工厂方法模式 Factory Method 
4.原型模式 Prototype 
5.单例模式 Singleton 

结构型模式 

1.适配器模式 Adapter 
2.桥接模式 Bridge 
3.组合模式 Composite 
4.装饰模式 Decorator 
5.外观模式 Facade 
6.享元模式 Flyweight 
7.代理模式 Proxy 

行为模式 

1.职责链模式 Chain of Responsibility 
2.命令模式 Command 
3.解释器模式 Interpreter 
4.迭代器模式 Iterator 
5.中介者模式 Mediator 
6.备忘录模式 Memento 
7.观察者模式 Observer 
8.状态模式 State 
9.策略模式 Strategy 
10.模板方法模式 Template Method 
11.访问者模式 Visitor

posted @ 2011-08-29 10:42 GavinMiao 阅读(2237) | 评论 (1)编辑 收藏

如何处理乱码?(对“许令波”文章的总结)

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-29 10:14 GavinMiao 阅读(88) | 评论 (0)编辑 收藏

spring面试题

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-29 00:38 GavinMiao 阅读(95) | 评论 (0)编辑 收藏

struts1面试题汇总

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-28 14:09 GavinMiao 阅读(96) | 评论 (0)编辑 收藏

hibernate面试题汇总

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-28 13:37 GavinMiao 阅读(90) | 评论 (0)编辑 收藏

Struts,Spring,Hibernate面试题总结

(转载)http://blog.csdn.net/David8631/article/details/2676615 作者:David8631
Hibernate工作原理及为什么要用?

原理:

1.         读取并解析配置文件

2.         读取并解析映射信息,创建SessionFactory

3.         打开Sesssion

4.         创建事务Transation

5.         持久化操作

6.         提交事务

7.         关闭Session

8.         关闭SesstionFactory

 

为什么要用:

 

1.    JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2.    Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

3.    hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

4.    hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

 

2.   Hibernate是如何延迟加载?

1.         Hibernate2延迟加载实现:a)实体对象  b)集合(Collection

2.         Hibernate3 提供了属性的延迟加载功能

Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

3.   Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-oneone-to-manymany-to-many

4.   说下Hibernate的缓存机制

1.         内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存

2.         二级缓存:

a)         应用及缓存

b)        分布式缓存

条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非              关键数据

c)  第三方缓存的实现

5.   Hibernate的查询方式

SqlCriteria,object comptosition

Hql

1、  属性查询

2、  参数查询、命名参数查询

3、  关联查询

4、  分页查询

5、  统计函数

 

6.   如何优化Hibernate

1.         使用双向一对多关联,不使用单向一对多

2.         灵活使用单向一对多关联

3.         不用一对一,用多对一取代

4.         配置对象缓存,不使用集合缓存

5.         一对多集合使用Bag,多对多集合使用Set

6.         继承类使用显式多态

7.         表字段要少,表关联不要怕多,有二级缓存撑腰

 

7.   Struts工作机制?为什么要使用Struts

工作机制:

Struts的工作流程:

  web应用启动时就会加载初始化ActionServlet,ActionServlet

  struts-config.xml文件中读取配置信息,把它们存放到各种配置对象

  ActionServlet接收到一个客户请求时,将执行如下流程.

    -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;

    -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm           对象中;

    -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionFormvalidate()方法;

    -(4)如果ActionFormvalidate()方法返回null或返回一个不包含ActionMessageActuibErrors对象,                就表示表单验证成功;

    -(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的                    Action实例不存在,就先创建这个实例,然后调用Actionexecute()方法;

    -(6)Actionexecute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给                               ActionForward对象指向的JSP组件;

    -(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;

为什么要用:

JSPServletJavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。

基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件

8.   Strutsvalidate框架是如何验证的?

struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。

9.   说下Struts的设计模式

MVC模式:  web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionFormValidate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Actionexecute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。

单例模式

Factory(工厂模式)

定义一个基类===》实现基类方法(子类通过不同的方法)===》定义一个工厂类(生成子类实例)

===》开发人员调用基类方法

Proxy(代理模式)

10.              spring工作机制及为什么要用?

 

1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.

3.DispatcherServlet请请求提交到目标Controller

4.Controller进行业务逻辑处理后,会返回一个ModelAndView

5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象

6.视图对象负责渲染返回给客户端。

为什么用:

{AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务   (比如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。

               IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反      过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用     其协作对象构造的。因此是由容器管理协作对象(collaborator)。

Spring即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。}

posted @ 2011-08-28 12:41 GavinMiao 阅读(417) | 评论 (0)编辑 收藏

谈log4j

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-26 15:18 GavinMiao 阅读(34) | 评论 (0)编辑 收藏

继承认识

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-26 12:01 GavinMiao 阅读(15) | 评论 (0)编辑 收藏

集合的认识

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-26 11:33 GavinMiao 阅读(28) | 评论 (0)编辑 收藏

接口与抽象类

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-26 00:03 GavinMiao 阅读(29) | 评论 (0)编辑 收藏

异常对照

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-25 17:34 GavinMiao 阅读(34) | 评论 (0)编辑 收藏

短路操作符认识

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-25 16:33 GavinMiao 阅读(28) | 评论 (0)编辑 收藏

java环境变量设置

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-25 15:42 GavinMiao 阅读(31) | 评论 (0)编辑 收藏

equals与==

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-25 14:55 GavinMiao 阅读(26) | 评论 (0)编辑 收藏

受打击后的疯狂---------js操作html元素

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-25 13:25 GavinMiao 阅读(95) | 评论 (0)编辑 收藏

hibernate概览

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-24 22:58 GavinMiao 阅读(28) | 评论 (0)编辑 收藏

struts1概览

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-08-24 22:01 GavinMiao 阅读(64) | 评论 (0)编辑 收藏

如何防止sql注入

转载:http://www.iteye.com/topic/617072  

SQL注入攻击的总体思路:
发现SQL注入位置;判断服务器类型和后台数据库类型;确定可执行情况

对于有些攻击者而言,一般会采取sql注入法。下面我也谈一下自己关于sql注入法的感悟。

 

注入法:
从理论上说,认证网页中会有型如:
select * from admin where username='XXX' and password='YYY' 的语句,若在正式运行此句之前,如果没有进行必要的字符过滤,则很容易实施SQL注入。
如在用户名文本框内输入:abc’ or 1=1-- 在密码框内输入:123 则SQL语句变成:
select * from admin where username='abc’ or 1=1 and password='123’ 不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

 

猜解法:
基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密码的表名,猜出表中的每个字段名,猜出表中的每条记录内容。
还有一种方式可以获得你的数据库名和每张表的名。
就是通过在形如:http://www. .cn/news?id=10'的方式来通过报错获得你的数据库名和表名!

 

对于jsp而言我们一般采取一下策略来应对:

1、PreparedStatement
如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.
以下是几点原因
    1)、代码的可读性和可维护性.
    2)、PreparedStatement尽最大可能提高性能.
    3)、最重要的一点是极大地提高了安全性.
到目前为止,有一些人(包括本人)连基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; 
如果我们把[' or '1' = '1]作为name传入进来.密码随意,看看会成为什么? 
select * from tb_name = 'or '1' = '1' and passwd = '随意' ; 
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:
把['; drop table tb_name; ]作为varpasswd传入进来,则:
select * from tb_name = '随意' and passwd = ''; drop table tb_name; 有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编译了,只有少数的桌面数据库,就是直接文件访问的那些只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的 statement,有可能要对drop,; 等做费尽心机的判断和过虑.

 

2、正则表达式
    2.1、检测SQL meta-characters的正则表达式 /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix
    2.2、修正检测SQL meta-characters的正则表达式 /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-) |(\%3B)|(:))/i
    2.3、典型的 SQL 注入攻击的正则表达式 /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\ ))/ix
    2.4、检测SQL注入,UNION查询关键字的正则表达式 /((\%27)|(\'))union/ix(\%27)|(\') - 单引号和它的hex等值  union - union关键字。
    2.5、检测MS SQL Server SQL注入攻击的正则表达式 /exec(\s|\+)+(s|x)p\w+/ix

 

3、字符串过滤
public static String filterContent(String content){
String flt ="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare|; |or|-|+|,"; 
Stringfilter[] = flt.split("|"); 
for(int i=0; i {
content.replace(filter[i], ""); 
}
return content; 
}

 

4、不安全字符屏蔽

本部分采用js来屏蔽,起的作用很小,这样用屏蔽关键字的方法虽然有一定作用,但是在实际应用中这些 SQL的关键字也可能成为真正的查询关键字,到那是被你屏蔽了那用户不是不能正常的使用了。 只要在代码规范上下点功夫就可以了。
凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了.
功能介绍:检查是否含有"'","\\","/" 
参数说明:要检查的字符串 
返回值:0:是 1:不是 
函数名是
function check(a) 

return 1; 
fibdn = new Array ("'" ,"\\","/"); 
i=fibdn.length; 
j=a.length; 
for (ii=0; ii { for (jj=0; jj


{ temp1=a.charAt(jj); 
temp2=fibdn[ii]; 
if (tem'; p1==temp2) 
{ return 0; } 


return 1;
}

posted @ 2011-08-24 12:37 GavinMiao 阅读(33001) | 评论 (9)编辑 收藏

报错总结:java.lang.NoSuchMethodError: main

package com.gavin.staticTest;
public class KeyWordsTest{
public static void main(String args[]) {
System.out.println("00");
}
}

java.lang.NoSuchMethodError: main
Exception in thread "main" 

解决方法:将包名改为com.gavin.test;

posted @ 2011-08-24 11:41 GavinMiao 阅读(287) | 评论 (0)编辑 收藏