JFinal个人总结

1、PlatformRoutes.java

这里面是用来定义路由的,默认跳转到index方法

 

如果在这儿定义,可以替代controller上@controller()

 

2、PlatformMapping.java

这个是用于表注入

 

在这儿定义就无需在实体类中定义@table

 

3、sqlId_splitPage_from

以教室管理为例,在查询时,有写到Jiaoshi.sqlId_splitPage_from,是在Jiaoshi类中定义的,这个对应的是jiaoshi.sql.xml中的splitPageFrom方法

 

 

 

而JiaoshiController index方法中的paging中的BaseModel.sqlId_splitPage_select则是sys-base-baseModel.sql.xml中的splitPageSelect方法

 

4、i18nMap

这个是一款轻量级的jQuery国际化插件,能实现Web前端的国际化。

https://www.cnblogs.com/sydeveloper/p/3729951.html

5、${i18nMap["admin.jiaoshi.common.name"]}

页面中的admin.jiaoshi.common.name是定义在resources-message_.._...properties中

 

 

直接在这里打汉字就会出现

6、页面权限

以user list页面为例

 

这部分控制下面的按钮显示

 

其中authUrl是页面按钮权限验证函数

7、AOP

AOP是这种在运行时,动态地讲代码切入到类的指定方法、指定位置上的编程思想就是面向切面编程。

面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。
但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。
    也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 
    一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
这样看来,AOP其实只是OOP(面向对象编程)的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。
    AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。

 

链接:https://www.zhihu.com/question/24863332/answer/48376158

 

8、jFinal内置查询sql

有三种,分别是Model.find、DB.query和DB.find

参考:https://www.cnblogs.com/wardensky/p/8250621.html

1) 使用Model.find(sql),这里面的sql语句是真正的sql不是定义在xxx.sql.xml里面的sqlId,如果想要使用sqlId,就使用下BaseService里面的getSql()方法,这个是根据sqlId获取sql语句的方法,具体表现为:

 

顺便提一嘴,因为我的jiaoxuelou实体类里面没有定义每一个字段,所以getStr()获取该字段的值。

2) 使用DB.query也可以,这里面有两个参数,分别是sqlId和param,param是需要传的参数,sqlId是xxx.sql.xml里面定义的id,这个使用也挺方便的,唯一一点是,返回的结果不是实体类,是只包含结果的数组.

 

3) 使用DB.find,这个我暂时没试过,这个的入参跟DB.query一样,是sqlId和param,但出参是List<Record>。

Record官方解释:Db 类及其配套的 Record 类, 提供了在 Model 类之外更为丰富的数据库操作功能。 使用Db 与 Record 类时,无需对数据库表进行映射, Record 相当于一个通用的 Model。 这样也可以得到该字段的值。

 

Jfinal数据库操作Api总结:http://blog.csdn.net/u010087886/article/details/51423714

 

9、关于beetle中集合Map获取key value

这篇文章https://www.cnblogs.com/luoxiaolei/p/6005797.html

 

10、getFile

单个文件上传时,使用UploadFile file = getFile()获取文件,多个文件上传时使用List<UploadFile> list = getFiles(),在使用getFile()方法时,需要先调用,不然getPara方法不好使。还有就是前台调用url时,url里面不能包含‘.’不然访问不通过。

 

11、该方法未注册(FUNCTION_NOT_FOUND)

在使用Beetle的contains方法时<% if(cyry.contains(entry.ids)) { %>,显示该方法未注册,只要在前面加一个@即可<% if(@cyry.contains(entry.ids)) { %>

 

12、富文本框保存时被转义

StringEscapeUtils.unescapeHtml4("&lt;p&gt;1111&lt;/p&gt;")

可得到<p>1111</p>

13、前端beetl字符串截取

字符串超过十个字,截取前十个字...

${strutil.length(str!) <=10? escapeXml(str!): strutil.subStringTo(str, 0, 10)+"..."}

14、前端beetl将List转为Map

<%
      var map = {};
      for(entry in list) {
          @map.put(entry.ids, entry.name);
      }
%>

15、前端beetl遍历含“,”的字符串

<% for(entry in strutil.split (str,",")) { %>
     ${kechengMap[entry]}${entryLP.last?'':','}
<% } %>

16、前端beetl将list按条件拆分

<% 
	var sfZdxx = {};
	var zdZdxx = {};
	var tjZdList = [];
	for(zdxx in zdxxList) {
		if(zdxx.xlids != xlxx.ids) {
			continue;
		}
		if(zdxx.zdxz == '0') {
			sfZdxx = zdxx;
			continue;
		} else if(zdxx.zdxz == '2') {
			zdZdxx = zdxx;
			continue;
		} else if(zdxx.zdxz == '1') {
			@tjZdList.add(zdxx);
		}
	}
%>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值