Java基础入门day54

day54

servlet升级03

特点

当前设计又有一个问题,我们目前可以做到一个实体类用一个servlet,比如Student类的所有crud方法都可以在StudentServlet中的service方法中进行动态处理。假如又有User类,我们就要在UserServlet中设计service方法,在该service方法中再次进行动态方法的判断处理

假如项目有几百个实体类,可能对应几百个Servlet,可能就要写几百个service方法的动态处理

通过分析,我们发现,可以将op的值特意设置为各个实体类的方 法名

使用反射动态获取每一个servlet,通过发射得到每一个servlet后,动态获取op的值,再来动态觉得调用各个op值所对应的方法

反射

“照妖镜”,一个类中有四个访问级别的成员,private只有自己能访问,default自己和通过的类可以访问,protected是自己,同包类和非同包子类可以访问,public是当前项目所有类都可以访问

反射可以在类的外部拿到任何访问修饰基本的数据成员

反射功能强大,但是效率低

service方法的重构

使用反射来实现service方法的简化

package com.saas.servlet;
​
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
​
public class BaseServlet extends HttpServlet {
​@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");
​String op = req.getParameter("op");
​System.out.println(op);
​Class<? extends BaseServlet> clazz = getClass();
​try {Method method = clazz.getDeclaredMethod(op, HttpServletRequest.class, HttpServletResponse.class);
​//  设置方法可以被访问method.setAccessible(true);
​//  使用反射调用对应的方法method.invoke(this, req, resp);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}}
}

任何继承自当前BaseServlet的servlet都会执行该BaseServlet的生命周期方法service方法

在service方法中,动态获取用户传递过来的op值

而该op值一定要设置为每个servlet中的方法名

运用反射得到op对应的方法对象,每个方法的参数列表都是HttpServletRequest和HttpServletResponse

得到每一个业务方法对象后,设置方法可以在外界被访问

并调用invoke实现对于每个业务方法的调用

好处是当前项目只需要做一个op的判断,无需再在每个servlet里面有关于op判断的重复代码

package com.saas.servlet;
​
import com.saas.entity.User;
import com.saas.service.IUserService;
import com.saas.service.impl.UserServiceImpl;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
​
@WebServlet("/User")
public class UserServlet extends BaseServlet{
​private IUserService userService = new UserServiceImpl();
​public void login(HttpServletRequest req, HttpServletResponse resp){System.out.println("UserServlet login");}public void register(HttpServletRequest req, HttpServletResponse resp){System.out.println("UserServlet register");}public void logout(HttpServletRequest req, HttpServletResponse resp){System.out.println("UserServlet logout");}
​protected void saveUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet saveUser");}
​protected void updateUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet updateUser");}
​protected void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet deleteUser");}
​protected void getUserByUid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet getUserByUid");
​String suid = req.getParameter("uid");int uid = suid == null ? 0 : Integer.parseInt(suid);
​User u = userService.getUserByUid(uid);
​PrintWriter out = resp.getWriter();
​out.print("<form>");out.print("<input type='hidden' name='uid' value='" + u.getUid() + "' />");out.print("<input type='text' name='username' value='" + u.getUsername() + "' />");out.print("<input type='text' name='password' value='" + u.getPassword() + "' />");out.print("<input type='text' name='email' value='" + u.getEmail() + "' />");out.print("<input type='text' name='phone' value='" + u.getPhone() + "' />");out.print("<input type='text' name='address' value='" + u.getAddress() + "' />");out.print("<input type='submit' value='update' />");out.print("</form>");
​}
​protected void getAllUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet getAllUsers");
​List<User> users = userService.getAllUsers();
​PrintWriter out = resp.getWriter();
​out.print("<table border=1 align='center' width='80%'>");out.print("<tr>");out.print("<th>uid</th>");out.print("<th>username</th>");out.print("<th>password</th>");out.print("<th>email</th>");out.print("<th>phone</th>");out.print("<th>address</th>");out.print("<th>manage</th>");out.print("</tr>");for (User user : users) {out.print("<tr>");out.print("<td>" + user.getUid() + "</td>");out.print("<td>" + user.getUsername() + "</td>");out.print("<td>" + user.getPassword() + "</td>");out.print("<td>" + user.getEmail() + "</td>");out.print("<td>" + user.getPhone() + "</td>");out.print("<td>" + user.getAddress() + "</td>");out.print("<td><a href='User?op=getUserByUid&uid=" + user.getUid() + "'>update</a></td>");out.print("</tr>");}out.print("</table>");}
}
package com.saas.servlet;
​
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​
@WebServlet("/Student")
public class StudentServlet extends BaseServlet {
​private static final long serialVersionUID = 1L;
​public void getAllStudents(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet getAllStudents");}
​
​public void getStudentBySid(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet getStudentBySid");}
​
​public void getStudentsByPage(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet getStudentsByPage");}
​
​public void saveStudent(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet saveStudent");}
​
​public void updateStudent(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet updateStudent");}
​
​public void deleteStudent(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet deleteStudent");}
}

在UserServlet和StudentServlet中都将不会出现op的判断处理,只需要在BaseServlet中实现一次即可,代码大大简化

        

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

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

相关文章

探索文档识别技术在加强教育资源共享与合作中的潜力

在数字化浪潮不断推进的今天&#xff0c;教育资源的共享与合作已经成为提高教学质量和效率的关键因素。文档识别技术作为一项强大的工具&#xff0c;在这一过程中发挥着至关重要的作用。本文旨在探讨如何通过文档识别技术的应用&#xff0c;促进教育资源的有效共享与教师、学校…

MySQL主从复制故障:“ Slave_SQL_Running:No“ 两种解决办法

问题 今天搭建MySQL的主从复制&#xff0c;查看从机状态时show slave status\G&#xff0c;发现这个参数为NO&#xff0c;导致主从复制失败。 Slave_SQL_Running: No 后面上网查阅了一下资料&#xff0c;大概就是因为在连接支持数据库后&#xff0c;也就是这个命令后&#xff…

Adobe产品安装目录修改

进入安装包目录&#xff0c;进入到products文件夹 编辑driver.xml文件 将“InstallDir”修改为你需要安装的软件的目录&#xff0c;我这里是修改到D:\Adobe目录 <DriverInfo> <ProductInfo> xxxxxxxxxxxxxxxxx </ProductInfo> 拷贝RequestInfo这部分…

c-lodop 打印面单 内容串页

场景&#xff1a;使用c-lodop程序调取打印机连续打印多张快递单时&#xff0c;上页内容&#xff0c;打到了下一页了 问题原因&#xff1a; 由于是将所有面单内容放到了一个页面&#xff0c;c-lodop 在打印时&#xff0c;发现一页放不下&#xff0c;会自动分割成多页 页面元素…

【在Postman中,如果后端返回的是String类型的数据但不是JSON格式,报错】

在Postman中&#xff0c;如果后端返回的是String类型的数据但不是JSON格式 问题描述解决办法 postman后端返回的String数据,不是json,怎么设置结果的接收&#xff1f; 问题描述 在postman中测试接口&#xff0c;报错Error&#xff1a;Abort&#xff0c;或者显示返回数据校验失…

coveralls使用pytest进行本地测试时报错SyntaxError: invalid escape sequence \S

## 错误复现&#xff1a; git clone gitgithub.com:TheKevJames/coveralls-python.git cd coveralls-python poetry install poetry run pytest## 错误内容&#xff1a; ## 完整的打印信息 test session starts platform darwin -- Python 3.8.18, pytest-8.2.1, pluggy-1.5.…

使用 LlamaParse 进行 PDF 解析并创建知识图谱

此 Python 笔记本提供了有关利用 LlamaParse 从 PDF 文档中提取信息并随后将提取的内容存储到 Neo4j 图形数据库中的综合指南。本教程在设计时考虑到了实用性&#xff0c;适合对文档处理、信息提取和图形数据库技术感兴趣的开发人员、数据科学家和技术爱好者。 该笔记本电脑的主…

可视化大屏,不搞点3D效果,感觉有点对不起观众呢。

使用3D模型可以为可视化展现增加更多的维度和真实感&#xff0c;提供更直观、生动的视觉效果。以下是一些3D模型在可视化展现中的作用&#xff1a; 增强沉浸感&#xff1a;通过使用3D模型&#xff0c;可以让观众感受到更真实的场景和物体&#xff0c;增强他们的沉浸感。这有助…

playwright相关的文章

霍格沃兹测试开发Muller老师 - 个人中心 - 腾讯云开发者社区-腾讯云 霍格沃兹测试开发Muller老师 &#xff1a;

【数组】Leetcode 452. 用最少数量的箭引爆气球【中等】

用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…

golang问题

文章目录 Go里有哪些数据结构是并发安全的&#xff1f;int类型是并发安全的吗&#xff1f;为什么int不是并发安全的&#xff1f; Go如何实现一个单例模式&#xff1f;sync.Once是如何实现的&#xff0c;如何不使用sync.Once实现单例模式&#xff1f;Go语言里的map是并发安全的吗…

Freeswitch-Python3开发

文章目录 一、Freeswitch如何使用mod_python31.1 Freeswitch和python1.2 Freeswitch版本选择1.3 Freeswitch编译mod_python31.3.1 debian安装python31.3.2 Freeswitch编译mod_python31.3.3 加载 二、如何编写脚本2.1 函数的基本框架2.2 基本使用2.2.1 触发条件2.2.2 默认脚本位…

pycharm更改远程编辑器设置

pycharm的远程编辑器可以分为两个部分&#xff1a;SFTP服务器(用于传输文件&#xff09;和命令行&#xff08;用于控制linux&#xff09;系统。那么当创建完成后&#xff0c;如何才能更改其设置呢&#xff1f; 一、远程SFTP服务器设置 找到导航栏依次点击tools-deployment-co…

运行vue2项目基本过程

目录 步骤1 步骤2 步骤3 补充&#xff1a; 解决方法&#xff1a; node-scss安装失败解决办法 步骤1 安装npm 步骤2 切换淘宝镜像 #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com 步骤3 安装vue-cli npm install…

取消页面按钮回车事件

html页面登录按钮 <button class"btn btn-success btn-block" id"btnSubmit" data-loading"正在验证登录&#xff0c;请稍候...">登 录</button>js部分 在回车键按下时&#xff0c;阻止默认行为 $(document).keyup(function (event…

采用伪代码及C代码演示如何解决脱机最小值问题

采用伪代码及C代码演示如何解决脱机最小值问题 问题背景算法设计伪代码实现C代码实现证明数组正确性使用不相交集合数据结构最坏情况运行时间的紧确界 问题背景 脱机最小值问题涉及到一个动态集合 &#xff08; T &#xff09; &#xff08;T&#xff09; &#xff08;T&…

并网逆变器学习笔记9---VSG控制

参考文献&#xff1a;《新型电力系统主动构网机理与技术路径》 “构网技术一般包含下垂控制&#xff0c;功率同步控制&#xff0c;虚拟同步机控制&#xff0c;直接功率控制&#xff0c;虚拟振荡器控制 等。其中&#xff0c;虚拟同步机技术&#xff0c;即 VSG&#xff0c;因其物…

蓝牙(2):BR/EDR的连接过程;查询(发现)=》寻呼(连接)=》安全建立=》认证=》pair成功;类比WiFi连接过程。

4.2.1 BR/EDR 流程&#xff1a; 查询&#xff08;发现&#xff09;》寻呼&#xff08;连接&#xff09;》安全建立》认证》pair成功 4.2.1.1 查询&#xff08;发现&#xff09;流程Inquiry (discovering) 类比WiFi的probe request/response 蓝牙设备使用查询流程来发现附近的…

Github 2024-05-24 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10Java设计模式:提高开发效率的正规化实践 创建周期:3572 天开发语言:Java协议类型:OtherStar数量:86766 个Fork数量:25959 次关…

探数API统计分享-1949年-2021年中国历年夏粮产量统计报告

​​​​​​​​中国历年夏粮产量​&#xff0c;为1949年到2021年我国每年的夏粮产量数据。2021年&#xff0c;我国夏粮产量为14596万吨&#xff0c;比上年增长2.2%。 数据统计单位为&#xff1a;万吨 。 我国夏粮产量有多少&#xff1f; 2021年&#xff0c;我国夏粮产量为1…