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

2021SC@SDUSC

本篇文章将继续分析模块module_page,此次分析module-page-web架构和module-page-web——文章管理的controller部分。

目录

1、module-page-web架构

1.1 html类文件

1.2 java类文件

2、pom依赖

3.Controller分析

3.1 _PageCommentController.java

3.1.1 父类AdminControllerBase.java

3.1.2 RequestMapping注解

3.1.3 AdminMenu注解

3.1.4 函数用途

3.2 _PageController.java

3.2.1 父类AdminControllerBase.java

3.2.2 EmptyValidate注解

3.2.3 函数用途

4.扩展内容:JFinal Interceptor拦截器

4.1 Interceptor

4.2 Before

4.3 Clear

5. 总结


1、module-page-web架构

1.1 html类文件

admin中的page包的html,对应的是页面功能中的几个功能:

  • setting对应设置功能。
  • page_write对应新建功能
  • page_list对应页面管理功能。
  • comment的三个文件对应评论的回应、编辑、列表功能。

commons中的page包对应的是默认评论和默认页面的显示。

1.2 java类文件

  • controller包负责给页面提供接口,页面的表格、按钮等调用controller里面的包获取数据库相关资源。
  • directive包负责给controller提供directive“指导性”方法,比如获得url、获得page等函数。
  • sitemap使用JFinal的Enjoy模板引擎和core核心文件,进行页面模块的初始化和相关的数据库操作。

2、pom依赖

该模块多依赖于之前分析过的包,给页面提供具体的操作函数。

<dependencies>

        <dependency>
            <groupId>io.jboot</groupId>
            <artifactId>jboot</artifactId>
        </dependency>

        <dependency>
            <groupId>io.jpress</groupId>
            <artifactId>jpress-core</artifactId>
        </dependency>

        <dependency>
            <groupId>io.jpress</groupId>
            <artifactId>module-page-model</artifactId>
            <version>4.0</version>
        </dependency>

        <dependency>
            <groupId>io.jpress</groupId>
            <artifactId>module-page-service</artifactId>
            <version>4.0</version>
        </dependency>

        <dependency>
            <groupId>io.jpress</groupId>
            <artifactId>module-page-service-provider</artifactId>
            <version>4.0</version>
        </dependency>

    </dependencies>

3.Controller分析

之前的文章中,因为代码和内容的联系不是很密切,我把注释和代码分开进行了分析。但是在controller中,注释和内容联系密切,本次结合在一起分析。

3.1 _PageCommentController.java

3.1.1 父类AdminControllerBase.java

  • _PageCommentController继承自jpress.web.base包中的AdminControllerBase,有管理员操作的相关函数。
  • AdminControllerBase中的方法使用了interceptor拦截器的相关内容,可以对用户、管理员、权限操作进行拦截,所以该类为管理员操作的基本。以下是AdminControllerBase中拦截器的配置。
@Before({
        CSRFInterceptor.class,
        AdminInterceptor.class,
        UserInterceptor.class,
        PermissionInterceptor.class
})
public abstract class AdminControllerBase extends ControllerBase {}
  • 拦截器相关内容请看4.扩展内容:Interceptor拦截器

3.1.2 RequestMapping注解

@RequestMapping(value = "/admin/page/comment", viewPath = JPressConsts.*DEFAULT_ADMIN_VIEW*)

  • 该注解来自Jboot,可以配置接口以及调用的界面。需要和SpringBoot的同名注解进行区分。
  • value属性负责配置接口,页面通过使用“/admin/page/comment”来调用此接口。
  • viewPath属性负责配置显示的界面,在这里页面路径为"/WEB-INF/views/admin/",就是前文提到的所有html文件。

3.1.3 AdminMenu注解

@AdminMenu(text = "评论", groupId = "page", order = 5)

  • 该注解来自JPress,配置页面功能板块的评论功能。
  • test配置功能显示文本。
  • groupId配置功能群组,此处为评论功能属于页面板块的意思。
  • order为五个种类。
  • 本个注解加在函数public void list() {}的前面,所以函数是列出五个种类的评论列表。

3.1.4 函数用途

public void list() {}

列出评论列表。

public void doDel() {}

删除评论。

public void doDelByIds() {}

批量删除评论。

public void doAuditByIds()

批量审核评论。

public void doChangeStatus(Long id, String status)

修改评论状态。

public void reply()

评论回复 页面。

public void doReply(String content, Long pageId, Long pid)

进行评论回复。

public void edit()

评论编辑 页面。

3.2 _PageController.java

父类AdminControllerBase.java、RequestMapping注解、AdminMenu注解在上文已经提到过,用法、运用的地方都相同,这里会重点介绍其他注解和函数。

3.2.1 父类AdminControllerBase.java

  • _PageCommentController继承自jpress.web.base包中的AdminControllerBase,有管理员操作的相关函数。在上一节已经介绍过,这里不再重点介绍。

3.2.2 EmptyValidate注解

@EmptyValidate({
        @Form(name = "id", message = "页面ID不能为空"),
        @Form(name = "mode", message = "页面编辑模式不能为空")
})
public void doChangeEditMode() {}
  • EmptyValidate注解来自Jboot的Validator数据验证模块,对调用数据的方法进行验证。
  • 形象化一下,我们自己写表单验证的时候,需要自己写函数获取input的内容,判断是否为空,再返回相关信息,此处的注解能很方便地做到这一点。
  • 如上代码,表格中如果传递过来的参数名为id,可以直接判断并且返回message“页面id不能为空”。
  • @EmptyValidate放在方法的前面使用,当如果我们的 Controller 的方法没有参数的时候就可以使用。

如果有参数,Jboot准备了更多的注解给你使用!Jboot 从 V3.7.5 开始,增强 Jboot 的验证方式,在 Jboot 之前的 @EmptyValidate、@RegexValidate 等基础上,进一步基于 JSR 303 – Bean Validation 简化了验证方式,相比 Spring 更加优雅简单。

详情可以查看Jboot文档:数据验证 Validator | Jboot 官方网站

3.2.3 函数用途

public void list()

列出页面管理的文章的列表

public void write()

新建文章,开始编写新的内容

public void setting()

页面设置,包括评论功能、通知管理员等等。

public void doChangeEditMode()

改变编辑模式

public void doWriteSave()

文章撰写保存

public void doDel()

删除文章

public void doDelByIds()

通过id删除文章

public void doTrash()

文章移动到垃圾箱

public void doDraft()

文章移动到草稿

public void doNormal()

文章移动到发布

4.扩展内容:JFinal Interceptor拦截器

Interceptor拦截器是JFinalAOP的最核心概念之一。JFinal采用极速化的AOP设计,专注AOP最核心的目标,将概念减少到极致,仅有三个概念:Interceptor、Before、Clear,并且无需引入IOC也无需使用啰嗦的XML。

4.1 Interceptor

  • Interceptor 可以对方法进行拦截,并提供机会在方法的前后添加切面代码,实现 AOP 的核心目标。Interceptor 接口仅仅定义了一个方法 public void intercept(Invocation inv)。
  • 以下代码中的 DemoInterceptor 将拦截目标方法,并且在目标方法调用前后向控制台输出文本。inv.invoke() 这一行代码是对目标方法的调用,在这一行代码的前后插入切面代码可以很方便地实现AOP。
public class DemoInterceptor implements Interceptor {
    public void intercept(Invocation inv) {
       System.out.println("Before method invoking");
       inv.invoke();
       System.out.println("After method invoking");
    }
}

4.2 Before

  • Before注解用来对拦截器进行配置,该注解可配置Class、Method级别的拦截器。
  • 如下代码所示,Before可以将拦截器配置为Class级别与Method级别,前者将拦截本类中所有方法,后者仅拦截本方法。此外Before可以同时配置多个拦截器,只需用在大括号内用逗号将多个拦截器进行分隔即可。
// 配置一个Class级别的拦截器,她将拦截本类中的所有方法
@Before(AaaInter.class)
public class BlogController extends Controller {
 
  // 配置多个Method级别的拦截器,仅拦截本方法
  @Before({BbbInter.class, CccInter.class})
  public void index() {
  }
 
  // 未配置Method级别拦截器,但会被Class级别拦截器AaaInter所拦截
  public void show() {
  }
}

4.3 Clear

  • 拦截器从上到下依次分为Global、Routes、Class、Method四个层次,Clear用于清除自身所处层次以上层的拦截器。
  • Clear声明在Method层时将针对Global、Routes、Class进行清除。Clear声明在Class层时将针对Global、Routes 进行清除。Clear注解携带参数时清除目标层中指定的拦截器。
// login方法需要移除该权限拦截器才能正常登录
@Before(AuthInterceptor.class)
public class UserController extends Controller {
    // AuthInterceptor 已被Clear清除掉,不会被其拦截
    @Clear
    public void login() {
    }
    
    // 此方法将被AuthInterceptor拦截
    public void show() {
    }
}

5. 总结

本篇文章内容非常多,且都是文件的核心内容。本次分析了两个controller java文件的父类、使用的注解、了解了JFinal的AOP重点内容,深入了解拦截器的作用、用法,解析每个方法的使用。下篇文章将继续深入了解controller,看JPress如何灵活运用JFinal、Jboot。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值