当前位置:网站首页><2021SC@SDUSC>山东大学软件工程应用与实践JPress代码分析(六)
<2021SC@SDUSC>山东大学软件工程应用与实践JPress代码分析(六)
2022-04-21 13:49:00 【indaeyo】
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)]](/img/34/3b43090254394406b2b52c551e6da1.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包,因为在方法中调用的方法、参数在前几篇代码分析报告中已经介绍过,在此不再重复分析。
版权声明
本文为[indaeyo]所创,转载请带上原文链接,感谢
https://blog.csdn.net/indaeyo/article/details/121237756
边栏推荐
猜你喜欢

JVM字节码文件结构深度剖析

STM32 MCU beginner 5-iic communication drive OLED screen

深度学习与图像识别:原理与实践 笔记Day_17

POI and easyexcel reading and writing test

MySQL Samsung index and cost calculation

CDH5删除数据节点

Number II that occurs only once (hash, bit operation, logic circuit, finite state automata)

Deep analysis of JVM bytecode file structure

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

Sqlyog import SQL file
随机推荐
EsgynDB 关于收集core信息的小技巧
认识系统服务
深度学习与图像识别:原理与实践 笔记Day_10
MySQL learning notes - day03
电力系统相关知识
vite. Config configuration file
EsgynDB 清理不一致对象
2021-10-20接口测试
Basic training process of image classification -- Based on mobilenet_ V3 as an example
MySQL high performance business table structure and index design practice
MySQL slow query log and index merge analysis
通过区块划分提高随机生成圆球干涉检查的效率
Longest ascending subsequence (2) (greedy + dichotomy)
字符串 - 1. 字符串长度 (10 分)C语言标准函数库中包括 strlen 函数,用于计算字符串的长度。作为练习,我们自己编写一个功能与之相同的函数。
《商用密码应用与安全性评估》第四章 密码应用安全性评估实施要点-小结
The sales attribute values in sku must be filled in in pairs. Why
Example: use C # NET teaches you to do WeChat official account development (7) -- location message for general message processing.
Detailed explanation of JVM memory allocation mechanism
mysql-连接查询成本和成本统计数据辨析
Deep understanding of concurrent programming