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;
 }

}

标签:请求路由
0
投稿

猜你喜欢

  • Java 编程中十个处理异常的建议

    2022-10-27 11:34:41
  • Maven添加Tomcat插件实现热部署代码实例

    2021-12-09 02:03:49
  • Spring 实现excel及pdf导出表格示例

    2023-12-21 04:17:32
  • IDEA中已配置阿里镜像但maven无法下载jar包的问题及解决方法

    2021-11-09 11:06:53
  • android中Bitmap用法(显示,保存,缩放,旋转)实例分析

    2022-07-03 14:18:41
  • C# 获取文件夹里所有文件名的详细代码

    2023-01-07 02:05:20
  • Spring之@Aspect中通知的5种方式详解

    2021-12-12 20:28:02
  • Android Studio kotlin生成编辑类注释代码

    2023-06-16 12:03:20
  • 如何解决springmvc文件下载,内容损坏的问题

    2023-10-11 07:12:10
  • C#支付宝扫码支付代码完整版

    2021-07-19 18:48:08
  • 你都理解创建线程池的参数吗?

    2022-06-10 06:36:05
  • Java8使用stream实现list中对象属性的合并(去重并求和)

    2023-06-23 13:44:40
  • 深入解析java中的静态代理与动态代理

    2023-08-23 13:10:56
  • Android类加载流程分析

    2023-05-30 11:13:44
  • C#中重载与重写区别分析

    2023-11-01 17:43:05
  • Spring如何在一个事务中开启另一个事务

    2021-08-30 17:29:15
  • Android实现的数字格式化用法示例

    2023-09-30 09:03:28
  • Android进阶从字节码插桩技术了解美团热修复实例详解

    2022-05-27 18:06:07
  • SpringBoot 如何从容器中获取对象

    2023-12-06 08:20:40
  • Java jar打包工具使用方法步骤解析

    2023-07-01 12:26:47
  • asp之家 软件编程 m.aspxhome.com