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. ...
随机推荐
- C# System.Timers.Timer定时器的使用和定时自动清理内存应用
项目比较大有时候会比较卡,虽然有GC自动清理机制,但是还是有不尽人意的地方.所以尝试在项目启动文件中,手动写了一个定时器,定时清理内存,加快项目运行速度. public class Program { ...
- 数据加密实战之记住密码、自动登录和加密保存数据运用DES和MD5混合使用
MD5的简介:MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有 ...
- Spring中的事务控制
Spring中事务控制的API介绍 PlatformTransactionManager 此接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法 我们在开发中都是使用它的实现类: 真正 ...
- MySql数据库内部常用命令大全
1. 连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1) 连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命 ...
- 浅识J2EE十三个规范
前言 没有规矩不成方圆,学习J2EE,先来明白都有什么规范. 内容 1.JDBC(Java Database Connectivity)java数据库连接 a)为java开发人员提供了一个行业标准AP ...
- Jmeter-无法启动,'findstr'不是内部或外部命令,也不是可运行的程序
今天有一个同事的jmeter无法安装,于是帮他看了看,报以下错误: JAVA的环境变量没有配置好,于是重新配置了下环境变量后,再启动,发现还是不好,于是网上查了下, 发现要在电脑的环境变量中增加 pa ...
- SprimgMVC学习笔记(二)—— 整合Mybatis
一.整合思路 1.1 Dao层 SqlMapConfig.xml:空文件即可,但是需要文件头. applicationContext-dao.xml 数据库连接池 SqlSessionFactory对 ...
- django导入 views.py
网上找了各种教程..均无解....自己摸索出来了..分享 给大家... 首先INSTALLED_APP 加入 自己的 app pili,然后如下图 from App名称 import views 就 ...
- LocalDate test
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.tim ...
- C3算法 和 super
一. Python的继承 多继承 子类继承父类. 继承是为了节省开发时间.提高开发效率 代码得到了重(chong)用 一个类可以拥有多个父类 lass shen_xian: # 定义一个神仙类 de ...