Jersey前后端交互初体验
一 get请求
前端
基本的GET请求
$.ajax({
type : "get",
url : "../rest/api/account/delete",
data : {
accountUid : accountUid,
tagRefId : accountTagRefId
},
dataType : "json",
success : function(data) {
if (0 != data.errCode) {
if ("" == data.msg || null == data.msg
|| 'undefined' == data.msg) {
$("#delAccountErr").html("系统错误,请稍后重试!");
} else {
$("#delAccountErr").html(data.msg);
}
}else{
$("#deleteModal").modal("hide");
}
queryAccount();
}
});
该get请求最终的Url为类似:http://192.168.2.126/vipmanager/rest/api/account/delete?accountUid=627EA55816B5427B86FBBE349C1E972E&tagRefId=4028822451d1a55d0151d1c0f9d50012
后端
//接收GET方式请求
@GET
//指定接收的请求路径
@Path("/delete")
//业务处理结束后返回的数据媒体类型,如果媒体类型错误,将返回405,Method not allow
@Produces(MediaType.APPLICATION_JSON)
//业务处理前,接收前端的请求数据的媒体类型,如果媒体类型错误,将返回405,Method not allow
@Consumes({ MediaType.APPLICATION_JSON,
MediaType.APPLICATION_FORM_URLENCODED })
public String deleteAccount(
@QueryParam("accountUid") final String refAccountUid,
@QueryParam("tagRefId") final String tagRefId) {
final BaseResponse baseResponse = new BaseResponse();
final String accountUid = (String) request.getSession().getAttribute(
ACCOUNTUID);
// 删除逻辑实现,删除关联关系,账户不删除
int errCode = 0;
boolean flag = true;
// 删除用户组关联关系
if (!StringUtil.isNull(tagRefId)) {
String[] tagRefIds = tagRefId.split(",");
for (String id : tagRefIds) {
final AccountTagRef accountTagRef = this.accountTagRefService
.findById(id);
if (null != accountTagRef) {
errCode = this.accountTagRefService.delete(accountTagRef);
if (0 != errCode) {
LOG.info(
"delete accounttagref by accounttagref.s id:{},errCode:{}",
accountTagRef, errCode);
flag = false;
}
}
if (true != flag) {
break;
}
}
}
if (true == flag ) {
errCode = this.accountService.deleteAccount(accountUid,
refAccountUid);
}
if(0 != errCode){
baseResponse.setErrCode(ErrorConstant.DELETE_ACCOUNT_FAIL);
baseResponse.setMsg(ErrorConstant
.getErrMsg(ErrorConstant.DELETE_ACCOUNT_FAIL));
LOG.error("error to deleteAccountTagRef for accountUid:{}",accountUid);
}
final JSONObject obj = JSONObject.fromObject(ResponseUtil.failed(
BaseResponse.class, baseResponse.getErrCode()));
return obj.toString();
}
在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。 下边是说明: application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。补充
form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
二 POST请求
前端
请求参数需要使用JSON.stringify()进行请求参数的格式化,将json对象转化为json字符串,需要提醒的是,最好指定请求的数据类型dataType,请求头的类型contentType。dataType : "json", contentType : 'application/json'
否则容易导致405,请求非法,无法访问rest资源
if (perFormValidate()) {
if(1 == num){
$("#savePerContinueBtn").button('loading');
}else{
$("#savePerBtn").button('loading');
}
var person_name = $("#person_name").val();
var person_mobile = $("#person_mobile").val();
var person_code = $("#person_code").val();
var person_email = $("#person_email").val();
var person_company = $("#person_company").val();
var person_usertag = $("#person_usertag").val();
$.ajax({
type : "POST",
url : "../rest/api/account/add",
dataType : "json",
contentType : 'application/json',
data : JSON.stringify({
"account":
{"mobile":person_mobile,"email":person_email,
"person":
{"name":person_name,"idNo":person_code,
"organ":person_company}},
"tagref":{"tag":{
"id":person_usertag}}
}),
success : function(data) {
if(1 == num){
$("#savePerContinueBtn").button('reset');
$("#savePerBtn").button('reset');
}else{
$("#savePerContinueBtn").button('reset');
$("#savePerBtn").button('reset');
}
if (0 != data.errCode) {
if ("" == data.msg
|| null == data.msg
|| 'undefined' == data.msg) {
$("#addPersonErr").html("系统错误,请稍后重试!");
} else {
$("#addPersonErr").html(data.msg);
}
} else {
if(1 == data.possessive ){
//提示手机号已经被使用
$("#useredModual").modal("show");
$("#usered_content").html("您填写的手机号已被用户【" + data.name +","+data.idNoOrganCode +"】使用,是否关联已有的账号?若不关联已有账号,请重新填写手机号。");
$("#relatedAccountUid").val(data.accountUid);
}else {
if(1 == num){
$("#personInfo").find(":input").not(":button,:submit,:reset,:hidden").val("");
$("#addPersonErr").html("个人用户添加成功!");
queryAccount();
}else{
$("#personInfo").find(":input").not(":button,:submit,:reset,:hidden").val("");
$("#addPersonModual").modal('hide');
$("#useredModual").modal("hide");
queryAccount();
}
}
}
},
error:function(data){
if(1 == num){
$("#savePerContinueBtn").button('reset');
$("#savePerBtn").button('reset');
}else{
$("#savePerContinueBtn").button('reset');
$("#savePerBtn").button('reset');
}
}
});
}
后端
@POST
@Path("/add")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public AddAccountResponse addAccount(final AddAccountParam param) {
AddAccountResponse addAccountResponse = new AddAccountResponse();
/* 检查参数有效性 */
final int iRet = param.valid();
if (ErrorConstant.SUCCESS != iRet) {
LOG.error("error to addAccount .");
return ResponseUtil.failed(AddAccountResponse.class, iRet);
}
final String projectId = (String) request.getSession().getAttribute(
"projectId");
final String accountUid = (String) request.getSession().getAttribute(
ACCOUNTUID);
addAccountResponse = this.accountService.addAccount(projectId,
param.getAccount(), accountUid, null);
if (0 == addAccountResponse.getErrCode()
&& !StringUtil.isNull(addAccountResponse.getAccountUid())) {
final Tag tag = this.tagService.findById(param.getTagref().getTag()
.getId());
final Account ac = this.accountService.findByUId(addAccountResponse
.getAccountUid());
if ((null != tag) && (null != ac)) {
final AccountTagRef tagRef = new AccountTagRef();
tagRef.setCreateDate(new Date());
tagRef.setAccount(ac);
tagRef.setTag(tag);
final int errCode = this.accountTagRefService.save(tagRef);
if (errCode > 0) {
addAccountResponse
.setErrCode(ErrorConstant.ADDACCOUNT_SUCC_ADDTAGREF_ERR);
}
} else {
addAccountResponse
.setErrCode(ErrorConstant.ADDACCOUNT_SUCC_ADDTAGREF_ERR);
}
} else {
LOG.error("error to addAccount or null for accountUid of result`AddAccount addAccountResponse");
}
addAccountResponse.setMsg(ErrorConstant.getErrMsg(addAccountResponse
.getErrCode()));
return addAccountResponse;
}
jersey会将前端请求自动转化为javabean对象接收请求参数,业务处理完成后,框架会将对象自动转化为json字符串返回至前端。
Jersey前后端交互初体验的更多相关文章
- 2、前端--初见前后端交互、CSS简介、基本选择器、组合选择器、属性选择器、分组与嵌套、伪类选择器
今日内容概要 初窥后端框架 css简介 css选择器 今日内容详细 初次体验前后端交互 # 代码无需掌握 只看效果即可 """后端框架:可以简单的理解为别人写好的一个非常 ...
- Node之简单的前后端交互
node是前端必学的一门技能,我们都知道node是用的js做后端,在学习node之前我们有必要明白node是如何实现前后端交互的. 这里写了一个简单的通过原生ajax与node实现的一个交互,刚刚学n ...
- Django之META与前后端交互
Django之META与前后端交互 1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请 ...
- 前后端交互实现(nginx,json,以及datatable的问题相关)
1.同源问题解决 首先,在同一个域下搭建网络域名访问,需要nginx软件,下载之后修改部分配置 然后再终端下cmd nginx.exe命令,或者打开nginx.exe文件,会运行nginx一闪而过, ...
- springboot+mybatis+thymeleaf项目搭建及前后端交互
前言 spring boot简化了spring的开发, 开发人员在开发过程中省去了大量的配置, 方便开发人员后期维护. 使用spring boot可以快速的开发出restful风格微服务架构. 本文将 ...
- 百度ueditor的图片上传,前后端交互使用
百度ueditor的使用 一个文本编辑器,看了网上很多文档写的很乱,这里拾人牙慧,整理下怎么使用. 这个东西如果不涉及到图片附件上传,其实很简单,就是几个前端文件,直接引用,然后配置下ueditor. ...
- SSM-网站后台管理系统制作(4)---Ajax前后端交互
前提:Ajax本身就为前后端交互服务的,实现功能:用户输入信息,实时判断用户的情况,这也是现在登录界面普遍流行的做法.前端js通过注释识别Controller层,该层查询返回,和之前Google验证码 ...
- 【开源.NET】 轻量级内容管理框架Grissom.CMS(第二篇前后端交互数据结构分析)
这是 CMS 框架系列文章的第二篇,第一篇开源了该框架的代码和简要介绍了框架的目的.作用和思想,这篇主要解析如何把sql 转成标准 xml 配置文件和把前端post的增删改数据规范成方便后台解析的结构 ...
- thinkphp+jquery+ajax前后端交互注册验证
thinkphp+jquery+ajax前后端交互注册验证,界面如下 register.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
随机推荐
- vue 项目接口管理
在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢? 方法可能不只一种,本文使用axios+async/await进行接口的统一管理. 本文使用vue-cli ...
- android studio 程序员有福了—从layout自动生成viewholder类
狂点这里下载 超级牛逼的插件啊,比那些使用SparseArray的强太多了! 在android studio 1.0上测试,没有问题. 不说了直接说功能 Android Toolbox Plugin ...
- HttpRunnerManager接口自动化测试框架测试报告页面优化
在测试报告生成结果页面,点击左上角的图标不能快速返回到首页.在大神的指点下,要改一个跳转链接,如下图: 修改路径如下: 修改的字段:把<a href="#!" class=& ...
- bsdasm
bsdasm 来源 http://www.int80h.org/bsdasm/ Preface by G. Adam StanislavWhiz Kid Technomagic Assembly la ...
- 大众点评CAT开源监控系统剖析
参考文档: 大众点评的实时监控系统分析(一) CAT_source_analyze 透过CAT,来看分布式实时监控系统的设计与实现 深度剖析开源分布式监控CAT [分布式监控CAT] Client端源 ...
- BZOJ1096 [ZJOI2007]仓库建设(斜率优化)
题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工厂1在山顶,工厂N在山脚. 由于这座山处于 ...
- GuavaCache简介(一)
原文地址 http://blog.csdn.net/guozebo/article/details/51590517 前言 在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选 ...
- 《图解HTTP》阅读笔记--第六章--HTTP首部
第六章.HTTP首部 <非常重要且恐怖的一章了> HTTP报文=报文首部+(CR+LF)+报文实体 首部字段:HTTP报文首部字段=(首部字段名:字段值)们---类型*4: 通用首部字段( ...
- Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作)
Leetcode 566. Reshape the Matrix 矩阵变形(数组,模拟,矩阵操作) 题目描述 在MATLAB中,reshape是一个非常有用的函数,它可以将矩阵变为另一种形状且保持数据 ...
- linux物理内存管理
1.为什么需要连续的物理内存: Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数个4k(在i386体系结构中)大小的页,从而分配和回收内存的基本单位便是内存页了.利用分页管理有助 ...