JavaWeb 前后端分离

AJax

1. 前端视图

ajax\src\main\webapp\ajax-register.html

<html><head><meta charset="UTF-8">
</head><body><form class="form-horizontal" role="form"><div><tr><td>账号</td><td class="inputs"><input name="username" type="text" id="username"></td><br><span id="username_err" class="err_msg" style="display:none">用户名已存在</span></tr></div><div><tr><td>密码</td><td class="inputs"><input name="password" type="text" id="password"></td></tr></div></form><script>// 1.给用户输入框绑定失去焦点事件document.getElementById("username").onblur = function () {// alert("TTT");// 2.发送ajax请求// 获取参数var username = this.value;// 2.1.创建核心对象const xhttp = new XMLHttpRequest();// 2.2.发送请求// 通过selectUserservlet向servlet.java发送usernema数据xhttp.open("GET", "http://localhost:8080/ajax/selectUserservlet?username=" + username);// 传两个参数:// xhttp.open("GET", "http://localhost:8080/ajax/selectUserservlet?username=test2&username2=test2");xhttp.send();// 2.3.获取响应xhttp.onreadystatechange = function () {if (this.readyState == 4 && this.status == 200) {//判断if (this.responseText == "true") {// 用户名已存在// 将展示(display)启用,显示提示信息document.getElementById("username_err").style.display = '';}else {// 用户名不存在// 将展示(display)关闭,清除提示信息document.getElementById("username_err").style.display = 'none';}}};}</script>
</body>
</html>

2. 后端

ajax\src\main\java\com\mercurows\web\servlet\servlet.java

package com.mercurows.web.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/selectUserservlet")
public class servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1.接受用户名String username = req.getParameter("username");System.out.println(username);// 2.调用service查询user对象boolean flag = true;// 3.标记响应resp.getWriter().write("" + flag);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

3. 请求链接如何确定?

xhttp.open("GET", "http://localhost:8080/ajax/selectUserservlet");

上述不带参数传递的请求连接为:http://localhost:8080/ajax/selectUserservlet

具体步骤:

用tomcat打开项目

一开始默认进来是这样的:image-20230713122716531

又因为要跳转到后端的servletservlet.java页面,通过上面的注解 **@WebServlet(“/selectUserservlet”)**知道请求链接后面应该跟随selectUserservlet

image-20230713123709201

若想传递参数则需要修改链接为:

http://localhost:8080/ajax/selectUserservlet?username=" + username

此时后端接受参数方法为:

String username = req.getParameter("username");

4. 项目结构

image-20230713132643922


Axios

0. 导入js文件

去网上找到axios.js并导入项目中

image-20230713134538221

然后在前端中导入

<script src="js/axios.js"></script>

1. 前端视图

ajax\src\main\webapp\axios-demo.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><script src="js/axios.js"></script><!-- 1.get方式 --><!-- <script>axios({method:"get",url:"http://localhost:8080/ajax/axiosServlet?username=zhangsan"}).then(function (resp){alert(JSON.stringify(resp.data));})</script> --><!-- 2.post方式 --><script>axios({method:"post",url:"http://localhost:8080/ajax/axiosServlet",data:"username=zhangsan"}).then(function (resp){alert(JSON.stringify(resp.data));})</script></body>
</html>

2. 后端

ajax\src\main\java\com\mercurows\web\servlet\AxiosServlet.java

package com.mercurows.web.servlet;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;@WebServlet("/axiosServlet")
public class AxiosServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {System.out.println("get..");// 1.接受用户名String username = req.getParameter("username");// 2.响应数据// res.getWriter().write("hello axios");System.out.println(username);Map<Object,Object> data1 = new HashMap<>();data1.put("name", "Alice");data1.put("age", 12);data1.put("measurements", new int[] { 60, 70, 70 });JSONObject object = JSONObject.fromObject(data1); //创建Json对象//将json对象转化为字符串在终端输出System.out.print(object.toString());//把json数据返回给浏览器:res.getWriter().write(object.toString());}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {System.out.println("pos..");this.doGet(req,res);}
}

3. 确定请求链接

参考AJax中的方法

**注意:**上面后端中使用JSONObject了传递JSON数据,可参考博客:简单的后端传送json格式至前端正确处理方法

4. 项目结构

image-20230713161105117


Servlet优化

情景想象:对于Student实体对象有添加(add)、查找(select)等方法,按照我旧的设计方法,会设计两个servlet类:AddStudentServlet、SelectALLStudentServlet。如果后面后续又出现了更多操作,这使得servlet类的管理出现不便。这时我可以采取与MyBatis类似的处理方法进行映射,见:MyBatis简单入门。Student专门写个成一个StudentServlet类,然后原本的AddStudentServlet、SelectALLStudentServlet写成里面的成员方法。

1.自定义servlet类重写service方法

自定义继承了HttpServlet类的子类,并且重写protected void service(HttpServletRequest req, HttpServletResponse resp)方法–根据请求链接来决定是调用doGet还是doPost之类的,源码可以见:源码,重写了该方法之后也就可以做到无需写doGetdoPost等方法。

ajax\src\main\java\com\mercurows\web\servlet\BaseServlet.java

package com.mercurows.web.servlet;import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;// @WebServlet("/selectUserservlet")
// 替换HttpServlet,根据请求的最后一段路径来进行分发
public class BaseServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1.1获取请求路径,即浏览器输入栏的链接String uri = req.getRequestURI();// System.out.println(uri);// 1.2获取最后一段路径,即StudentServlet中的成员方法名//这里的方法名即指int index = uri.lastIndexOf('/');String methodName = uri.substring(index + 1);// System.out.println(methodName);// 2.执行方法// 2.1 获取TeacherServlet、StudentServlet字节码对象Class// 谁调用该方法,该方法中的this就是谁Class<? extends Object> cls = this.getClass();cls.getMethods();// 2.2获取方法Method对象try {// 方法名称、方法参数对应的classMethod method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);// 2.3参数:调用方法的类,该方法对应的参数method.invoke(this, req, resp);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}
}

2. 映射servlet的类

与以往编写servlet类要继承HttpServlet类一样,这里因为BaseServlet继承了HttpServlet,所以直接继承BaseServlet即可,如:

ajax\src\main\java\com\mercurows\web\servlet\StudentServlet.java

package com.mercurows.web.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/student/*")
public class StudentServlet extends BaseServlet {public void selectAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Student selectAll..");}public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Student add..");}public void del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Student del..");}    
}

这里的@WebServlet("/student/*")表示通配符,表示当要执行StudentServlet中任一方法时(如selectAll方法,则路径应该是:/student/selectAll)便会见控制权转交给对应方法。

3. 具体执行流程

运行tomcat打开项目浏览器:image-20230713172507702

假如要执行StudentServlet中的成员方法,则具体路径为:http://localhost:8080/ajax/student/selectAll

**具体的:**当我在浏览器中输入http://localhost:8080/ajax/student/del时,执行流程如下

  1. 请求由服务器接收,并传递给与路径匹配的Servlet,即BaseServlet
  2. BaseServletservice方法被调用,传入HttpServletRequestHttpServletResponse对象。
  3. service方法内部,通过req.getRequestURI()获取请求的URI,即/ajax/student/del
  4. 然后,通过uri.lastIndexOf('/')获取最后一个斜杠的索引,这里是14
  5. 使用uri.substring(index)截取最后一段路径,即/del,并将其存储在methodName变量中。
  6. methodName现在包含要执行的方法名。
  7. BaseServletservice方法执行完毕,控制权传递回StudentServlet
  8. StudentServlet继承自BaseServlet,因此它会继承service方法。
  9. service方法在StudentServlet中未被重写,因此将调用BaseServlet中的service方法。
  10. BaseServletservice方法将执行上述步骤来解析URI,并确定要执行的方法名为/del
  11. service方法输出/ajax/student/del/del的日志信息。
  12. service方法执行完毕,请求处理完成。

总结:请求首先由BaseServlet接收并解析URI,然后确定要执行的方法名为/del。然后控制权传递给StudentServlet,但由于StudentServlet没有重写service方法,因此将继续执行BaseServlet中的service方法。

4. 多个映射servlet的类

假如,现在又多了TeacherServlet.java,同理也只需要继承BaseServlet.java即可,而且BaseServlet.java不需要做出任何修改。

ajax\src\main\java\com\mercurows\web\servlet\TeacherServlet.java

package com.mercurows.web.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/teacher/*")
public class TeacherServlet extends BaseServlet {public void selectAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("teacher selectAll..");}public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("teacher add..");}
}

5. 项目结构

image-20230713173922734

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

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

相关文章

谁能成为首个RedCap规模商用的厂商?

RedCap在“降本、小尺寸、低功耗”的呼声中逐渐成为后5G时代的宠儿&#xff0c;随着相关技术的成熟&#xff0c;RedCap如何进一步商用成为行业关注的焦点。RedCap的发展&#xff0c;离不开运营商、芯片厂商、终端厂商、模组厂商等产业关键节点的通力合作。那RedCap离正式商用还…

RT-Thread 互补滤波器 (STM32 + 6 轴 IMU)

作者&#xff1a;wuhanstudio 原文链接&#xff1a;https://zhuanlan.zhihu.com/p/611568999 最近在看无人驾驶的 Prediction 部分&#xff0c;可以利用 EKF (Extended Kalman Filter) 融合不同传感器的数据&#xff0c;例如 IMU, Lidar 和 GNSS&#xff0c;从而给出更加准确的…

Ribbon负载均衡

Ribbon负载均衡 负载均衡一般分为服务器端负载均衡和客户端负载均衡 所谓服务器端负载均衡&#xff0c;比如Nginx、F5这些&#xff0c;请求到达服务器之后由这些负载均衡器根据一定的算法将请求路由到目标服务器处理 所谓客户端负载均衡&#xff0c;比如我们要说的Ribbon&#…

Spring - 更简单的存取 Bean 对象(使用注解)

目录 一、类注解是什么 二、使用类注解 存取 Bean 对象 1. 准备工作 2. 所以使用五大类注解的规则&#xff1a; 三、五大类注解之间的关系 1. 首先可以查看 类注解的源码如下图&#xff1a; 2. 为什么需要五个类注解&#xff1f; 3. 为什么使用类注解的方式不能使用原类…

使用腾讯云轻量应用服务器搭建网站教程

腾讯云轻量应用服务器怎么搭建网站&#xff1f;太简单了&#xff0c;轻量服务器选择宝塔Linux镜像&#xff0c;然后在宝塔面板上添加站点&#xff0c;以WordPress建站为例&#xff0c;腾讯云服务器网来详细说下腾讯云轻量应用服务器搭建网站全流程&#xff0c;包括轻量服务器配…

A Simple Framework for Contrastive Learning of Visual Representations(论文翻译)

A Simple Framework for Contrastive Learning of Visual Representations 摘要1介绍2 方法2.1 对比学习框架2.2 训练大批量数据2.3 评估协议 3.用于对比表示学习的数据增强3.1.数据增强操作的组合对于学习良好的表示至关重要3.2 对比学习需要更强的数据增强比有监督学习 4. 编…

基于scrcpy的Android群控项目重构,集成Appium服务执行自动化测试用例

系列文章目录 基于scrcpy的Android群控项目重构 基于scrcpy的Android群控项目重构 进阶版 基于scrcpy的Android群控项目重构&#xff0c;获取Android屏幕元素信息并编写自动化事件&#xff08;视频&#xff09; 基于scrcpy的Android群控项目重构&#xff0c;获取Android屏幕…

虚拟机中安装RabbitMQ及使用(超详细)

目录 1. 安装Socat 2. 安装Erlang 3. 安装RabbitMQ 4. 开启管理界面及配置 5. 启动 6. 配置虚拟主机及用户 6.1. 用户角色 6.2. Virtual Hosts配置 6.2.1. 创建Virtual Hosts 6.2.2. 设置Virtual Hosts权限 1. 安装Socat 在线安装依赖环境&#xff1a; yum install g…

VBA代码如何切换word和excel(3)

【分享成果&#xff0c;随喜正能量】人不能因为一件好事&#xff0c;高兴一整年&#xff0c;却能因为一个创伤&#xff0c;郁郁终生。痛苦给人的刺激&#xff0c;总是远远大于快乐。成年人的烦恼&#xff0c;和谁说都不合适&#xff0c;悲喜自渡&#xff0c;他人难悟。人最强大…

深度图像Range Image

从点云创建深度图并显示 函数原型 RangeImage::createFromPointCloud (const PointCloudType& point_cloud, float angular_resolution, float max_angle_width, float max_angle_height, …

JVM 调优测试Jmeter 压测

Jmeter 内存不足了&#xff0c;修个5个线程吧 测试结果&#xff1a; Jmeter配置参数 5个线程&#xff0c;每个线程1秒跑1000次 测试串行吞吐量 -XX:PrintGCDetails -Xmx128M -Xms128M -XX:HeapDumpOnOutOfMemoryError -XX:UseSerialGC -XX:PermSize32M GC回收4次 吞吐量138…

菜鸡shader:L10 帧序列动画和极坐标的使用

文章目录 帧序列动画代码最后效果 极坐标代码最后效果 顶点色 这次笔记就直接放最后的效果了&#xff0c;因为课程上老师也没有给代码图片或是什么技巧说明。 下图左边是帧序列动画(鬼火)&#xff0c;右边是极坐标。 帧序列动画 帧序列的原理是对一张有规律行列排序的序列帧…