基于Servlet建立表白墙网站

目录

一、设计思想

二、设计表白墙页面(前端--VSCode)

1、效果图

2、html部分(网页上有哪些内容)

3、css部分(页面内容的具体样式)

4、js部分(页面行为)

三、借助Servlet实现客户端与服务器交互

1、服务器的功能

2、客户端发送数据--服务器保存并做出响应

(1)客户端发送数据(json类型请求)

(2)服务器接收数据--保存数据并发送响应给客户端

3、客户端获取当前所有表白数据--服务端响应所有数据

(1)客户端发送请求(无请求正文)

(2)服务器接收请求--将保存的所有表白数据响应给客户端

4、客户端将收到的所有数据显示到页面

四、运行效果

五、问题改进

(1)引入mysql资源依赖

(2)建表

(3)获得数据源

(4)收到客户端的post请求保存数据

(5)收到客户端的get请求返回数据


一、设计思想

二、设计表白墙页面(前端--VSCode)

1、效果图

2、html部分(网页上有哪些内容)
<body><div class="container"><h1>表白墙</h1><p>输入内容后点击提交, 信息会显示到下方表格中</p><div class="row"><span>谁: </span><input type="text"></div><div class="row"><span>对谁: </span><input type="text"></div><div class="row"><span>说: </span><input type="text"></div><div class="row"><button id="submit">提交</button></div><div class="row">xxx 对 xx 说 xxxx</div> </div>

<div class="container"> 表示一个包含内容的区域;

<div class="row"> 表示一个包含行内容的区域;

3、css部分(页面内容的具体样式)
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>表白墙</title><style>/* * 通配符选择器, 是选中页面所有元素 */* {/* 消除浏览器的默认样式. */margin: 0;padding: 0;box-sizing: border-box;}.container {width: 600px;margin: 20px auto;}h1 {text-align: center;}p {text-align: center;color: #666;margin: 20px 0;}.row {/* 开启弹性布局 */display: flex;height: 40px;/* 水平方向居中 */justify-content: center;/* 垂直方向居中 */align-items: center;}.row span {width: 80px;}.row input {width: 200px;height: 30px;}.row button {width: 280px;height: 30px;color: white;background-color: orange;/* 去掉边框 */border: none;border-radius: 5px;}/* 点击的时候有个反馈 */.row button:active {background-color: grey;}</style></head>

选中某个标准,{}里描述这个标签应该具有什么样式。

4、js部分(页面行为)
<script>// 实现提交操作. 点击提交按钮, 就能够把用户输入的内容提交到页面上显示. // 点击的时候, 获取到三个输入框中的文本内容// 创建一个新的 div.row 把内容构造到这个 div 中即可. let containerDiv = document.querySelector('.container');let inputs = document.querySelectorAll('input');let button = document.querySelector('#submit');button.onclick = function() {// 1. 获取到三个输入框的内容let from = inputs[0].value;let to = inputs[1].value;let message = inputs[2].value;if (from == '' || to == '' || message == '') {return;}// 2. 构造新 divlet rowDiv = document.createElement('div');rowDiv.className = 'row message';rowDiv.innerHTML = from + ' 对 ' + to + ' 说: ' + message;containerDiv.appendChild(rowDiv);// 3. 清空之前的输入框内容for (let input of inputs) {input.value = '';}}
</script>

通过js代码可以实现网页和用户以及网页和服务器的交互。(以上代码还未实现和服务器的交互)

三、借助Servlet实现客户端与服务器交互

1、服务器的功能

以上代码也可以实现表白墙的功能,但是发现未和服务器建立连接,数据保存在浏览器内存里,刷新浏览器数据就会消失,且该客户端也看不到上一个客户端的留言,所以就要和服务器进行交互。

服务器的功能:(1)页面加载的时候要获取到当前表白数据,由服务器响应发送;(2)客户端发送数据时,服务器要接受并保存数据。

2、客户端发送数据--服务器保存并做出响应
(1)客户端发送数据(json类型请求)

①规定请求为json类型,方法为post,请求正文样子:

{"from":from,"to":to,"message":message
}

在点击提交按钮后,发送数据给服务端,即在function函数里实现。需要引入第三方库:jquery库

②实现代码(VSCode--js语言)

// 4. 把用户填写的内容, 发送给服务器. 让服务器来保存. //    $ 是 jquery 提供的全局变量. ajax 就是 $ 的一个方法. //    ajax 的参数是一个 js 对象, 可以有很多属性let requestBody = {"from": from,   // from 变量里的值, 就是第一个输入框的内容, "张三""to": to,       // to 变量的值, 就是第二个输入框的内容, "李四""message": message  // message 变量的值, 就是第三个输入框的内容, "我喜欢你很久了"};// 上述 body 是一个 js 对象, 还需要转成 json 字符串. let jsonRequest = JSON.stringify(requestBody);$.ajax({type: 'post',url: 'message',contentType: 'application/json; charset=utf8',data: jsonRequest,success: function(responseBody) {// 这个回调就是收到响应之后要执行的代码了. // 前端使用 console.log 打印日志到控制台. (chrome 开发者工具的控制台)console.log("responseBody: " + responseBody);}});
(2)服务器接收数据--保存数据并发送响应给客户端

①服务器需要把请求正文json字符串转为java对象,且把请求上传的数据增加到列表中,给客户端响应一个json字符串,响应正文为:

{"ok" : "true"
}

②实现代码(IDEA--java语言)

import com.fasterxml.jackson.databind.ObjectMapper;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;class Request{  //请求正文json字符串转为java对象public String from;public String to;public String message;@Overridepublic String toString() {return "Request{" +"from='" + from + '\'' +", to='" + to + '\'' +", message='" + message + '\'' +'}';}
}class Response{public boolean ok;
}@WebServlet("/message")
public class messageServlet extends HttpServlet{List<Request> list=new ArrayList<>();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ObjectMapper objectMapper=new ObjectMapper();Request request=objectMapper.readValue(req.getInputStream(),Request.class); //转为java对象System.out.println("请求内容:"+request);list.add(request); //保存数据resp.setStatus(200); //响应返回一个状态码Response response=new Response(); //响应的java对象response.ok=true;String jsonResponse=objectMapper.writeValueAsString(response); //响应转为json字符串resp.setContentType("application/json;charset=utf8");resp.getWriter().write(jsonResponse);}
}
3、客户端获取当前所有表白数据--服务端响应所有数据
(1)客户端发送请求(无请求正文)

①请求方法为get方法,加载页面时发送该请求。

②实现代码(VSCode--js语言)

  // 直接在 script 里面写的 js 代码, 就是在页面加载时被执行到的. // 发起一个 get 请求, 从服务器获取到数据// get 请求不需要 body, 也就不需要上述 data 和 contentType 属性了. $.ajax({type:'get',url:'message',success:function(body){//这个回调就是收到响应之后要执行的代码了. //客户端将收到的所有数据显示到页面}})

客户端收到响应后,显示数据的代码下一步实现。

(2)服务器接收请求--将保存的所有表白数据响应给客户端

①服务器需要将保存数据的数组转为json数组,将json数组响应给客户端,

②实现代码(IDEA--java语言)

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ObjectMapper objectMapper=new ObjectMapper();resp.setStatus(200);  //响应返回一个状态码resp.setContentType("application/json;charset=utf8");String jsonResponse=objectMapper.writeValueAsString(list); //jackson支持把一个数组对象转为json数组resp.getWriter().write(jsonResponse);}
4、客户端将收到的所有数据显示到页面

①客户端将收到的所有表白数据显示在页面上,在success:function(body){}回调函数中实现;

②响应中header中带有:Content-Type:appliaction/json,jquery库就会自动把响应的json正文转为js对象。eg:resp.setContentType("application/json;charset=utf8");

若响应中header中没有:Content-Type:appliaction/json,客户端拿到响应后,在回调函数中就会调用body = JSON.parse(body) ;

③实现代码(VSCode--js语言)

success: function(body) {//这个回调就是收到响应之后要执行的代码了. //客户端将收到的所有数据显示到页面// 由于响应中已经有 Content-Type: application/json 了, 就不需要使用 parse 方法手动转换了.  // body = JSON.parse(body);// 拿到 container 这个元素let containerDiv = document.querySelector('.container');// 处理服务器返回的响应数据. (json 格式的数组了)for (let i = 0; i < body.length; i++) {// body 是一个数组, 此时 message 也就是 js 对象了. // 这个 message 对象里, 有三个属性, from, to, messagelet message = body[i];// 根据 message 对象构建 html 片段, 把这个片段给显示到网页上. // createElement 方法就能构造出一个 html 标签. // 此时就得到了 <div></div> let div = document.createElement('div');// 还需要往里面设置一个 属性 , class="row" (设置这个属性, 是为了让 css 能够给这个元素设置一些样式)// 此时就得到了 <div class="row"></div>div.className = 'row';// 给这个 div 里设置内容// 此时就得到了 <div class="row">张三 对 李四 说: 我喜欢你很久了</div>div.innerHTML = message.from + " 对 " + message.to + " 说: " + message.message;// 把 div 添加到 containerDiv 的末尾containerDiv.appendChild(div);}}

四、运行效果

需注意:需要将前端代码放在webapp包中(IDEA)

效果图

刷新或者重新打开页面,数据依旧存在。

五、问题改进

上述虽然实现了基于服务器的通信,但是若后台服务器停止运行,则所有的数据也都没有了,所以我们需要将数据存在数据库里,即使服务器停止运行了,再次重启时数据依然存在。

(1)引入mysql资源依赖

(2)建表

message表,里面有from、to、message属性。

create database if not exists message_wall charset utf8;
use message_wall;
-- 删表目的是为了, 防止之前数据库里有一样的表, 对咱们的代码产生干扰.
drop table if exists message;
create table message (`from` varchar(1024), `to` varchar(1024), message varchar(1024));

(3)获得数据源
private DataSource datasource=new MysqlDataSource(); //导入数据源 向上转型@Override//获取数据源--在HttpServlet被实例化后调用该方法public void init() throws ServletException {((MysqlDataSource) datasource).setUrl("jdbc:mysql://127.0.0.1:3306/message_wall?characterEncoding=utf8&useSSL=false");((MysqlDataSource) datasource).setUser("root");  //用户名((MysqlDataSource) datasource).setPassword("272222"); //密码}
(4)收到客户端的post请求保存数据
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ObjectMapper objectMapper=new ObjectMapper();Request request=objectMapper.readValue(req.getInputStream(),Request.class); //转为java对象System.out.println("请求内容:"+request);try {save(request);//保存数据} catch (SQLException e) {throw new RuntimeException(e);}resp.setStatus(200); //响应返回一个状态码Response response=new Response(); //响应的java对象response.ok=true;String jsonResponse=objectMapper.writeValueAsString(response); //响应转为json字符串resp.setContentType("application/json;charset=utf8");resp.getWriter().write(jsonResponse);}private void save(Request request) throws SQLException {//建立连接Connection connection=datasource.getConnection();//创建执行语句String sql="insert into message values(?,?,?)"; //?是通配符//转成服务器能看懂的语句 客户端已提前解析好,mysql直接运行PreparedStatement statement=connection.prepareStatement(sql);statement.setString(1,request.from);  //第一个问号内容statement.setString(2,request.to);    //第二个问号内容statement.setString(3,request.message);  //第三个问号内容//执行sql语句statement.executeUpdate();//回收资源statement.close();connection.close();}
(5)收到客户端的get请求返回数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {List<Request> list=null;ObjectMapper objectMapper=new ObjectMapper();resp.setStatus(200);  //响应返回一个状态码resp.setContentType("application/json;charset=utf8");try {list=load();} catch (SQLException e) {throw new RuntimeException(e);}String jsonResponse=objectMapper.writeValueAsString(list); //jackson支持把一个数组对象转为json数组resp.getWriter().write(jsonResponse);}
private List<Request> load() throws SQLException {//建立连接Connection connection=datasource.getConnection();//创建执行语句String sql="select * from message";//转成服务器能看懂的语句 客户端已提前解析好,mysql直接运行PreparedStatement statement=connection.prepareStatement(sql);//执行sql语句ResultSet resultSet=statement.executeQuery();//添加到返回数组List<Request> list1=new ArrayList<>();while (resultSet.next()){Request request=new Request();request.from=resultSet.getString("from");request.to=resultSet.getString("to");request.message=resultSet.getString("message");list1.add(request);}return list1;}

服务器重启后,数据依旧存在。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python内置函数有哪些?整理到了7大分类48个函数,都是工作中常用的函数

python内置函数 一、入门函数 1.input() 功能&#xff1a; 接受标准输入&#xff0c;返回字符串类型 语法格式&#xff1a; input([提示信息])实例&#xff1a; # input 函数介绍text input("请输入信息:") print("收到的数据是:%s" % (text))#输出…

Linux之快速入门

一、Linux目录结构 从Windows转到Linux最不习惯的是什么&#xff1a; 目录结构 Windows会分盘&#xff0c;想怎么放东西就怎么放东西&#xff0c;好处自由&#xff0c;缺点容易乱 Linux有自己的目录结构&#xff0c;不能随随便便放东西 /&#xff1a;根目录/bin:二进制文件&…

达梦数据库Windows安装教程:从准备到完成

目录 博客前言&#xff1a; 一.达梦数据库安装前准备 1.下载 2.进行解压 装载 二.正式安装 选择语言与时区 安装向导 许可证协议 验证 Key 文件 选择安装组件 选择安装目录 安装前小结 数据库安装 数据库安装完成 三.配置实例 选择操作方式 创建数据库模板 选…

微信小程序-03

小程序官方把 API 分为了如下 3 大类&#xff1a; 事件监听 API 特点&#xff1a;以 on 开头&#xff0c;用来监听某些事件的触发 举例&#xff1a;wx.onWindowResize(function callback) 监听窗口尺寸变化的事件 同步 API 特点1&#xff1a;以 Sync 结尾的 API 都是同步 API 特…

Docker(十六)Kubernetes - 开源容器编排引擎

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Kubernetes Kubernetes 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统&#xff0c;它不仅支持常见的云平台&#xff0c;而…

macOS跨进程通信: TCP Socket 创建实例

macOS跨进程通信: TCP Socket 创建实例 一&#xff1a; 简介 Socket 是 网络传输的抽象概念。 一般我们常用的有Tcp Socket和 UDP Scoket&#xff0c; 和类Unix 系统&#xff08;包括Mac&#xff09;独有的 Unix Domain Socket&#xff08;UDS&#xff09;。 Tcp Socket 能够…

xshell可以远程登录服务器但是vscode一直显示让输入密码的解决方案

vscode报错 但是xshell可以登录 原因&#xff1a;可能因为我上一次没有恰当的退出远程链接导致的&#xff0c;我每次退出远程都是直接强制关闭VScode。 解决方法&#xff1a;打开VScode的 view &#xff08;查看&#xff09; palette&#xff08;命令面板&#xff09;然后输…

【数据结构】 顺序栈的基本操作 (C语言版)

目录 一、顺序栈 1、顺序栈的定义&#xff1a; 2、顺序栈的优缺点 二、顺序栈的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、顺序栈的初始化 4、顺序栈的入栈 5、顺序栈的出栈 6、取栈顶元素 7、栈的遍历输出 8、顺序栈的判空 9、顺…

【算法专题】动态规划之路径问题

动态规划2.0 动态规划 - - - 路径问题1. 不同路径2. 不同路径Ⅱ3. 珠宝的最高价值4. 下降路径最小和5. 最小路径和6. 地下城游戏 动态规划 - - - 路径问题 1. 不同路径 题目链接 -> Leetcode -62.不同路径 Leetcode -62.不同路径 题目&#xff1a;一个机器人位于一个 m …

(2)(2.4) CRSF/ELRS Telemetry

文章目录 前言 1 ArduPilot 参数编辑器 前言 &#xff01;Note ELRS&#xff08;ExpressLRS&#xff09;遥控系统使用穿越火线协议&#xff0c;连接方式类似。不过&#xff0c;它不像穿越火线那样提供双向遥测。 TBS CRSF 接收机与 ArduPilot 的接口中包含遥测和遥控信息。…

【大数据精讲】全量同步与CDC增量同步方案对比

目录 背景 名词解释 问题与挑战 FlinkCDC DataX 工作原理 调度流程 五、DataX 3.0六大核心优势 性能优化 背景 名词解释 CDC CDC又称变更数据捕获&#xff08;Change Data Capture&#xff09;&#xff0c;开启cdc的源表在插入INSERT、更新UPDATE和删除DELETE活动时…

c++ 包管理工具vcpkg

微软包管理工具 一、下载 git clone https://github.com/microsoft/vcpkg二、初始化 ./vcpkg/bootstrap-vcpkg.sh三、查看帮助文档 ./vcpkg/vcpkg help四、安装包 vcpkg/vcpkg install fmt五、查看安装包 vcpkg/vcpkg list输出 包实际安装路径 ./vcpkg/packages/fmt_x…

docker - compose 部署 Tomcat

目录 下面用 docker-compose 方法部署 Tomcat 1、准备工作 2、部署容器 启动容器 查看新启动的容器 3、总结 下面用 docker-compose 方法部署 Tomcat 1、准备工作 先在主机创建工作文件夹&#xff0c;为了放置 Tomcat 的配置文件等。创建文件夹的方法&#xff0c;自己搞…

JVM篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、解释 Java 堆空间及 GC?二、JVM 内存区域三、程序计数器(线程私有)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一…

「Qt Widget中文示例指南」如何实现一个日历?(三)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的CalendarWi…

API接口安全总结

接口分类 HTTP接口 RPC接口&#xff08;客户端和服务器端的连接 例如游戏登陆&#xff09;非web协议&#xff0c;PRC 远程过程调用 Remote Procedure Call&#xff0c;其就是一个节点请求另外一个节点提供的服务。当两个物理分离的子系统需要建立逻辑上的关联时&#xff0c;R…

Centos7 两种方式安装 MySQL5.7 步骤 yum 、本地 tar 文件

一、使用 yum 源方式安装 1、卸载系统自带 mariadb MariaDB Server 是最流行的开源 关系型数据库 之一。它由 MySQL 的原始开发者制作&#xff0c;并保证保持开源。 在 CentOS 7 中默认安装有 MariaDB 可忽略&#xff0c;安装完成之后可以直接覆盖掉 MariaDB。 查看并卸载系统…

扩散模型公式推导

这篇文章将尝试推导扩散模型 DDPM 中涉及公式&#xff0c;主要参考两个 B 站视频&#xff1a; 大白话AI狗中赤兔 本文所用 PPT 元素均来自 UP 主&#xff0c;狗中赤兔和大白兔AI&#xff0c;特此感谢。 在证明开始&#xff0c;我们需要先对扩散模型有一个整体的认知。扩散模型…

(M)unity2D敌人的创建、人物属性设置,遇敌掉血

敌人的创建 1.敌人添加与组件设置 1&#xff09;添加敌人后&#xff0c;刚体添加&#xff0c;碰撞体添加&#xff08;一个碰撞体使猪在地上走&#xff0c;不接触人&#xff0c;另一个碰撞体组件使人和猪碰在一起产生伤害&#xff09; ①刚体 ②碰撞体一 设置的只在脚下&a…

【寒假打卡】Day01

文章目录 选择编程HJ99 自守数OR86 返回小于 N 的质数个数 选择 如下代码输出的是什么&#xff08; &#xff09; char a101; int sum200; a27;suma; printf("%d\n",sum);A: 32 B: 99 C: 328 D: 72 答案&#xff1a; C 解析&#xff1a; 首先&#xff0c;char a …