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.lang.reflect.Method; @WebServlet(name = "BasicServlet")
public abstract class BasicServlet extends HttpServlet {
public void fun(HttpServletRequest request,HttpServletResponse response){
System.out.println("fun");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//这种反射,自定义方法必须是public 的,不然反射不到。想反射protected、private方法
还需要其他操作。
自定义方法和doGet、doPost等方法不同时执行,去掉ifelse则可同时执行
//查询是否调用自定义方法,method为参数,值为方法名
String methodName = request.getParameter("method");
//methodName为null则没有调用自定义方法,去除空格为空即调用的自定义方法为空
//说明没有调用自定义方法,则去试图调用doGet,doPost,等等do方法。
if (methodName == null || methodName.trim().isEmpty()) {
System.out.println("Basicserver");
super.service(request, response);
} else {
//当确实调用自定义方法,则利用反射来调用方法,
//先得到方法名。在得到Method类对象。因此需要得到Class,在调用他的方法查询得到Method
//我们要查询当前类的方法,所有需要当前类的Class
Class classname = this.getClass();
Method method = null;
try {
method = classname.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
} catch (Exception e) {
throw new RuntimeException("调用的方法:" + methodName + "不存在");
} //!!!!!!!!!!!!!!调用method表示的方法
try {
//正常调用:this.add(request,repsponse),
// 反射调用method(this,request,response): 方法(对象,参数)
//this调用method表示的方法,参数为request,response
String result = (String) method.invoke(this, request, response);
//获取请求处理方法,执行后返回的字符串,表示转发或重定向,帮他完成
//若result是null,或""则不处理
//查看返回的字符串是否有冒号,没有则不处理
if (result == null || result.trim().isEmpty())
return;
else if (result.contains(":")) {
//使用冒号分割字符串,得到前缀和后缀
int index = result.indexOf(":");//获取冒号位置
String before = result.substring(0, index);
String path = result.substring(index + 1);
if (before.equalsIgnoreCase("r")) {//前缀为r则是重定向
response.sendRedirect(request.getContextPath() + path);
} else if (before.equalsIgnoreCase("f")) {//前缀为f为转发
request.getRequestDispatcher(path).forward(request, response);
} else {
throw new RuntimeException("操作无法完成!");
} } else {
//返回的字符串没有冒号,则不执行操作
return;
}
} catch (Exception e) {
System.out.println(methodName + " 方法调用异常!");
throw new RuntimeException("调用的方法:" + methodName + "内部抛出异常!"); } } }}

  

Java反射实现Servlet处理多个请求--server分发的更多相关文章

  1. java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)

    第一步: 1.为项目配置 Tomcat 为 server: 2.导入 mysql的jar包 到项目目录中: 第二步:编码 1.数据库连接类ConnectMysql.java代码: package co ...

  2. 一个servlet处理多个请求(使用Method的反射机制)

    方法一 可以通过在请求的时候加上参数,然后在servlet中获取请求的参数,再去调用对应的方法.达到一个servlet处理多个请求的目的 test.jsp: <%@ page language= ...

  3. Java Servlet (1) —— Filter过滤请求与响应

    Java Servlet (1) -- Filter过滤请求与响应 版本: Java EE 6 参考来源: Oracle:The Java EE 6 Tutorial: Filtering Reque ...

  4. java web Servlet学习笔记-2 请求重定向和请求转发的区别

    请求转发与请求重定向的区别 请求重定向和转发 1.请求重定向:浏览器的行为(通过响应对象HttpServletResponse来执行) 特点:可以重新定向访问其他Web应用下的资源 浏览器发出了2次请 ...

  5. Java 反射在实际开发中的应用

    运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...

  6. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

  7. Java反射机制小结和实际操作

    一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...

  8. Servlet(五):一个Servlet处理多个请求

    一.为什么要使用一个Servlet来处理多个请求? 当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet ...

  9. [转]Java 反射在实际开发中的应用

    一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2  :RTT ...

随机推荐

  1. Linux系统配置Java开发基本环境

    jdk安装一.用yum安装jdk1.查看yum库都有哪些jdk版本yum search java|grep jdk2.选择版本安装yum install java-1.8.0-openjdk(/usr ...

  2. 报错: no such table:django_session解决方式

    如果出现这个错误 “no such table:django_session” 这个错误跟Session的机制有关, 既然要从Web服务器端来记录用户信息, 那么一定要有存放用户session id对 ...

  3. 使用网易云web 版外部链接

    右击打开控制台,找到音乐列表 ——> 点开详情 -------> 生成外部链接器 ,如: outchain/0/3073492173    ,这是每一个音乐的编号. 然后拼接上它的官网域名 ...

  4. Panabit的各种配置文件

    Panabit的各种配置文件 1.启动配置文件路径:/etc/rc.local作用:这个文件里的内容是BSD启动后会自动执行的命令默认配置如下:fsck -y -t ufs /dev/ad0s2a & ...

  5. tensorflow实现一个神经网络简单CNN网络

    本例子用到了minst数据库,通过训练CNN网络,实现手写数字的预测. 首先先把数据集读取到程序中(MNIST数据集大约12MB,如果没在文件夹中找到就会自动下载): mnist = input_da ...

  6. jquery+html实现前端的上传图片预览

        就是这样的一个功能,点击加号,出现图片选择,然后选择好以后生成预览. input那么丑,UI看不惯,一定要改成加号 我就用了fa的图标,外部套一个bootstrap4中的class:borde ...

  7. Springmvc上传过程中遇到的错误

    问题1: org.springframework.web.util.NestedServletException: Handler processing failed; nested exceptio ...

  8. CodeForces - 343D 树链剖分

    题目链接:http://codeforces.com/problemset/problem/343/D 题意:给定一棵n个n-1条边的树,起初所有节点权值为0,然后m个操作. 1 x:把x为根的子树的 ...

  9. 8VC Venture Cup 2017 - Elimination Round - A

    题目链接:http://codeforces.com/contest/755/problem/A 题意:给定一个正整数N,问你是否存在一个数M使得N*M+1不是素数(M的范围在[1,1000]). 思 ...

  10. pwn的一些技巧与总结

    原文地址:https://github.com/Naetw/CTF-pwn-tips 目录 溢出 在gdb中寻找字符串 二进制服务 找到libc中特定函数的偏移地址 Find '/bin/sh' or ...