web路由的java简单实现思路

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: 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效果图


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


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

相关文章
|
1月前
|
SQL 监控 安全
Java Web应用的安全防护与攻防策略
Java Web应用的安全防护与攻防策略
|
4天前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
15 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
|
6天前
|
Java
java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 增样将jar包导入
文章记录了解决Java项目中遇到的`java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter`异常的方法,即通过在项目的`WEB-INF`文件夹下创建与`classes`平级的`lib`文件夹并添加所需的jar包来解决。
java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 增样将jar包导入
|
6天前
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
|
8天前
|
分布式计算 安全 Java
Java帝国的无限魅力:揭秘这门万能编程语言如何征服科技世界,从Web到太空探索,Java的触角无处不在!
【8月更文挑战第12天】随着信息技术的发展,编程语言成为科技核心。Java以其成熟与广泛应用,在众多语言中脱颖而出。它支持跨平台运行,实现“一次编写,处处运行”。Java的面向对象特性促进代码复用与维护,内置的安全机制保障系统安全。Java应用于Web开发、大数据处理、移动应用等多个领域,展现了其不可替代的价值。
20 1
|
11天前
|
jenkins 持续交付 开发工具
"引爆效率革命!Docker+Jenkins+GIT+Tomcat:解锁持续集成魔法,一键部署Java Web应用的梦幻之旅!"
【8月更文挑战第9天】随着软件开发复杂度的增加,自动化变得至关重要。本文通过实例展示如何结合Docker、Jenkins、Git与Tomcat建立高效的持续集成(CI)流程。Docker确保应用环境一致性;Jenkins自动化处理构建、测试和部署;Git管理源代码版本;Tomcat部署Web应用。在Jenkins中配置Git插件并设置项目,集成Docker构建Tomcat应用镜像并运行容器。此外,通过自动化测试、代码质量检查、环境隔离和日志监控确保CI流程顺畅,从而显著提高开发效率和软件质量。
34 3
|
8天前
|
Java Maven Windows
java -jar 启动 boot 程序 no main manifest attribute, in .\vipsoft-model-web-0.0.1-SNAPSHOT.jar
java -jar 启动 boot 程序 no main manifest attribute, in .\vipsoft-model-web-0.0.1-SNAPSHOT.jar
28 0
|
1月前
|
JSON 中间件 数据处理
实践出真知:通过项目学习Python Web框架的路由与中间件设计
【7月更文挑战第19天】探索Python Web开发,掌握Flask或Django的关键在于理解路由和中间件。路由连接URL与功能,如Flask中@app.route()定义请求响应路径。中间件在请求处理前后执行,提供扩展功能,如日志、认证。通过实践项目,不仅学习理论,还能提升构建高效Web应用的能力。示例代码展示路由定义及模拟中间件行为,强调动手实践的重要性。
34 1
|
1月前
|
消息中间件 Java 微服务
构建可扩展的Java Web应用架构
构建可扩展的Java Web应用架构
|
21天前
|
Java UED
Java Web 中forward 和 redirect 的区别
在Java Web开发中,页面跳转是构建用户界面和实现业务逻辑的重要组成部分。Forward(转发)和Redirect(重定向)是两种常见的跳转方式,它们分别具有不同的特点和适用场景。正确地选择和使用这两种跳转方式,有助于提高Web应用的性能、用户体验和代码可维护性。
32 0

热门文章

最新文章