web路由的java简单实现思路

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: web路由的java简单实现思路

1.web路径分析



https://juejin.cn/pins/recommended
协议://地址/端口/路由地址
                我们只关注这里就可以了
前面的容器处理了
复制代码


2.路由思路



2.1定义注解
2.2系统初始化的时候扫描注解,解解析路由缓存起来
2.3接收请求的时候由自定义过滤器进行拦截
2.4解析请求的路径,并匹配缓存的路由,处理业务
2.5注意对于业务处理的action进行单例实例化
2.6目前这里这里处理方法还只是servlet的request,response只是个例子了解下流程
复制代码


3.基本实现



3.1注解简单的定义


@Retention(RetentionPolicy.RUNTIME)
public @interface PathAnnotation {
    String path();//这里是路径
    String type();//这里是类型
}
复制代码


3.2扫描注解,缓存路径


这里就是遍历读取class文件,找到注解为PathAnnotation的类
解析路径然后缓存起来
//路由对应的实体类
public class Route {
  /** 路径*/
  private String path;
  /** 执行方法*/
  private String method;
  /** 方法类型*/
  private String type;
  /** action控制类*/
  private Object action;
 } 
 /**
 * 扫描的class类,解析路径缓存起来routeList
 * @param path
 * @return
 * @throws IllegalAccessException
 * @throws InstantiationException
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public void addAllRoutes(Set<Class> actionClass) throws InstantiationException, IllegalAccessException {
if (null != actionClass) {
 for (Class cls : actionClass) {
  PathAnnotation pa = (PathAnnotation) cls.getAnnotation(PathAnnotation.class);
  String routPath = "";
  if (null != pa) {
   routPath = pa.path();
  }
  Method[] methods = cls.getMethods();
  for (Method m : methods) {
   pa = m.getAnnotation(PathAnnotation.class);
   if (null == pa) {
      continue;
  }
  routPath += "/" + pa.path();
  Route rt = new Route(routPath, m.getName(), pa.type(), BeanUtil.getBeanUtil().getObj(cls));
        logger.info("加载路由:" + rt.toString());
        routeList.add(rt);
      }
    }
   }
}
复制代码


3.3路径匹配


/**
 * 这里是个匹配的路径内容
 * 这里的匹配路径所有的都根据/来的
 * @param rs
 * @param path
 * @return
 */
public static  Route findRoute(Routes rs,String path) {
  if(null==rs||rs.getRouteList().size()<1) {
    return null;
  }else {
    List<Route> allRoute=rs.getRouteList();
    //首先要把路径给格式化为标准的路径
               if(null==path) {
            return null;
               }else {
                /**
                 * 1.这里首先要去掉开始的项目地址,然后把字符\转换为/
                 * 2.如何是/结尾的要去掉
                 * 3.开始的项目地址如何去掉
                 * 4.项目路径匹配返回正常的路由
                 */  
                String currentPath=path.trim().replace('\\', '/');
                if(currentPath.endsWith("/")) {
                   currentPath=currentPath.substring(0,currentPath.length()-1);
                }
                if(currentPath.startsWith("/")) {
                   currentPath=currentPath.substring(1,currentPath.length()); 
                }
                for(Route rt:allRoute) {
                        if(rt.getPath().equals(currentPath)) {
                                return rt;
                        }
                }
               }
        return null;
  }
}
复制代码


4.效果测试



4.1指定过滤器配置


<filter>
  <filter-name>pingpang</filter-name>
  <filter-class>com.pingpang.core.Core</filter-class>
  <init-param>
     <param-name>autoPackage</param-name>
           <!--这里是扫描的包路径-->
     <param-value>com.pingpang.test</param-value>
     </init-param>
</filter>
<filter-mapping>
  <filter-name>pingpang</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
复制代码


4.2测试action


//路由注解的测试
@PathAnnotation(path = "hello", type = "")
public class PingPangTest {
  @PathAnnotation(path = "test", type = "")
  public void helloWord(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        System.out.println("-----------");
        request.getRequestDispatcher("/login.jsp").forward(request, response);
   }
}
复制代码


4.3效果图


网络异常,图片无法展示
|


网络异常,图片无法展示
|

相关文章
|
11天前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
|
13天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
40 4
|
13天前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
31 0
WK
|
19天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
28 0
|
1月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
23 1
|
2月前
|
缓存 中间件 网络架构
Python Web开发实战:高效利用路由与中间件提升应用性能
在Python Web开发中,路由和中间件是构建高效、可扩展应用的核心组件。路由通过装饰器如`@app.route()`将HTTP请求映射到处理函数;中间件则在请求处理流程中插入自定义逻辑,如日志记录和验证。合理设计路由和中间件能显著提升应用性能和可维护性。本文以Flask为例,详细介绍如何优化路由、避免冲突、使用蓝图管理大型应用,并通过中间件实现缓存、请求验证及异常处理等功能,帮助你构建快速且健壮的Web应用。
29 1
|
2月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
33 1
|
3月前
|
前端开发 JavaScript Java
Ajax进行异步交互:提升Java Web应用的用户体验
Ajax 技术允许在不重载整个页面的情况下与服务器异步交换数据,通过局部更新页面内容,极大提升了 Java Web 应用的响应速度和用户体验。本文介绍 Ajax 的基本原理及其实现方式,包括使用 XMLHttpRequest 对象发送请求、处理响应数据,并在 Java Web 应用中集成 Ajax。此外,还探讨了 Ajax 如何通过减少页面刷新、实时数据更新等功能改善用户体验。
73 3
|
3月前
|
Java Docker 微服务
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
88 1