SSH實現客戶按條件查詢\上傳檔案等

秦始皇的天下發表於2018-06-03

1、書寫規範

    1 action - bean -strust
    2 service- 事務-bean-注入action中
    3 dao--繼承HibernateDaoSupport--bean--注入service

2. 使用非同步的方式載入客戶級別和客戶的來源

2.1使用的技術

  前端使用JQuery的ajax技術

  後端使用fastjson的jar包

  匯入fastjson的開發jar包fastjson-1.2.8.jar
  String s = JSON.toJSONString(集合)
  String s = JSON.toJSONString(物件)

 如果List集合中存入相同引用的物件
  fastjson預設的情況下是進行迴圈檢測的,去除掉死迴圈呼叫的方式
  可以使用JSON.toJSONString(p,SerializerFeature.DisableCircularReferenceDetect) 去除迴圈檢測,但是就會出現死迴圈的效果

  最後可以使用註解:@JSONField(serialize=false)對指定的屬性不轉換成json



2.2 非同步獲取客戶級別

Ajax程式碼

$(function(){
	// 載入完成後使用ajax非同步請求獲得
	var url = "${pageContext.request.contextPath}/dict_findByCode.action";
	var param = {"dict_type_code":"006"};
	$.get(url,param,function (data){
		//$(data)表示將data(list)轉成將jquery物件,然後做遍歷
		$(data).each(function(i,n){
			//第一種方式是使用(i,n)i表示下表,n表示當前的物件==n.dict_type_name
			
			$("#levelID").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>")
			//第二種方式是使用this,表示的是當前遍歷的物件,相當於n;this.dict_type_name
		})
	},"json")
	
	var param = {"dict_type_code":"001"};
	$.get(url,param,function (data){
		//$(data)表示將data(list)轉成將jquery物件,然後做遍歷
		$(data).each(function(i,n){
			//第一種方式是使用(i,n)i表示下表,n表示當前的物件==n.dict_type_name
			
			$("#inductoryID").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>")
			//第二種方式是使用this,表示的是當前遍歷的物件,相當於n;this.dict_type_name
		})
	},"json")
	
})

前端關鍵程式碼  

	<TD>客戶名稱:</TD>
	<TD><INPUT class=textbox id=sChannel2
		style="WIDTH: 80px" maxLength=50 name="cust_name"></TD>
		
	<TD>客戶級別:</TD>
	<TD>
		//關鍵的思想是level表示Customer實體類儲存的字典表物件,通過.dict_id方式進行封裝資料集
		<select id="levelID" name="level.dict_id">
			<option  value="">--請選擇--</option>
		</select>
	</TD>
	
	<TD>客戶行業:</TD>
	<TD>
		<select id="inductoryID" name="industry.dict_id">
			<option  value="">--請選擇--</option>
		</select>
	</TD>


Action的程式碼

			public String findByCode(){
				List<Dict> list = dictService.findByCode(dict.getDict_type_code());
				String jsonString = FastJsonUtil.toJSONString(list);
				HttpServletResponse response = ServletActionContext.getResponse();
				FastJsonUtil.write_json(response, jsonString);
				return NONE;
			}
		
		* CustomerAction的分頁查詢的程式碼
			public String findByPage(){
				// 呼叫service業務層
				DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
				// 拼接查詢的條件
				String name = customer.getCust_name();
				if(name != null && !name.trim().isEmpty()){
					criteria.add(Restrictions.like("cust_name", "%"+name+"%"));
				}
				
				// System.out.println(customer.getLevel().getDict_type_code());
				Dict level = customer.getLevel();
				if(level != null && !level.getDict_id().trim().isEmpty()){
					criteria.add(Restrictions.eq("level.dict_id", level.getDict_id()));
				}
				
				Dict source = customer.getSource();
				if(source != null && !source.getDict_id().trim().isEmpty()){
					criteria.add(Restrictions.eq("source.dict_id", source.getDict_id()));
				}
				
				// 查詢
				PageBean<Customer> page = customerService.findByPage(pageCode,pageSize,criteria);
				// 壓棧
				ValueStack vs = ActionContext.getContext().getValueStack();
				// 棧頂是map<"page",page物件>
				vs.set("page", page);
				vs.set("cust_name", name);
				return "page";
			}

3、資料的回顯



前端的程式碼

//1、資料的回顯(txt 文字的顯示)
	<TD>客戶名稱:</TD>
	<TD><INPUT class=textbox id=sChannel2
		style="WIDTH: 80px" maxLength=50 name="cust_name" value="${ model.cust_name }"></TD>
//2、下拉選單的回顯示
//2.1級別選擇
	function(data){
		$(data).each(function(i,n){
			//第一種方式是使用(i,n)i表示下表,n表示當前的物件==n.dict_type_name
			
			// 先獲取值棧中的值,使用EL表示式
			var vsId = "${model.level.dict_id}";
			// 值棧中的id值和遍歷的id值相同,讓被選中
			if(vsId == n.dict_id){
				// JQ的DOM操作
				$("#levelID").append("<option value='"+n.dict_id+"' selected>"+n.dict_item_name+"</option>");
			}else{
				$("#levelID").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
			}
			
			//$("#levelID").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>")
			//第二種方式是使用this,表示的是當前遍歷的物件,相當於n;this.dict_type_name
		})
	}
//2.2 
	$(data).each(function(i,n){
		//第一種方式是使用(i,n)i表示下表,n表示當前的物件==n.dict_type_name
		
		var vsId = "${model.industry.dict_id}";
		// 值棧中的id值和遍歷的id值相同,讓被選中
		if(vsId == n.dict_id){
			// JQ的DOM操作
			$("#inductoryID").append("<option value='"+n.dict_id+"' selected>"+n.dict_item_name+"</option>");
		}else{
			$("#inductoryID").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
		}
		
		//$("#inductoryID").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>")
		//第二種方式是使用this,表示的是當前遍歷的物件,相當於n;this.dict_type_name
	})

4 儲存客戶動能

前提:javaBean是由get或者set方法決定的,和成員沒有用。有get方法就可以當做屬性,那麼就能夠進入值棧

 4.1 頁面跳轉(menu->add)
       前端-action-Struts2配置檔案
       <result name="addUI" >/jsp/customer/add.jsp</result> 為什麼不能重定向到add頁面上呢!!!!
4.2 新增功能

5、檔案上傳功能

5.1. 客戶端三個注意事項


        * method="post"
        * enctype="multipart/form-data"
        * <input type="file" name="myfile">

5.2 攔截器

* 提供 FileUpload 攔截器,用於解析 multipart/form-data 編碼格式請求,解析上傳檔案的內容 
		* fileUpload攔截器 預設在 defaultStack 棧中, 預設會執行的 
		
		* 在Action中編寫檔案上傳,需要定義三個屬性
			> 檔案型別File ,屬性名與表單中file的name屬性名一致.
			> 字串型別String , 屬性名:前段是name屬性名一致 + ContentType;
			> 字串型別String , 屬性名:前段是name屬性名一致+FileName;
			
			> 最後需要為上述的三個屬性提供set方法。
			> 可以通過FileUtils提供 copyFile 進行檔案複製,將上傳檔案 儲存到伺服器端 

5.3 檔案上傳存在的問題

* 先配置input邏輯檢視
* 在頁面中顯示錯誤資訊

* 檔案上傳的總大小預設值是2M,如果超過了2M,程式會報出異常。可以使用<s:actionError>來檢視具體資訊!
	> 解決總大小的設定,找到常量:
		* struts.multipart.parser=jakarta		-- 預設檔案上傳解析器,就是FileUpload元件
		* struts.multipart.saveDir=				-- 檔案上傳的臨時檔案儲存目錄
		* struts.multipart.maxSize=2097152		-- 檔案上傳的最大值(總大小),預設是2M
	
	> 可以在struts.xml中設定常量,修改檔案上傳的預設總大小!!!
		* <constant name="struts.multipart.maxSize" value="5000000"></constant>

5.4 通過配置攔截器 來設定檔案上傳你的屬性

* 先在<action>標籤中引入檔案上傳的攔截器
	<interceptor-ref name="defaultStack">
		<!-- 設定單個上傳檔案的大小 -->
		<param name="fileUpload.maximumSize">2097152</param>
		<!-- 設定副檔名 -->
		<param name="fileUpload.allowedExtensions">.txt</param>
	</interceptor-ref>

5.5 Action中的程式碼

	/**
	 * 檔案的上傳,需要在CustomerAction類中定義成員的屬性,命名是有規則的!!
	 * private File upload;		// 表示要上傳的檔案
	 * private String uploadFileName;	表示是上傳檔案的名稱(沒有中文亂碼)
	 * private String uploadContentType;	表示上傳檔案的MIME型別
	 * 提供set方法,攔截器就注入值了
	 */
	
	// 要上傳的檔案
	private File upload;
	// 檔案的名稱
	private String uploadFileName;
	// 檔案的MIME的型別
	private String uploadContentType;
	
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	/**
	 * 儲存客戶的方法
	 * @return
	 * @throws IOException 
	 */
	public String add() throws IOException{
		if(uploadFileName != null){
			// 列印
			System.out.println("檔案型別:"+uploadContentType);
			// 把檔案的名稱處理一下
			String uuidname = UploadUtils.getUUIDName(uploadFileName);
			// 把檔案上傳到D:\\apache-tomcat-7.0.52\\webapps\\upload
			System.out.println(uuidname);
//			上傳的地址       
			String path = "D:\\JavaTomcat\\apache-tomcat-7.0.85\\upload\\";
			// 建立file物件
			File file = new File(path+uuidname);
			// 簡單方式
			FileUtils.copyFile(upload, file);
			
			// 把上傳的檔案的路徑,儲存到客戶表中
			customer.setFilePath(path+uuidname);
		}
		customerService.save(customer);
		return "list";
	}

6、刪除客戶

1. 先通過客戶的主鍵查詢出客戶物件

2.根據客戶物件進行刪除,並且刪除 upload檔案

action程式碼

	
	public String delete(){
		// 刪除客戶,獲取客戶的資訊獲取到,上傳檔案的路徑
		customer = customerService.findById(customer.getCust_id());
		// 獲取上傳檔案的路徑
		String filepath = customer.getFilePath();
		// 刪除客戶
		customerService.delete(customer);
		
		// 再刪除檔案
		if(filepath!=null){
			File file = new File(filepath);
			if(file.exists()){
				file.delete();
			}
		}
		
		
		return "list";
	}

相關文章