SSM+BJUI實現新增和編輯共用一個頁面
場景
SSM+BJUI在對記錄進行新增或者編輯時可以共用一個jsp頁面,然後再進行儲存。
實現
1.主頁面新增兩個按鈕,一個是新增按鈕一個是編輯按鈕。
<!-- 新增按鈕--> <shiro:hasPermission name="partnerAdd"> <a href="${ctx}/sys/cooperativePartnersManageAction/toAdd" class="btn btn-green" data-icon="plus" data-toggle="dialog" data-width="800" data-height="400" data-id="dialog-user" data-mask="true">新增</a> </shiro:hasPermission> <!-- 編輯按鈕--> <shiro:hasPermission name="partnerEdit">< BR> <ahref="${ctx}/sys/cooperativePartnersManageAction/toEdit?id={#bjui-selected}" class="btn btn-blue" data-icon="edit" data-toggle="dialog" data-width="800" data-height="400" data-id="dialog-user" data-mask="true">編輯</a> </shiro:hasPermission>
三個頁面:
partnerMain就是當前主頁面,帶有新增以及編輯的頁面。
partnerEditDlg是新增和編輯共用的頁面。
新增功能實現
1.現在點選新增按鈕,來到對應的action
@RequestMapping(value="/toAdd") public ModelAndView toAdd(){ ModelAndView mv = null; try { //業務部分程式碼省略 //傳遞當前的操作型別的標識,左邊是op常量引數,表示操作型別,右邊是add常量引數,表示是新增操作 mv.addObject(ModelAndViewConstants.OPERATION_KEY,ModelAndViewConstants.OPERATION_VALUE_ADD); //傳遞到共用頁面的標題引數,左邊是title常量引數,右邊是要顯示的標題的內容 mv.addObject(ModelAndViewConstants.TITLE_KEY, "新增合作商戶資訊"); //跳轉的具體的頁面 mv.setViewName(ModelAndViewConstants.PARTNER_EDIT_VIEW); LogService.getInstance(this).error("進入合作伙伴新增功能成功:" +ModelAndViewConstants.PARTNER_EDIT_VIEW); } catch(Exception ex) { LogService.getInstance(this).error("進入合作伙伴新增失敗:" + ex.getMessage(), ex); mv = new ModelAndView("redirect:/error.jsp"); } return mv; }
2.通過上面的action可以傳遞要執行的操作型別為add,並跳轉到共用的頁面。
<c:set var="ctx" value="${pageContext.request.contextPath}" /> <div class="bjui-pageContent"> <form action="${ctx}/sys/cooperativePartnersManageAction/doSave" class="pageForm" data-toggle="validate" autocomplete="off"> <input type="hidden" name="op" id="j_dialog_op" value="${param.op}${op}"> <input type="hidden" name="id" id="j_dialog_id" value="${partner.id}"> <c:if test="${!empty role}"> <input type="hidden" name="status" id="j_dialog_op" value="${partner.status}"> </c:if> <table class="table table-condensed table-hover"> <tbody> <tr> <td colspan="2" align="center" valign="middle"><h4>${title}</h4></td> </tr> <tr> <td> <label for="name" class="control-label x90">合作方名稱:</label> <input class="" id="partnerName" type="text" name="partnerName" data-rule="required;" autocomplete="off" value="${partner.partnerName}" /> </td> <td> <label class="control-label x90">合作方公司名稱:</label> <input class="" id="companyName" type="text" name="companyName" data-rule="required;" autocomplete="off" value="${partner.companyName}" /> </td> </tr> </tbody> </table> </form> </div> <script> </script> <div class="bjui-pageFooter"> <ul> <li><button type="button" class="btn-close" data-icon="close">關閉</button></li> <li><button type="submit" class="btn-default" data-icon="save">儲存</button></li> </ul> </div>
主要功能點;
在共享頁面新增隱藏input,來接受傳過來的op引數,即操作型別,這裡是add
因為是新增所以傳過來的實體類partner沒有ID等屬性,但是要在編輯要用到,所以這裡也新增一個hidden。
這裡只顯示一個欄位,其他的省略。
3.點選儲存時,BJUI會提交當前form,此form會提交到:${ctx}/sys/cooperativePartnersManageAction/doSave,然後執行儲存的操作。
@ResponseBody
@RequestMapping(value="/doSave")
public Map<String, Object> doSave(SysPartners entity, String op) {
Map<String, Object> jsonResult = null;
try {
//正式業務部分開始
//與配置許可權管理中相對應,實現新增或編輯完實時更新
String tabid = tabid(ModelAndViewConstants.PARTNER_SYS_ID);
//如果是測試簽約
if(entity.getContractStatus()==0) {
entity.setTestContractTime(new Date());
entity.setContractStatusName("測試簽約");
}
//如果是正式簽約
if(entity.getContractStatus()==1) {
entity.setFormalContractTime(new Date());
entity.setContractStatusName("正式簽約");
}
entity.setRecordTime(new Date());
//獲得當前使用者的id和name,加入客戶物件中
ShiroUser currentUser = (ShiroUser)SecurityUtils.getSubject().getPrincipal();
entity.setModifyUserId(currentUser.getUserId());
entity.setModifyUserName(currentUser.getAccount());
//正式業務部分結束
//如果op標誌引數為空,或者為add 那麼就執行新增操作
if (null == op || ModelAndViewConstants.OPERATION_VALUE_ADD.equals(op)) {
//此欄位表示資料未被更改
entity.setStatus("0");
//執行插入資料操作,方法是有程式碼生成工具自動生成
int count = this.sysPartnersService.insert(entity);
if (count > 0) {
LogService.getInstance(this).debug("新增客戶資訊成功!");
}
}
else {
//如果不是,則就是編輯後的儲存操作
//獲取現存資料,也是通過程式碼生成工具生成的方法
SysPartners currentSysPartner = this.sysPartnersService.getByPrimaryKey(entity);
int count = this.sysPartnersService.updateByPrimaryKey(entity);
if (count > 0) {
LogService.getInstance(this).debug("編輯合作商戶資訊成功!");
}
}
Integer statusCode = 200;
String msg = "合作商戶資訊儲存成功";
jsonResult = JsonResult.jsonReturn(statusCode, msg, tabid);
}
catch(Exception ex) {
LogService.getInstance(this).error("儲存合作商戶資訊失敗:" + ex.getMessage(), ex);
String msg = "儲存合作商戶資訊失敗:" + ex.getMessage();
jsonResult = JsonResult.jsonReturnErr(msg);
}
return jsonResult;
}
編輯功能實現
1.現在點選主頁面的編輯按鈕
<!-- 編輯按鈕-->
<shiro:hasPermission name="customerEdit">
<a href="${ctx}/sys/sysCustomerAction/toEdit?id={#bjui-selected}" class="btn btn-blue" data-icon="edit" data-toggle="dialog" data-width="800" data-height="400" data-id="dialog-user" data-mask="true">編輯</a>
</shiro:hasPermission>
2.點選編輯按鈕會跳到後臺action,並將當前BJUI整合的能獲取選中項的ID傳過去。
現在來到後臺的toEdit
@RequestMapping(value="/toEdit")
public ModelAndView toEdit(Integer id) {
ModelAndView mv = null;
try {
//根據ID先查詢要編輯的資料
SysPartners partner = this.sysPartnersService.getByPrimaryKey(id);
//業務部分程式碼開始
//獲取簽約狀態,此處是通過關聯碼錶來實現
Map<String, Object> param = new HashMap<String, Object>();
//0 表示正常資料
param.put("status", "0");
param.put("codeType", "contractStatus");
//根據引數將相關碼錶內容查詢出來
List<SysCode> contractStatus = codeService.getByParam(param);
mv = new ModelAndView();
//傳遞簽約狀態
mv.addObject("contractStatus", contractStatus);
//業務部分程式碼結束
//傳遞操作型別,這裡是編輯操作
mv.addObject(ModelAndViewConstants.OPERATION_KEY,ModelAndViewConstants.OPERATION_VALUE_EDIT);
//jsp頁面要顯示的標題title
mv.addObject(ModelAndViewConstants.TITLE_KEY, "修改合作商戶資訊");
//將查詢到的實體Model類傳遞
mv.addObject(ModelAndViewConstants.PARTMER, partner);
//跳轉到編輯介面
mv.setViewName(ModelAndViewConstants.PARTNER_EDIT_VIEW);
}
catch(Exception ex) {
LogService.getInstance(this).error("進入客戶編輯失敗:" + ex.getMessage(), ex);
mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
}
return mv;
}
關鍵點:
通過傳過來的ID獲取要編輯的Model實體類的資料,然後執行相應的業務,
關鍵是通過:
mv.addObject(ModelAndViewConstants.OPERATION_KEY,ModelAndViewConstants.OPERATION_VALUE_EDIT);
來傳遞操作型別,左邊是常量引數op,右邊是常量引數edit。
然後傳遞要顯示的標題,傳遞獲取的model資料,跳轉到共用的編輯頁面。
3.剩餘操作與新增功能一樣,不過是編輯時將資料傳遞過去,通過input的value來賦值,如果是新增時value為空所以不顯示,如果是編輯則會將傳遞的資料進行顯示,新增與編輯都是執行同一個save方法。