天天看点

jsp利用smartLoad实现上传下载

1.在填写表单时需要进行日期、数字等校验,这可以用jQuery easyUI来实现,非常方便。

使用jquery easyui时需导入类似jquery-easyui-1.3.1的包,然后在jsp页面引入相应的文件,一般来说是4个。

<!-- 先引入jquery核心文件,剩下的引入顺序就无所谓 -->
<script type="text/javascript" charset="utf-8" src="js/jquery-easyui-1.3.1/jquery-1.8.0.min.js"></script>
<!-- 引入easy_ui的css样式文件 -->
<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.3.1/themes/default/easyui.css" target="_blank" rel="external nofollow" >
<!-- 引入easy_ui的js -->
<script type="text/javascript" charset="utf-8" src="js/jquery-easyui-1.3.1/jquery.easyui.min.js"></script>
<!-- 引入国际化文件 -->
<script type="text/javascript" charset="utf-8" src="js/jquery-easyui-1.3.1/locale/easyui-lang-zh_CN.js"></script>
           

2.上传时需注意两点,method="post"和enctype="multipart/form-data".

3.BaseDao是一个最基本的接口,里边定义了增删改查数据库的方法,使用时直接继承就好了。如:

public interface BaseDao<Entity> {//Entity也可以换成其他值,一般换为T,然后所有的Entity都换成T才可以,泛型的一种写法
	void save(Entity entity) throws Exception;//保存
	void view(Entity entity) throws Exception;//展示
	void update(Entity entity) throws Exception;//更新
	void delete(int id) throws Exception;//根据id删除指定数据
	Entity findById(int id) throws Exception;//根据id查询指定记录
	List<Entity> findAll() throws Exception;//查询所有记录
}
           

4.

ParameterizedType pz = (ParameterizedType) this.getClass().getGenericSuperclass();
//利用反射返回当前类的父类的类型,并强制转换
           

5.BaseDaoImpl中有

String methodName = "get" + fs[i].getName().substring(0,1).toUpperCase()+ fs[i].getName().substring(1);
String methodName = "get" + Character.toUpperCase(fs[i].getName().charAt(0))+ fs[i].getName().substring(1);
           

这两句是等效的。

6.若想获取request,可用类似下边的方法

SamrtUpload su = new SmartLoad();
Request req = su.getRequest();
           

7.String型转化为int型

int id = Integer.parseInt(request.setParameter("id"));
//因为request.setParameter()获取的都为string类型
           

8.若想让表的自增索引从0开始,则可以用

truncate 表名;这相当于删除表重建

9.传递方法时不用打单引号或双引号,否则会找不到该方法.如:

<form action="UserServlet?method=save">;//正确
<form action="UserServlet?method='save'">;//可能会出错
           

10.根据id删除时

String sql = "delete from " + clazz.getSimpleName() + " where id = " + id;//注意空格
           

" where id = "的id后不能加问号,因为后边已经有了变量值,不用占位

查找时

String sql = "select * from " + clazz.getSimpleName() + " where id= ? ";
           

而这" where id= ? "需加问号,因为要占位

11.el表达式中,如果要做判断某值是否为空,可以用

<c:if test="${user.path ne null }">//ne表示不相等

<c:if test="${user.path eq null }">//eq表示相等
           

12.在使用Myeclipse时也遇到问题,就是以前只要一开启服务器,界面就自动跳转到console控制台,今天不知啥原因不跳了,网上查了才知道,在Window-preferences-Run/Debug-Console,下边有两个show选项,"Show when program writest to standard out"和"Show when program writes to standard error,都勾上时就会自动跳转,不选择就不跳。

13.关于basePath和realPath

SmartUpload su = new SmartUpload();//新建上传下载对象,对,smartUpload也可以下载
File file = su.getFiles().getFile(0);获取上传的文件,因为只上传了一个文件,所以为0
ServletContext sc = new ServletContext();//获取ServletContext对象,该对象用于共享数据
String basePath = sc.getRealPath("/upload");//定义文件上传位置
//输出的basePath为E:\Program Files\apache-tomcat-6.0.14\webapps\upload\upload
//其中第一个upload为项目名称,第二个upload为上传的位置。虽然想把文件上传至项目的文件夹中
//但上传至服务器是无争议的,因为tomcat就是服务器,所以会上传到那个位置
String realPath = basePath + "/" + UUID.randomUUID().toString() + file.getFileName();//假设文件名为001.jpg
//打印出的realPath为E:\Program Files\apache-tomcat-6.0.14\webapps\upload\upload/b9e47b6b-c656-41f0-a1c2-828087a011ad001.jpg
//加UUID是为了防止文件重名
           

14.下面贴两段代码,以后可以直接拿来用

①BaseDaoImpl中的代码,利用反射获取方法,注意里边的注释

/**
 * 利用反射获取
 * 
 */

package com.bjsxt.base;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.bjsxt.util.DBUtil;

public class BaseDaoImpl<Entity> implements BaseDao<Entity> {
	
	protected Class clazz;
	
	public BaseDaoImpl(){
		ParameterizedType pz = (ParameterizedType) this.getClass().getGenericSuperclass();
		//利用反射返回当前类的父类的类型,并强制转换
		clazz = (Class) pz.getActualTypeArguments()[0];
		//返回此类型实际类型参数的Type对象数组的第一个
		//这两步的作用就是获取父类泛型参数的实际类型
		//System.out.println(clazz + "这是测试代码,打印出来的");
		
		//打印得出clazz为class com.bjsxt.po.User
		
	}
	
	
	@Override
	public void save(Entity entity) throws Exception {
		Connection conn = DBUtil.getConn();//连接数据库
		String sql = "insert into " + clazz.getSimpleName() + " values(null";
		Field[] fs = clazz.getDeclaredFields(); 
		for (int i = 1; i < fs.length; i++) {//这里要注意i要从1开始,因为数据库下标是从1开始,否则会出问题
			sql += ",?";
		}
		sql = sql + ")";
		PreparedStatement ps = DBUtil.getPs(conn, sql);
		//user.setUsername(rs.getString("username"));
		for (int i = 1; i < fs.length; i++) {//这里也要注意i要从1开始
			String methodName = "get" + Character.toUpperCase(fs[i].getName().charAt(0)) + fs[i].getName().substring(1);
			//也可写为String methodName = "get" + fs[i].getName().substring(0,1).toUpperCase()+ fs[i].getName().substring(1);
			//假如有个实体user类,含有uname属性,则获取uname的方法默认会为getUname(),会将uname的首字母大写,其余不变
			//Character.toUpperCase就是将字符大写,然后将除首字母以外的截取出来,拼到一起,构成类似于getUname()的方法
			//user.setUsername(uForm.getUsername);  
			//该处用get是因为要把对象保存进数据库里,用get获取属性
			Method m = clazz.getDeclaredMethod(methodName);
			ps.setObject(i,m.invoke(entity));
			//setObject用来给"?"赋值。invoke则是在不知道具体类的情况下利用字符串去调用方法
			//正常情况下是user.getUsername,m.invoke(entity)中m是一个方法,类似于getUsername(),entity相当于user.
			//invoke是从实体里边找方法,那句话的意思就是从实体里边调用方法
		}
		ps.executeUpdate();
		DBUtil.close(ps);
		DBUtil.close(conn);
	}

	@Override
	public void view(Entity entity) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void update(Entity entity) throws Exception {
		Connection conn = DBUtil.getConn();
		String sql = "update " + clazz.getSimpleName() + " set ";//注意这儿的set两旁的空格,否则会出错,蛋疼
		Field[] fs = clazz.getDeclaredFields();
		for (int i = 1; i < fs.length; i++) {//下标从1开始
			sql += fs[i].getName() + " = ?,";
		}
		sql = sql.substring(0,sql.length()-1) + " where id = ?"; //减去最后的逗号
		PreparedStatement ps = DBUtil.getPs(conn, sql);
		for (int i = 1; i < fs.length; i++) {//注意下标从1开始
			String methodName = "get" + Character.toUpperCase(fs[i].getName().charAt(0)) + fs[i].getName().substring(1);
			System.out.println(methodName+"这是methodName");
			Method m = clazz.getDeclaredMethod(methodName);
			ps.setObject(i, m.invoke(entity));
		}
		Method getId = clazz.getDeclaredMethod("getId");//更新需要知道id
		ps.setInt(fs.length, (Integer) getId.invoke(entity));//因为id在sql语句最后一个问号处,所以要用fs.length
		ps.executeUpdate();
		DBUtil.close(ps);
		DBUtil.close(conn);
		
	}

	@Override
	public void delete(int id) throws Exception {
		Connection conn = DBUtil.getConn();
		//String sql = "delete from " + clazz.getSimpleName() + " where id = ?" + id;
		//上句为错误写法,不能加问号,因为后边已经有了变量值,不用占位
		String sql = "delete from " + clazz.getSimpleName() + " where id = " + id;
		PreparedStatement ps = DBUtil.getPs(conn, sql);
		ps.executeUpdate();
		DBUtil.close(ps);
		DBUtil.close(conn);
	}

	@Override
	public Entity findById(int id) throws Exception {
		Connection conn = DBUtil.getConn();
		String sql = "select * from " + clazz.getSimpleName() + " where id= ? ";
		PreparedStatement ps = DBUtil.getPs(conn, sql);
		ps.setInt(1,id);
		ResultSet rs = ps.executeQuery();
		Entity entity = (Entity) clazz.newInstance();//利用无参构造函数新建实例
		Field[] fs = clazz.getDeclaredFields();
		if(rs.next()){
			for (int i = 0; i < fs.length; i++) {
				String methodName = "set" + Character.toUpperCase(fs[i].getName().charAt(0)) + fs[i].getName().substring(1);
				Method m = clazz.getDeclaredMethod(methodName, fs[i].getType());
				m.invoke(entity, rs.getObject(fs[i].getName()));
			}
		}
		DBUtil.close(rs);
		DBUtil.close(ps);
		DBUtil.close(conn);
		
		return entity;
	}

	@Override
	public List<Entity> findAll() throws Exception {
		Connection conn = DBUtil.getConn();
		String sql = "select * from " + clazz.getSimpleName();
		PreparedStatement ps = DBUtil.getPs(conn, sql);
		ResultSet rs = ps.executeQuery();
		List<Entity> enList = new ArrayList<Entity>();
		while(rs.next()){
			Entity en = (Entity) clazz.newInstance();
			//user.setUsername(rs.getString("username"));
			Field[] fs = clazz.getDeclaredFields();
			for (int i = 0; i < fs.length; i++) {
				String methodName = "set" + Character.toUpperCase(fs[i].getName().charAt(0)) + fs[i].getName().substring(1);
				Method m = clazz.getDeclaredMethod(methodName, fs[i].getType());
				m.invoke(en, rs.getObject(fs[i].getName()));
			}
			enList.add(en);
		}
		DBUtil.close(rs);
		DBUtil.close(ps);
		DBUtil.close(conn);
		return enList;
	}
	
}
           

②利用SmartUpload控制上传下载的servlet

package com.bjsxt.action;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjsxt.dao.UserDao;
import com.bjsxt.dao.impl.UserDaoImpl;
import com.bjsxt.po.User;
import com.jspsmart.upload.File;
import com.jspsmart.upload.Request;
import com.jspsmart.upload.SmartUpload;

public class UserServlet extends HttpServlet {
	
	private UserDao udao = new UserDaoImpl();//这条不能忘,很重要
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String method = request.getParameter("method");
		if("save".equals(method)){
			this.save(request,response);
		}else if("view".equals(method)){
			this.view(request,response);
		}else if("preUpdate".equals(method)){
			this.preUpdate(request,response);
		}else if("delete".equals(method)){
			this.delete(request,response);
		}else if("update".equals(method)){
			this.update(request,response);
		}else if("download".equals(method)){
			this.download(request,response);
		}
	}
	
	
	/**
	 * 添加用户信息
	 * @param request
	 * @param response
	 */
	private void save(HttpServletRequest request, HttpServletResponse response) {
		try {
			//1.创建上传下载对象
			SmartUpload su = new SmartUpload();
			//2.初始化上传下载
			su.initialize(this.getServletConfig(),request,response);
			//3.设置上传的限制内容
			su.setMaxFileSize(400000);//单个文件的最大上传大小
			su.setTotalMaxFileSize(100000000);//总上传文件大小
			su.setAllowedFilesList("jpeg,png,jpg,gif");//设置限制的文件类型
			su.setDeniedFilesList("exe,doc,ppt");//设置不允许上传的文件类型
			//4.开始上传
			su.upload();
			
			File file = su.getFiles().getFile(0);//获取上传的文件,因为只上传了一个文件,所以为0
			String realPath = null;//文件上传的真实路径
			
			if(file.getSize()>0){
				ServletContext sc = this.getServletContext();//得到servletContext实例
				String basePath = sc.getRealPath("/upload");
				//获取上传的绝对路径,因为上传至web服务器的虚拟路径
				/******************************************************************/
				System.out.println("bathPath为" + basePath);
				//输出为E:\Program Files\apache-tomcat-6.0.14\webapps_upload_upload
				
				
				
				realPath = basePath + "/" + UUID.randomUUID().toString() + file.getFileName(); 
				System.out.println("realPath为" + realPath);
				//打印为E:\Program Files\apache-tomcat-6.0.14\webapps_upload_upload/c402cc92-7644-4259-8232-22dd8c63605e1hhWO.gif
				/******************************************************************/
				file.saveAs(realPath);//将文件换名另存
			}
			Request req = su.getRequest();
			String uname = req.getParameter("username");
			String pwd = req.getParameter("pwd");
			String salary = req.getParameter("salary");
			String birthday = req.getParameter("birthday");
			//String path = req.getParameter("path");
			
			User user = new User();
			user.setUsername(uname);
			user.setPwd(pwd);
			user.setSalary(salary);
			user.setBirthday(birthday);
			user.setPath(realPath);//这一步也必须有,否则图片存不进数据库
			
			this.udao.save(user);//将所加信息保存到对象中
			response.sendRedirect("UserServlet?method=view");//将结果发送到展示页面一律用sendRedirect
			//注意这里不是发送到user_view.jsp,而是发送到本UserServlet的view方法,而且view不能打单引号,血的教训
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 展示用户信息
	 * @param request
	 * @param response
	 */
	private void view(HttpServletRequest request, HttpServletResponse response) {
		try{
			//List<User> ulist = new ArrayList<User>();
			//不能这样写,否则ulist会永远是空值
			List<User> ulist = this.udao.findAll();//正确的写法是这样
			request.setAttribute("ulist",ulist);//将对象添加到作用域中
			request.getRequestDispatcher("user_view.jsp").forward(request, response);
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 预修改
	 * @param request
	 * @param response
	 */
	private void preUpdate(HttpServletRequest request,HttpServletResponse response) {
		try {
			User user = this.udao.findById(Integer.parseInt(request.getParameter("id")));
			request.setAttribute("user",user);
			request.getRequestDispatcher("user_update.jsp").forward(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	private void update(HttpServletRequest request, HttpServletResponse response) {
		try {
			//1:第一次save没有上传照片,这次修改也没有上传照片
			//2:第一次save没有上传照片,这次上传了照片(smartupload)
			//3:第一次save上传照片了 ,这次没有上传照片
			//4:第一次save上传照片了,这次也上传了(smartupload[新上传的会把旧的覆盖掉])
			
			//1.创建上传下载对象
			SmartUpload su = new SmartUpload();
			//2.初始化上传下载
			su.initialize(this.getServletConfig(),request, response);
			//3设置上传的限制内容
			su.setMaxFileSize(100000);		//单个文件的最大上传限制
			su.setTotalMaxFileSize(500000);	//总文件上传最大限制
			su.setAllowedFilesList("doc,txt,jpg,png,gif");	//允许上传文件的类型
			su.setDeniedFilesList("exe,bat,html,htm,,");//不允许上传文件的类型
			//4开始上传
			su.upload();
			
			Request req = su.getRequest();
			String id = req.getParameter("id");
			String uname = req.getParameter("username");
			String salary = req.getParameter("salary");
			String birthday = req.getParameter("birthday");
			
			User user = this.udao.findById(Integer.parseInt(id));
			String realPath = user.getPath();//之前数据库里的图片路径
			
			System.out.println("之前数据库的图片路径realPath为"+realPath);
			
			File file = su.getFiles().getFile(0);
			
			if(file.getSize()>0){
				if(realPath!=null){
					java.io.File f = new java.io.File(realPath);
					if(f.exists()){
						f.delete();
					}
					
				}
				ServletContext sc = this.getServletContext();
				//String basePath = sc.getRealPath(realPath);//错误写法,找这个快蛋碎而亡了
				String basePath = sc.getRealPath("/upload");//这才是正确的写法
				System.out.println("/************************************************/");
				System.out.println(realPath);
				realPath = basePath + "/" + UUID.randomUUID().toString() + file.getFileName();
				System.out.println("/************************************************/");
				System.out.println(realPath);
				file.saveAs(realPath);
			}
			
			user.setBirthday(birthday);
			user.setUsername(uname);
			user.setSalary(salary);
			user.setPath(realPath);//注意该处为realPath
			
			this.udao.update(user);//注意此处为update,不是save
			response.sendRedirect("UserServlet?method=view");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	/**
	 * 删除方法
	 * @param request
	 * @param response
	 */
	private void delete(HttpServletRequest request, HttpServletResponse response) {
		try {
			String id = request.getParameter("id");
			//System.out.println(id);
			this.udao.delete(Integer.parseInt(id));
			response.sendRedirect("UserServlet?method=view");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 下载照片
	 * @param request
	 * @param response
	 */
	private void download(HttpServletRequest request,HttpServletResponse response) {
		try {
			String path = request.getParameter("path");
			String imageName = new String("照片".getBytes("utf-8"),"iso-8859-1");
			//如果需要文件名中附加中文,需要转码
			imageName += path.substring(path.lastIndexOf("."));
			//拼接带中文的文件名,以后只要下载,就只有一种默认的文件名"照片.jpg"或"照片.bmp"等
			
			//设置response对象的响应头内容
			response.setContentType("application/x-download");
			response.addHeader("Content-Disposition", "anttachment;filename="+imageName);
			
			//写出图片
			FileInputStream fis = new FileInputStream(path);
			OutputStream os = response.getOutputStream();
			
			int temp = 0;
			byte[] bs = new byte[256];//设置缓存大小
			while((temp=fis.read(bs))!=-1){
				os.write(bs,0,temp); //写出文件
			}
			fis.close();
			os.flush();
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
           

说在最后边的,这代码还是得多练,虽然现在很蛋疼吐血。