<2021SC@SDUSC>山东大学软件工程应用与实践JPress代码分析(六)

2021SC@SDUSC

本篇文章分析module-page-web的directive包、sitemap包部分。

注:因代码较短且较精简,代码的分析放在代码段的备注中。

1.directive包架构

本个文件夹包含三个类与一个静态内部类。

  • PageCommentPageDirective.java提供对单条评论的渲染。
  • 静态内部类TemplatePaginateDirective.java提供对评论的分页处理。
  • PageDirective.java提供对单个页面的渲染。
  • PagesDirective.java提供对多个页面的渲染。
  • directive包负责给controller提供directive“指导性”方法,比如获得url、获得page等函数。

2.PageCommentPageDirective.java

因为包中的三个类的作用大同小异,无非是分别对单条评论、单个界面、多个界面的渲染,其中每个类中都有onRender()方法和hasEnd()方法。所以接下来以PageCommentPageDirective.java中的onRender()方法、hasEnd()方法为例,进行代码的分析。

2.1 onRender()

@Override
public void onRender(Env env, Scope scope, Writer writer) {
		//设置初始的界面数为1
    int page = 1;
		
		//将url解码,通过伪静态处理器JPressHandler,获得当前的目标target
    String target = StrUtil.urlDecode(JPressHandler.getCurrentTarget());
		//如果target中包含“-”
    if (target.contains("-")) {
        int indexOf = target.lastIndexOf('-');
				//获得页面字符串
        String pageString = target.substring(indexOf + 1);
				//如果页面字符串不是空白并且可以转换成数字
        if (StrUtil.isNotBlank(pageString) && StrUtil.isNumeric(pageString)) {
						//将该值转换,设置page值
            page = Integer.valueOf(pageString);
        }
    }
		//使用Controller的getPara方法,获得页面的大小
    int pageSize = getParaToInt("pageSize", scope, 10);

    Controller controller = JbootControllerContext.get();
		//使用getAttr方法获得url中的参数
    SinglePage singlePage = controller.getAttr("page");
    if (singlePage != null) {
        Page<SinglePageComment> articlePage = service.paginateByPageIdInNormal(page, pageSize, singlePage.getId());
        scope.setGlobal("commentPage", articlePage);
        renderBody(env, scope, writer);
    }
}

2.2 hasEnd()

判断当前值是否有末尾值。

@Override
public boolean hasEnd() {
    return true;
}

3.TemplatePaginateDirective

该类是PageCommentPageDirective的静态内部类。提供了获得Url、获得界面的方法。

3.1 父类PaginateDirectiveBase

  • TemplatePaginateDirective继承自PaginateDirectiveBase。
  • PaginateDirectiveBase中定义了很多关于页面状态的静态常量。
boolean onlyShowPreviousAndNext = this.getParaToBool("onlyShowPreviousAndNext", scope, false);
String previousText = (String)this.getPara("previousText", scope, "上一页");
String nextText = (String)this.getPara("nextText", scope, "下一页");
String pageItemsName = (String)this.getPara("pageItemsName", scope, "pages");
String pageDataKey = (String)this.getPara("pageData", scope, "pageData");
  • TemplatePaginateDirective实现了父类中的两个抽象方法,即getUrl()getPage()方法。

3.2 getUrl()

获得新界面的url

@Override
protected String getUrl(int pageNumber, Env env, Scope scope, Writer writer) {
		//获得页面参数
    SinglePage page = JbootControllerContext.get().getAttr("page");
		//通过页数获得页面的url
    String url = page.getUrlWithPageNumber(pageNumber);
		//根据传入的url获得参数名为anchor的参数值
    String anchor = getPara("anchor", scope);
		//返回页面的新url
    return StrUtil.isBlank(anchor) ? url : url + "#" + anchor;
}

3.3 getPage()

获得该评论页面

@Override
protected Page<?> getPage(Env env, Scope scope, Writer writer) {
    return (Page<?>) scope.get("commentPage");
}

4.sitemap包架构

  • sitemap包包含两个类文件。
  • PageModuleInitializer实现对页面相关功能的按钮的初始化。
  • PageNotifyKit为实现页面评论时,评论功能的选择与邮件通知管理员、短信通知管理员的方法实现。

5.PageModuleInitializer.java

  • 继承ModuleBase,是模块类实现的基础。
  • ModuleBase 继承 JbootAppListenerBase,实现 ModuleListener, JbootAppListener两个接口。实现对MenuGroup的监听。
  • PageModuleInitializer中只有一个方法。
@Override
public void onConfigAdminMenu(List<MenuGroup> adminMenus) {

    MenuGroup menuGroup = new MenuGroup();
    menuGroup.setId("page");
    menuGroup.setText("页面");
    menuGroup.setIcon("<i class=\"fas fa-file\"></i>");
    menuGroup.setOrder(2);

    adminMenus.add(menuGroup);

}

实则在JPress后台界面上增加了页面的选项组:
在这里插入图片描述

6.PageNotifyKit.java

JPress的后台管理界面中,有评论通知管理员的方法设置,而PageNotifyKit正实现了这一点。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C2OZIZmo-1636465804374)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4d899706-7339-4a13-83f2-0a1b4018e842/Untitled.png)]

6.1 函数用途

public static void notify(SinglePage page, SinglePageComment comment, User user)

传入页面、评论、用户,通知管理员

private static void bySms(SinglePage page, SinglePageComment comment)

通过短信通知管理员

private static void doSendSms()

发送短信

public static void byEmail(SinglePage page, SinglePageComment comment, User user)

通过邮件通知管理员

private static void doSendEmail(SinglePage page, SinglePageComment comment, User user)

发送邮件

7.总结

本篇文章分析了directive包、sitemap包,因为在方法中调用的方法、参数在前几篇代码分析报告中已经介绍过,在此不再重复分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值