动态Web项目讲解+Demo

web流程演示

请求路径

请求路径明确要请求的是哪个servlet

请求方式

servlet含有两种请求方式:doGet和doPost

doGet&doPost

返回数据就是httpResponse,返回给success

参数

包含在request当中

成功

上述流程任何一步都没出问题,就会走到success当中

返回httpServletResponse给success当中

失败

只要有一步出现问题,就会走到失败当中去

get请求和post请求的区别

1. post请求用data域传参,get用url携带参数进行传参

2. 发起请求的方式不同

get:任意能写地址的地方,都能发起get请求

a标签的href属性,浏览器地址栏,img标签的src属性,jquery+ajax,都能发起get请求

post:jquery+ajax发起/form表单发起

form表单会更新全部的表单数据,jquery+ajax可以做到局部的更新

SQL

JDBC

Sun公司对底层数据库驱动的一层封装,是一种规范

流程

demo:JDBC

import java.sql.*;

public class JDBCTest {

    static final String url = "jdbc:mysql://127.0.0.1:3306/qcby?serverTimezone=UTC";// 端口号可能会变,一般是3306
    static final String username = "写你自己的数据库账号,一般是root";
    static final String password = "写你自己的数据库密码";

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        query("select * from student");
        change("UPDATE student SET age = 99 where id = 1;");
        add("INSERT INTO student(Sname,sex,age,t_id) value(\"拜登\",\"男\",77,2);");
        delete("DELETE FROM student WHERE id = 12");
    }


    public static void query(String querySql) throws ClassNotFoundException, SQLException {
        Connection connection = initSqlConnection();
        Statement statement = connection.createStatement();
        // 5, 执行sql语句,executeQuery方法去查询,返回获取结果
        ResultSet resultSet = statement.executeQuery(querySql);
        // 6. resultSet处理数据
        while (resultSet.next()) {
            String id = resultSet.getString("id");
            String Sname = resultSet.getString("Sname");
            String sex = resultSet.getString("sex");
            String age = resultSet.getString("age");
            String t_id = resultSet.getString("t_id");
            System.out.println("id=" + id + ",Sname=" + Sname + ",sex=" + sex +
                    ",age=" + age + ",t_id=" + t_id);
        }
        closeJdbcResources(connection, statement, resultSet);

    }

    public static void change(String updateSql) throws SQLException, ClassNotFoundException {
        Connection connection = initSqlConnection();

        Statement statement = connection.createStatement();

        // 增删改都是这个executeUpdate方法
        int changeResult = statement.executeUpdate(updateSql);
        if (changeResult > 0) {
            System.out.println("受影响的行数:" + changeResult);
        } else {
            throw new SQLException("修改失败!");
        }

        closeJdbcResources(connection, statement, null);

    }

    public static void add(String insertSql) throws SQLException, ClassNotFoundException {
        Connection connection = initSqlConnection();

        Statement statement = connection.createStatement();

        int addResult = statement.executeUpdate(insertSql);

        if (addResult > 0) {
            System.out.println("受影响的行数:" + addResult);
        } else {
            throw new SQLException("新增失败!");
        }

        closeJdbcResources(connection, statement, null);
    }

    public static void delete(String deleteSql) throws SQLException, ClassNotFoundException {
        Connection connection = initSqlConnection();

        Statement statement = connection.createStatement();

        // 增删改都是这个executeUpdate方法
        int deleteResult = statement.executeUpdate(deleteSql);
        if (deleteResult > 0) {
            System.out.println("受影响的行数:" + deleteResult);
        } else {
            throw new SQLException("删除失败!");
        }

        closeJdbcResources(connection, statement, null);
    }

    private static Connection initSqlConnection() throws ClassNotFoundException, SQLException {
        // 1. 加载驱动(类加载)
        Class.forName("com.mysql.cj.jdbc.Driver");// mysql8以下要去掉中间的cj

        // 2. 用户信息和url

        // 3. 驱动管理类调用方法进行连接,创建连接对象connection,connection代表了数据库

        return DriverManager.getConnection(url, username, password);
    }

    private static void closeJdbcResources(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {
        // 7. 释放资源
        if (resultSet != null) {
            resultSet.close();
        }
        statement.close();
        connection.close();
    }
}

jdbc为我们提供的接口

前后端数据交互demo

我们要实现的需求是:查询student表的全部学生数据,返回给前端;前端将json格式的数据拼接成表格(table标签)展示

1. 实体类对应的Servlet----查询数据库并转换为JSON格式返回给前端

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;

@WebServlet("/student")
public class StudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get请求接收到了!");
        String[] queryParam = {"id", "Sname", "sex", "age", "t_id"};// 确定要拼装成JSON的字段
        String queryResult = MysqlUtil.getJsonBySql("select * from student", queryParam);// 查询数据库并且拼装成JSON格式
        System.out.println("queryResult:" + queryResult);

        // 给前端响应数据
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("application/json;charset=UTF-8");// 这里的contentType不能是text/html; charset=UTF-8
        resp.getWriter().write(queryResult);// 组装响应报文给前端(主要是给js)
    }
}

这里注意一定要拼装成json格式的数据,否则js读不出来,不会arr视为一个数组

MysqlUtil是一个包装了原生的JDBC的工具类,原生的JDBC,demo:JDBC中讲了,读者可以向上查看

2. 创建对应的html和js(使用jquery和ajax)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--第一种方式:本地文件导入,可以不加defer,不加defer就需要加文档就绪函数-->
<script src="js/jQuery.js" defer></script>
<!--我们自定义的js文件得加defer-->
<script src="js/index.js" defer></script>
<body>
<div>
    <table border=1>
        <thead>
        <tr>
            <td>id</td>
            <td>Sname</td>
            <td>sex</td>
            <td>age</td>
            <td>t_id</td>
            <td>操作</td>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td>1</td>
            <td>张三</td>
            <td>男</td>
            <td>99</td>
            <td>1</td>
            <td>
                <input type="button" value="修改">
                <input type="button" value="删除">
            </td>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>

这里tbody里面的数据只是一个演示,实际我们应该用数据库当中查到的数据

使用jquery需要先引入jQuery.js,jquery相当于对原生js操作dom文档函数的一次封装,是一个外部包,我们需要引入才能使用

$.ajax({
    url: "student", // 对应StudentServlet的@WebServlet("/student")
    type: "get", // 对应StudentServlet重写的doGet方法
//     查全表不需要带参数
    success: function (value) {// 这里的value就是StudentServelet最后拼装并返回的response(resp.getWriter().write(queryResult);)
        console.log(value);
        var arr = value.data;// value是一个json格式的数据,包含code,msg,data三个变量,其中data是一个数组,我们只需要获取data即可
        console.log(arr);
        for (var i = 0; i < arr.length; i++) {// 把data当成一个数组
            console.log(arr[i]);
            // 创建html元素,并且赋值
            $("tbody").append("<tr>" +
                "<td>"+arr[i].id+"</td>" +
                "<td>"+arr[i].Sname+"</td>" +
                "<td>"+arr[i].sex+"</td>" +
                "<td>"+arr[i].age+"</td>" +
                "<td>"+arr[i].t_id+"</td>" +
                "<td>" +
                "<input type=\"button\" value=\"修改\">" +
                "<input type=\"button\" value=\"删除\">" +
                "</td>" +
                "</tr>")
        }
    },
    // 后端报错,无法返回给前端response,就会走到这里,然后在浏览器给用户警告
    error: function () {
        alert("查询全部学生失败!");
    }
})

3. 运行tomcat

如何在eclipse/IDEA中新建DynamicWebProject/Jarkarta EE项目,并且配置Tomcat,请读者自行搜索

我们点击右上角的运行按钮,tomcat会运行,并且自动打开默认的浏览器环境(我这里配置的是chrome)

自动弹出的应该是这样一个地址

我们可以看到,这里表格已经被成功创建了出来,数据也被显示了出来

F12查看控制台,数据也都显示出来了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563762.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之创建型模式---工厂模式

文章目录 工厂模式概述简单工厂简单工厂的代码实现简单工厂的使用简单工厂应用场景 工厂方法工厂方法模式的代码实现工厂方法的使用工厂方法应用场景 抽象工厂抽象工厂模式代码实现抽象工厂的使用方法抽象工厂模式的应用场景 总结 工厂模式概述 工厂模式从名字就能看出&#x…

在【laravel框架】学习中遇到的常见的问题以及解决方法

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

.net core webapi 高颜值的接口管理系统界面取代swagger,更好调试和查看

.net core webapi 高颜值的接口管理系统界面取代swagger&#xff0c;更好调试和查看 安装 dotnet add package IGeekFan.AspNetCore.Knife4jUI --version 0.0.16配置文档&#xff1a; 配置起始页 builder.Services.AddSwaggerGen(c > {// 配置 Swagger 文档相关信息c.Swa…

开源项目实现简单实用的股票回测

1 引言 之前&#xff0c;尝试做股票工具一直想做的大而全&#xff0c;试图抓取长期的各个维度数据&#xff0c;然后统计或者训练模型。想把每个细节做到完美&#xff0c;结果却陷入了细节之中&#xff0c;最后烂尾了。 最近&#xff0c;听到大家分享了一些关于深度学习、时序…

【面试题】MySQL 事务的四大特性说一下?

事务是一个或多个 SQL 语句组成的一个执行单元&#xff0c;这些 SQL 语句要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不会出现部分执行的情况。事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。 事务的主要作用是保证数…

Core dump(核心转储)

文章目录 core dump core dump 进程退出时有三种情况正常退出&#xff0c;退出结果不对&#xff0c;异常退出 低7位表示收到信号退出&#xff0c;次低八位代表进程正常退出它的退出码&#xff01;在第八位有一个core dump标志位&#xff0c;这个标志位表示进程收到信号做的动…

Leetcode 28. 找出字符串中第一个匹配项的下标

心路历程&#xff1a; 两个字符串匹配的问题基本都可以用动态规划解决&#xff0c;递推关系就是依次匹配下去 注意的点&#xff1a; 1、注意边界条件是匹配串needle到头&#xff0c;但是haystack不一定需要到头 2、这道题按照从i开始的字符串而不是从i结束的进行DP建模 解法…

vue---计算属性

姓名案例 1.使用插值语法实现 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>姓名案例_插值语法实现</title><!-- 引入Vue --><script type"text/javascript" src"../js/vue.js"&g…

被这批B端界面的颜值给征服了,匍匐拜倒。。

高颜值的 B 端界面对于企业来说具有非常重要的作用&#xff0c;可以帮助企业提升品牌形象、吸引客户、增加用户留存、提升竞争力、提高交易转化率&#xff0c;以及优化用户体验&#xff0c;从而为企业带来更多的商业机会和利益。本期分享一批&#xff0c;都是颜值杠杠的。

制造业信息安全实践——企业信息安全运营规划

前言 制造业作为一个庞大的传统产业&#xff0c;涵盖了汽车、船舶、飞机、家电、新能源等众多领域。当前&#xff0c;无论是国内还是国外的制造业都面临着一个共同的挑战&#xff1a;在计算机和信息时代的背景下&#xff0c;如何跟上IT技术的发展步伐&#xff1f;如何让传统产…

网络协议安全:OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

「作者简介」&#xff1a;2022年北京冬奥会中国代表队&#xff0c;CSDN Top100&#xff0c;学习更多干货&#xff0c;请关注专栏《网络安全自学教程》 这一章节我们需要知道OSI分哪七层&#xff0c;每层的作用&#xff0c;知道数据在七层模型中是怎样传输的&#xff0c;封包和解…

【离婚不再难】告别痛苦,用一纸起诉状重新启航

【离婚不再难】告别痛苦&#xff0c;用一纸起诉状重新启航 在这个瞬息万变的时代&#xff0c;婚姻关系的走向已不再是人们心中永恒的定局。当缘尽人散&#xff0c;面对离婚的纷扰&#xff0c;你是否感到迷茫与无助&#xff1f;别担心&#xff0c;李秘书讲写作公众号在这里&…

C++11——线程库的理解与使用

目录 前言 一、线程库的构造 1.默认构造 2.带参构造 3.拷贝构造与赋值拷贝&#xff08;不支持&#xff09; 4.移动构造 二、线程调用lambda函数 三、线程安全与锁 1.lambda中的线程与锁 2.函数指针中的线程与锁 3.trylock() 4.recursive_mutex 5.lock_gurad守卫锁…

​「Python大数据」VOC数据清洗

前言 本文主要介绍通过python实现数据清洗、脚本开发、办公自动化。读取voc数据,存储新清洗后的voc数据数据。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词,清洗后的评论存储到新的列中保存清洗后的数据到新的Excel文件中二、具体产出 三、执…

three.js(2):渲染第一个three.js三维对象

这一章渲染一个立方体对象到场景中&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><script text"module" charset"UTF-8"…

LabVIEW学习记录2 - MySQL数据库连接与操作

LabVIEW学习记录2 - MySQL数据库连接与操作 一、前期准备1.1 windows下安装MySQL的ODBC驱动 二、LabVIEW创建MySQL 的UDL文件三、LabVIEW使用UDL文件进行MySQL数据库操作3.1 建立与数据库的连接&#xff1a;DB Tools Open Connection.vi3.2 断开与数据库的连接&#xff1a;DB T…

功能测试前景揭秘:会被淘汰吗?

在当今快速发展的信息时代&#xff0c;软件已经成为我们工作、学习乃至生活中不可或缺的一部分。随着技术的不断进步和应用的广泛普及&#xff0c;软件测试作为保障软件质量和功能实现的关键步骤&#xff0c;其职业发展路径也受到了广泛的关注。特别是针对功能测试这一细分领域…

The layered MVP architecture in Acise

Acise是一款CAx软件开发平台&#xff0c;本文给出Acise中的MVP架构模式的实现思路。 注1&#xff1a;文章内容会不定期更新。 MVP Data Model View Model 参考文献 Erich Gamma. Design Patterns:elements of reusable object-oriented software. Addison Wesley, 1994.Josep…

高达27K star!基于LLM构建本地智能知识库 太猛了

觉得搞一个AI的智能问答知识库很难吗&#xff1f;那是你没有找对方向和工具&#xff0c; 今天我们分享一个开源项目&#xff0c;帮助你快速构建基于Langchain 和LLM 的本地知识库问答&#xff0c;在GitHub已经获得27K star&#xff0c;它就是&#xff1a;Langchain-Chatchat L…

摄影的技术和艺术,摄影师的日常修养

一、资料描述 本套摄影师资料&#xff0c;大小1.50G&#xff0c;共有67个文件。 二、资料目录 《1900&#xff0c;美国摄影师的中国照片日记》.pdf 《40幅引人入胜的获奖照片》.pdf 《把你的照片换成钱&#xff1a;图片库摄影师的生存之道》(美)陈小波.扫描版.PDF 《半小…