`
ruyi574812039
  • 浏览: 43831 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
java大量insert数据 批量insert
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;

public class inserttest {

      public static void test1(Connection iConn) throws SQLException{

            Statement statement = iConn.createStatement();

            String str_i;

            for (int i=1;i<100000;i++) {

                  str_i=new Integer(i).toString();

                  String vSQL = "insert into t_employee(id,name,birthday,address,email,mobilephone,telephone,identity_card,weight,height)"

                              + " values(seq_t_employee_id.nextval,'张三"+str_i+ "',sysdate - "+str_i+","

                              + "'上海市南京东路11号203室"+str_i+"',"

                              + "'abcd"+str_i+"@gmail.com',"

                              + "'138'|| trim(to_char("+str_i+", '00000000')),"

                              + "'021-'|| trim(to_char("+str_i+", '00000000')),"

                              + "'3504561980' || trim(to_char("+str_i+", '00000000')),"

                              + "64,1.72)";

                  //System.out.println(vSQL);

                  statement.executeUpdate(vSQL);

            }

      }

 

      public static void test2(Connection iConn) throws SQLException{

            String vSQL = "insert into t_employee(id,name,birthday,address,email,mobilephone,telephone,identity_card,weight,height)"

                  + "values(seq_t_employee_id.nextval,'张三'||?,sysdate - ?,"

                  + "'上海市南京东路11号203室'||?,"

                  + "'abcd'||?||'@gmail.com',"

                  + "'138'|| trim(to_char(?, '00000000')),"

                  + "'021-'|| trim(to_char(?, '00000000')),"

                  + "'3504561980' || trim(to_char(?, '00000000')),"

                  + "64,1.72)";    

            PreparedStatement ps = iConn.prepareStatement(vSQL); 

            String str_i;

            for (int i=1;i<100000;i++) {

                  str_i=new Integer(i).toString();

                  ps.setString(1, str_i);

                  ps.setString(2, str_i);

                  ps.setString(3, str_i);

                  ps.setString(4, str_i);

                  ps.setInt(5, i);

                  ps.setInt(6, i);

                  ps.setInt(7, i);

                  ps.executeUpdate();

            }

      }    

 

      public static void test3(Connection iConn) throws SQLException{

            String vSQL = "insert into t_employee(id,name,birthday,address,email,mobilephone,telephone,identity_card,weight,height)"

                  + " values(seq_t_employee_id.nextval,'张三'||?,sysdate - ?,"

                  + "'上海市南京东路11号203室'||?,"

                  + "'abcd'||?||'@gmail.com',"

                  + "'138'|| trim(to_char(?, '00000000')),"

                  + "'021-'|| trim(to_char(?, '00000000')),"

                  + "'3504561980' || trim(to_char(?, '00000000')),"

                  + "64,1.72)";    

            PreparedStatement ps = iConn.prepareStatement(vSQL); 

            String str_i;

            for (int i=1;i<30000;i++) {
System.out.println(i);
                  str_i=new Integer(i).toString();

                  ps.setString(1, str_i);

                  ps.setString(2, str_i);

                  ps.setString(3, str_i);

                  ps.setString(4, str_i);

                  ps.setInt(5, i);

                  ps.setInt(6, i);

                  ps.setInt(7, i);

                  ps.addBatch();

                  //ps.executeUpdate();

            }

            ps.executeBatch();

      }    

           

      public static void main(String[] args) throws ClassNotFoundException,SQLException {

            Class.forName("oracle.jdbc.driver.OracleDriver");

            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.146:1521:orcl", "zfjdgl", "1234");

            //Connection conn = DriverManager.getConnection("jdbc:oracle:oci:@192.168.0.146:1521:orcl", "zfjdgl", "1234");

            java.util.Date d1=Calendar.getInstance().getTime();

            conn.setAutoCommit(false);

            //1万记录:
            
            //使用thin方式测试结果:
            
            //test1(conn); //16766ms
            //test2(conn); //5859ms
            //test3(conn); // 359ms
            
            //使用oci方式测试结果:
            //test1(conn);//16516ms
            //test2(conn);//5625ms
            //test3(conn); //328s
            
            
            //10万
          //使用thin方式测试结果:
            //test1(conn); //166907ms
            //test2(conn);//53610ms
            test3(conn);//10万记录时结果错误!只存储了34463记录。所以实际使用需要考虑一定记录数进行提交。
            			  //3万记录时:用时1203ms
            
          //使用oci方式测试结果:
           // test1(conn);//181594ms
            //test2(conn);//57641ms	
            //test3(conn);//3万记录时:1062ms(oci方式效率高于thin,oci方式需要安装客户端,一般web开发都使用thin方式)
            
            //总结:1,2,3 3种方式。1,2种使用oci方式效率未得到提高。只有第三种oci方式效率高于thin方式。
            //考虑实际情况,一般不使用oci方式,都使用thin方式,不需要安装客户端。
            //批量insert时,效率3>2>1
            //注意:使用addBatch时,有最大限制,要根据实际情况选择一定记录数进行提交。
            
            
            java.util.Date d2= Calendar.getInstance().getTime();

            System.out.println("es:"+(d2.getTime()-d1.getTime())+"ms");

            conn.commit();

            conn.close();

      }

}
js处理url传递参数编码 js编码
js编码:var url = ctxpath+'/jsps/msa/add.jsp?content='+encodeURIComponent(encodeURIComponent(temp_t));

 jsp页面解码:
 <input id="t_content" value="<%= java.net.URLDecoder.decode(request.getParameter("content"),"UTF-8")%>"  type="hidden"> 


地址:http://www.cnblogs.com/goody9807/archive/2009/01/16/1376913.html
java编码 编码
Java开发中,常常会遇到乱码的问题,一旦遇到这种问题,常常就很扯蛋,每个人都不愿意承认是自己的代码有问题。其实编码问题并没有那么神秘,那么不可捉摸,搞清Java的编码本质过程就真相大白了。(见相册图片)

其实,编码问题存在两个方面:JVM之内和JVM之外。
 
1、Java文件编译后形成class
这里Java文件的编码可能有多种多样,但Java编译器会自动将这些编码按照Java文件的编码格式正确读取后产生class文件,这里的class文件编码是Unicode编码(具体说是UTF-16编码)。
 
因此,在Java代码中定义一个字符串:
String s="汉字";
不管在编译前java文件使用何种编码,在编译后成class后,他们都是一样的----Unicode编码表示。
 
2、JVM中的编码
JVM加载class文件读取时候使用Unicode编码方式正确读取class文件,那么原来定义的String s="汉字";在内存中的表现形式是Unicode编码。
 
当调用String.getBytes()的时候,其实已经为乱码买下了祸根。因为此方法使用平台默认的字符集来获取字符串对应的字节数组。在WindowsXP中文版中,使用的默认编码是GBK,不信运行下:
[java]
public class Test {  
        public static void main(String[] args) {  
                System.out.println("当前JRE:" + System.getProperty("java.version"));  
                System.out.println("当前JVM的默认字符集:" + Charset.defaultCharset());  
        }  
} 

public class Test {
        public static void main(String[] args) {
                System.out.println("当前JRE:" + System.getProperty("java.version"));
                System.out.println("当前JVM的默认字符集:" + Charset.defaultCharset());
        }
}
运行结果如下:
[plain]
当前JRE:1.6.0_10-rc2 
当前JVM的默认字符集:GBK 

当前JRE:1.6.0_10-rc2
当前JVM的默认字符集:GBK

当不同的系统、数据库经过多次编码后,如果对其中的原理不理解,就容易导致乱码。因此,在一个系统中,有必要对字符串的编码做一个统一,这个统一模糊点说,就是对外统一。比如方法字符串参数,IO流,在中文系统中,可以统一使用GBK、GB13080、UTF-8、UTF-16等等都可以,只是要选择有些更大字符集,以保证任何可能用到的字符都可以正常显示,避免乱码的问题。(假设对所有的文件都用ASCII码)那么就无法实现双向转换了。
 
要特别注意的是,UTF-8并非能容纳了所有的中文字符集编码,因此,在特殊情况下,UTF-8转GB18030可能会出现乱码,然而一群傻B常常在做中文系统喜欢用UTF-8编码而不说不出个所以然出来!最傻B的是,一个系统多个人做,源代码文件有的人用GBK编码,有人用UTF-8,还有人用GB18030。FK,都是中国人,也不是外包项目,用什么UTF-8啊,神经!源代码统统都用GBK18030就OK了,免得ANT脚本编译时候提示不可认的字符编码。
 
因此,对于中文系统来说,最好选择GBK或GB18030编码(其实GBK是GB18030的子集),以便最大限度的避免乱码现象。
 
3、内存中字符串的编码
内存中的字符串不仅仅局限于从class代码中直接加载而来的字符串,还有一些字符串是从文本文件中读取的,还有的是通过数据库读取的,还有可能是从字节数组构建的,然而他们基本上都不是Unicode编码的,原因很简单,存储优化。
 
因此就需要处理各种各样的编码问题,在处理之前,必须明确“源”的编码,然后用指定的编码方式正确读取到内存中。如果是一个方法的参数,实际上必须明确该字符串参数的编码,因为这个参数可能是另外一个日文系统传递过来的。当明确了字符串编码时候,就可以按照要求正确处理字符串,以避免乱码。
在对字符串进行解码编码的时候,应该调用下面的方法:
[java]
getBytes(String charsetName)     
String(byte[] bytes, String charsetName) 

getBytes(String charsetName)   
String(byte[] bytes, String charsetName)而不要使用那些不带字符集名称的方法签名,通过上面两个方法,可以对内存中的字符进行重新编码
常用设置记录 笔记
1.myecplise ALT+/自动提示设置:
WIndows->Preferences->General->keys
将"Command"列中的"Word Completion"的快捷键设置为"CTRL+ALT+/",再将"Connand"列下的"Content Assist"的快捷键改成"ALT+/"点提交便可 
telewave总结 java中xml处理
替换xml串的值:
xml:原xml
endxml:替换后的xml
builder = factory.newDocumentBuilder();
	Document doc = builder
			.parse(new InputSource(new StringReader(xml)));
	Element root = doc.getDocumentElement();
	NodeList nl = root.getElementsByTagName("LoginId");
	Element e = (Element) nl.item(0);
	e.setTextContent("newlongid");//CS调用传递的用户名
	NodeList n2 = root.getElementsByTagName("UserId");
	Element e2 = (Element) n2.item(0);
	e2.setTextContent("newuserid");//userid
	StringWriter strWtr = new StringWriter();
	StreamResult result = new StreamResult(strWtr);
	Transformer transformer = TransformerFactory.newInstance()
			.newTransformer();
	transformer.transform(new DOMSource(doc), result);
	String endxml = strWtr.toString();
struts2文件下载 struts2文件下载
strut.xml
<action name="download" class="com.telewave.policesystemweb.szrk.DownloadAction" >
            <result name="success" type="stream">
				 <!-- 下载文件类型定义 --> 
			     <param name="contentType">application/octet-stream</param>
				 <!-- 下载文件输出流定义 --> 
			     <param name="inputName">inputStream</param>
                  <!-- 下载文件处理方式 --> 
   <param name="contentDisposition">attachment;filename="${downfilename}"</param>    
			     <!-- 下载文件的缓冲大小 -->
			     <param name="bufferSize">4096</param>
			</result>
        </action>


package com.telewave.policesystemweb.szrk;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
 
import com.opensymphony.xwork2.ActionSupport;
import com.sun.xml.messaging.saaj.packaging.mime.internet.MimeUtility;
 
 
/**
 * 文件下载
 * @author Luxh
 */
public class DownloadAction extends ActionSupport {
 
 
    private static final long serialVersionUID = -3036349171314867490L;
     
    //文件名
    private String fileName;
    private String downfilename;
    public String getFileName() {
        return fileName;
    }
	public void setFileName(String fileName) throws UnsupportedEncodingException {
        //用UTF-8重新编码文件名,解决中文乱码
        this.fileName = fileName;
    }
    public String getDownfilename() {
		return downfilename;
	}
	public void setDownfilename(String downfilename) {
		this.downfilename = downfilename;
	}     
	public InputStream getInputStream() throws UnsupportedEncodingException, FileNotFoundException{
		int i = fileName.lastIndexOf("\\");
		String str = fileName.substring(i+1);//截取文件名
		HttpServletRequest request = ServletActionContext.getRequest();
		String userAgent = request.getHeader("User-Agent");
		userAgent = userAgent.toLowerCase(); 
		String filernd = "";
		//针对不同浏览器,进行不同的编码,目前支持火狐、谷歌、ie
		if (null != userAgent){  
            if (-1 != userAgent.indexOf("firefox")) {//Firefox  
            	filernd = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(str.getBytes("UTF-8"))))+ "?=";  
            }else if (-1 != userAgent.indexOf("chrome")) {//Chrome  
            	filernd = new String(str.getBytes(), "ISO8859-1");  
            } else {//IE7+  
            	filernd = java.net.URLEncoder.encode(str, "UTF-8");  
            	filernd = StringUtils.replace(filernd, "+", "%20");//替换空格  
            }  
        } else {  
        	filernd = str;  
        } 
		setDownfilename(filernd);
//      IE浏览器可以用以下方式,不通过xml文件<param name="contentDisposition">attachment;filename="${downfilename}"</param>,但是非ie不支持以下这种方式,
//		只能通过xml文件方式读取action中的downfilename的值
//		ServletActionContext.getResponse().setHeader(
//				"Content-Disposition",
//				"attachment;fileName="+filernd);
//						+ java.net.URLEncoder.encode(str, "ISO-8859-1"));
		InputStream inputStream = new FileInputStream(fileName);
		return inputStream;
	  
		
    }   
     
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

 
}
数据库设计三范式 范式 http://m.baidu.com/from=1000953b/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1002%2Cta%40iphone_2_4.3_2_5.2/baiduid=1E5915CF5EB6858F0CE8C422A852F062/w=0_10_%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1%E4%B8%89%E5%A4%A7%E8%8C%83%E5%BC%8F/t=iphone/l=3/tc?ref=www_iphone&lid=7971625144864654207&order=1&vit=osres&tj=www_normal_1_0_10&m=8&srd=1&cltj=cloud_title&dict=30&sec=39680&di=ffe2b512fbd25130&bdenc=1&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRAXjb6Kn_HGkewdoS4csxNaT0u3mRU7xJ_rrdmpWkbznuPd48hgK3AGRYZeQplNNbWVS7
http://m.baidu.com/from=1000953b/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1002%2Cta%40iphone_2_4.3_2_5.2/baiduid=1E5915CF5EB6858F0CE8C422A852F062/w=0_10_%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1%E4%B8%89%E5%A4%A7%E8%8C%83%E5%BC%8F/t=iphone/l=3/tc?ref=www_iphone&lid=7971625144864654207&order=1&vit=osres&tj=www_normal_1_0_10&m=8&srd=1&cltj=cloud_title&dict=30&sec=39680&di=ffe2b512fbd25130&bdenc=1&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRAXjb6Kn_HGkewdoS4csxNaT0u3mRU7xJ_rrdmpWkbznuPd48hgK3AGRYZeQplNNbWVS7
安装svn服务器小结 svn,svn服务器,svn服务器安装
windows安装svn服务器小结:

1.
创建库目录:
svnadmin create  E:\svnserver\svnrepo

2.
启动服务器(有很多种方式):
C:\Users\zhangruyi>svnserve -d -r E:\svnserver\svnrepo

3.分配用户:
配置E:\svnserver\svnrepo\conf下的svnserve.conf文件和passwd文件。

svnserve.conf常用配置:
password-db = passwd 取消注释,注意:之前不能用空格
anon-access = read   表示匿名访问 
auth-access = write  表示匿名访问

passwd 配置:
用户名=密码
新加:zhangruyi=zhangruyi
2014/05/08开始总结 2014/05/08开始总结
1.
switch(a){
  case 1:
  case 2:
  default:
}用法:
// default只可以有一个.
// 1.首先匹配a,若匹配上,直接从a处开始顺序往下执行,直到遇到break才退出。若没有break,直到全部执行完毕。
// 2.若匹配不上,直接找default开始顺序往下执行,直到遇到break才退出,若没有,全部执行完毕。
//总结一句话:匹配上的只是一个入口,退出与否关键在于break;

2.

this. : 当前对象
super. : 父类对象
this(1,2) :在当前类中的一个构造方法中,调用参数相匹配的另一个构造方法
super(1) : 调用父类中参数相匹配的构造方法
//注:super()只能写在子类构造方法的第一行。
3.
final 修饰方法不能被重写
      修饰类不能被继承
      修饰变量的值是不能被改变(常量)
private  修饰的方法不能被子类所继承

4.

一个类中两个方法。
方法1锁定后,虽然方法1锁定了当前调用该方法1的对象,但是另一个线程(会拿到被方法1锁定的对象)去访问其他未加锁的方法2。
若都加锁了,则一个线程访问方法1时,其他线程不会访问方法2.

5.
必须是synchronized的方法里才可以用this.wait()
当篮子满了,生产者wait,this.notify()叫醒消费者。
当篮子空了,消费者wait,this.notify()叫醒生产者
notify叫醒一个正在我这个对象上等待的线程

this.wait();只有synchronized的当前对象才可以wait;锁定在当前对象上的线程停止住。
只有锁住这个对象才可以wait;
wait什么时候醒过来?
wait后,该对象的锁不在属于我。
而sleep睡着了也会拿着锁!
this.notify(),叫醒当前在对象当中wait的线程。

6.case  when  then  end用法:
 select   id1,id2,id3,
         case  when  
         to_number(id3) >  (case  when  to_number(id1)>to_number(id2)  then  id1   else id2  end )  then id3
         else    (case  when  to_number(id1)>to_number(id2)  then  id1  else id2  end )   
         end  maxval
  from  testcase 
 
7.
left join  on   ,right  join  on ,(+)用法:
select  count(*)  from   za_zfba_jcxx_rk_wfxyrxx t   left  join     ga_jcxx_rk_syrk g on   t.gmsfhm = g.gmsfhm 等价于
select  count(*)  from   za_zfba_jcxx_rk_wfxyrxx t, ga_jcxx_rk_syrk  g where t.gmsfhm = g.gmsfhm(+)  

 select count(1) from   ga_jcxx_rk_syrk t   left  join   za_zfba_jcxx_rk_wfxyrxx g    on   t.gmsfhm = g.gmsfhm  等价于
select  count(*)  from   za_zfba_jcxx_rk_wfxyrxx t, ga_jcxx_rk_syrk  g where t.gmsfhm(+) = g.gmsfhm  

注:当副表关联字段有重复记录时,并非是主表的全记录,而会关联出重复记录!


8.
oracle中的rownum不可以用于  > 
若想查询>  需要借助临时表:
select *   from     (select   tt.gmsfhm,tt.wfxyrxh,rownum  rownumt  from    za_zfba_jcxx_rk_wfxyrxx tt  )t  where rownumt>5

db2中,可以直接用rownumber() over()

9.
Map,Set,List遍历总结:
                Map<String,String>   mp = new  HashMap<String,String>();
		mp.put("1", "a");
		mp.put("2", "b");
		mp.put("3", "c");
		
		//4种遍历map的方式
		
		//1.遍历key,查value
		for(String s: mp.keySet()){
			System.out.println("key:"+s+",value:"+mp.get(s));
		}
		//2.只遍历value
		for(String s:mp.values()){
			System.out.println("value:"+s);
		}
		//3.利用evtrySet() Map.Entry是一个接口
		for(Map.Entry<String, String> s: mp.entrySet()){
			System.out.println("key:"+s.getKey()+",value:"+s.getValue());
		}
		
		//4.Map.Entry是一个接口,mp.entrySet()返回该类型的
		Iterator<Map.Entry<String, String>> mi = mp.entrySet().iterator();
		while(mi.hasNext()){
			Map.Entry<String, String> mm = mi.next();
			System.out.println("key:"+mm.getKey()+",value:"+mm.getValue());
		}
		
//4种遍历List方式
               //--------------------------
		List<String> list = new ArrayList<String>();
		list.add("1");
		list.add("2");
		list.add("3");
		//1.遍历
		for(String s: list){
			System.out.println("list1:"+s);
		}
		//2.
		Iterator<String> ilist = list.iterator();
		while(ilist.hasNext()){
			System.out.println("list2:"+ilist.next());
		}
		//3.由于list是有序的,所以可以get
		for(int i=0;i<list.size();i++){
			System.out.println("list3:"+list.get(i));
		}
		//4.诡异的遍历,貌似和2相同
		for(Iterator<String> ilist2 = list.iterator();ilist2.hasNext();){
			System.out.println("list4:"+ilist2.next());
		}
		
//3种遍历Set方式
		//--------------------------


		Set<String>  set = new HashSet<String>();
		set.add("1");
		set.add("2");
		set.add("3");
		//1.遍历
		for(String s:set){
			System.out.println("set1:"+s);
		}
		//2
		Iterator<String> iset = set.iterator();
		while(iset.hasNext()){
			System.out.println("set2:"+iset.next());
		}
		//3
		for(Iterator<String> iiset = set.iterator();iiset.hasNext();){
			System.out.println("set3:"+iiset.next());
		}

10.
static语句块在类加载的时候执行,且只执行一次。
做如下验证:

public class HelloWord {
	public static int   a = 1; 
	static {
		System.out.println("静态块被初始化!");
	}
}

public class T {
	
	public static void main(String[] args) {
//		此时用到了HelloWord类,并没有new对象,将HelloWord.class加载到内存
//		类加载的时候初始化static语句块,且只初始化一次。
		System.out.println(HelloWord.a);
//		输出结果:
//		静态块被初始化!
//		1
	}

}
java中 ==和equals()区别 java中 ==和equals()区别
"=="和"!="比较的是"栈"中的内容是否相同 (基础数据类型存在"栈"中,引用数据类型的引用存在"栈"中)
所以"=="对于基本数据类型比较的是值是否相同,对于引用数据类型比较的是引用的地址是否相同

而equals()比较的是"堆"中的内容:
equals()只适用于引用数据类型,且比较的是"堆"中的对象是否是同一个对象

String中的equels()方法比较的是"堆"中的对象的值是否相同,是因为String重写了equals()方法。
java设计模式总结 java设计模式总结
工厂模式:所有的工厂模式都是用来生产对象的。
(1)静态工厂方法,产生对象,构造方法为private
(2)简单工厂
(3)抽象工厂方法(重点),生产一套产品
   例子:
游戏当中所有的场景对象定义为一个接口GameFactory()。(所有场景:坦克,子弹,等等对象)



有一套OvalFactory()游戏场景实现了GameFactory()
GameFactory() gf = new  OvalFactory();//圆形的
则gf调用了一套圆形的游戏场景。

有一套FxFactory()游戏场景实现了GameFactory()
GameFactory() gf = new  OvalFactory();//方形的
则gf调用了一套方形的游戏场景。

(例子:qq更换一套皮肤,新增一套皮肤,更换一个工厂即可)
struts2学习记录之OGNL表达式 struts2学习记录之ognl表达式
	<ol>
		<li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
		<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
		<li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
		<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
		<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
		<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
		<hr />
		<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
		<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
		<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
		<hr />
		<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
		<hr />
		<li>访问List:<s:property value="users"/></li>
		<li>访问List中某个元素:<s:property value="users[1]"/></li>
		<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
		<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
		<li>访问Set:<s:property value="dogs"/></li>
		<li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
		<li>访问Map:<s:property value="dogMap"/></li>
		<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
		<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
		<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
		<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
		<hr />
		<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
		<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
		<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
		<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
		<hr />
		<li>[]:<s:property value="[0].username"/></li>
		
	</ol>
java基础内存分析总结 java基础内存分析总结
1.基础数据类型就一块内存(栈),引用数据类型两块内存(栈,堆)new出来的对象在堆中。引用在栈内存。
2.形参和局部变量一样,在栈内存分配。(方法调用完毕后,为这个方法分配的局部变量全部消失,即栈内存立即消失)
3.方法开始执行才分配内存空间。方法执行完毕,为此方法分配的局部变量都消失。
4.调用一个方法有返回值时,返回值也在栈内存中分配临时空间。
5.方法重载,一个类里出现名字相同的多个方法,条件:参数不同(类型,个数),只要根据参数能确定调用的是哪个方法就叫重载。 构造方法也可以重载。
6.静态的方法可以不通过对象调用。非静态的方法只能通过对象调用。
7.this,对哪个对象掉的这个方法,this就是谁。
8.非静态的成员变量,new 一个对象就在自己对象内有一个成员变量
  static定义的成员变量只有一份(在数据区)。这个类的所有的对象共享的。
(多继承,一个子类对象含有多个父类对象,父类对象之间有重复的成员变量,非常容易出问题!java为了避免这个问题(实现多个接口时)!接口的成员变量用static修饰!不属于专门某个对象!)
接口是一个特殊的抽象类!只有常量和方法的定义(无实现)!接口里,所有的方法无需写abstract!都是abstract的!
接口的成员变量默认是 public static final 的!也只能是 public static final的!
接口中的方法只能是public 的抽象方法!



9.静态变量存在(数据区 data seg)。。。。。。。。(heap 堆)(stack  栈)
10.静态的成员变量,当没有对象时,用类名.静态的变量。
11.字符串常量分配在数据区。
12.静态的东西在数据区。局部变量永远在栈里,new出来的东西在堆里。代码在代码区。
13.局部变量在栈里分配,成员变量只有new以后才在堆里分配(对象中)。
14.  非静态的成员变量,只有new出来对象后才存在,所以没有new出对象是不可以调用的。
     在静态的方法里,不可以访问非静态的(成员变量和方法)。
     在静态的方法里可以不通过对象访问静态的(成员变量和方法)
15.package是为了解决类重名的问题。起名规则,公司的域名倒过来。neusoft.com-->com.neusoft
   如果类的源文件放入包中,则必须在源文件第一句话写package.
   import 引入别的包下的类。
   同一个包下的类不需要import.

		
16.
修饰成员变量和方法时:
   private(私有的),只有类内部可以访问。
   default(什么都不写),同一个包下可以访问。
   protected(受保护的),同一个包下可以访问且子类也可以访问。
   public  (公共的)  ,所有的都可以访问。
--------------
对于class的权限修饰符,只有两种:(当出现内部类时,private和protected可以修饰类class)
  public和default
  public  任何地方都可以访问
  default  同一个包内可以访问。

17.被重写方法的修饰权限 〉=重写的方法的修饰权限。
18.创建子类的对象时,一定先调用父类的构造方法构造一个父类的对象。
如果调用父类的构造方法,必须写在子类的构造方法的第一行。
如果子类构造方法中不写父类的构造方法,系统调用无参数的父类的构造方法。
19.所有的对象,包括数组都实现了Object类的方法。
20.Object的getClass()方法!拿到的是自己编译好的class文件。(java反射机制)
 hashCode(),返回对象的哈希编码。(这个对象在内存中有个位置,根据哈希编码可以很快找到这个位置)


21.Object的equals()方法等同于== ,比较对象的引用是否指向同一个对象。
22. 对象a  instancesof  b类型   a  instancesof b  表示 a是不是b的引用
判断对象a是否是b类型的。
23.其他的jdk包都需要引入到类中,如果未引入则一定是java.lang的包下的

24. Java4类8种数据类型。
整型:byte short int long
浮点型:float double
逻辑型:Boolean
字符型:char
在栈中可以直接分配内存的数据是基本数据类型。 引用数据类型:是数据的引用在栈中,但是他的对象在堆中。


25. 
java中默认的整数类型是int类型,如果要定义为float型,则要在数值后加上l或L;
 默认的浮点型也是双精度浮点,如果要定义为float型,则要在数值后加上f或F。 

26.
Dog 是Animal的子类:
向上转型:Animal  a = new  Dog();---有利于扩展性(a指向dog对象(含有自己的和父类继承过来的对象),但是对于Animal只能看到自己中有的方法。所以,a.只能调用继承过来的方法!)
向上转型后,向下转型(也叫强制转型): Dog  d = (Dog) a; (d.可以调用new出来的dog的全部方法).
-----------------------------------------------

Dog 实现 Animal接口和Sing 接口
 Animal a = new Dog();     ----a只可以调用,a.(重写Animal的方法);
 
Sing  s = (Sing)a;-----------此处可以强制转型??
s 可以调用重写的Sing接口的那些方法。

记住 除了接口之间的转型必须有继承关系 而接口转型必须有相同的实现类

-----------------------------------------------
动态绑定也叫多态:在执行期间而非编译期间,根据实际类型调用方法。
只有new出来对象后,执行期间才可以知道调用哪个方法。
只要方法重写了,

产生多态条件:1.要有继承,2.要有重写,3.父类引用指向之类对象(即:向上转型)
当你调用父类里面被重写的方法的时候,实际new的时什么对象,
 class Animal{
  public   void	enjoy(){
  }
}


------
class Dog extends  Animal{
  public   void	enjoy(){重写父类enjoy方法
  }
}


class Cat extends  Animal{

  public   void	enjoy(){ 重写父类enjoy方法
  }
}


Animal  a = new  Dog() ,
Animal  a = new  Cat()

public  void  f(Animal  a){

	a.enjoy(),(根据传入的对象来决定调用什么方法)
  传入new的Dog的对象,自动调用Dog类中重写的方法。
  传入new的Cat的对象,自动调用Cat类中重写的方法。

}




struts2学习记录 struts2
struts1与struts2区别:
(1):
在struts1上访问action时,都是同一个对象。会有线程同步的问题,需要进行很好的线程同步的控制。
struts2里访问action时,每次都会new一个对象,所有用户调用action时都是不同的对象,永远不会出现线程同步的问题。


学习struts2记录:
(1)
方法调用:

struts2里访问action时,会调用execute()方法。
action中class执行时,不一定要执行excute()方法,可以在strut.xml中配置method参数(不推荐使用)。
推荐使用:
1.在url地址中动态指定,动态方法调用(DMI)

2.通用符配置来调用。
在struts.xml中配置,通用符配置:约定优于配置。
访问时用Teacher_add.会调用TeacherAction下的add()方法。

<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
</action>


(2)
在struts2中,action中的class只用这一种办法:extends ActionSupport(ActionSupport已经封装了许多方法)

(3)
路径问题:统一使用绝对路径。

(4)
接收参数的三种方式:

一:

在action中用类的属性接收参数:

在url地址传递参数时的变量名称可以和action中成员变量的名称一一对应。
strutst2自动调用setter()方法赋值,自动传递到成员变量中。
(在action中提供setter和getter方法。setName和url传递参数时name=  对应。)
setName,这个Name和传参的name对应。
 
二:

在action的类中使用DomainModel(域模型)接收参数:

在action的类中存在的不是直接的属性,而是域模型User  (例如:private User user;//User就是类似于formbean;)

在action类中:只需一个setUser(),一个getUser()方法即可;
在域模型User中无论有几百个属性,都可以传递(传递参数时用user.a=xxx,user.b=xxx,user.c=xxx,user.d=xxx....)
public class UserAction extends ActionSupport {
	
	private User user;
	//private UserDTO userDTO;
	public String add() {
		System.out.println("name=" + user.getName());
		System.out.println("age=" + user.getAge());
		return SUCCESS;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
}

用域模型接收参数时,存在特殊情况:
当传入的参数和action中DomainModel(User,也就是formbean)匹配不上时
(例如在域模型User存在name,password两个属性,而需要传递name,password,confirpassword三个值)
两种方式处理:
	1.用属性接收参数的方法全部接收过来,再给DomainModel(User).
  2.用DTO(DTO中的属性和接收参数完全匹配),DTO接收后,在填到User中。
  
  
三:
 action类implement ModelDriven<User>,实现了ModelDriven接口。
 
用ModelDriven接收参数(并不常用,但隐含了一种非常重要的程序思想,MVC)



public class UserAction extends ActionSupport implements ModelDriven<User>{
	
	private User user = new User();
	
	public String add() {
		System.out.println("name=" + user.getName());
		System.out.println("age=" + user.getAge());
		return SUCCESS;
	}

	@Override
	public User getModel() {
		return user;
	}
	
}
url参数传递方式:name=xxx,age=xxx

struts2的内部处理过程;(不常用)
filter接收到两个参数,就会去new这个UserAction, new这个UserAction时,会发现action实现了ModelDriven接口。
可以调用你的getModel();反馈一个Model(User),可调用这个User的setName()方法(在User类中存在的setName())。则会把参数放入user里了。




MVC:
V:那些个jsp展现。
M:后台的model
C:各种action(由C控制V和M互相通信,把M和V耦合度解开)

(5)
struts2_2.1.6版本的中文乱码问题:
在接收参数过程中,中文处理方法:
按照struts2文档,在struts.xml中配置  <constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->
struts.i18n.encoding在default.properties配置里,=UTF-8
中文乱码问题就可以解决了。
解决方式:
1.利用Spring的filter(建议)
2.在web.xml里用2.0的filter配置就不会有中文乱码问题,但不知道会有什么其他问题产生。

(6)简单的数据校验:
struts2里action中拿不到request,response,只能用struts2的方法实现。

action用this.addFieldError("name", "name is error");//设置错误信息
//<%@taglib uri="/struts-tags" prefix="s" %>引入标签。
在jsp中用<s:fielderror fieldName="name" theme="simple"/>取出。
fieldName和this.addFieldError("name"对应。


<s:property value="errors.name[0]"/>只取值。常用
<s:debug></s:debug>,默认展现出[Debug]链接.常用

struts2不太好的地方就是:<s:fielderror标签把返回的字符串name is error强制给展现
<s:fielderror展现标签基本上不用:
<s:fielderror fieldName="name" theme="simple"/>默认给加上<class=errorMessage>空样式了。
simple是struts2内置的一个比较简单的主题。


(7)
在struts2里必须提供一种机制
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:

value stack,直接取
stack context(action context),加#取
context,上下文,理解为程序当前所处得环境。

ActionContext即,action运行的周边的环境情况。request,session,application等等。
action运行的时候要用到。

在页面中的request是HttpServletRequest, session是HttpSession, application是ServletContext。

第一种方式(主动取,不常用):
在action中
		request = (Map)ActionContext.getContext().get("request");
		session = ActionContext.getContext().getSession();
		application = ActionContext.getContext().getApplication();
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");

在jsp中可以直接用request了:
	<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
	<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
	<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
两种取值方式:
(1)<s:property value="#request.r1"/>,用标签的方式取值
(2)<%=request.getAttribute("r1") %>

(request全都放到HttpServletRequest里,有对HttpServletRequest封装处理,在jsp中可以直接使用request。)

第二种方式(常用,只用这种方式,除非常特殊情况):
(IoC(控制反转)设计思想,也叫DI(依赖注入))
依赖容器注入:依赖别人给我注入一个值。
而不像第一种自己主动去拿。
控制反转:给别人控制了

 public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
	
	private Map<String, Object> request;
	private Map<String, Object> session;
	private Map<String, Object> application;
	
	//DI dependency injection
	//IoC inverse of control
	public String execute() {
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");
		return SUCCESS; 
	}

	@Override
	public void setRequest(Map<String, Object> request) {//依赖struts2给注入
		this.request = request;
	}

	@Override
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}

	@Override
	public void setApplication(Map<String, Object> application) {
		this.application = application;
	}
	
	
}


(8)
struts2模块包含。
(分模块开发时,一人一个类似于struts.xml的xml)
最后调试把所有人的xml包含到struts.xml中。

(9)默认action,在struts.xml里配置
找不到action时,都由默认的action处理。


(10)result的配置:

result类型:
服务器端跳转:访问服务器url,服务器直接跳转(客户端不知道)到另外jsp,浏览器地址栏显示的是最初请求的地址。
客户端跳转:访问服务器url,服务器反馈给客户端一个信息,然后客户端再次重新发起请求到另外的url,显示的是第二次请求的地址。


默认的就是dispatcher:服务器跳转到html,jsp(不能跳转到action)
redirect,客户端跳转到html,jsp
chain,服务器端跳转,可跳转到action
redirectAction,客户端跳转,跳转action

	    <action name="r1">
	    	<result type="dispatcher">/r1.jsp</result>
	    </action>
	    
	    <action name="r2">
	    	<result type="redirect">/r2.jsp</result>
	    </action>
	    
	    <action name="r3">
	    	<result type="chain">r1</result>
	    </action>
	    
	    <action name="r4">
	    	<result type="redirectAction">r2</result>
	    </action>

(11)
<global-results>
全局的结果
所有的action有一个共同的<result时。
	<global-results>
    		<result name="mainpage">/main.jsp</result>
    	</global-results>
其他包想用可以继承:
<package name="admin" namespace="/admin" extends="user">
    	<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
    		<result>/admin.jsp</result>
    	</action>
</package>

(12)
动态结果集:(用的不多,了解即可)
<package name="user" namespace="/user" extends="struts-default">
    	
	    <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
	    	<result>${r}</result>//这种写法,代表在配置文件里可以读取value stack里的值。OGNL表达式。就这一种用法。
	    </action>	    
    </package>

对于任何action,他的属性都会放到value satck里面。
所以就是可以在action中动态的定义jsp后,会放到value stack里,然后在配置文件里可以取到。

注:凡是forward(服务器端跳转)的所有的action共享同一个value stack。
一次request只有一个value stack。不需要传参。

需要传递参数的情况:
发起一次请求,进行客户端跳转(重新请求,两次request,不共享同一个value stack)到action时,
action之间需要传递。
<result type="redirect">/user_success.jsp?t=${type}</result>
由于是jsp页面,没有action的存在,并没有value stack的存在。 <s:property value="t"/><br/>在jsp文件里这种方式取不到。

虽然没有value stack,但存在action context(stack context),存在parameters。
解决方式:<s:property value="#parameters.t"/>取得重定向后的参数。


























java抽象类和final关键字 java抽象类和final关键字
用abstract关键字来修饰一个类时,这个类叫做抽象类;
用abstract关键字来修饰一个方法时,该方法叫抽象方法。
含有抽象方法的类必须被声明为抽象类。
抽象类必须被继承,抽象方法必须被重写。
抽象类不能够实例化。
抽象方法只需声明,不需实现。

final关键字:
final 修饰变量,方法,类
final修饰变量:
1.基础数据类型
(1)final int i = 0;编译时常量(可在编译时参与运算,节省运行时消耗)
(2)可以运行时赋值;
Random rand = new Random(47);
final int a = rand.next(20);
2.引用数据类型
final使引用恒定不变,但是对象其自身却是可以被修改的。
(java并未提供使任何对象恒定不变的途径,可以自己编写类实现)

final修饰方法:
final修饰的方法不能被重写(现在只需考虑这一点即可)(java早期考虑效率问题)

final修饰类:
不能被继承(慎用)。

final修饰变量的值不能被改变,修饰方法不能被重写,修饰类不能被继承。
java多态 java多态
面向对象的核心:多态

向上转型:父类对象的引入指向子类对象:Anaimal a = new Dog();   (a可以调用继承过来的成员变量和方法,但不可以调用子类特用的方法和成员变量)
向下转型:要想调用子类特有的方法和成员变量,必须进行向下转型,Dog aa = (Dog) a; aa可以调用Dog()中所有的成员变量和方法。
向上转型带来了比较好的可扩展性,但并未达到最好的扩展性。
向上转型扩展性体现在: 传入(Anaimal a) ,根据实际传入的是对象判定
if (a instanceof Dog){
}
if  (a  instanceof Cat){
}
(比定义好多个方法扩展性好一些,但没有多态扩展性好)


多态,达到了扩展性的极致。
多态指在程序的执行期间(非编译期间)判断所引用对象的实际类型调用相应的方法。
       运行起来后,根据实际new的对象,调用其方法
多态的3个条件:
1.继承。
2.重写。
3.向上转型。

体会多态带来的扩展性:
游戏图形例子:
基类:GameObject{
			draw();
}

把现有的子弹和飞机放入容器中,拿出来if是飞机,按画飞机,if是子弹,按画子弹。
此时,如果想加入一个图形呢?
办法:改变原有结构,再if是新图形,再画新图形。


扩展性好的办法:
所有的游戏中图形都继承GameObject类,且都自己重写draw();
子弹有子弹的方法,重写。
飞机有飞机的方法,重写。
实际当中扔的是什么,就调用什么的draw方法。
扩展性体现:如果需要新加入一个图形,只需要画出新图形的方法,继承一下GameObject,重写一下draw()方法即可。
java IO总结 java io总结
流的分类:
1.数入流和输出流(方向不同)
2.字节流和字符流(处理数据的单位不同)
3.节点流和处理流(功能的不同)
节点流:直接从数据源读写数据。
处理流:是连接在已存在的流(节点流或处理流)之上。	通过对数据的处理为程序提供更强大的读写功能。


J2SDK所提供的所有流类型位于java.io内,都分别继承自以下四种抽象流类型:

InputStream     (输入字节流)
OutputStream   (输出字节流)
Reader      (输入字符流)
Writer    (输出字符流)


凡是以Stream结尾的都是字节流(以字节为单位读取)。
凡是Reader或Writer都是字符流。

 
InputStream:
FileInputStream (从文件读数据)
PipedInputStream(从管道读数据)
ByteArrayInputStream(从字节数组中读数据)
常用方法:
int read()返回-1,表示已读到输入流的尾端。             
int  read( byte[] buffer)   返回实际读取的字节数,待buffer填满后,再处理

OutputStream:
常用方法:
void write(byte[] b)  写,将一个字节类型的数据中的数据写入输出流。
void close()  关闭流,释放内存。
void  flush() 将输出流中缓冲的数据全部写出到目的地
所以在colse()之前需要先进行 flush();
和InputStream都是对称的。

都类似于字节的
Reader(字符):读
例如一个汉字字符占用两个字节,所以有必须存在这种流。否则读取半个汉字。
Writer(字符):写


注:输入管道和输出管道用完后一定要关闭,close();
in.close();
out.close();

写入时,只能创建文件,不能创建目录,使用以下方法:
 File logosavedir = new File(path1);//path1为存放的路径
			if (!logosavedir.exists()) {//如果不存在文件夹,则自动生成
				logosavedir.mkdirs();
			}



带缓冲区的叫缓冲流,就是在没有缓冲的流的管道上套一层Buffered的管道。(可显著的减少程序对硬盘的读写次数,保护硬盘):
BufferedWriter  bw = new BufferedWriter(new FileWriter("D:\tes.txt"));
new FileWriter("D:\tes.txt")无缓冲区,再外套一层带缓冲区的管道BufferedWriter;

删除重复记录sql语句(任意保留一条) 删除重复记录sql语句(任意保留一条)
DELETE FROM ba_ry_zgkssh
 WHERE ROWID in (SELECT m.rowid
                   FROM (SELECT MAX(rowid) tim, gmsfzh, tbr
                           FROM ba_ry_zgkssh
                          where mz is not null
                          GROUP BY gmsfzh, tbr
                         HAVING COUNT(*) > 1) b,
                        ba_ry_zgkssh m
                  WHERE b.gmsfzh = m.gmsfzh
                    AND m.rowid < tim)
oracle创建自增表空间 oracle创建自增表空间
create tablespace xjxy  logging datafile 'D:\app\zhangruyi\oradata\orcl\xjxy.dbf' size 5000M autoextend on next 1000M maxsize unlimited extent management local segment space management auto; 
各种总结 总结
----------2013-4-26

exists  和 in用法:
select * from ba_ry_jbxx T1 where  exists(select 1 from ba_ry_zgkssh T2 where T1.Gmsfzh=T2.Gmsfzh) ;-- 1,无实际意义,也可以为*.exists()表示在这个范围内。not表示不在这个范围内。

select * from ba_ry_jbxx T1 where t1.gmsfzh     in   (select ba_ry_zgkssh.gmsfzh  from  ba_ry_zgkssh  ) ;  --in 需要字段对应。(当用到not  in 的时候,注意:如果子查询中任意记录含有null的话,则查询结果不返回任何记录。除非子查询有非空限制(ba_ry_zgkssh.gmsfzh)否则,尽量不使用not in )

效率问题: 


GROUP BY 
是分组查询, 一般 GROUP BY 是和聚合函数配合使用group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)
group by 后面是要跟着的 select 中所有不是聚合函数的字段。

select  count(*),t1.mz from  ba_ry_jbxx  t1 group  by  t1.mz   having    count(*)> 2   and    t1.mz = '01'

having 相当于where     与where的唯一区别是 当查询语句中有 聚合函数(having 后需要用到聚合函数) 的时候 就不能用where 了  只能用having




oracle中如何查询数据表中重复的数据?  
  select  *  from   ba_ry_jbxx tt right   join (select t.gmsfzh  From ba_ry_jbxx t Group by t.gmsfzh  having Count(t.gmsfzh) > 1 )T  on T.Gmsfzh = tt.gmsfzh

  或 select  *  from   ba_ry_jbxx tt  ,(select t.gmsfzh  From ba_ry_jbxx t Group by t.gmsfzh  having Count(t.gmsfzh) > 1 )T 
    where   tt.gmsfzh = T.Gmsfzh

--------------2013-4-27

java创建线程的两种方式:

第一种方式:使用Runnable接口创建线程
第二种方式:直接继承Thread类创建对象

继承 Thread类:----------start(),run()方法都是Thread类中特有的方法。此类是实现了Runnable接口而重写的方法。run()方法为线程执行的内容。
1.新建一个线程类继承Thread类A   (从写run()方法)。  
2.new A().start();----表示启动线程(不一定立即执行),程序会自动调用run()方法真正执行线程(cpu有空间的话)

实现Runnable接口:
1.新建一个线程类B实现Runnable接口(从写run()方法)。
2.new   Thread ( new  B() ).start()  ---------启动线程。    
 

----------------2013-4-28
多态:(执行期间,而非编译期间)
条件;父类对象的引用指向子类对象,重写。
 




CountDownLatch latch = new CountDownLatch(list.size());
直到list.size()为0时,主线程继续往下走。
latch.countDown(),自动-1.





--------------------------------------------------------------------------------2013-5-13
[javascript]关于window.showModalDialog的缓存问题 window.showModalDialog()方法常用于在IE弹出对话框,
前不久使用中发现一个“滞留”问题,即弹出对话框中的网页内容不能及时更新,仍然显示第一次弹出时的内容,直到父页面刷新。
经过查找资料,发现有解决方法如下: 
1、给弹出的窗口的页面加上时间参数,这样可以消除缓存:

<script language='javascript'>
    var time = new Date();
     window.showModalDialog("newWin.html?time="+time,"父页面传递到子页面的值","")
</script>
2、在页面代码Page_Load()中设置缓存过期:
Response.Expires = -1;

3、在一个HTML页面中使用iframe,在其中嵌套真正要显示的页面,这样虽然iframe被缓存了,但里面真正要显示的页面还是重新加载了。


var kpxm_src = "<%=request.getContextPath()%>/jsp/zljc/jchd/setJcfw.jsp?hdbh="+hdbh+ "&tmpId=" + new Date().getTime();;
var sFeatures=fnSetValues();
var result = window.showModalDialog(kpxm_src,"父页面传递到子页面的值",sFeatures);

参数1:URL
参数2:父页面传给子页面的值
参数3.子页面的高度,宽度属性值。

window.showModalDialog和window.open()区别:
打开一个子窗口,并且可与父窗口相互传递数据,window.showModalDialog与window.open的最大区别就在于由ShowModalDialog打开子窗口后,父窗口将不能操作。
父窗口向子窗口传递参数采用ShowModalDialog的第2个参数即可,父窗口要获取子窗口传回的参数则可通过ShowModalDialog函数的返回值result获取。
子窗口获取父窗口参数的方法为采用子窗口window对象dialogArguments属性获取,例如:
var a=window.dialogArguments;
window.dialogArguments 即为父窗口window对象的引用。
注意第二个参数用window,这样你就把父窗口对象当做参数传递给了子窗口.
你也可以调用主窗口里的函数:
window.dialogArguments.函数名();



子窗口向父窗口返回参数采用window.returnValue属性,如:
window.returnValue=1;




showModalDialog() 弹出一个对话框,对话框是依附于打开它的那个窗口的;window.open() 是开一个新窗口,和打开它的那个窗口是独立的
关闭子窗口的办法:onclick="window.close();



WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
WEB-INF文件夹下除了web.xml外,还存一个classes文件夹,用以放置 *.class文件,这些 *.class文件是网站设计人员编写的类库,
实现了jsp页面前台美工与后台服务的分离,使得网站的维护非常方便。web.xml文件为网站部署描述XML文件,对网站的部署非常重要。
Web-Inf文件夹中除了有classes文件夹和一个web.xml文件外、还有lib文件夹(用于存放需要的jar包)(用于配置,比如说用来配置过滤器等。)




-----------------------------------------2013-5-28
1.
replace()函数用法:
SELECT REPLACE('JACK and JUE','J','BL') "Changes"
 FROM DUAL;
 
Changes
--------------
BLACK and BLUE  

2.
chr()函数和ascii()函数相反转换。

      select chr('36')  from dual   ======== $
      select  ascii('$') from dual  ========== 36

insert into test(col1,col2,col3,type) values(0,0,0,'&jfd') ,会弹出一个Variables提示框,要求你输入变量'jfd'值
而如果执行:insert into test(col1,col2,col3,type) values(0,0,0,chr(38)||'jfd'),就会直接把'&jfd'插入。



-----------------------------------2013-5-29



----------------------------------------------2013-7-16

document.getElementById("JSPY").innerHTML ="<B><font size = '3'  >" +jspy_gsh+"</font></B>" ;
document.getElementById("JSPY").innerText = jspy_gsh;

innerHTML 可以动态在固定标签上加标签.
innerText 只可以在标签上加入文本.


--------------------------------2013-7-17


tabList1.getSelectedRow().PZBH;	


-------------------------------------2013-7-18

导入导出dmp两种方式:
1.通过客户端访问数据库进行导入导出.
2.直接在数据库的机器上进行导入导出.

在本地(通过客户端访问数据库,客户端版本和数据库版本必须兼容):	imp   baxt/baxt@orcl   ------(orcl此时为连接数据库配置的服务名)
在数据库上: imp   baxt/baxt@orcl ------------(orcl此时为数据库的sid)

查询sid的sql语句:         select instance_name from v$instance; 

----------------------------2013-8-12

---cookies:
1.服务器可以向客户端写内容.
2.只能是文本内容.
3.只能拿自己webapp写入的东西.
4.Cookies分为两种:属于窗口/子窗口
		 属于文本

5.一个servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的servlet/jsp读取到.(路径值URL)不是指真实路径.

//绝对路径(真实的路径)
//相对路径(URL)


http协议时非连接的.	

Cokkies记录在客户端.
--Session记录在服务器端.服务器端的一块内存.名/值对出现.
SessionID (窗口传(SessionID)到服务器端,根据SessionID找到对应的session)
session利用cookies(窗口的)传递即可.
--session和窗口对应.


\规则:1.如果浏览器支持Cookies,创建session时,会把sessionid保存在cookies里面.
cookies真正禁止掉.通过session第二种实现方法.(如下,通过url地址传递)
2.如果不支持cookies,必须自己编程使用URL重写的方式实现session.
               response.encodeURL()
	       /转码
	       /URL后面加上sessionid.



//session不像cookies有路径的问题.同一个应用下的所有的servlet/jsp可以共享同一个session.前提是同一个客户端窗口.


--application(所有的客户端都可以访问)


-----------------------2013-8-13

去掉字符串数组中的重复值的方法:(Set不允许重复,所以把重复的都放入set后,再toArray后就去掉了.)
for(int ii=0;ii<tempStr.length;ii++){
set.add(tempStr[ii]);
            		
}
String[] str = (String[]) set.toArray(new String[0]);


----------2013-8-28
     前台取标识:
     var BKBM = document.getElementById("BKBM").value;
     action1 = strAction+"?method=delete_zgkssh&BKBM="+BKBM;
     var response = doPost(action1);
     if("1" == response ){
    	 alert("注销成功!");
     }else{
     	alert("注销失败!");
     }


     后台返回: response.getWriter().write("1");




-----------

     java.util.date和java.sql.date比有什么区别?

     一般时候用java.util.Date和数据库jdbc相关的方法都在java.sql这个包里,
     接受以java.sql.Date为参数。例如:java.sql.PreparedStatement里的setDate(int parameterIndex, java.sql.Date x)



---------------

java.lang包是默认导入的,不用手动引入。其他包就需要手动了。




--------------------------2013-8-30
效率测试:

(1)
ba_ry_jbxx:2000条
ba_ry_zgkssh:68801

查询ba_ry_zgkssh 的gmsfzh不在ba_ry_jbxx中的办法:


当ba_ry_jbxx未加gmsfzh索引字段时。特慢(120s)。
  select count(1)
          from ba_ry_zgkssh t
         where not exists
         (select 1 from ba_ry_jbxx a where a.gmsfzh = t.gmsfzh)

当ba_ry_jbxx加索引后,效率特大提高(不到1s)。


不用not exists时,用
select count(1)
  from ba_ry_zgkssh a, ba_ry_jbxx b
 where a.gmsfzh = b.gmsfzh(+)
   and decode(b.gmsfzh,'','1','0')='1'

   效率也不错!


--------------------------------2013-9-4
servlet是可以在任何服务器端运行的小程序。

web服务器端
email服务器端
ftp服务器端
http服务器端

doGet方式参数名都跟在url地址后面
doPost则不跟在后面


oracle
伪字段,rownum
取第几行到第几行。
rownum只能用<或<= 。

加主键和唯一,自动加索引。
-----------------plsql语言:
定义现有表中的字段类型的变量    变量声明方法:ba_ry_zgkssh.bkbm%TYPE;
定义现有表中的一条记录的类型    声明方法:baydata      ba_ry_zgkssh%rowtype;
cursor bay is
    select *
      from ba_ry_zgkssh t
     where t.bkdssxq like '2101%' and t.gxsj > sysdate -3

for baydata  in  bay(游标) loop 


定义数组,也得指定类型
必须手动创建一个类型。
type  type_table_emp_empno  is table of emp.empno%type index by binary_integer;
定义了新的类型 type_table_emp_empno;
然后可以使用
v_empnos type_table_emp_empno;

v_empnos(0) :=1;
v_empnos(1) :=2;
v_empnos(-1) :=2;//下标可以取负值。

----Record变量类型。
type  type_record_dept is record;
定义一个record的类型 record_dept(
			deptno dept.deptno%type;
			dname dept.dname%type;
			loc  dept.loc%type;
				);

v_temp type_record_dept;
用法:
v_temp.deptno :=1;
v_temp.dname :='bj';
v_temp.loc :='bb';



--------使用%rowtype声明record变量;(好处,表加字段后,无需修改)
v_temp dept%type;--即可。


select 语句里必须有into(切保证有且只有一条记录)或者用游标。
---%rowcount。
sql%rowcount;表示刚刚执行的sql语句影响了多少行!

if循环:
if  then
elseif  then
else 

endif;


plsql语言中所有的循环一定是loop   end loop;
三种循环:
(1)
loop
 
   exit when(i>11);//退出
end loop;
相当于 do   while()循环。

(2)
while  j<11  
loop

end loop;

相当于while()循环



(3)

for  k  in  1..10  loop


end  loop;
相当于 for  循环


//fetch一下后游标指针自动向下移动。

游标:

----只会打印一条!
cursor c  is  select *  from  emp ;
 v_emp emp%rowtype;
 open c;
  fetch c  into v_emp;       
  dbms_output.put_line(v_emp.empno);
 close c;

---------------------------------------------
do  while()循环游标。
------全部打印完。
 cursor c  is  select *  from  emp ;
 v_emp emp%rowtype;
 open c;

 loop;

  fetch c  into v_emp;       
    exit  when  (c%notfound);
  dbms_output.put_line(v_emp.empno);
 close c;

 end loop;
----------------------------------------------------
while() 循环游标

-------------------------------------------------

(for循环和游标一起用简单)
for循环取游标是三种循环中最简单的:

 cursor c  is  select *  from  emp ;
 
begin--------------v_emp不需要声明,for自动给声明。游标不需要开启和关闭,for自动开启和关闭。
 for v_emp  in  c loop
   dbms_output.put_line(v_emp.empno);
 end loop;
end;
-------------------------------------------



1.%notfound    最近的fetch语句找不到记录。
2.%found    最近的fetch语句找到记录。
3.%rowcount   记录数


------------------------
带参数的游标。


-----------------------------2013-9-9
容器:



---------------------------------2013-9-12
DOM编程:

------------------
Websphere和Weblogic,为应用服务器



---------------------------2013-9-17
java.sql.Date  

-------------------2013-11-4
Cookies有两种:
1.临时的,在内存中的。
2.以文本文档形式存在客户端中。

session的两种实现方式:
  1.通过Cookies实现。把session id 放在Cookies里面(临时的即可,只跟浏览器窗口有关)。
  2.通过URL重写实现。(所有的连接地址加上response.encodeURL())
规则:
  如果浏览器支持Cookies,创建session时,会把session id保存在Cookies(临时的).
  如果浏览器不支持Cookies,每次会生成新的session id .此时必须自己编程,使用URL重写的方式实现session.(通过url后传入session id)



在一个页面设置的Cookies,只有这个页面所在的目录下或者其子路径下的所有的jsp/servlet可以访问。
session不存在路径的问题,同一个application下的jsp/sevlet可以共享同一个session,前提是同一个客户端窗口。

application.所有的客户端共有的。

Cookies设置了过期时间,就会在客户端硬盘上生成txt文件。
若未设置过期时间,则表示这个Cookies的声明周期为浏览器会话期间,关闭浏览器窗口,cookies就消失。一般不会在客户端硬盘上生成txt文件。而是保存在内存中。



jsp就是servlet。
tomact下的work是存放jsp转换完成之后的class文件和java文件。 
<%!  int a= "";%>//声明成员变量
<%  int b= "";%>//声明局部变量
<%!  void m(){};%>//声明方法正确写法.
<%  void n(){};%>//错误写法,类似于在方法里声明方法了。

html的注释:<!-- 	--> ,客户端浏览器可以查看
jsp的注释:<%-- --%>,客户端浏览器看不到,程序员自己看的注释。


Directive编译指令,编译期间的命令:
<%@ 指令的名称   %>
常见的三种编译指令:
page 
 <%@ page import="org.dom4j.*"%  contentType="text/html; charset=GBK">
 <%@ page errorPage="error.jsp"%  >配置当当前出错时显示的页面。
 
include:将指定的jsp程序或者html文件包含进来。	
<%@ include file="fileURL" %> ,先包含进来,再编译,然后再执行。
taglib

<jsp:include >执行期间引入进来。

<jsp:forward >和response.sendRedirect区别:
<jsp:forward >使用同一个request
response.sendRedirect是不同request
Global site tag (gtag.js) - Google Analytics