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 ...
随机推荐
- [Linux] 003 分区
1. 磁盘分区 使用分区编辑器再磁盘上划分几个逻辑部分 不用类的目录与文件可以存储进不同的分区 2. 分区类型 主分区 最多只能有 4 个 扩展分区 最多只能有 1 个 主分区加扩展分区最多为 4 个 ...
- Codeforces 1110E (差分)
题面 传送门 分析 一开始考虑贪心和DP,发现不行 考虑差分: 设d[i]=c[i+1]-c[i] (i<n) 那么一次操作会如何影响差分数组呢? \(c[i]'=c[i+1]+c[i-1]-c ...
- HTTP中ip地址伪造的问题以及解决办法
在真实环境下,php获取客户端ip地址的方法通常有以下几种: (1):通过$_SERVER[ "HTTP_CLIENT_IP" ] (2):通过$_SERVER[ "HT ...
- 8、numpy——数组的迭代
1.单数组的迭代 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 1.1 默认迭代顺序 import ...
- A Bug’s Life POJ - 2492(种类并查集)
题目链接 每次给出两个昆虫的关系(异性关系),然后发现这些条件中是否有悖论 就比如说第一组数据 1 2 2 3 1 3 1和2是异性,2和3是异性,然后说1和3是异性就显然不对了. 我们同样可以思考一 ...
- UVALive 6270 Edge Case(找规律,大数相加)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/36905379 转载请注明出 ...
- 重命名sql数据库
use master select spid from master.dbo.sysprocesses where dbid=db_id('TW') 查看连接,杀死线程 use master kill ...
- C#设计模式:桥接模式(Bridge Pattern)
一,桥接模式,直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- JSON:结构化数据格式
JSON是javascript的子类,也是作为更好的互联网传输结构化数据格式逐渐取代XML,因此要理解JSON,重要的是理解它是一种数据格式,不是一种编程语言. 语法 //javascript var ...
- jar 启动脚本
前段时间用springboot做项目后,每次重新发布都好麻烦, 所以写了个脚本来配合jenkins 发布: #!/bin/bash APP_NAME=application.jar function ...