jsp+js+servlet中前后端获取数据

在项目中遇到的问题:jsp项目中前端jsp页面的js段需要获取后台servlet中的数据,数据格式为对象,对象当中封装的属性为ArrayList。也就是说,如何在js前端获取到servlet中的(list)数据呢?

两种方法:
1.利用EL表达式:servlet中将数据存储在session范围当中,在jsp页面用EL表达式直接取出使用。可以用jstl进行简单的逻辑判断来减少jsp页面java代码的嵌套。这个办法只适用于简单的数据获取,本文章就不详细说明了。
2.(推荐方法)向后台发送ajax请求: 前台js(jq)代码向servlet发送ajax请求,并且传送参数,然后获取到后台返回的数据,并进行处理。

js代码

let check_file = {sub:check_sub, start:check_startTime, end:check_endTime };
 $.ajax({
      type: "post",     //发送请求的方式    get / post
       dataType: "json",		// 从服务端返回数据的格式:html, xml, text,json
       url: "./terrain",		//请求的路径,根据自己的servlet而不同
       data: check_file,		//请求带的参数,这里的check_file是一个js对象,对象的三个属性就是需要传的参数
       success: function (msg) {    
            console.log("拿到数据成功");
            console.log(msg)    //发送请求成功时执行的函数,其中的msg参数是后台的返回的数据。
       }
  });

servlet页面:

package Servlet;

import Services.TerrainData;
import Util.OutList;
import com.google.gson.Gson;  //重点在这里

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.awt.event.ItemListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

@WebServlet(urlPatterns = "/terrain")   //这里是请求的路径
public class TerrainServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
  		//设置响应的编码格式
        response.setCharacterEncoding("utf-8");
        response.setContentType("textml;charset=UTF-8");
        //初始化将得到的参数
        int start = 1;
        int end = 1;
        int substance = 4;		

   		//传给前台的数据
        TerrainData data = new TerrainData();
        
		//得到前台请求中带的参数,并且化为整型(括号当中的是前台参数对象的属性)
        start = Integer.parseInt(request.getParameter("start"));
        end = Integer.parseInt(request.getParameter("end"));
        substance = Integer.parseInt(request.getParameter("sub"));
        System.out.println(start);
        System.out.println(end);
        System.out.println(substance);
        
		//根据前台传的参数生成一个对象,对象中包含传给前台的两个ArrayList数据
        OutList list = data.getData(start, end, substance);
        
		//将参数转为json格式(必须转为json格式),用了一个包 import com.google.gson.Gson;
        Gson gson=new Gson();
        String json = gson.toJson(list);
    
		//将json数据设置为传回的数据
	    PrintWriter out = response.getWriter();
	    out.print(json);

然后就可以在前台拿到数据了。也可以根据需要与定时器配合使用

需要注意的点:
1.向后台请求数据时,如果请求的是对象,数组等复杂数据,则必须使用json格式。也就是说,在后台必须将数据转为json格式。
2.在后台转为json格式可以导入 com.google.gson.Gson包,相对其他办法来说比较方便。详细说明见官网。
3.这里传的数据有两个属性,都属ArrayList类型,但是在前台拿到的msg本身就是一个js可以识别的数据类型:对象。其中msg.属性一 和 msg.属性二 自动转为js可识别的二维数组。前台直接进行操作。
4. 不建议用原生js写ajax请求。
4. 博主是个小菜鸟,第一次写文章,希望多多支持,不足错误之处请指出。

你可能感兴趣的:(js)