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">
<!-- 引入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();
		}

	}
}

說在最後邊的,這代碼還是得多練,雖然現在很蛋疼吐血。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章