通过注解实现路由前缀配置,并自动扫描,主要是减少Routes的继承与书写.可以向spring系列一样,在controller加上@RequestMapping来实现路由前缀配置.拦截器配置,视图路径配置等
使用方式:
第一步:
@Override
public void configRoute(Routes routes) {
// 自定义自动扫描路由工具,与系统不冲突
RoutesKit.initRoutes(routes);
}第二步,在Controller上加上使用的注解即可,可以配置viewPath,与拦截器
@RequestMapping("/u")
public class LoginController extends BaseController {
....
}具体实现代码:
定义注解,主要有 路由,视图路径,与拦截器三个属性
/***
* 请求映射前缀, 只能用于类上
* 例如:RequestMapping("/hello),则 实际url为 /hello/方法名称
*/
@Retention(RUNTIME)
@Target(TYPE)
public @interface RequestMapping {
/***
* 请求的前缀
*/
String value() default "/";
/***
* 返回视图的前缀,用于没有分离视图用,如果没有配置,则默认使用路由的前缀
*/
String viewPath() default "";
/***
* 拦截器
*/
Class<? extends Interceptor>[] interceptor() default {};
}具体扫描实现:
/**
* @createTime: 2019/1/6
* @author: HingLo
* @description: 路由自动扫描工具
*/
public class RoutesKit {
/***
* 初始化路由工具 在JFinalConfig中configRoute方法中调用,通过对controller上加上RequestMapping 来自动扫描与初始化路由<br>
* 需要通过:hutool工具包中ClassUtil工具来进行扫描类
* @param routes JFinalConfig 中路由配置的configRoute 参数
*/
public static void initRoutes(Routes routes) {
//扫描项目下的所有的带有RequestMapping 的Controller
Set<Class<?>> set = ClassUtil.scanPackageBySuper("", Controller.class);
for (Class x : set) {
RequestMapping annotation = (RequestMapping) x.getAnnotation(RequestMapping.class);
// 用来限制只有加上了RequestMapping注解的controller才进行自动初始化
if (annotation == null) {
continue;
}
// 获取controllerKey
final String path = getPath(annotation.value());
// 获取视图路径
String viewPath = annotation.viewPath();
// 获取拦截器
Class<? extends Interceptor>[] interceptor = annotation.interceptor();
Routes routes1 = new Routes() {
@Override
public void config() {
// 添加拦截器
if (interceptor.length > 0) {
for (Class<? extends Interceptor> aClass : interceptor) {
addInterceptor(ReflectUtil.newInstance(aClass));
}
}
// 设置视图,如果视图是空,使用path 作为视图路径
setBaseViewPath(StrKit.isBlank(viewPath) ? path : viewPath);
// 设置路由
add(path, x);
}
};
routes.add(routes1);
}
}
/***
* 请求路由处理
* @param path 原始路由
* @return 返回处理后的路由
*/
private static String getPath(String path) {
path = path.trim();
if (!path.startsWith("/")) {
path = "/" + path;
}
if (path.endsWith("/")) {
path = path.substring(0, path.length() - 1);
}
return path;
}结尾:自此就结束了,整体代码都不是很多,但是需要引入:hutool这个工具包进行Controller扫描.hutool工具包的地址:Hutool 工具包文档地址