Java反射实现Servlet处理多个请求--server分发
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分发的更多相关文章
- java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)
第一步: 1.为项目配置 Tomcat 为 server: 2.导入 mysql的jar包 到项目目录中: 第二步:编码 1.数据库连接类ConnectMysql.java代码: package co ...
- 一个servlet处理多个请求(使用Method的反射机制)
方法一 可以通过在请求的时候加上参数,然后在servlet中获取请求的参数,再去调用对应的方法.达到一个servlet处理多个请求的目的 test.jsp: <%@ page language= ...
- Java Servlet (1) —— Filter过滤请求与响应
Java Servlet (1) -- Filter过滤请求与响应 版本: Java EE 6 参考来源: Oracle:The Java EE 6 Tutorial: Filtering Reque ...
- java web Servlet学习笔记-2 请求重定向和请求转发的区别
请求转发与请求重定向的区别 请求重定向和转发 1.请求重定向:浏览器的行为(通过响应对象HttpServletResponse来执行) 特点:可以重新定向访问其他Web应用下的资源 浏览器发出了2次请 ...
- Java 反射在实际开发中的应用
运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...
- 初学Java Web(4)——Servlet学习总结
经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...
- Java反射机制小结和实际操作
一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...
- Servlet(五):一个Servlet处理多个请求
一.为什么要使用一个Servlet来处理多个请求? 当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet ...
- [转]Java 反射在实际开发中的应用
一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2 :RTT ...
随机推荐
- JavaWeb学习——session总结
一.session简介 sesion也就是会话,Session对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整 ...
- 2019牛客暑期多校训练营(第一场) - E - ABBA - 贪心 - dp - 组合
https://ac.nowcoder.com/acm/contest/881/E 从dp的角度来看是比较正常的.无后效性来源于前面只要的合法的方案分配,那么对后面造成的影响就只有A,B的数目. 从贪 ...
- 72.Minimum Window Substring(最小子串窗口)
Level: Hard 题目描述: Given a string S and a string T, find the minimum window in S which will contain ...
- gulp run 报错 gulp[3192]: src\node_contextify.cc:628: Assertion `args[1]->IsString()' failed.
由于把node升级到了10以上的版本 执行gulp rjs打包文件报错,错误如下: gulp[3192]: src\node_contextify.cc:628: Assertion `args[1] ...
- tornado ioloop current和instance的一些区别
import tornado.ioloop # 此时_current没有instance print dir(tornado.ioloop.IOLoop._current) # 通过instance ...
- js事件循环了解一下
https://segmentfault.com/a/1190000019900532
- 负载均衡算法WeightedRoundRobin(加权轮询)简介及算法实现
Nginx的负载均衡默认算法是加权轮询算法,本文简单介绍算法的逻辑,并给出算法的Java实现版本. 本文参考了Nginx的负载均衡 - 加权轮询 (Weighted Round Robin). ...
- 自定义的最简单的可回调的线程任务CallbackableFeatureTask(模仿google的ListenableFutureTask)
1.使该Task继承Callable,Runable import java.util.concurrent.Callable; import java.util.function.Consumer; ...
- 2018-2-13-C#-搜索算法
title author date CreateTime categories C# 搜索算法 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 +0 ...
- 快速的统计千万级别uv
菜菜,咱们网站现在有多少PV和UV了? Y总,咱们没有统计pv和uv的系统,预估大约有一千万uv吧 写一个统计uv和pv的系统吧 网上有现成的,直接接入一个不行吗? 别人的不太放心,毕竟自己写的,自己 ...