【JPress】FlatUrl

2021SC@SDUSC

目录

一、FlatUrl

1.FlatUrlProcesser

2.CommonsFlatUrlProcesser

二、FlatUrlHandler


一、FlatUrl

1.FlatUrlProcesser

JPress中有使用扁平结构的URL。网站大量使用URL都属于扁平结构,这种属树形结构。内容页离首页的“url距离”越短,则网站结构越扁平。一般的网站内容管理逻辑上会采用树型结构,结构比较清晰,网站深层内容页面到首页的点击距离可能很长,相应的url会很长,但这不利于搜索引擎抓取。扁平化结构可以较好的解决这个问题,如:深层网页的逻辑结构可能是:首页-1级栏目-2级栏目-列表页-内容页。但其URL结构却是:首页-(聚合)-内容页,即所有的频道,子频道,栏目,子栏目在“url”上都处于1个层级:(聚合)。

一般在网站URL结构合理的情况下,越短越好。因为扁平化利于用户体验,能简单明了地告知用户自己所在位置,站在SEO的角度,利于权重的分配。而简短的URL则能让此页面的排名和收录明显提高。

JPress中定义的FlatUrlProcesser如下:

public interface FlatUrlProcesser {
    String flat(String target, HttpServletRequest request);
}

FlatUrl处理器,其作用是对 target 进行转换,例如:把 /article-1.html 还原到 /article/1.html。

2.CommonsFlatUrlProcesser

public class CommonsFlatUrlProcesser implements FlatUrlProcesser {
​
    private final Map<String, String> prefixAndTargets;
​
    public CommonsFlatUrlProcesser(Map<String, String> prefixAndTargets) {
        this.prefixAndTargets = prefixAndTargets;
    }
​
    @Override
    public String flat(String target, HttpServletRequest request) {
        for (Map.Entry<String, String> entry : prefixAndTargets.entrySet()) {
            if (target.startsWith(entry.getKey())) {
                return entry.getValue() + target.substring(entry.getKey().length());
            }
        }
        return target;
    }
}

可以看到,CommonsFlatUrlProcesser在创建的时候就注入了prefixAndTargets前缀和目标参数。当它需要处理一个target时,会拿出prefixAndTargets中的所有属性和target的前缀比较,如果有匹配的,那么将会返回扁平化后的结果。

二、FlatUrlHandler

FlatUrlHandler是JPress 网站的URL管理器,其肯定要使用FlatUrlProcesser类来处理扁平URL事务,但是它用一个Set<FlatUrlProcesser>来装配FlatUrlProcesser,其初始化如下:

private static Set<FlatUrlProcesser> flatUrlProcessers = Collections.synchronizedSet(new HashSet<>());

当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。所以该初始化解决了同步问题,不会重复地初始化这个静态事例。

Handler可以接管所有web请求,并对应用拥有完全的控制权,可以很方便地实现更高层的功能性扩展。

@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
    if (JPressOptions.isFlatUrlEnable() && flatUrlProcessers.size() > 0) {
        for (FlatUrlProcesser processer : flatUrlProcessers) {
            target = processer.flat(target, request);
        }
    }
    next.handle(target, request, response, isHandled);
}

FlatUrlHandler把web请求中的target给拦截下来,进行扁平化处理,然后再让该请求继续往后响应。JPress中使用该Handler来管理网站的URL,处理了伪静态的问题,并处理了扁平化 URL 问题,也就是全站 URL 转为为 /xx-xx-1.html ,不再有 "/" 这个符号 ,更加有利于 SEO。

一般来说,大多数会更倾向于扁平化的结构,站在用户的角度,网站清晰明了,层次也会更层次分明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值