利用反射机制,多个请求对应一个Servlet!附源代码
javaweb多个请求对应一个Servlet
采取的策略(一)
代码的书写
简单的测试
首先我们在JSP中写上三个连接,接着在一个Servlet中响应它。响应到了打印出字符串就可以了。
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><a href="customerServlet?method=add">Add</a><br><br><a href="customerServlet?method=query">Query</a><br><br><a href="customerServlet?method=delete">Delete</a><br><br>
</body>
</html>
CustomerServlet.java的代码
package 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("/customerServlet")
public class CustomerServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String method=request.getParameter("method");switch(method) {case "add":add(request,response);break;case "query":query(request,response);break;case "delete":delete(request,response);break;}}private void delete(HttpServletRequest request, HttpServletResponse response) {// TODO Auto-generated method stubSystem.out.println("delete");}private void query(HttpServletRequest request, HttpServletResponse response) {// TODO Auto-generated method stubSystem.out.println("query");}private void add(HttpServletRequest request, HttpServletResponse response) {// TODO Auto-generated method stubSystem.out.println("add");}}
运行结果
至此,简单的连接我们已经建立起来。
方法的改进
- 方法略显麻烦
- 当添加一个请求时,需要在Servlet中修改两处代码:switch,添加方法
- url中使用method暴露了要调用的方法,不私密,有安全隐患
采用下面的方法
- 解决方法
1.获取ServletPath:addCustomer.do或者 query.do等
2.去除/和.do得到要调用的方法
3.利用反射调用servletPath对应的方法
4.创建对应的方法 - 具体的代码
处理字符串的代码
String servletPath =request.getServletPath();String methodName=servletPath.substring(1);methodName=methodName.substring(0,methodName.length()-3);
反射的代码
String servletPath =request.getServletPath();String methodName=servletPath.substring(1);methodName=methodName.substring(0,methodName.length()-3);System.out.println(methodName);try {Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);method.invoke(this,request,response);} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) {e1.printStackTrace();response.sendRedirect("error.jsp");}
tips我们在反射的代码中加入了错误处理的代码
catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) {e1.printStackTrace();response.sendRedirect("error.jsp");}
源代码
链接:https://pan.baidu.com/s/15Tr6Qvp6tjz2n4CPrDRIyg
提取码:7yet
遇到的问题
- 如何判断什么时候用doGet,什么时候用doPost??
直接通过URL方式发送请求,用doget()方法。
表单提交的方式发送请求,方式为“get”就用doget(),“post”就用dopost(),表单默认提交方式是get
Ajax发送请求的时候同样会指定用什么方式。
总之用get发送调doget(),用post发送调dopost() - ServletPath方法的属性
https://blog.csdn.net/qq_27770257/article/details/79438987
参考这篇文章,getServletPath():获取能够与“url-pattern”中匹配的路径,注意是完全匹配的部分,*的部分不包括。 - 反射的原理
https://blog.csdn.net/xiaoqiu_cr/article/details/77199355
这篇博客写的很好。
这谁顶得住呀!–林允儿
利用反射机制,多个请求对应一个Servlet!附源代码相关推荐
- android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...
想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...
- 利用反射机制获取未知类型的枚举的信息
原文:利用反射机制获取未知类型的枚举的信息 开发游戏设置选项遇到一个问题,我有两个枚举,一个是屏幕分辨率,一个是语言 我需要在不知道一个枚举到底是哪一个枚举类型的情况下,获取这个枚举的值以及这个枚举类 ...
- java 反射 单例类_利用反射机制破坏单例模式
简介 利用反射机制破坏了单例模式,这里以懒汉单例模式为例子进行操作. 之前利用反射也是改变了类中的private变量. 类中的private变量真的private么? 正常的单例模式的实现 这里采用了 ...
- android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解
android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解 一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的 ...
- java 反射修改final变量_Java中final的属性值怎么利用反射机制进行修改
Java中final的属性值怎么利用反射机制进行修改 发布时间:2020-12-02 17:31:07 来源:亿速云 阅读:96 作者:Leah 今天就跟大家聊聊有关Java中final的属性值怎么利 ...
- java判断对象无数据_java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值...
1.java利用反射机制判断对象的属性是否为空: Map validateMap = new LinkedHashMap(); validateMap.put("serial", ...
- 利用反射机制创建新类的两种方式及比较
[0]README 0.1) 本文描述+源代码均 转自 http://blog.csdn.net/fenglibing/article/details/4531033 , 旨在深入理解 如何利用反射机 ...
- C#利用反射机制,获取实例的属性和属性值
C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();// ...
- 利用反射和xml配置文件手写一个小型的框架
通用的增删改查 1. 利用xml配置实体类和数据库表名的映射关系 2. 根据xml设计,用正确的数据结构映射类封装好xml信息 3. 得到数据库连接前,读取xml信息,用map封装成映射数据 4. 写 ...
- php反射机制与依赖注入,利用反射机制实现基本的依赖注入
ReflectionClass实现了 Reflector 接口,使得我们可以使用该类查看另一个类的相关信息.所谓的反射,大概的意思就是将一个类的相关信息给反射 (映射.反映) 出来,转载. 无依赖的情 ...
最新文章
- CR--同事分享学习
- BCH未来发展的支柱是什么
- 深度学习已成强弩之末?Bengio等大牛NeurlPS2019上支招
- mysql数据库物理备份_MySQL数据库之xtrabackup物理备份(一)
- apache beam_Apache Beam ML模型部署
- linux 脚本 写更新,用Shell写的游戏客户端更新脚本
- php把buffer转化为图片_信息流广告 | 信息流广告怎么做?如何提高转化?
- 机器学习笔记(六) ---- 支持向量机(SVM)
- LeetCode113. 路径总和||
- 刷屏!马化腾:腾讯只是一家普通公司,随时可以被替换
- VMware 怎么解决VMware“该虚拟机似乎正在使用中”问题
- mysql教程datetime_Mysql中的Datetime与Timestamp不同之处
- unity3d 官方demo入门概念
- VMware安装Android虚拟机
- Linux DRM(一)Display Server
- Vanishing gradient and activiation funcation(ReLU、Maxout)
- 疫情期间对通证经济的一些思考
- 云计算技术 实验三 安装Hadoop系统并熟悉hadoop命令
- 【Web技术】1114- 一文彻底读懂ESLint
- 大地电磁二维正演程序--详细介绍
热门文章
- 分享我的第一次Selenium自动化测试框架开发过程
- 国都企信通短信平台发送手机短信的python脚本一例
- 经典排序之 归并排序
- VMware View 5.0 策略列表
- ARM汇编程序设计之--数据搬移
- Myeclipse10如何进行代码提示和自动补全
- Java写入磁盘阵列_什么是RAID?RAID有什么用?RAID原理
- python 面向对象编程、别人么样用_Python 中的面向对象没有意义
- eclipse svn插件安装_eclipse 2020-03 (4.15.0) SVN 插件在线安装教程
- 名校课程、计算机相关课程等网站连接