小项目:使用ajax异步get请求获取数据库信息并输出到浏览器页面,并使用JSON改进代码,实现前后端分离

功能:点击按钮,后端数据库信息输出到前端浏览器页面上。


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取数据库信息</title>
</head>
<body>
    <script type="text/javascript">
        window.onload = function (){
            document.getElementById("btn").onclick = function (){
                //1.创建核心对象
                var xhr = new XMLHttpRequest();
                //2.注册回调函数
                xhr.onreadystatechange = function(){
                    if (this.readyState == 4){
                        if(this.status == 200){
                            document.getElementById("tr1").innerHTML = this.responseText;
                        }else{
                            alert(this.status);
                        }
                    }
                }
                //3.开启通道
                xhr.open("get","/xmm/servlet3",true);
                //4.发送请求
                xhr.send();
            }
        }

    </script>
    <input type="button" id="btn" value="点击"/><br/>
    <table>
        <tr>
            <th>deptno</th>
            <th>dname</th>
            <th>loc</th>
        </tr>
        <tbody id="tr1">


        </tbody>
    </table>
</body>
</html>

package mypackage;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.ResourceBundle;

@WebServlet("/servlet3")
public class Servlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ResourceBundle rb = ResourceBundle.getBundle("jdbc");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        StringBuilder sb = new StringBuilder();
        Connection con = null;
        PreparedStatement pre = null;
        ResultSet res = null;
        try {
            Class.forName(rb.getString("driver"));
            con = DriverManager.getConnection(rb.getString("url"),rb.getString("username"),rb.getString("password"));
            pre = con.prepareStatement("select * from dept");
            res = pre.executeQuery();
            while(res.next()){
                int deptno = res.getInt("deptno");
                String dname = res.getString("dname");
                String loc = res.getString("loc");
                sb.append("<tr>");
                sb.append("<td>"+deptno+"</td>");
                sb.append("<td>"+dname+"</td>");
                sb.append("<td>"+loc+"</td>");
                sb.append("</tr>");
            }
            out.print(sb);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                res.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                pre.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                con.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

  • 该程序存在的问题:后端servlet中写有HTML代码,前后端未分离。
    试想能否用jsp将后端servlet中的代码分离出来:
    不可以!如果使用jsp,就等于是又新建了一个html页面,使用转发或重定向是可以跳转到这个jsp并展示后端数据库信息,但是URL发生了变化,而我们使用ajax的目的就是为了不让URL发生变化并获得我们需要的功能。
  • 解决方法:使用json对象作为数据传送规范

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>获取数据库信息</title>
</head>
<body>
<script type="text/javascript">
  window.onload = function (){
    document.getElementById("btn").onclick = function (){
      //1.创建核心对象
      var xhr = new XMLHttpRequest();
      //2.注册回调函数
      xhr.onreadystatechange = function(){
        if (this.readyState == 4){
          if(this.status == 200){
            var t = JSON.parse(xhr.responseText);
            var html = "";
            for (var i = 0; i < t.length; i++) {
              var s = t[i];
              html+=("<tr>");
              html+=("<td>"+s.deptno+"</td>");
              html+=("<td>"+s.dname+"</td>");
              html+=("<td>"+s.loc+"</td>");
              html+=("</tr>");
            }
            document.getElementById("tr1").innerHTML=html;
          }else{
            alert(this.status);
          }
        }
      }
      //3.开启通道
      xhr.open("get","/xmm/servlet4",true);
      //4.发送请求
      xhr.send();
    }
  }

</script>
<input type="button" id="btn" value="点击"/><br/>
<table>
  <tr>
    <th>deptno</th>
    <th>dname</th>
    <th>loc</th>
  </tr>
  <tbody id="tr1">


  </tbody>
</table>
</body>
</html>

package mypackage;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.ResourceBundle;

@WebServlet("/servlet4")
public class Servlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ResourceBundle rb = ResourceBundle.getBundle("jdbc");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        StringBuilder sb = new StringBuilder();
        Connection con = null;
        PreparedStatement pre = null;
        ResultSet res = null;
        try {
            Class.forName(rb.getString("driver"));
            con = DriverManager.getConnection(rb.getString("url"),rb.getString("username"),rb.getString("password"));
            pre = con.prepareStatement("select * from dept");
            res = pre.executeQuery();
            sb.append("[");
            while(res.next()){
                int deptno = res.getInt("deptno");
                String dname = res.getString("dname");
                String loc = res.getString("loc");
                String jsonString = "{\"deptno\":"+deptno+", \"dname\":\""+dname+"\", \"loc\":\""+loc+"\" }";
                sb.append(jsonString+",");
            }
            sb.deleteCharAt(sb.length()-1);
            sb.append("]");
            /*
            拼成的实际上是一个json对象的数组:
            [
                {
                "deptno":01
                "dname":"指挥部"
                "loc":"北京"
                },
                {
                "deptno":02
                "dname":"执行部"
                "loc":"上海"
                }
            ]
             */
            out.print(sb);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                res.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                pre.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                con.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值