今天,师弟开发时有遇到一个小问题:struts表单点取消时,出现org.apache.struts.action.InvalidCancelException异常,弄了一阵子,发现用了validate="true"就会出现此异常。然后找到 
freiberg 的博客。
说到用
<set-property property="cancellable" value="true"/>
可以解决,马上复制去试下,行喔,^_^。
---------------------------------引用--------------------------------------
Any existing applications that use the Cancel processing will need to modify their struts-config.xml to set the cancellable property for actions which require it. 
In Struts 1.2.9 the <set-property> is used to set the cancellable property for an action.... 
    <action path="/fooAction"
input="/foo.jsp"
validate="true">
<set-property property="cancellable" value="true"/>
<forward name="success" path="/bar.jsp"/>
</action>
From Struts 1.3.x a new cancellable attribute can be used.... 
    <action path="/fooAction"
input="/foo.jsp"
validate="true"
cancellable="true">
<forward name="success" path="/bar.jsp"/>
</action>
In both Struts 1.2.9 and Struts 1.3.x an exception handler can be configured to handle the InvalidCancelException 
    <action path="/fooAction"
input="/foo.jsp"
validate="true"
cancellable="true">
<forward name="success" path="/bar.jsp"/>
<exception key="errors.cancel"
type="org.apache.struts.action.InvalidCancelException"
path="/foo.jsp"/>
</action>
---------------------------------------end-----------------------------------------------------
刚好我用的是struts是1.2.9的
原文:http://www.blogjava.net/freiberg/archive/2007/10/20/154384.html 
			posted @ 
2007-10-31 16:25 流浪汗 阅读(1440) | 
评论 (1) | 
编辑 收藏 
		
			
		
			
			      今天,师弟更新数据的时候出现问题。出现“更新分区关键字列将导致分区的更改” ,看了下数据库,更新的表有分区,而且更新的字段是分区的关键字(从报错可以看出来了)。
      网上找了下,说用这样可以:
alter table xxx enable row_movement;
但我没有试也没有这样做,可能是不放心,解决办法是不更新分区的关键字(因为系统不用更新它的,之前更新是因为hibernate处理它了)。如果的确要更新可以先删除了,再添加一个。引用
http://www.itpub.net/283642,1.html
Question: Why am I getting an ora-14402 error when I update a partition key 
Answer: You cannot update the value of the partition key, the only way you can go about this is by deleting the old row and adding a new row to the table
			posted @ 
2007-10-29 21:09 流浪汗 阅读(4362) | 
评论 (0) | 
编辑 收藏 
		
			
		
			
			      与写对应的是读.
 
package net.blogjava.chenlb;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
/**
 * jxl 的Excel阅读器.
 * @author chenlb 2007-10-20 下午01:36:01
 */
public class JxlExcelReader {
    
    /**
     * @return 返回String[] 的列表
     */
    public List readExcel(InputStream in) {
        List lt = new ArrayList();
        Workbook wb = null;
        
        try {
            wb = Workbook.getWorkbook(in);
            Sheet[] sheets = wb.getSheets();    //获取工作
            for(int i=0; i<sheets.length; i++) {
                Sheet sheet = sheets[i];
                for(int j=0; j<sheet.getRows(); j++) {
                    Cell[] cells = sheet.getRow(j);    //读取一行
                    if(cells != null && cells.length > 0) {    //这一行有内容才添加
                        String[] dataCells = new String[cells.length];
                        for(int k=0; k<cells.length; k++) {
                            dataCells[k] = ""+cells[k].getContents(); //读内容
                        }//column
                        lt.add(dataCells);
                    }
                }//one sheet
            }//xls file
        } catch (BiffException e) {
            e.printStackTrace();
        } catch (IOException e) {    
            e.printStackTrace();
        } finally {
            if(wb != null) {
                wb.close();
            }
        }
        
        return lt;
    }
}
			posted @ 
2007-10-29 11:04 流浪汗 阅读(1020) | 
评论 (0) | 
编辑 收藏 
		
			
		
			
			      项目中要写excel,把这个例子写出来,以后可以看。
1.写excel类
package net.blogjava.chenlb;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
/**
 * Jxl 的 Excel写数据器.
 * @author chenlb 2007-10-29 上午10:39:31
 */
public class JxlExcelWriter {
    
    /**
     * @param datas 封装着Object[]的列表, 一般是String内容.
     * @param title 每个sheet里的标题.
     */
    public void writeExcel(OutputStream out, List datas, String[] title) {
        if(datas == null) {
            throw new IllegalArgumentException("写excel流需要List参数!");
        }
        try {
            WritableWorkbook workbook = Workbook.createWorkbook(out);
            WritableSheet ws = workbook.createSheet("sheet 1", 0);
            int rowNum = 0;    //要写的行
            if(title != null) {
                putRow(ws, 0, title);//压入标题
                rowNum = 1;
            }
            for(int i=0; i<datas.size(); i++, rowNum++) {//写sheet
                Object[] cells = (Object[]) datas.get(i);
                putRow(ws, rowNum, cells);    //压一行到sheet
            }
            
            workbook.write();
            workbook.close();    //一定要关闭, 否则没有保存Excel
        } catch (RowsExceededException e) {
            System.out.println("jxl write RowsExceededException: "+e.getMessage());
        } catch (WriteException e) {
            System.out.println("jxl write WriteException: "+e.getMessage());
        } catch (IOException e) {
            System.out.println("jxl write file i/o exception!, cause by: "+e.getMessage());
        }
    }
    private void putRow(WritableSheet ws, int rowNum, Object[] cells) throws RowsExceededException, WriteException {
        for(int j=0; j<cells.length; j++) {//写一行
            Label cell = new Label(j, rowNum, ""+cells[j]);
            ws.addCell(cell);
        }
    }
}
2.使用
    public void testWriteExcel() {
        List datas = new ArrayList();
        String[] data = {"1", "chenlb"};
        datas.add(data);
        try {
            OutputStream out = new FileOutputStream(new File("doc/chenlb.blogjava.net.xls"));
            JxlExcelWriter jxlExcelWriter = new JxlExcelWriter();
            jxlExcelWriter.writeExcel(out, datas, new String[] {"Id", "name"});
            out.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
			posted @ 
2007-10-29 10:52 流浪汗 阅读(5930) | 
评论 (1) | 
编辑 收藏 
		
			
		
			
			      当为遗留系统加入spring时,经典问题就是遗留系统需要引用spring管理的bean。幸好spring有机制可以处理这些。
建一个类实现ApplicationContextAware接口,有一个引用ApplicationContext的静态成员,然后,遗留系统需要引用spring管理的bean的地方,使用这个类。
1.比如:我这里建一个SpringContext类
package net.blogjava.chenlb;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
 * 此类可以取得Spring的上下文.
 * Spring 使new方法创建的对象可以引用spring管理的bean.
 * 2007-10-18 上午11:12:33
 * @author chenlb
 */
public class SpringContext implements ApplicationContextAware {
    protected static ApplicationContext context;
    
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
    public static ApplicationContext getContext() {
        return context;
    }
}
2.然后在spring配置文件里加
<bean id="springContext" class="net.blogjava.chenlb.SpringContext"></bean>
3.其它类中引用
MyBean myBean = (MyBean) SpringContext.getContext().getBean("myBean"); 
4.如果老是写SpringContext.getContext().getBean("...");麻烦,可以建一个工厂类来返回你要的bean
package net.blogjava.chenlb;
public class MyServerFactory {
    public static MyBean1 getMyBean1() {
        return (MyBean1) SpringContext.getContext().getBean("myBean1");
    }
    
}
^_^
			
posted @ 
2007-10-27 16:31 流浪汗 阅读(15473) | 
评论 (1) | 
编辑 收藏 
		
			
		
			
			     jstl 1.0 formatDate yyyy-mm 不能正常工作,格式出来的月是00,要用yyyy-MM,才能,郁闷。
			
posted @ 
2007-10-25 22:38 流浪汗 阅读(384) | 
评论 (1) | 
编辑 收藏 
		
			
		
			
			      开发项目,今天又难到问题。junit测试写数据到oracle时,出现:
ORA-01461: can bind a LONG value only for insert into a LONG column错误,郁闷,试了几次发现,中文才会有这个问题,而且jsp页面里输入的中文又不会报这个错(前端是struts)。像mysql的话,很有可能是数据库字符编码问题,就怀疑是否为字符编码问题(这种思维不知道会不会很傻),因为项目所有编码都是utf-8, 看了下oracle是zhs16GBK。然后就建一个gbk的项目来测试,结果还是出现此问题。后来就换用旧系统的classes12.jar驱动测试下,^_^, 不会了,太好了。看了下classes12.jar的版本是
9.0.2.0.0的而且又是classes12.jar不爽,后来看到一个帖子,说:用9的和10.2的没有此问题,我回去看下之前出问题的版本是10.1.0.2.0,郁闷,用的数据库是10.2.0.1.0。马上换成10.2.0.1.0的版本。当初不注意,今天花了我几个小时。我一直以为jdbc是数据库对应的。
对应的jdbc在oracle安装目录可以找到oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar
问题总算解决,^_^ 
			posted @ 
2007-10-20 21:08 流浪汗 阅读(25308) | 
评论 (14) | 
编辑 收藏 
		
			
		
			
			      用java好久了,还没有写个压缩文件的示例,昨晚弄了下,把写下来,以后可以看。
关系到
java.util.zip.ZipEntry
java.util.zip.ZipOutputStream
如果要解决中文文件名问题,用到ant.jar
这两个类。
ZipOutputStream.putNextEntry(ZipEntry);就可以了,然后ZipOutputStream.wirte();就得了。
package net.blogjava.chenlb.zip;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipOutputStream;
//用ant.jar的zip.*可以解决中文文件名问题
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
 * 压缩文件.
 * 2007-10-17 下午11:19:50
 * @author chenlb
 */
public class RecursiveZip {
    
    public static void main(String[] args) {
        RecursiveZip recursiveZip = new RecursiveZip();
        System.out.println("====开始====");
        try {
            OutputStream os = new FileOutputStream("e:/doc-recursive.zip");
            BufferedOutputStream bs = new BufferedOutputStream(os);
            ZipOutputStream zo = new ZipOutputStream(bs);
            
            //recursiveZip.zip("e:/recursive-zip/中文文件名.txt", new File("e:/recursive-zip"), zo, true, true);
            recursiveZip.zip("e:/recursive-zip", new File("e:/recursive-zip"), zo, true, true);
            
            zo.closeEntry();
            zo.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("====完成====");
    }
    /**
     * @param path 要压缩的路径, 可以是目录, 也可以是文件.
     * @param basePath 如果path是目录,它一般为new File(path), 作用是:使输出的zip文件以此目录为根目录, 如果为null它只压缩文件, 不解压目录.
     * @param zo 压缩输出流
     * @param isRecursive 是否递归
     * @param isOutBlankDir 是否输出空目录, 要使输出空目录为true,同时baseFile不为null.
     * @throws IOException
     */
    public void zip(String path, File basePath, ZipOutputStream zo, boolean isRecursive, boolean isOutBlankDir) throws IOException {
        
        File inFile = new File(path);
        File[] files = new File[0];
        if(inFile.isDirectory()) {    //是目录
            files = inFile.listFiles();
        } else if(inFile.isFile()) {    //是文件
            files = new File[1];
            files[0] = inFile;
        }
        byte[] buf = new byte[1024];
        int len;
        //System.out.println("baseFile: "+baseFile.getPath());
        for(int i=0; i<files.length; i++) {
            String pathName = "";
            if(basePath != null) {
                if(basePath.isDirectory()) {
                    pathName = files[i].getPath().substring(basePath.getPath().length()+1);
                } else {//文件
                    pathName = files[i].getPath().substring(basePath.getParent().length()+1);
                }
            } else {
                pathName = files[i].getName();
            }
            System.out.println(pathName);
            if(files[i].isDirectory()) {
                if(isOutBlankDir && basePath != null) {    
                    zo.putNextEntry(new ZipEntry(pathName+"/"));    //可以使空目录也放进去
                }
                if(isRecursive) {    //递归
                    zip(files[i].getPath(), basePath, zo, isRecursive, isOutBlankDir);
                }
            } else {
                FileInputStream fin = new FileInputStream(files[i]);
                zo.putNextEntry(new ZipEntry(pathName));
                while((len=fin.read(buf))>0) {
                    zo.write(buf,0,len);
                }
                fin.close();
            }
        }
    }
}
			posted @ 
2007-10-18 13:53 流浪汗 阅读(3052) | 
评论 (3) | 
编辑 收藏 
		
			
		
			
			      昨天出了一个奇怪的问题,hibernate通过实体Id(char(10)型)取得数据,session.find("from TableName where id=?","value");取不到数据,但数据库里是有这个条数据。真奇怪,后来用pl/sql看数据库,鼠标点到Id那时,可以看到内容后面还有一些空格,带着期望与质疑把字段里的值自制过来, session.find("from TableName where id=?","value    ");后发现可以。我特别试了下connection.createStatement("select * from table_name where id='value'");则正常取数据,session.find("from TableName where id=?","value");而却找不到数据,然后又试了下 
ptmt = connection.prepareStatement(select * from table_name where id=?");
ptmt.setString(1,"year");
这样也不行,以是结论是:jdbc驱动PrepareStatement对char字段类型的查找问题,因为hibernate是用PrepareStatement的,自然,hibernate对char对应的属性条件查找出现找不到的情况,
解决办法是:
1.属性用TRIM函数处理:session.find("from TableName where TRIM(id)=?","value");
2.char改为varchar2类型
今天试了下mysql,它不会这样的情况,所以结论是:Oracle JDBC PreparedStatement的bug(有可能它故意这样)
 
			
posted @ 
2007-10-17 22:22 流浪汗 阅读(5629) | 
评论 (1) | 
编辑 收藏 
		
			
		
			
			      jsp 直接输出二进制文件怎么办呢?
download.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%@ page import="java.io.*" %>
<%
try {
    FileInputStream fin = new FileInputStream(application.getRealPath("/")+"/readme.zip");
    response.addHeader("Content-Disposition","attachment;filename=read.zip"); 
    byte[] buf = new byte[1024];
    int readSize = fin.read(buf);
    OutputStream os = response.getOutputStream();
    
    while(readSize != -1) {
        os.write(buf, 0, readSize);
        readSize = fin.read(buf);
    }
    os.flush();
    os.close();
    os = null ;
    response.flushBuffer();
    out.clear();
    out  =  pageContext.pushBody();
        
} catch (IllegalStateException e) {
}
%>
webapps/test/readme.zip文件可以被下载,可能第一次会输出文字。
			
posted @ 
2007-10-16 23:57 流浪汗 阅读(587) | 
评论 (0) | 
编辑 收藏