JFinal
Posted yu-si
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JFinal相关的知识,希望对你有一定的参考价值。
JFinal
认识JFinal
web开发框架
概括:精简,使用,急速。
JFinal入门Hello word
Maven下开发:添加Jfinal依赖
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>3.4</version>
</dependency>
添加web项目,配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<!--主配置类路径-->
<param-value>com.ys.config.JfConfig</param-value>
</init-param>
</filter>
<!--过滤器-->
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
主配置类JFinalConfig配置
package com.ys.config;
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
//继承JFinalConfig并重写6个方法
public class JfConfig extends JFinalConfig {
//启动方法,内置服务器
public static void main(String[] args) {
//这个注意web的路径
JFinal.start("web",8091,"/",5);
}
//常量配置
public void configConstant(Constants me) {
}
public void configRoute(Routes routes) {
routes.add("/",JfController.class);//路由
}
public void configEngine(Engine engine) {
}
public void configPlugin(Plugins me) {
}
public void configInterceptor(Interceptors interceptors) {
}
public void configHandler(Handlers handlers) {
}
}
Controller层
package com.ys.config;
import com.jfinal.core.Controller;
import com.ys.Model.UserModel;
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
//Controller需要继承Controller类添加路由加指定方法为接口
public class HelloController extends Controller {
//路径不填写方法名默认访问index方法
public void index() {
renderText("Hello,JFinal!");//返回文本到页面
}
}
JFinalConfig配置详解
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
public class JfConfig extends JFinalConfig {
//启动方法
public static void main(String[] args) {
//配置web,端口,拼接路径,
JFinal.start("web",8091,"/",5);//注意web的路径
}
//常量配置
public void configConstant(Constants me) {
//配置的路径运行时参数不能为空,会报错
me.setDevMode(true);//开启开发模式打印日志信息
// me.setBaseDownloadPath("");//设置文件渲染的默认路径
// me.setBaseUploadPath("");//设置上传文件存放的默认路径
// me.setBaseViewpath("");//设置路由视图的默认路径
me.setEncoding("utf-8");//设置JFinal编码格式
me.setError404View("404.html");//设置404错误视图
// me.setError404View("401.html");//设置401错误视图
me.setError500View("500.html");//设置500错误视图
// me.setI18nDefaultBaseName("");//设置国际化的默认名字
// me.setI18nDefaultLocale("");//设置国际化的默认语言
// me.setReportAfterInvocation(true);//设置先打印log,还是先执行方法,true先执行方法后打印log
// me.setTokenCache(null);//设置Token的缓存---token防止用户多次提交的比如转账----(暂时还没明白有什么用)
// me.setMaxPostSize(1024 * 1024 * 10);//设置上传文件的大小,参数可以理解为文件上传的大小1024*1024为1M 再*10就是10M
// me.setFreeMarkerTemplateUpdateDelay(0);//设置FreeMarker模板引擎的更新时间
// me.setUrlParaSeparator("");//设置URl的分隔符,默认分隔符是中划线‘-‘,可以设置别的,例如改为下划线
me.setViewType(ViewType.FREE_MARKER);//没设置,默认的是FREE_MARKER模板
}
public void configRoute(Routes routes) {
routes.add("/hello",HelloController.class,"hello");//路由
}
public void configEngine(Engine engine) {
}
public void configPlugin(Plugins me) {
}
public void configInterceptor(Interceptors interceptors) {
}
public void configHandler(Handlers handlers) {
}
}
JFinal-Controller控制器详解
Controller简介
控制器Controller是MVC中的C,是用来接收和处理浏览器提交的信息的核心的类。
在Jfinal里继承了Controller才是Controller层。
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
public class HelloController extends Controller {
public void index() {
renderText("Hello,JFinal!");//返回文本
}
}
Action
Action简单点就是Controller得方法。
方法等级必须为pubilc修饰,没有参数,必须在Controller里面,不受返回值影响。
可以加@ActionKey,如果没加就是方法名。
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
public class HelloController extends Controller {
@ActionKey("index")
public void index() {
renderText("Hello,JFinal!");//返回文本
}
}
路由
路由简单点讲就是可以找到Controller层。
路由代码在Jfinal配置下的configRoute方法里:
Jfinal配置类:
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
public class JfConfig extends JFinalConfig {
//启动方法
public static void main(String[] args) {
//配置web,端口,拼接路径,
JFinal.start("web",8091,"/",5);//注意web的路径
}
public void configConstant(Constants me) {
}
public void configRoute(Routes routes) {
//路由,/hello路径前部分,方法名或@ActionKey("index")名为后部位拼接在HTTP路径上
routes.add("/hello",HelloController.class,"hello");
}
public void configEngine(Engine engine) {
}
public void configPlugin(Plugins me) {
}
public void configInterceptor(Interceptors interceptors) {
}
public void configHandler(Handlers handlers) {
}
}
Controller层
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
public class HelloController extends Controller {
//路径不填写方法名默认访问index方法
public void index() {
//里面还有很多别的方法,和重载方法
// renderFile();//返回文件
// renderJson();//返回json字符串
// renderJsp();//返回字符串
// render("/index.html");//返回Html页面
// render("hello.html");//会在路由找视图路径 /hello/hello.html
// render("/hello.html");//会在web根路径下找视图
renderText("Hello,JFinal!");//返回文本
}
}
数据接收
getPara及系列方法
JFinal数据提交的三种方式
-
普通的http get提交
-
普通的http post提交
form表单(post和get一样)
<form action="/index" method="post" enctype="multipart/form-data"> <input type="text" name="title" placeholder="标题"> <input type="text" name="subtitle" placeholder="副标题"> <textarea name="content" placeholder="文章内容..."/> <button type="submit" id="tijiao">保存</button> </form>
package com.ys.Controller; /** * @Author 渝思 * @Date 2020/4/8 9:21 * @Version 1.0 */ public class HelloController extends Controller { //路径1 没jpress的方法会被index当成参数 public void index() { String title = getPara("title");//根据name命名接收 String subtitle = getPara("subtitle"); String content = getPara("content"); System.out.println(title+subtitle+content);//输出内容 render("/Hello.html");//web根目录下页面 } }
-
Jfinal独有的url参数化提交
127.0.0.1:8080/jpress 路径1
127.0.0.1:8080/test/jpress 路径2
路径1会先找jpress这个方法,如果找不到会找默认的index方法执行,jpress会被当成参数,如果没有index则,404
路径二没有jpress这个方法会根据test找方法,如果找不到test方法则,404
package com.ys.Controller; /** * @Author 渝思 * @Date 2020/4/8 9:21 * @Version 1.0 */ public class HelloController extends Controller { //路径1 没jpress的方法会被index当成参数 public void index() { String jpress = getPara(); System.out.println(jpress);//输出数值jpress render("/Hello.html");//web根目录下页面 } }
getPara();
提交路径
127.0.0.1:8080/test/test1?key1=value1&key2=value2
Controller层接收
package com.ys.Controller;
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
public class HelloController extends Controller {
public void test1() {
String value1 = getPara("key1");
System.out.println(value1);//输出数值
String value2 = getPara("key2");
System.out.println(value2);//输出数值
render("/Hello.html");//web根目录下页面
}
}
路径分隔符设置
// me.setUrlParaSeparator("");//设置URl的分隔符,默认分隔符是中划线‘-‘,可以设置别的,例如改为下划线
me.setUrlParaSeparator("@");//设置@为分隔符
127.0.0.1:8080/(一般路由定义前半部分)/test1@aa@张三 路径
package com.ys.Controller;
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
public class HelloController extends Controller {
public void test1() {
System.out.println(getPara(0));//输出数值aa
String value = getPara(1);
System.out.println(value);//输出数值
System.out.println(URLDecoder.decode(value));//中文解码张三
System.out.println(getPara(2));//输出数值null
String value = getPara(3,“默认值参数”);//当没有第三个参数的时候会报空指针,这里可以设置个默认值---输出(默认值参数)
int value1 = getParaToInt(4,"4")//路径传的字符转为int 没有参数默认为4
//getParaToBoolean();//转为布尔
//getParaToDate();//转为时间
//getParaToLong();//转为long
render("/Hello.html");//web根目录下页面的页面
}
}
getModel和getBean
getBean和getModel的区别
使用的区别: getBean只是 一 个javaBean, getModel必须是一个和数据库映射的一一个JFinal Model
JFinal解析方法不同,getBean是依赖get和iset方法去取值和设置属性。getModel以基 于put和get
getBean
写一个bean类
package com.ys.Controller;
/**
* @Author 渝思
* @Date 2020/4/22 21:39
* @Version 1.0
*/
//文章类
public class Article {
private long id;
private String title;//标题
private String subtitle;//副标题
private String content;//内容
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title=‘" + title + ‘‘‘ +
", subtitle=‘" + subtitle + ‘‘‘ +
", content=‘" + content + ‘‘‘ +
‘}‘;
}
//getset方法太长省略。。。。。
}
Controller层
package com.ys.Controller;
/**
* @Author 渝思
* @Date 2020/4/8 9:21
* @Version 1.0
*/
public class HelloController extends Controller {
public void test1() {
Atricle article = getBean(Atricle.class);
//Atricle article = getBean(Atricle.class,"arl");//在表单可以用别名点。
Atricle article = getBean(Atricle.class,"");//放个空字符串可以在表单省略类实例名点。
System.out.println(article);//bean类重写了toString方法,输出接收的数值。
System.out.println("title:"+article.getTitle);
System.out.println("Subtitle:"+article.getSubtitle);
render("/Hello.html");//web根目录下页面。
}
}
表单需要用类名点(这里的类名可以用别名)
<form action="test/test1" method="post" enctype="multipart/form-data">
<input type="text" name="title" placeholder="标题">//Controller设置默认为空字符串,省掉实例名
<input type="text" name="arl.title" placeholder="标题">
<input type="text" name="article.subtitle" placeholder="副标题">
<input type="text" name="arl.subtitle" placeholder="副标题">
<textarea name="article.content" placeholder="文章内容..."/>
<textarea name="arl.content" placeholder="文章内容..."/>
<button type="submit" id="tijiao">保存</button>
</form>
getModel
因和数据库对应字段暂略。。。。。
getFile接收文件上传
表单上传文件
//表单上传文件必设置enctype="multipart/form-data"
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="touxiang" >
<input type="file" name="shenfenzheng" >
<button type="submit" id="tijiao">提交</button>
</form>
Controller层
//上传
public void upload(){
List<UploadFile> files = getFiles();//接收批量文件
//通过表单的name来区分接收的文件或图片
UploadFile touxiang = getFile("touxiang");
//第二个参数是保存相应的路径,会在config设置的目录下创建一个imgUpload的文件夹。
UploadFile shenfenzheng = getFile("shenfenzheng","imgUpload");
//调用getFile 必须是multipart/form-data
//文件大小的限制可能会出错,通过config的setMaxPostSize(1024 * 1024 * 10)设置允许上传的最大数据
//getFile();必须依赖于cos-26Dec2008.jar
//getFile();必须在第一行,因为Http传输必须传完multipart/form-data的数据,才能接收其他参数,否则其他参数接收不到。
//getFile();默认上传的位置是webapp下的upload,可以通过在config的setBaseUploadPath("");设置保存的路径会在
// webapp路径下生成一个文件夹
renderText("Hello,JFinal!");
}
文件的上传与CDN整合
什么是CDN?
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之.上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
七牛云存储服务器就属于CDN。还有阿里云存储......
文件与CDN整合的方式
- 通过CDN云存储的API主动提交
通过API随时可以提交、修改、删除缓存文件,功能较
多,但是实施困难,编写代码较多,不够灵活。 - 通过CDN的镜像功能被动拉取
无法通过API修改或删除文件,只能等了CDN去修改
或删除,但是使用简单,稳定。配置灵活。
HTTP协议详解
Cookie与Session的操作
Cookie的安全问题解决方案
Session在分布式环境应该注意的问题及解决方案
Render与UI渲染
转发与跳转
防止重复提交
验证码与注意事项
KeepPara、KeepModel与KeepBean
Jfinal处理器Handler-Handler简介
编写自己的一个handler
使用handler来做伪静态功能
使用Handler来做路由的重新分配
使用handler来对特定请求拦截
JPress使用了handler来做了哪些事情
Jfinal拦截器详解-拦截器简介
编写自己的一个拦截器
@Before和Clear的灵活使用
JFinal自带的拦截器功能讲解
拦截器在实际开发过程中应该注意哪些问题
JPress使用拦截器来做了哪些事情
Jfinal数据库操作-Jfinal数据库配置
-
创建数据库
-
配置数据源
导入jra包,这里导入了maven依赖
<dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal</artifactId> <version>3.4</version> </dependency> <dependency> <groupId>com.jfinal</groupId> <artifactId>jetty-server</artifactId> <version>8.1.8</version> <!--idea--> <!--<scope>compile</scope>--> </dependency> <!--引入druid数据源--> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!--mysql驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> <!--FreeMarker 跳页面需要--> <!-- freemarker jar --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency>
Config配置
package com.ys.config; /** * @Author 渝思 * @Date 2020/4/8 9:21 * @Version 1.0 */ public class JfConfig extends JFinalConfig { //启动方法 public static void main(String[] args) { //配置web,端口,拼接路径, // JFinal.start("web",8091,"/",5); //因为使用idea这里要把最后一个参数去掉,否则会和Druid冲突启动不了 JFinal.start("web",8091,"/"); } //常量配置 public void configConstant(Constants me) { me.setDevMode(true);//开启开发模式打印日志信息 } public void configRoute(Routes routes) { routes.add("/hello",HelloController.class,"hello");//路由 } public void configEngine(Engine engine) { } public void configPlugin(Plugins me) { //在jfinal里缓存或数据源等等...都看作是一个插件 // me.add(new EhCachePlugin()); //准备设置哪个数据源.....这里是Druid插件 DruidPlugin druidPlugin = new DruidPlugin("jdbc:mysql://127.0.0.1:3306/jfinal","root","root");//使用Druid数据源 me.add(druidPlugin); //选择哪个数据源即插件 ActiveRecordPlugin arPlugin = new ActiveRecordPlugin(druidPlugin);//把数据源当成插件来使用 arPlugin.addMapping("j_user",UserModel.class);//对应数据库表和Model类 arPlugin.setShowSql(true);//true参数:在控制台打印sql语句 me.add(arPlugin); } public void configInterceptor(Interceptors interceptors) { } public void configHandler(Handlers handlers) { } }
Model层
package com.ys.Model; import com.jfinal.plugin.activerecord.Model; /** * @Author 渝思 * @Date 2020/4/8 22:43 * @Version 1.0 */ //继承Model public class UserModel extends Model<UserModel> { public static final UserModel Dao = new UserModel();//可以把Dao当作一个工具类 }
Service层
package com.ys.Service; /** * @Author 渝思 * @Date 2020/4/24 22:27 * @Version 1.0 */ public class CRUDService { private static final UserModel Dao = new UserModel(); //传一个id,返回该id的数据 public static UserModel findById(Object id){ return Dao.findById(id); } }
Controller层
package com.ys.Controller; /** * @Author 渝思 * @Date 2020/4/24 21:25 * @Version 1.0 */ public class CRUDController extends Controller { //UserModel.Dao一般当成一种工具,适合用查询和删除,修改数据的时候可能会出问题。 //增 public void setUser(){ UserModel userModel = new UserModel(); userModel.set("name","渝思"); userModel.set("password","123456"); userModel.save();//保存,save()一个model对象不能出现两次,一个save会自动创建id。两个save()会有俩会冲突。 renderText("增加成功!"); } //删 public void delUser(){ UserModel.Dao.deleteById(2);//根据id删除记录 renderJson("删除成功!"); } //改 public void upUser(){ UserModel userModel = new UserModel(); userModel.set("id",1);//设置id。 userModel.set("name","李四");//更新名字。 userModel.set("password","456789");//更新名字。 userModel.update();//确定修改。 renderJson("修改成功!"); } //查 public void getUser(){ // 根据id // UserModel dbuser = UserModel.Dao.findById(1);//根据id查询 UserModel dbuser = UserModel.Dao.findFirst("select * from j_user where id = 1");//用sql根据id查询 String name = dbuser.getStr("name");//获得数据 String password = dbuser.getStr("password"); // dbuser.getLong("id");//查询id dbuser.getStr("name");// //使用service层类 UserModel byId = CRUDService.findById(8); String name1 = byId.getStr("name");//用service层用dao工具查询 System.out.println(name1); renderJson("查询成功:name:"+name1+"password:"+password+"id:"); } }
get页面获取结果:
set数据库结果:
-
配置连接驱动
以上是关于JFinal的主要内容,如果未能解决你的问题,请参考以下文章