Dbutils框架使用和文件的上传和下载

一、Dbutils框架使用
1、实现查询功能
QueryRunner qr=new QueryRunner(连接池对象);
BeanHandler<泛型> bh=new BeanHandler<泛型>(实体类.class);
实体对象 entity=(实体对象)qr.query(sql,bh,参数1,参数2,参数3);
2、批处理
QueryRunner qr=new QueryRunner(连接池对象);
String sql="insert into users(name,password) values(?,?)";
//二维的对象的数组
Object[][] params={{"111","111"},{"111","222"}};
qr.batch(sql,params);  执行三次,将两条记录通过批处理全部插入进去
3、ArrayHandler   结果集返回的是一个对象数组
4、ArrayListHandler  返回  List<Object[]>
5、ColumnListHandler 指定一个字段名并返回一个数组
6、keyHandler(字段名):将结果集中的每一行数据都封装到一个Map中
select * from users;
返回多行多列

一行元素的集合  Map类型的集合里面去   key为字段名   value为值

多行的元素Map类型的集合   键: 参数(字段名且必须是唯一的) 值 行元素的集合
Map<String,Map<key,value>> map=qr.query(sql,new KeyeHandle("id"));
遍历:
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(1,"aaaa");
map.put(2,"bbbb");
map.put(3,"cccc");

Set<Map.Entry<Integer,String>> set=
map.entrySet();  //键值对组成的组合值(类型是内部类Entry<Integer,String>);
for(Map.Entry<Integer,String> element:set){
element.getValue()+"\t"+element.getKey();  仍然可以得到值

}
7、MapListHandle()  //返回类型为 List<Map<键,值>>
二、文件的上传和下载
1、上传功能,需完成如下二步:
(1)在web页面中添加上传输入项(JSP)(HTML)
表单里有 <input type="file">标签
<form action="{pageContext.request.contextPath}/servlet/UploadServlet" method="post" enctype="multipart/form-data"></form>
设置enctype类型,指定表单提交的时候采用什么编码方式
默认是application/x-www-form-urlencoded
如果上传 应指定为:multipart/form-data
  (2)在servlet中读取上传文件的数据,并保存到本地硬盘
获取表单里的数据。 不能用getParameter()来获取数据,因为enctype已经更改
getInputStream() 获取到了上传的字节流
重点:利用apache的组件commons-fileupload组件  来解析流。需要导入组件jar文件 

ServletFileUpLoad     upLoad.PareRequest();//调用方法解析


FileItem[] item=upLoad.PareRequest();

item[i].isFormField(),  
如果返回为真,则表示是普通的输入项 
getFieldName() 获取输入项的名字   
getString() 获取输入项的值
如果返回值为假,则是文件的上传项
getName()  ---用户上传的文件的文件名
getInputStream()  ---得到此文件的流对象


ServletFileUpLoad对象方法, 来解决乱码等问题
ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:
boolean isMultipartContent(HttpServletRequest request) :判断上传表单是否为multipart/form-data类型
List parseRequest(HttpServletRequest request):解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。 
setFileSizeMax(long fileSizeMax) :设置上传文件的最大值
setSizeMax(long sizeMax) :设置上传文件总量的最大值
setHeaderEncoding(java.lang.String encoding) :设置编码格式
setProgressListener(ProgressListener pListener) 


上传代码:
//文件的上传
//(1)创建一个解析器工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//(2)得到解析器  实例化,用工厂对象作为参数来实例化
ServletFileUpload upload=new ServletFileUpload(factory);
//(3)对请求进行解析,有几个输入项,就有几个FileItem对象
try {
List<FileItem> list=upload.parseRequest(request);

//(4)迭代list集合,获取list集合中每一个输入项
for(FileItem item:list){
//(5)判断输入项的类型
if(item.isFormField()){
System.out.println(item.getFieldName()+"\t"+item.getString());
}else{
String fileName=item.getName();   //上传文件的文件名  d:\aa\bb\cc\1.txt
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);  //得到文件名
InputStream is=item.getInputStream();
OutputStream os=new FileOutputStream("C:\\"+fileName);
byte[] buff=new byte[1024];
int len=0;
while((len=is.read(buff))>0){
os.write(buff, 0, len);
}
is.close();
os.close();
}
}
request.setAttribute("message", "上传成功!");
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
request.setAttribute("message", "上传失败!");
}
request.getRequestDispatcher("/message.jsp").forward(request, response);




思考:(1)解决普通输入项的乱码问题
     (2)当用户只输入了一个上传文件项目,为什么出现这种异常?如何解决
              (3)创建一个动态的输入项目   +  -   来增加上传和删除项
     (4)限制一下上传文件的大小和总量的大小。
     (5)限制一下上传文件的类型
     (6)指定一下临时文件的存放路径,当上传文件的时候超过大小,  删除临时文件的问题?
     (7)如果上传的东西同名,不被覆盖
     (8)上传的资源放在那? (不能放在同一个文件夹下)
       

你可能感兴趣的:(sql,框架,String,servlet,list,encoding)