AJAX学习笔记(五、AJAX+JSON与Servlet前后端交互)

Stella981
• 阅读 1084

前后端分离实现

前后端分离的好处就不用多说了,前后端那么Java Web项目前后端分离是怎么实现的呢?
1.浏览器发送请求
2.直接到达html页面(前端控制路由与渲染页面,整个项目开发的权重前移)
3.html页面负责调用服务端接口产生数据(通过ajax等等,后台返回json格式数据,json数据格式因为简洁高效而取代xml)
4.填充html,展现动态效果,在页面上进行解析并操作DOM。

它的核心思想是前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互。如果后端采用了Spring MVC框架的话,那么只需要·加一个@ResponseBody注解就可以返回json对象,一个@RequestBody就可以接收前台json数据,这就是框架的好处吧,可以省很多工夫,但是现在先不用,用最基本的Servlet来接收和返回json数据。

JQuery对ajax的支持

JQuery也有对AJAX的支持,使得其对AJAX的操作简化了很多,这样就不用用原生js了。

关键字

简介

$.ajax

提交AJAX请求

$.get

使用get方式提交ajax

$.post

使用post方式提交ajax

load

最简单的调用ajax的方式

serialize

格式化form下的输入数据

前后端交互

建一个实体类
package edu.hpu.Pojo;

public class Role {
   
   
   
    private String name;
    private String film;
    public String getName() {
   
   
   
        return name;
    }
    public void setName(String name) {
   
   
   
        this.name = name;
    }
    public String getFilm() {
   
   
   
        return film;
    }
    public void setFilm(String film) {
   
   
   
        this.film = film;
    }
    @Override
    public String toString() {
   
   
   
        return "Role [name=" + name +  ", film=" + film + "]";
    }
    
}

我们的前后端数据就主要围绕这个实体类展开了。

导入相应的包和jquery.min.js

解析json数据好像用Jackson的比较多(可以参考【3】),但这个用的不是,具体用的包直接参考【2】。

提交数据

submit.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>提交数据</title>
    <script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
<form>
    <p>影视角色</p>
    姓名:<input type="text" id="name"><br>
    电影:<input type="text" id="film"><br>
    <input type="button" value="提交" id="sender">
</form>
<div id="message"></div>
<script type="text/javascript">
   $('#sender').click(function () {
   
   
                 //点击按钮触发
       var name=document.getElementById("name").value;
       var film=document.getElementById("film").value;
       var role={
   
   
   "name":name,"film":film};            //新建一个json对象
       var url="submitServlet";

       $.post(
           url,
           {
   
   
   "data":JSON.stringify(role)},
           function(data) {
   
   
   
               alert("提交成功,请在Tomcat控制台查看服务端接收到的数据");
           });
   });
</script>
</body>
</html>

SubmitServlet:

package edu.hpu.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import edu.hpu.Pojo.Role;
import net.sf.json.JSONObject;

/**
 * Servlet implementation class SubmitServlet
 */

public class SubmitServlet extends HttpServlet {
   
   
   
    private static final long serialVersionUID = 1L;
       
 
    public SubmitServlet() {
   
   
   
        super();
        
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
   
        
        doPost(request, response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
   
           String data=request.getParameter("data");        //获取前端传递数据
           System.out.println("服务端接收到的数据是:" +data);
           
            JSONObject json=JSONObject.fromObject(data); 
              
            System.out.println("转换为JSON对象之后是:"+ json);
               
            Role role = (Role)JSONObject.toBean(json,Role.class); 
            System.out.println("转换为Hero对象之后是:"+role);        
    }

}

web.xml配置:

 <servlet>
        <servlet-name>SubmitServlet</servlet-name>
        <servlet-class>edu.hpu.servlet.SubmitServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SubmitServlet</servlet-name>
        <url-pattern>/submitServlet</url-pattern>
    </servlet-mapping>

跑一下,结果:
AJAX学习笔记(五、AJAX+JSON与Servlet前后端交互) AJAX学习笔记(五、AJAX+JSON与Servlet前后端交互) AJAX学习笔记(五、AJAX+JSON与Servlet前后端交互)

前端获取一个对象

GetOneServlet:

package edu.hpu.servlet;

import edu.hpu.pojo.Role;
import net.sf.json.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public class GetOneServlet extends HttpServlet {
   
   
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
   
        Role role=new Role();
        role.setName("柳飘飘");
        role.setFilm("喜剧之王");
        JSONObject json= new JSONObject();
        json.put("role", JSONObject.fromObject(role));
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print(json);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
   

    }
}

web.xml配置:

    <servlet>
        <servlet-name>GetOneServlet</servlet-name>
        <servlet-class>edu.hpu.servlet.GetOneServlet</servlet-class>
    </servlet>  
    <servlet-mapping>
        <servlet-name>GetOneServlet</servlet-name>
        <url-pattern>/getOneServlet</url-pattern>
    </servlet-mapping>

getOne.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取一个对象</title>
 <script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
   影视角色:<br>
   <input type="submit"  value="通过AJAX获取一个Role对象" id="sender">
   <div id="message"></div>
   <script type="text/javascript">
      $('#sender').click(function(){
   
   
   
         var url="getOneServlet";
        $.post(
                url,
                function(data) {
   
   
   
                   var json=JSON.parse(data);
                   var name =json.role.name;
                   var film = json.role.film;
                   $("#message").html("角色名字:"+name + "<br>电影:" +film );

                });
     });
   </script>
</body>
</html>

跑一下,结果:
AJAX学习笔记(五、AJAX+JSON与Servlet前后端交互)

F12可以进入调试模式,查看前端发出的异步请求以及后端的响应:

AJAX学习笔记(五、AJAX+JSON与Servlet前后端交互)

前端获取多个对象

GetManyServlet:

package edu.hpu.servlet;

import edu.hpu.pojo.Role;
import net.sf.json.JSONSerializer;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "GetManyServlet")
public class GetManyServlet extends HttpServlet {
   
   
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
   
        List<Role> roles=new ArrayList<>();
        for (int i=0;i<10;i++){
   
   
   
            Role role=new Role();
            role.setName("燕双鹰"+i);
            role.setFilm("宇宙第一豪杰、灭霸杀手"+i);
            roles.add(role);
        }
        String result= JSONSerializer.toJSON(roles).toString();  //通过通过JSONSerializer.toJSON(heros)把集合转换为JSON字符串
        response.setContentType("text/html;charset=utf-8");         //设置编码
        response.getWriter().print(result);                          //以流的形式传递给前端
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
   

    }
}

配置:

<servlet>
        <servlet-name>GetManyServlet</servlet-name>
        <servlet-class>edu.hpu.servlet.GetManyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>GetManyServlet</servlet-name>
        <url-pattern>/getManyServlet</url-pattern>
    </servlet-mapping>

getMany.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>获取多个对象</title>
    <script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
  <input type="button" value="通过AJAX获取多个Hero对象" id="sender">
  <div id="messageDiv"></div>
  <script>
      $('#sender').click(function () {
   
   
   
          var url="getManyServlet";
          $.post(
              url,
              function (data) {
   
   
   
                  var roles=$.parseJSON(data);       //把返回的数据转换为json数组
                  for(i in roles){
   
   
                      //循环json数组
                      var old = $("#messageDiv").html();
                      var role = roles[i];
                      $("#messageDiv").html(old + "<br>"+role.name+"   -----   "+role.film);
                  }
              }
          );
      });
  </script>
</body>
</html>

跑一下结果:
AJAX学习笔记(五、AJAX+JSON与Servlet前后端交互)

参考:
【1】、https://blog.csdn.net/piantoutongyang/article/details/65446892?tdsourcetag=s\_pctim\_aiomsg###
【2】、http://how2j.cn/k/jquery/jquery-ajax/474.html#step1002
【3】、https://blog.csdn.net/qq1940879801/article/details/77854906
【4】、http://how2j.cn/k/servlet/servlet-submit-json/1323.html#nowhere
【5】、http://how2j.cn/k/servlet/servlet-get-one-json/1324.html#nowhere
【6】、http://how2j.cn/k/servlet/servlet-get-many-json/1325.html

本文分享 CSDN - 三分恶。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Symbol卢 Symbol卢
2年前
聊聊前后端接口对接的那些事
前言在现在的前后端分离的项目开发中,为了不影响项目的进度,都是前后端同时进行开发。为了不影响咱们前端开发的进度,通常都是由后端同学,先提供接口文档,然后前端同学对照这接口文档来进行数据的模拟来完成前后端对接的工作。这里的数据模拟其实也就是大家平时所说的mock数据,那么前端当中有哪些方式来实现mock数据呢???…(⊙_⊙;)…咱们接着往下聊!(●^o^●)
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
kenx kenx
3年前
Spring Boot 无侵入式 实现RESTful API接口统一JSON格式返回
前言现在我们做项目基本上中大型项目都是选择前后端分离,前后端分离已经成了一个趋势了,所以总这样·我们就要和前端约定统一的api接口返回json格式,这样我们需要封装一个统一通用全局模版api返回格式,下次再写项目时候直接拿来用就可以了约定JSON格式一般我们和前端约定json格式是这样的json"code":200,"message
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
springboot+vue 登录页面(一)
首先了解的技术点是:后台:springboot,mybatis,mybatis逆向工程,mysql,日志前端:nodejs,npm,cnpm,vue,vuecli,webpack,elementui,router,axios开发工具:idea,webstorm该项目前端使用的是vue,目的是实现前后端分离后台:1.选择spr
Easter79 Easter79
3年前
springboot2之优雅处理返回值
前言最近项目组有个老项目要进行前后端分离改造,应前端同学的要求,其后端提供的返回值格式需形如{"status":0,"message":"success","data":{}}方便前端数据处理。要实现前端同学这个需求,其实也挺简单的,
Chase620 Chase620
3年前
前端异常监控解决方案研究 – 腾讯CDC
前端监控包括行为监控、异常监控、性能监控等,本文主要讨论异常监控。对于前端而言,和后端处于同一个监控系统中,前端有自己的监控方案,后端也有自己等监控方案,但两者并不分离,因为一个用户在操作应用过程中如果出现异常,有可能是前端引起,也有可能是后端引起,需要有一个机制,将前后端串联起来,使监控本身统一于监控系统。因此,即使只讨论前端异常监控,其实也不能严格区分前
Stella981 Stella981
3年前
Serverless 实战——使用 Rendertron 搭建 Headless Chrome 渲染解决方案
为什么需要Rendertron?传统的Web页面,通常是服务端渲染的,而随着SPA(SinglePageApplication)尤其是React、Vue、Angular为代表的前端框架的流行,越来越多的WebApp使用的是客户端渲染。使用客户端渲染有着诸多优势,比如节省后端资源、局部刷新、前