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!附源代码相关推荐

  1. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

  2. 利用反射机制获取未知类型的枚举的信息

    原文:利用反射机制获取未知类型的枚举的信息 开发游戏设置选项遇到一个问题,我有两个枚举,一个是屏幕分辨率,一个是语言 我需要在不知道一个枚举到底是哪一个枚举类型的情况下,获取这个枚举的值以及这个枚举类 ...

  3. java 反射 单例类_利用反射机制破坏单例模式

    简介 利用反射机制破坏了单例模式,这里以懒汉单例模式为例子进行操作. 之前利用反射也是改变了类中的private变量. 类中的private变量真的private么? 正常的单例模式的实现 这里采用了 ...

  4. android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解

    android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解 一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的 ...

  5. java 反射修改final变量_Java中final的属性值怎么利用反射机制进行修改

    Java中final的属性值怎么利用反射机制进行修改 发布时间:2020-12-02 17:31:07 来源:亿速云 阅读:96 作者:Leah 今天就跟大家聊聊有关Java中final的属性值怎么利 ...

  6. java判断对象无数据_java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值...

    1.java利用反射机制判断对象的属性是否为空: Map validateMap = new LinkedHashMap(); validateMap.put("serial", ...

  7. 利用反射机制创建新类的两种方式及比较

    [0]README 0.1) 本文描述+源代码均 转自 http://blog.csdn.net/fenglibing/article/details/4531033 , 旨在深入理解 如何利用反射机 ...

  8. C#利用反射机制,获取实例的属性和属性值

    C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();// ...

  9. 利用反射和xml配置文件手写一个小型的框架

    通用的增删改查 1. 利用xml配置实体类和数据库表名的映射关系 2. 根据xml设计,用正确的数据结构映射类封装好xml信息 3. 得到数据库连接前,读取xml信息,用map封装成映射数据 4. 写 ...

  10. php反射机制与依赖注入,利用反射机制实现基本的依赖注入

    ReflectionClass实现了 Reflector 接口,使得我们可以使用该类查看另一个类的相关信息.所谓的反射,大概的意思就是将一个类的相关信息给反射 (映射.反映) 出来,转载. 无依赖的情 ...

最新文章

  1. CR--同事分享学习
  2. BCH未来发展的支柱是什么
  3. 深度学习已成强弩之末?Bengio等大牛NeurlPS2019上支招
  4. mysql数据库物理备份_MySQL数据库之xtrabackup物理备份(一)
  5. apache beam_Apache Beam ML模型部署
  6. linux 脚本 写更新,用Shell写的游戏客户端更新脚本
  7. php把buffer转化为图片_信息流广告 | 信息流广告怎么做?如何提高转化?
  8. 机器学习笔记(六) ---- 支持向量机(SVM)
  9. LeetCode113. 路径总和||
  10. 刷屏!马化腾:腾讯只是一家普通公司,随时可以被替换
  11. VMware 怎么解决VMware“该虚拟机似乎正在使用中”问题
  12. mysql教程datetime_Mysql中的Datetime与Timestamp不同之处
  13. unity3d 官方demo入门概念
  14. VMware安装Android虚拟机
  15. Linux DRM(一)Display Server
  16. Vanishing gradient and activiation funcation(ReLU、Maxout)
  17. 疫情期间对通证经济的一些思考
  18. 云计算技术 实验三 安装Hadoop系统并熟悉hadoop命令
  19. 【Web技术】1114- 一文彻底读懂ESLint
  20. 大地电磁二维正演程序--详细介绍

热门文章

  1. 分享我的第一次Selenium自动化测试框架开发过程
  2. 国都企信通短信平台发送手机短信的python脚本一例
  3. 经典排序之 归并排序
  4. VMware View 5.0 策略列表
  5. ARM汇编程序设计之--数据搬移
  6. Myeclipse10如何进行代码提示和自动补全
  7. Java写入磁盘阵列_什么是RAID?RAID有什么用?RAID原理
  8. python 面向对象编程、别人么样用_Python 中的面向对象没有意义
  9. eclipse svn插件安装_eclipse 2020-03 (4.15.0) SVN 插件在线安装教程
  10. 名校课程、计算机相关课程等网站连接