JFinal常见问题和知识点笔记

1、当主键Id命名不是“id”时,应该显式地将自定义的id指出来

例如:

Db.deleteById("post_user","user_id", 5);

2、声明式事务实现方式为拦截器

例如:

 1 @Override
 2     public void configInterceptor(Interceptors me) {
 3         // TODO Auto-generated method stub
 4         // 声明式事务
 5         // actionKey 正则  实现方式---拦截器
 6         me.add(new TxByActionKeyRegex("/user.*"));
 7         // actionKeys
 8         me.add(new TxByActionKeys("/user/save","/user/testDb"));
 9         // actionMethods
10         me.add(new TxByMethods("save","update"));
11         // action methodRegex
12         me.add(new TxByMethodRegex("(.*save.*|.*update.*)"));
13         
14     }

MySqlMySqlMySqlMySql 数据库表必须设置为 InnoDBInnoDB InnoDB 引擎时才支持事务, 引擎时才支持事务, MyISAMMyISAMMyISAM 并不支持事务。

3、复合主键 

当一个字段无法确定唯一性的时候,需要其他字段来一起形成唯一性。就是说用来组成唯一性的字段如果有多个就是联合主键
例如:
学生成绩(学号,课程号,成绩)
那学号和课程号就可以做为联合主键.
因为学号和课程号决定了成绩.也就是说.你要知道成绩..你就要知道学号,知道学号,但还不能知道某一科的成绩.还要知道课程号.
所以函数依赖关系是{学号,课程号}->{成绩}

JFinal中复合主键实现:

<1>.

arp.addMapping("post_user", "user_id,user_class_id",User.class);

<2>.

1 // 复合主键    select * from "post_user" where "user_id" = ? and "user_class_id" = ?
2         user = Db.findById("post_user", "user_id,user_class_id",33,1);
3         System.out.println("测试复合主键:"+user.getStr("user_password"));

4、缓存

CacheInterceptor可以将action所需要的数据全部缓存下来,下次请求来时如果cache存在则直接使用数据并render,而不去调用action,

这样可以使action完全不受cache相关代码污染,即插即用。

示例代码如下:

 1 // 测试缓存  需要在ehcache.xml 中进行配置 例如:<cache name="/user/testCache"...>
 2     @Before(CacheInterceptor.class)
 3     public void testCache() {
 4         System.out.println("测试Cache");
 5         String sql = "select * from post_user u inner join post_class c on u.user_class_id = c.class_id"
 6                    + " where u.user_name= ?";
 7         User user = User.user.findFirst(sql,"liubaohua");
 8         
 9         System.out.println("多表关联-操作成功!"+"\n学生:"
10                         +user.getStr("user_name")+"所在班级是:"+user.getStr("class_name"));
11         // 传参
12         setAttr("userName", user.getStr("user_name"));
13         setAttr("userClass", user.getStr("class_name"));
14         
15         renderJsp("/login.jsp");
16     }

ps: 需要在ehcache.xml 中进行配置 例如:<cache name="/user/testCache"...>

方式二:使用注解

// 使用注解的方式,取代默认的actionKey作为actionName 需要在ehcache.xml 中进行配置 例如:<cache name="testCache"...>

@CacheName("testCache")

清除缓存:

1 /**
2      * EvictInterceptor可以根据CacheName注解自动清除缓存
3      */
4     @Before(EvictInterceptor.class)
5     @CacheName("testCache")
6     public void testEvict() {
7         
8         redirect("login.html");
9     }

 

5、forward内部跳转 和redirect重定向跳转的区别(面试经常被问到)

<1>.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

<2>.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.

<3>.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

<4>.从效率来说
forward:高.
redirect:低.

6、CacheKit 缓存操作工具

示例如下:

 

 1     /**
 2      * CacheKit 是缓存操作工具类
 3      */
 4     public void testCacheKit() {
 5         final String sql = "select * from post_user u inner join post_class c on u.user_class_id = c.class_id"
 6                    + " where u.user_name= ?";
 7         // 从缓存中取出
 8         User user = CacheKit.get("testCache", "user");
 9         if(user == null) {
10             user = User.user.findFirst(sql,"张三丰");
11             // 放入到缓存
12             CacheKit.put("testCache", "user",user);
13         }
14         setAttr("userName", user.getStr("user_name"));
15         setAttr("userClass", user.getStr("class_name"));
16         
17         render("/login.html");
18         
19         /**
20          *CacheKit重载CacheKit.get(String,String,IDataLoader)方法示例
21          *
22          * CacheKit.get方法提供一个IDataLoader接口,该接口中的load方法在缓存不存在时才会被调用
23          * 
24          */
25         user = CacheKit.get("testCache", "user",new IDataLoader() {
26             
27             public Object load() {
28                 // TODO Auto-generated method stub
29                 return User.user.findFirst(sql,"张三丰");
30             }
31         });
32         
33     }
34
35

 

 

 

转载于:https://www.cnblogs.com/huaxingtianxia/p/5509334.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值