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. LeetCode #657. Robot Return to Origin 机器人能否返回原点

    https://leetcode-cn.com/problems/robot-return-to-origin/ 设置 flagUD 记录机器人相对于原点在纵向上的最终位置 flagRL 记录机器人相 ...

  2. P2747 [USACO5.4]周游加拿大Canada Tour

    题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边的城市,再由东向西返回,直到你回到开始的城市.除了旅 ...

  3. 道路模型--linear-parabolic model

    读过很多道路追踪的论文,经常都需要道路模型的建模.我不知道是不是因为自己太笨还是怎样,好多人建的模型我实在无法理解他的用意何在,而且我真的深刻怀疑他们那些模型的参数是不是真的可以求出来.就比如这篇文章 ...

  4. windows切换窗口和网页快捷键

    alt+tab 切换窗口win+D 显示桌面,再按一下返回运来的网页win+M 所有程序最小化 网页之间切换(我用的是360) ctrl + tab 往回切 ctrl + shift +tab

  5. ELKStack之操作深入(中)

    ELKStack之操作深入(中) 链接:https://pan.baidu.com/s/1V2aYpB86ZzxL21Hf-AF1rA 提取码:7izv 复制这段内容后打开百度网盘手机App,操作更方 ...

  6. Es学习第八课, Filter、bool和范围查询

    Filter过滤查询 filter是不计算相关性的,同时可以缓存.因此filter速度快于query. 我们先在kibana上先添加数据来做准备 POST /lib4/items/_bulk { &q ...

  7. Maven项目的pom.xml配置文件格式初识

    Maven项目 有pom.xml文件的项目就已经是一个maven项目了,但是还没有被maven托管,我们需要将该项目添加为maven项目 <project xmlns="http:// ...

  8. 指针使用const修饰总结

    1 double rates[5] = {1, 2, 3, 4, 5}; const double * pd = rates; 被pd指向的值不可改变,比如,不允许*pd = 20 但是pd的指向改变 ...

  9. ASIO

    { 编译ASIO库时,出现编译警告, "Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. For example:\n& ...

  10. 英语单词Repository

    Repository 来源——查看仓库的名称内容 [root@centos7 ~]# yum repolist Loaded plugins: fastestmirror Repository bas ...