java基于包结构的请求路由实现实例分享
发布时间:2021-10-23 13:10:18
WebFilter.java
package com.hongyuan.route;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class WebFilter implements Filter {
public static final String BASE_PACKAGE="com.hongyuan";
public static final String CLASS_FLAG="Action";
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
if(!hasResouce(request)){
String requestPath=((HttpServletRequest)request).getServletPath();
if(requestPath.indexOf(".")>=0){
requestPath=requestPath.substring(0, requestPath.indexOf("."));
}
if(requestPath.endsWith("/")){
requestPath=requestPath.substring(0, requestPath.length()-1);
}
//获取请求的类全限定名
String className=BASE_PACKAGE+requestPath.replaceAll("/", ".")+CLASS_FLAG;
//获取请求方法名称
String methodName=request.getParameter("method");
if(methodName==null||"".equals(methodName.trim())){
methodName="index";
}
try {
//获取处理类并响应请求
Class clazz=Class.forName(className);
Object instance=this.initContext(clazz,request,response);
Method method=clazz.getMethod(methodName, new Class[]{});
Object result=method.invoke(instance, new Object[]{});
response.getWriter().print(result);
} catch (Exception e) {
e.printStackTrace(response.getWriter());
}
}else{
chain.doFilter(request, response);
}
}
//判断是否存在请求的资源
private boolean hasResouce(ServletRequest request) {
String realPath=request.getServletContext().getRealPath(((HttpServletRequest)request).getServletPath());
File resouce=new File(realPath);
if(resouce.exists()){
return true;
}else{
return false;
}
}
//初始化上下文
private Object initContext(Class clazz, ServletRequest request,
ServletResponse response) throws Exception{
Object instance=clazz.newInstance();
clazz.getMethod("setRequest",new Class[]{ServletRequest.class}).invoke(instance, new Object[]{request});
clazz.getMethod("setResponse", new Class[]{ServletResponse.class}).invoke(instance, new Object[]{response});
return instance;
}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
BaseAction.java
package com.hongyuan.route;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public abstract class BaseAction {
protected ServletRequest request=null;
protected ServletResponse response=null;
public ServletRequest getRequest() {
return request;
}
public void setRequest(ServletRequest request) {
this.request = request;
}
public ServletResponse getResponse() {
return response;
}
public void setResponse(ServletResponse response) {
this.response = response;
}
}


猜你喜欢
- 对于一个简单的tcp通讯这里我就不再讲述了,今天主要为大家讲解下,如何从::recv中筛选出一个完整包逻辑。就简单的以客户端为例(服务器接收
- 一、编码规则Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组
- 不可变对象不可变(immutable): 即对象一旦被创建初始化后,它们的值就不能被改变,之后的每次改变都会产生一个新对象。var str=
- 本文实例为大家分享了Android实现跟随手指画圆的具体代码,供大家参考,具体内容如下首先自己定义一个View子类:package com.
- 本文实例讲述了C++判断一个链表是否为回文结构的方法。分享给大家供大家参考,具体如下:题目:给定一个链表头节点head,请判断是否为回文结构
- 做侧滑删除网上有很多方案,比如重写Listview实现滑动的监听,今天说下一个SwipeListView,这个是之前一个朋友在网上开源的一个
- 本文实例讲述了C#实现闪动托盘图标效果的方法。分享给大家供大家参考,具体如下:在用户正在登录QQ或者使用Firemail邮件系统自动收取邮件
- 一、导航栏UINavigationBar1、导航栏的使用在iOS开发中,我们通常会使用导航控制器,导航控制器中封装了一个UINavigati
- 引言你在服务端的安全管理使用了 Spring Security,用户登录成功之后,Spring Security 帮你把用户信息保存在 Se
- 如果有人对程序的崩溃原因做下统计的话,那么由于对象为空,但是又访问了对象的某个属性而导致的崩溃,也许会是程序崩溃的第一大原因了。比如我们在使
- 参考文献:https://www.jb51.net/article/232858.htm使用springboot 2 构建项目,调试代码的时
- 缘起标准的RABC, 权限需要支持动态配置,spring security默认是在代码里约定好权限,真实的业务场景通常需要可以支持动态配置角
- 场景:假设每次我们去超市购物,我们都会推一个购物车,有水果、蔬菜、肉类三种商品,提供给我们选择,那么这时候,如果使用装饰器模式,应该如何实现
- Java连接SQLServer 2008数据库的步骤:1.到微软官方下载jdbc 并解压,得到sqljdbc.jar和sqljdbc4.ja
- 开始接触分布式概念,学习之前要准备搭建Dubbo和Zookeeper环境的简单搭建。Window下安装Zookeeper和Dubbo-adm
- 如何解决yml没有spring小叶子标志我的idea springboot项目中有两个.yml文件,一个application.yml,一个
- 新建项目IDEA上方工具栏点击:文件->新建->模块此时的目录结构:需要在main文件夹下补全两个文件夹,点击main,右键-&
- spring的事务控制本质上是通过aop实现的。在springboot中使用时,可以通过注解@Transactional进行类或者方法级别的
- 内存泄露内存泄漏就是在当前应用周期内不再使用的对象被GC Roots引用,导致不能回收,使实际可使用内存变小,通俗点讲,就是无法回收无用对象
- 什么是 terms set 查询?Terms set 查询根据匹配给定字段的精确术语的最少数量返回文档。terms set 查询与 term