SSH實現客戶按條件查詢\上傳檔案等
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.jarString 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";
}
相關文章
- 檔案批次查詢複製匯出,按檔名批次查詢檔案,按檔案內容批次查詢檔案
- SpringBoot專案實現檔案上傳和郵件傳送Spring Boot
- gorm 使用map實現in 條件查詢用法GoORM
- mysql,where條件查詢等學習筆記MySql筆記
- Flutter 新聞客戶端 - 15 strapi 資料建模 graphql 條件查詢排序Flutter客戶端API排序
- mysql條件查詢MySql
- MongoDB查詢條件MongoDB
- redis實現像關係型資料庫一樣按條件高效查詢分頁Redis資料庫
- ajax實現檔案上傳
- PHP實現單檔案、多檔案上傳 封裝 物件導向實現檔案上傳PHP封裝物件
- Mybatis實現條件IN查詢(foreach)和invalid comparison異常MyBatis
- Laravel 多條件查詢Laravel
- ORACLE 查詢條件出現關鍵字:&Oracle
- Spring mvc檔案上傳實現SpringMVC
- HttpFileCollection 實現多檔案上傳HTTP
- 檔案上傳原理和實現
- 使用Spring實現上傳檔案Spring
- JN專案-時間查詢條件驗證
- Java大檔案上傳、分片上傳、多檔案上傳、斷點續傳、上傳檔案minio、分片上傳minio等解決方案Java斷點
- 通過配置檔案(.htaccess)實現檔案上傳
- 使用java的MultipartFile實現layui官網檔案上傳實現全部示例,java檔案上傳JavaUI
- Javaweb-DQL-條件查詢JavaWeb
- 查詢條件封裝物件封裝物件
- AntDesignBlazor示例——列表查詢條件Blazor
- SpringBoot Jpa多條件查詢Spring Boot
- mongodb條件查詢不等於MongoDB
- golang beego orm 查詢條件 or andGolangORM
- 【mybatis-plus】條件查詢MyBatis
- js實現帶上傳進度的檔案上傳JS
- Feign實現檔案上傳下載
- PHP實現圖片(檔案)上傳PHP
- SpringMVC多個檔案上傳實現SpringMVC
- Java檔案上傳如何實現呢?Java
- 關於node實現檔案上傳
- 寫一個“特殊”的查詢構造器 – (四、條件查詢:複雜條件)
- 檔案上傳——客戶端檢測繞過(JavaScript檢測)(一)客戶端JavaScript
- 利用程序池給客戶端傳檔案客戶端
- 快速實現客戶查重效果