ajax调后台servlet,把返回json用vue做绑定

1. 描述
最近项目需要开发微信手机端,本来用的架构是bootstrap+jquery,但每次数据绑定前台的时候jquery都把javascript代码和html代码混着写,违背业务与界面相分离的原则,希望找个轻量级的数据绑定js架构,觉得vue.js是个不错的选择,这里做个小demo把servlet+bootstrap+jquery+vue整合在一起。

2. 所需jar包

3. 项目结构
项目结构

4. 创建servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>VueDatagrid</display-name>
  <servlet>
    <description></description>
    <display-name>LoadDataServlet</display-name>
    <servlet-name>LoadDataServlet</servlet-name>
    <servlet-class>com.vue.datagrid.LoadDataServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoadDataServlet</servlet-name>
    <url-pattern>/LoadDataServlet.do</url-pattern>
  </servlet-mapping>
</web-app>

5. 编写servlet代码

package com.vue.datagrid;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;


public class LoadDataServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public LoadDataServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8;pageEncoding=UTF-8");
        response.setCharacterEncoding("UTF-8");

        Goods goods1 = new Goods();
        goods1.setId("1");
        goods1.setBarcode("101");
        goods1.setName("中华面粉");
        goods1.setShortName("面粉");

        Goods goods2 = new Goods();
        goods2.setId("2");
        goods2.setBarcode("102");
        goods2.setName("中华面包");
        goods2.setShortName("面包");

        Goods goods3 = new Goods();
        goods3.setId("3");
        goods3.setBarcode("103");
        goods3.setName("中华面条");
        goods3.setShortName("面条");

        List<Goods> goodList = new ArrayList<Goods>();
        goodList.add(goods1);
        goodList.add(goods2);
        goodList.add(goods3);

        PrintWriter out = response.getWriter();  

        try {
            String json = JSONObject.toJSONString(goodList);
            System.out.println("json:" + json);
            out.write(json);  
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.flush();
            out.close();
        }
    }

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

}

6. 编写页面代码
页面代码有个坑,弄了很久才弄出来,但还是不知所以然。在ajax调用后台servlet时,已经设置了datatype:”json”,但servlet的printwriter处理后response的仍然是“text”,需要在success后加上JSON.parse(data)把字符串转成JSON类型,希望有哪位大神可以告诉缘由和告诉我怎么可以response JSON类型到前台。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Vue Bind Data</title>
<link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/vue/latest/vue.js"></script>
<script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script src="js/vue-async-data.js"></script>
</head>
<body>
    <div class="container">
        <div class="col-md-6 col-md-offset-3">
            <h1>Vue demo</h1>
            <div id="app">
                <button v-on:click="nameSearch()">查询</button><br><br>
                <table>
                    <thead>
                    <tr>
                        <th style='width:3%; text-align: left'>ID</th>
                        <th style='width:5%; text-align: left'>名称</th>
                        <th style='width:10%; text-align: left'>条形码</th>
                        <th style='width:10%; text-align: left'>简称</th>
                    </tr>
                    </thead>
                    <tbody>
                        <tr v-for="goods in goodsList" track-by="$index">
                            <td>{{goods.id}}</td>
                            <td>{{goods.name}}</td>
                            <td>{{goods.barcode}}</td>
                            <td>{{goods.shortName}}</td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
<script>
$(function() {
    $.ajax({
        type:'get',
        url:'http://localhost:8080/VueDatagrid/LoadDataServlet.do',
        success: function(data){
            if (data.success){
                pushDom(data);
            }else{
                alert("接口调用失败");
            }
        },
        error: function(data){
            alert(JSON.stringify(data));
        }
    });

    function pushDom(data){
        // 然后再交给 vue 进行渲染
        var vm = new Vue({
            el: '#app',
            data: data
        });
    }
})
</script>
</html>

7. 运行程序

在浏览器打开地址 http://localhost:8080/VueDatagrid/index2.jsp,效果图如下
效果图

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!如果您需要使用Vue根据后台返回JSON数据生成动态列表,可以使用Vue的v-for指令结合数组方法,如下所示: 1.在Vue组件的data选项中定义一个数组用于存储JSON数据,例如: ``` data() { return { items: [] } } ``` 2.在Vue组件的mounted钩子函数中,使用axios或其他工具从后台获取JSON数据并将其存储在上述定义的数组中,例如: ``` mounted() { axios.get('/api/items').then(response => { this.items = response.data; }) } ``` 3.在Vue组件的模板中,使用v-for指令结合数组方法将JSON数据动态生成列表,例如: ``` <ul> <li v-for="item in items" :key="item.id">{{ item.name }}</li> </ul> ``` 在上述示例中,v-for指令用于遍历items数组,生成包含每个item对象的li元素,其中:key属性用于为每个列表项指定唯一的key值,以提高性能。 希望这能够帮助您! ### 回答2: Vue中可以根据后台返回JSON动态生成列表。实现这个功能的关键是将后台返回JSON数据以合适的格式绑定Vue组件中的数据属性,然后使用循环指令(v-for)来遍历这个数据属性,生成相应的列表。 具体来说,可以按照以下步骤实现动态生成列表的功能: 1. 在Vue组件中定义一个data属性,用于存储后台返回JSON数据。例如,可以定义一个名为"listData"的数组属性。 2. 在Vue的生命周期钩子函数中,使用异步请求(如axios、fetch等)从后台获取JSON数据,并将返回的数据赋值给"listData"属性。例如,在created钩子函数中可以使用axios发送异步请求,并在请求成功后将返回JSON数据赋值给"listData"属性。 3. 在Vue组件的模板中,使用v-for指令遍历"listData"属性,生成相应的列表项。例如,可以使用如下代码片段遍历"listData"属性并生成一个无序列表: ``` <ul> <li v-for="item in listData">{{ item }}</li> </ul> ``` 上述代码中,v-for指令会遍历"listData"属性中的每个元素,依次生成相应的<li>元素。其中,"item"是一个临时变量,表示当前遍历的元素。 4. 最后,在Vue组件中进行渲染,即将组件实例挂载到DOM元素上,这样就能够看到动态生成的列表了。 综上所述,通过将后台返回JSON数据绑定Vue组件的数据属性中,并使用v-for指令遍历这个数据属性,就能够动态生成列表了。只需在适当的生命周期钩子函数中获取后台数据并赋值给数据属性,然后在模板中使用v-for指令生成相应的列表项即可。 ### 回答3: 在Vue中,我们可以根据后台返回JSON数据动态生成列表。首先,我们需要通过Vue的数据绑定后台返回JSON数据存储在Vue实例的data属性中。假设后台返回JSON数据包含一个数组,每个数组元素代表一个列表项,如下所示: ```javascript data: { items: [] // 存储后台返回JSON数据 } ``` 接下来,我们可以使用Vue的v-for指令来遍历items数组,并将每个数组元素渲染为具体的列表项。在模板中,我们可以使用类似下面的代码来生成列表: ```html <ul> <li v-for="item in items" :key="item.id">{{ item.name }}</li> </ul> ``` 上面的代码中,v-for="item in items"表示遍历items数组,将每个数组元素赋值给变量item;:key="item.id"用于给每个列表项指定一个唯一的键,以优化列表渲染;{{ item.name }}表示渲染item对象中的name属性值。 当后台返回JSON数据改变时,Vue会自动检测到data属性的变化并重新渲染列表,从而实现动态生成列表的效果。 除了简单的列表渲染外,我们还可以根据需要对列表进行排序、过滤等操作。Vue提供了强大的计算属性和过滤器来帮助我们实现这些功能。 总结起来,我们只需要使用Vue的数据绑定和v-for指令,就可以轻松地根据后台返回JSON数据动态生成列表。这使得前端开发变得更加简单和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值