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

2021SC@SDUSC

承接代码分析第四篇,本篇文章将分析文章管理Controller的PageApiController与PageController。

1.Controller分析

1.1 PageApiController.java

1.1.1 父类 ApiControllerBase.java

  • PageApiController继承自ApiControllerBase,实现了页面操作的相关Api,比如根据 flag 查询页面列表、删除页面、更新页面等等。
  • ApiControllerBase中。使用了JFinal极速化的AOP设计,使用@Before注解配置类级别的拦截器。
  • 拦截器的相关补充详见上一篇文章。
@Before({ApiInterceptor.class, UserInterceptor.class})

1.1.2 函数用途

public Ret detail(@ApiPara("页面ID") Long id, @ApiPara("页面固定连接") String slug)

查看页面,返回页面详情

public Ret listByFlag(@ApiPara("页面的 flag 标识") @NotEmpty String flag)

查询界面,返回根据flag查询到的页面列表

public Ret doDelete(@ApiPara("页面id") @NotNull Long id)

删除界面,返回删除界面的操作状态

public Ret doCreate(@ApiPara("页面 json 数据") @JsonBody SinglePage singlePage)

创建界面,返回创建的新界面的id

public Ret doUpdate(@ApiPara("页面 json 数据") @JsonBody SinglePage singlePage)

更新界面,返回更新操作的状态

1.1.3 注解的使用

在PageApiController类中,我们看到很多注解的使用,以下代码段作为一个注解使用的例子。

@ApiOper("删除页面")
    public Ret doDelete(@ApiPara("页面id") @NotNull Long id) {
        service.deleteById(id);
        return Rets.OK;
    }

接下来会逐个解析注解的作用

@Api(“页面相关的API”)

  • jboot注解,放在类的前面,表示对类的作用的说明。

@ApiOper(value = “页面详情”, paraNotes = “id 和 slug 必须有一个不能为空”)

  • jboot注解,用在请求方法上,说明方法的用途和作用。
  • value=“说明方法的用途、作用”。
  • paraNotes=“方法参数的备注说明”。

@ApiPara(“页面ID”) Long id

  • 使用在方法上或者参数上,字段说明。

@NotEmpty String flag

  • 注解来自javax.validation.constraints.NotEmpty
  • 该注解加载String类、Collection、Map、数组的参数上,是不能为null或者长度为0的。

@NotNull Long id

  • 该注解来自javax.validation.constraints.NotNull,加在方法的参数上。
  • 该注解验证对象是否不为null, 无法查检长度为0的字符串。

@JsonBody SinglePage singlePage

  • 该注解来自io.jboot.web.json.JsonBody
  • 注解将参数标识为JSON格式的请求体.
  • 使用 @JSONBody 注解的同时就可以 省略 contentType = "application/json"属性设置。

1.1.4 Ret

PageApiController类的方法中,除了对注解的运用,还有一个共同点——返回的值都为Ret类型的变量。所以我们接下来对Ret进行分析。

@ApiOper("根据 flag 查询页面列表")
    public Ret listByFlag(@ApiPara("页面的 flag 标识") @NotEmpty String flag) {
        List<SinglePage> pages = service.findListByFlag(flag);
        return Ret.ok().set("list", pages);
    }
  • Ret来自于com.jfinal.kit包,是JFinal里的核心工具类包,里面还有我们常用来判断和处理字符串用的StrKit工具类。加载读取配置文件用的PropKit工具类。用户密码Md5或者加盐加密用的HashKit工具类等。这个工具包是我们日常开发中常用的工具包。
  • Ret继承自HashMap,当然也拥有HashMap的特性。
  • Ret类中静态变量为几个状态量,用于在程序中确认执行状态。
private static final String STATE = "state";
    private static final String STATE_OK = "ok";
    private static final String STATE_FAIL = "fail";
  • Ret类中的静态方法、动态方法用于返回执行状态或封装数据称为拥有(key,value)的HashMap。所以在本小节最开始的代码段中,其实返回的是一个HashMap。
public static Ret ok(Object key, Object value) {
        return ok().set(key, value);
    }
//静态方法中调用的方法
public Ret set(Object key, Object value) {
        super.put(key, value);
        return this;
    }

其实com.jfinal.kit包中还有一个工具类Kv.java,他与Ret有些许的相似,因不在代码中,所以作为补充内容2.1、2.2撰写。

1.2 PageController.java

1.2.1 父类 TemplateControllerBase.java

  • PageController继承了TemplateControllerBase,主要用以渲染界面。
  • TemplateControllerBase中同样也设置了拦截器,拦截微信Api、模板Api、用户Api的相关内容。
@Before({WechatInterceptor.class,
        TemplateInterceptor.class,
        UserInterceptor.class})

1.2.2 函数用途

private SinglePageService pageService;

声明页面的service对象,可调用其中的方法。

private SinglePageCommentService commentService

声明页面评论的service对象,可调用其中的方法。

private OptionService optionService

声明选项的service对象,可调用其中的方法。

public String getIdOrSlug()

获得目前对象的id或slug。

private void renderPage(SinglePage page, String slugOrId)

根据页面的slug或id,渲染该页面。

private void renderTemplateView(String slugOrId)

根据slug或id渲染模板视图。

private void setSeoInfos(SinglePage page)

设置页面的seo信息。

public void postComment()

发布评论。

public void index()

利用以上所有方法,根据对象的slug或id对应渲染相关信息。

1.2.3 get/getPara

在方法中,我们常见的JFinal的方法之一是getPara。如下例:

Long pageId = getParaToLong("pageId");
Long pid = getParaToLong("pid");
  • 这个方法中封装了java中原始的获取参数的方法,总共有两种使用类型。
  • 第一种类型为第一个形参为String的getPara系列方法。该系列方法是对HttpServletRequest.getParameter(String name)的封装,这类方法都是转调了HttpServletRequest.getParameter(String name)。
  • 第二种类型为第一个形参为int或无形参的getPara系列方法。该系列方法是去获取urlPara中所带的参数值。getParaMap与getParaNames分别对应HttpServletRequest的getParameterMap与getParameterNames。

官网给出的getPara的使用例子:

在这里插入图片描述

1.2.4 set/setAttr

页面代码如下:

private void renderPage(SinglePage page, String slugOrId) {
    pageService.doIncViewCount(page.getId());

//设置SEO信息
setSeoInfos(page);

//设置菜单高亮
setMenuActive(menu -> menu.getUrl().indexOf("/") <= 1 && menu.isUrlStartWidth("/" + slugOrId));

    setAttr("page", page);

    render(page.getHtmlView());
}

在代码中,我们使用了setAttr的方法。

  • setAttr(String, Object) 转调了 HttpServletRequest.setAttribute(String, Object),该方法可以将各种数据传递给View并在View中显示出来。
  • 通过查看 jfinal 源码 Controller 可知 setAttr(String, Object) 方法在底层仅仅转调了底层的 HttpServletRequest 方法:
private HttpServletRequest request;
 
public Controller setAttr(String name, Object value) {
    request.setAttribute(name, value);
    return this;
}

所以get和set方法完美封装了HttpServletRequest 的调用形式,极大缩短了代码量,提高程序的简洁性和高效性!

1.2.5 render

renderPagerenderTemplateView函数中,我们的返回值都是调用了一个render方法,以下来解析render的使用和返回值。

  • render(String view) 方法将对 view 所指向的模板进行渲染。
  • render系列方法将渲染不同类型的视图并返回给客户端。JFinal目前支持的视图类型有:JFinal Template、FreeMarker、JSP、Velocity、JSON、File、Text、Html、QrCode 二维码 等等。除了JFinal支持的视图型以外,还可以通过继承Render抽象类来无限扩展视图类型。
  • 以下是 render 系方法使用例子:
// 渲染名为test.html的视图,且视图类型为 JFinal Template
renderTemplate(”test.html”);
 
// 生成二维码
renderQrCode("content");
 
// 渲染名为test.html的视图,且视图类型为FreeMarker
renderFreeMarker(”test.html”);
 
// 渲染名为test.html的视图,且视图类型为Velocity
renderVelocity(“test.html”);

// 仅将setAttr(“user”, user)与setAttr(“blog”, blog)设置的属性转换成json并渲染
renderJson(new  String[]{"user", "blog"});
 
// 渲染名为test.zip的文件,一般用于文件下载
renderFile("test.zip");
 
// 渲染纯文本内容 "Hello JFinal"
renderText("Hello JFinal");
 
// 渲染 Html 内容 "Hello Html"
renderHtml("Hello Html");
 
// 渲染名为 test.html 的文件,且状态为 404
renderError(404 , "test.html");

2.补充

2.1 Kv类

com.jfinal.kit包中不止有文章中用到的Ret类,还有也是非常常用的Kv类。接下来补充他的使用方法。

  • Kv继承HashMap,拥有HashMap的所有特性,你可以把Kv.java当做一个更好用的HashMap。
  • 它主要是用来做参数,传递参数。下例是一个Service里封装的例子。这是Service中封装的一个根据关联类型和关联对象ID 删除符合条件数据的一个数据库操作。这里用Kv来构造了删除使用的参数,是deleteBy(Kv params)这个方法的参数。
    在这里插入图片描述

2.2 Kv.java和Ret.java

  • Kv中没有静态变量的设置。
  • Kv里提供了很多快速参数转型的方法:在Service里可以快速根据参数的名字作为Kv里的Key获取转型数据值**。**
  • Ret主要是用来做返回值,用来返回操作处理的数据和状态的。也用于服务器对客户端请求响应JSon数据通讯。
  • Ret和Kv的区别,就是一个主要作为参数,一个主要作为返回值。如下例:

在这里插入图片描述

3.总结

本篇文章将剩下的两篇Controller进行了分析总结,了解了jboot、jfinal、jpress所用的注解和jFinalController的各种封装方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值