BJUI使用ajax异步表单提交时后台action要加@ResponseBody
場景
在使用BJUI的ajaxform異步表單提交時,后臺直接使用
@RequestMapping時不能正常回顯消息。
知識儲備
ajaxform異步表單提交
通過data屬性使用(帶驗證):
<form action="../../json/ajaxDone.json" data-toggle="ajaxform"><h5>Data API Ajax提交表單1(帶驗證)</h5><div class="bjui-row col-2"><label class="row-label">姓名</label><div class="row-input"><input type="text" name="username" data-rule="required"></div><label class="row-label">住址</label><div class="row-input"><input type="text" name="address" data-rule="required"></div></div><hr style="margin:5px 0 15px;"><div class="text-center"><button type="submit" class="btn-default">提交表單</button></div> </form>通過JS API屬性使用(無驗證):
BJUI.ajax('ajaxform', {url: 'json/ajax/ajax-test1.json',form: $.CurrentNavtab.find('form:eq(1)'),validate: false,loadingmask: true,okCallback: function(json, options) {console.log('返回內容1:\n'+ JSON.stringify(json))} })參數:
?
| url | string | null | [必選] 提交的URL,未指定時將取form的action屬性。 |
| type | string | POST | [可選] ajax請求方式,未指定該參數時會取form的method屬性值。 |
| confirmMsg | string | null | [可選] 提交表單前的確認提示。 |
| beforeSubmit | function(form) | null | [可選] 執行動作前的確認函數,返回false時不提交表單。 |
| validate1.31 | boolean | true | [可選] 提交表單前是否需要驗證(需要驗證插件nicevalidate支持)。 |
| alertmsg | boolean | false | [可選] 是否彈出驗證未通過的信息提示。 |
| okalert | boolean | true | [可選] 請求正常返回后,是否彈出相應的信息提示。 |
| callback | function(json) | null | [可選] 自定義回調函數。 |
| okCallback | function(json, options) | null | [可選] 請求成功時的回調函數,該函數會覆蓋B-JUI默認的成功回調函數,函數的options參數即是該doajax的options參數。 |
| okAfterCallback | function(json, options) | null | [可選] 請求成功時的回調函數,該函數會在B-JUI默認的成功函數后執行,函數的options參數即是該doajax的options參數。 |
| errCallback | function(json, options) | null | [可選] 請求失敗時的回調函數,函數的options參數即是該doajax的options參數。 |
| failCallback | function(msg, options) | null | [可選] ajax請求出錯時的回調函數,函數的msg參數是服務端返回的出錯信息,options參數即是該doajax的options參數。 |
| form | selector | null | [可選] 要提交的表單,通過JS API使用時需要。 |
| loadingmask | boolean | true | [可選] ajax請求時是否顯示數據加載遮罩。 |
| target | selector | null | [可選] 數據加載遮罩的父容器,值為空時默認是當前Navtab或Dialog。 |
| reload | boolean | false | [可選] 請求返回成功狀態后,是否重新加載當前target。 |
| forward | string | null | [可選] 跳轉地址,請求返回成功狀態后,加載forward地址對應的內容到當前target。 |
| forwardConfirm | boolean | false | [可選] 請求返回成功狀態后,是否重新加載當前target。 |
| closeCurrent | boolean | false | [可選] 請求返回成功狀態后,是否關閉當前target(僅navtab或dialog)。 |
| tabid | string | null | [可選] 請求返回成功狀態后,需要刷新的navtab的id集合,多個id以,分隔。 |
| dialogid | string | null | [可選] 請求返回成功狀態后,需要刷新的dialog的id集合,多個id以,分隔。 |
| divid | string | null | [可選] 請求返回成功狀態后,需要刷新的div(僅限通過doload加載的div)的id集合,多個id以,分隔。 |
| datagrids | string | null | [可選] 請求返回成功狀態后,需要刷新的datagrid的id集合,多個id以,分隔。 |
| gridrefreshflag | boolean | true | [可選] 刷新datagrid時保留其快速篩選、排序、分頁信息。 |
| ajaxTimeout | int | BJUI.ajaxTimeout | [可選] 請求超時設置,即$.ajax的timeout屬性。 |
?
請求返回成功狀態
指服務端返回B-JUI的消息JSON并在json[BJUI.keys.statusCode] == BJUI.statusCode.ok時有效。
?
@ResponseBody
@ResponseBody是作用在方法上的,@ResponseBody 表示該方法的返回結果直接寫入 HTTP response body 中,一般在異步獲取數據時使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析為跳轉路徑,但是加上 @ResponseBody 后返回結果不會被解析為跳轉路徑,而是直接寫入 HTTP response body 中。 比如異步獲取 json 數據,加上 @ResponseBody 后,會直接返回 json 數據。@RequestBody 將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。
舉例:
@RequestMapping("/login")@ResponseBodypublic User login(User user){return user;}User字段:userName pwd那么在前臺接收到的數據為:'{"userName":"xxx","pwd":"xxx"}'效果等同于如下代碼:@RequestMapping("/login")public void login(User user, HttpServletResponse response){response.getWriter.write(JSONObject.fromObject(user).toString());}后臺實現
前端BJUI頁面:
<form id="RechargeRecordForm" action="${ctx}/sys/cooperativePartnersManageAction/doRecharge"data-toggle="ajaxform"class="ajaxForm" data-toggle="validate" enctype="multipart/form-data"><li><button type="submit" class="btn-default" data-icon="save" >提交</button></li>后臺action:
@Controller @RequestMapping("/sys/cooperativePartnersManageAction") public class SysCooperativePartnerManageAction? extends BaseAction{...@ResponseBody@RequestMapping(value="/doRecharge")public Map<String, Object> doRecharge(Integer partnerId,BigDecimal rechargeMoney ) {ModelAndView mv = null;Map<String, Object> jsonResult = null;...業務代碼省略Integer statusCode = 200;String msg = "成功";jsonResult = JsonResult.jsonReturn(statusCode, msg, tabid);mv.setViewName(ModelAndViewConstants.PARTNER_RECHARGE_VIEW);LogService.getInstance(this).debug("成功:"+ModelAndViewConstants.PARTNER_RECHARGE_VIEW);}catch(Exception ex) {LogService.getInstance(this).error("失敗:" + ex.getMessage(), ex);mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);}return jsonResult;}?
注意:
在BJUI使用ajax異步表單提交時,提交到后臺的action要加@ResponseBody,不然不能成功回顯。
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的BJUI使用ajax异步表单提交时后台action要加@ResponseBody的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: www/index.html would
- 下一篇: BJUI+SSM实现报表添加时间筛选功能