jfinal学习笔记
jfinal原理

jfinal原理JFinal是一款基于Java语言的轻量级开发框架,它具有简单易用、高效稳定的特点。
本文将从JFinal的原理角度进行分析,介绍JFinal框架的内部机制和工作原理。
一、JFinal的基本架构JFinal采用了MVC(Model-View-Controller)的设计模式,将应用程序分为模型、视图和控制器三个部分。
其中,模型负责数据的存储和处理,视图负责数据的展示,控制器负责处理用户请求并调用相应的模型和视图。
二、JFinal的核心组件1. JFinalConfig:JFinal框架的配置类,负责配置应用程序的路由、插件、模板引擎等信息。
2. Routes:JFinal框架的路由器,负责根据用户请求的URL匹配相应的控制器和方法。
3. Controller:JFinal框架的控制器,负责处理用户请求,并调用相应的模型和视图进行处理。
4. Model:JFinal框架的模型,负责数据的存储和处理。
5. View:JFinal框架的视图,负责数据的展示。
三、JFinal的工作流程1. 配置阶段:在JFinalConfig类中进行应用程序的配置,包括路由配置、插件配置、模板引擎配置等。
2. 启动阶段:通过JFinal的启动类JFinal.start()方法启动应用程序,初始化相关组件,如数据库连接、插件等。
3. 请求处理阶段:当用户发起请求时,JFinal框架首先通过Routes 类将请求URL与相应的控制器和方法进行匹配,然后调用该方法进行处理。
4. 控制器处理阶段:控制器接收到请求后,根据业务逻辑调用相应的模型和视图进行处理,并返回处理结果。
5. 视图渲染阶段:视图负责将处理结果生成相应的HTML页面,并返回给用户。
6. 响应发送阶段:JFinal框架将HTML页面封装成HTTP响应,发送给浏览器进行展示。
四、JFinal的特点1. 简单易用:JFinal提供了简洁明了的API,开发人员可以快速上手,提高开发效率。
jfinal 传数组当参数

jfinal 传数组当参数(原创版)目录1.JFinal 简介2.传数组参数的背景和需求3.传数组参数的方法和示例4.注意事项和建议正文【1.JFinal 简介】JFinal 是一款基于 Java 语言的 Web 开发框架,以其简洁、快速、安全的特点受到了广大开发者的喜爱。
在 JFinal 中,我们可以通过控制器(Controller)来处理用户的请求,并返回相应的响应。
【2.传数组参数的背景和需求】在实际开发过程中,我们可能需要将数组作为参数传递给控制器方法。
例如,某个网页表单提交后,需要将表单中的数据(可能包含多个值)以数组形式传递给后端处理。
为了满足这一需求,JFinal 提供了相应的实现方法。
【3.传数组参数的方法和示例】在 JFinal 中,我们可以通过以下方式将数组作为参数传递给控制器方法:1.在 URL 中直接传递数组参数。
例如,访问`/user/save?arr=1&arr=2&arr=3`,其中`arr`参数包含了一个包含三个整数值的数组。
2.在请求头(Request Header)中传递数组参数。
例如,访问`/user/save`,并在请求头中设置`arr=1&arr=2&arr=3`。
3.在请求体(Request Body)中传递数组参数。
例如,使用 Ajax 请求访问`/user/save`,并在请求体中包含`arr[]=1&arr[]=2&arr[]=3`。
需要注意的是,在使用数组参数时,JFinal 会自动对数组进行解析,并根据数组的实际类型(例如,整型、字符串型等)进行相应的处理。
此外,在传递数组参数时,建议使用`&`代替`&&`进行连接,以避免潜在的编码问题。
【4.注意事项和建议】在实际开发过程中,为了保证程序的健壮性和易读性,建议注意以下几点:1.尽量使用 URL 传递数组参数,以便于调试和分析。
jfinal框架的使用

jfinal框架的使用JFinal框架是一款基于Java语言开发的轻量级Web框架,它的设计理念是简单、灵活和高效。
它采用了MVC(Model-View-Controller)架构模式,能够快速开发出高性能、易维护的Web应用程序。
在JFinal框架中,Controller是核心控制器,负责接收用户请求并调用相应的业务逻辑处理。
它通过路由机制将不同的URL映射到不同的Controller方法上,实现了请求的分发。
同时,JFinal还提供了强大的路由配置功能,可以通过注解或配置文件来实现路由的灵活配置,使得路由规则更加清晰明了。
在Controller中,我们可以通过渲染引擎来渲染视图,JFinal默认使用JFinal Template Engine作为渲染引擎,它具有简洁、高效的特点。
通过在Controller中调用render方法,我们可以将数据传递给视图,然后在视图中进行渲染,最终将结果返回给用户。
同时,JFinal还支持其他常用的渲染引擎,如Freemarker、Velocity等,开发者可以根据自己的需求选择使用。
在JFinal框架中,Model负责与数据库进行交互,它通过ORM (Object-Relational Mapping)技术将Java对象映射到数据库表中。
JFinal内置了ActiveRecord模式,简化了数据库操作,开发者只需定义好Model类,即可通过简单的API进行CRUD操作。
同时,JFinal还支持事务管理,保证了数据的一致性和完整性。
除了Controller和Model,JFinal框架还提供了丰富的插件机制,开发者可以通过插件扩展框架的功能。
例如,JFinal提供了JFinal-undertow插件,可以替代默认的Servlet容器,提升系统的性能和稳定性。
此外,JFinal还支持热加载,开发者在修改代码后无需重启应用,即可生效,极大地提高了开发效率。
在JFinal框架中,开发者可以轻松实现RESTful风格的接口,通过注解来定义不同的HTTP请求方式,并通过参数绑定来获取请求参数。
j2se知识点

J2se基本语法学习1、final关键字的意义是变量的值不可以改变,相当于c++中的const关键字。
2、变量对应内存中的一小块区域,从用户接收变量的值放入小区域中,使用时直接运用,但是不同的数据类型声明不同的长度。
3、程序执行过程中的内存分为四个部分:heap(堆空间),stack(栈),datasegment(数据区)Codesegment(代码区),new出来的东西都在heap中,stack存放局部变量。
4、Java变量分为局部变量和成员变量。
局部变量是方法内部定义的变量,类里面,方法外面声明的变量叫成员变量。
5、方法的作用域在哪里,局部变量的作用范围就是多大,在方法定义的大括号外面局部变量不被识别。
6、定义浮点数float f=1.234f,如果不加 f就会出错。
7、容量小的数据类型转换成数据类型大的类型,如int 和long类型运算直接转换成long类型。
8、在程序设计中格式比算法重要!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9、程序格式基本要求:大括号对齐、10、方法返回值暂时存放在栈空间里面,后来被销毁。
字符串常量分配在datasegment中;11、静态变量存放在datasegment 中,用类名加点来访问:如System.out.println();所以out是静态变量。
12、方法是针对某一个对象类调用,静态的方法可以不用针对某个对象调用,所以在static main中不能访问非静态的变量。
静态方法访问非静态变量必须通过对象的形式来访问。
13、Java包机制:必须写在第一句!!!!!!!!!!!!!!!!!!!14、java中的子类中的方法不能有比父类更为严格的访问权限。
15、Java中new出来的对象有一个this指针,指向对象本身,如果这个类是从其他类继承过来的子类,那么对象中还有一个super指针,指向这个对象本身的父类。
16、Java中子类的构造过程必须首先调用父类的构造方法。
jfinal学习笔记

jfinal框架教程-学习笔记上一节介绍了jfinal框架的简单搭建,这节通过一个小例子了解jfinal 的结构和特点先上图1、建数据库(我用的是oracle数据库,其他的相对也差不多)-- Create tablecreate table CLASSES(classesid NUMBER not null,classesname VARCHAR2(20),classesaddress VARCHAR2(50));-- Create tablecreate table STUDENT(studentid NUMBER not null,studentname VARCHAR2(10),studentage NUMBER,studentsex VARCHAR2(2),classesid NUMBER);alter table STUDENTadd constraint FK_CLASSESID foreign key (CLASSESID) references CLASSES (CLASSESID);新建项目,我用的myeclipse,先把jar包导入2、实体类Classes.javapackage com.demo.model;import com.jfinal.plugin.activerecord.Model;public class Classes extends Model<Classes//表名> { public static final Classes dao = new Classes(); }Student.javapackage com.demo.model;import com.jfinal.plugin.activerecord.Model;public class Student extends Model< Student//表名> { public static final Student dao = new Student();public Classes getClasses() {return Classes.dao.findById(get("classesid"));//表的属性}}什么这是实体类?没错!!~ ActiveRecord 是jfinal 最核心的组成部分之一,通过ActiveRecord 来操作数据库,将极大地减少代码量,极大地提升开发效率,配置在后面,我这里用的是Model,Model 是ActiveRecord 中最重要的组件之一,它充当MVC 模式中的Model部分。
javafinal关键字用法技巧汇总解析

java final关键字用法技巧汇总解析谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。
另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。
一、深入理解final关键字在了解了final关键字的基本用法之后,这一节我们来看一下final关键字容易混淆的地方。
1.类的final变量和普通变量有什么区别?当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。
那么final变量和普通变量到底有何区别呢?下面请看一个例子:11publ ic class Te st {public static void main(String[] args) {String a = “hello2”;final String b = “hello”;String d = “hello”;String c = b + 2;String e = d + 2;System.out.println((a == c));System.out.println((a == e));}}View Code大家可以先想一下这道题的输出结果。
为什么第一个比较结果为true,而第二个比较结果为fasle。
这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。
也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。
这种和C语言中的宏替换有点像。
因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的值。
jfinal框架讲解

一、JFinal 简介JFinal 是基于Java 语言的极速 WEB + ORM 开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。
在拥有Java 语言所有优势的同时再拥有ruby、python、php 等动态语言的开发效率!注:ORM:对象关系映射。
二、JFinal 有如下主要特点(1)MVC架构,设计精巧,使用简单。
(2)遵循COC原则,零配置,无xml。
COC原则:Convention over Configuration(CoC)–惯例优于配置原则简单点说,就是将一些公认的配置方式和信息作为内部缺省的规则来使用。
例如,Hibernate的映射文件,如果约定字段名和类属性一致的话,基本上就可以不要这个配置文件了。
你的应用只需要指定不convention的信息即可,从而减少了大量convention而又不得不花时间和精力啰里啰嗦的东东。
配置文件很多时候相当的影响开发效率。
(3)独创Db + Record模式,灵活便利。
(4)ActiveRecord支持,使数据库开发极致快速。
(5)自动加载修改后的java文件,开发过程中无需重启web server。
(6)AOP 支持,拦截器配置灵活,功能强大。
注:AOP :面向切面编程。
(7)Plugin 体系结构,扩展性强。
(8)多视图支持,支持FreeMarker、JSP、Velocity。
(9)强大的Validator后端校验功能。
(10)功能齐全,拥有struts2绝大部分核心功能。
(11)体积小,且无第三方依赖。
三、SSI与JFinal如何取舍不可否认,SSI与JFinal都是非常优秀的架构,两者都有各自的优点,如何进行取舍取决于项目与项目组成员的实际情况!SSI和JFinal的比较注:*表示所在项具有相对优势四、Model与Bean合体(1)极速体验GeneratorJFinal 2.1新增了Generator用来极速生成Model、BaseModel、MappingKit、DataDictionary 文件。
Java关键字final使用总结

Java关键字final使用总结Java关键字final使用总结在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java;根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。
你可能出于两种理解而需要阻止改变:设计或效率。
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
1、final类final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final 的。
在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
2、final方法如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
使用final方法的原因有二:第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。
编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
例如:public class Test1 {public static void main(String[] args) {// TODO 自动生成方法存根}public void f1() {System.out.println("f1");}//无法被子类覆盖的方法public final void f2() {System.out.println("f2");}public void f3() {System.out.println("f3");}private void f4() {System.out.println("f4");}}public class Test2 extends Test1 {public void f1(){System.out.println("Test1父类方法f1被覆盖!");}public static void main(String[] args) {Test2 t=new Test2();t.f1();t.f2(); //调用从父类继承过来的final方法t.f3(); //调用从父类继承过来的方法//t.f4(); //调用失败,无法从父类继承获得}}3、final变量(常量)用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
项目:ht为了防止tp:/和谐/yun.baidu.co请去掉m/share/汉字link?shareid=446316952&uk=6726421102014年12月9日星期二(jfinal)今天是第一天入职,学习jfinal从表中可以看出,JFinal访问一个确切的Action(Action定义见 3.2节)需要使用controllerKey与method 来精确定位,当method 省略时默认值为index。
urlPara 是为了能在url 中携带参数值,urlPara 可以在一次请求中同时携带多个值,JFinal 默认使用减号“-”来分隔多个值(可通过constants. setUrlParaSeparator(String)设置分隔符),在Controller 中可以通过getPara(int index)分别取出这些值。
controllerKey、method、urlPara这三部分必须使用正斜杠“/”分隔。
注意,controllerKey 自身也可以包含正斜杠“/”,如“/admin/article”,这样实质上实现了struts2的namespace功能。
记忆技巧:第一个参数为String 类型的将获取表单或url 中问号挂参的域值。
第一个参数为int 或无参数的将获取urlPara 中的参数值。
2014年12月10日星期三1.注意打字质量,几次打错字而出错!2.理清逻辑思路,居然出现没有配置web.xml3.对陌生的质疑使我畏葸不前,要自信!1.关于add1.首先,页面是添加<form action="/student/save"method="post">姓名:<input type="text"name="student.studentname"/>${studentnameMsg!}${studentnameLMsg!} </form>2.到web.xml<filter><filter-name>jfinal</filter-name><filter-class>com.jfinal.core.JFinalFilter</filter-class><init-param><param-name>configClass</param-name><param-value>com.demo.config.DemonConfig</param-value> </init-param></filter><filter-mapping><filter-name>jfinal</filter-name><url-pattern>/*</url-pattern></filter-mapping>3.到demonconfig/*** 配置路由*/public void configRoute(Routes me) {me.add("/", StudentController.class);me.add("/student", StudentController.class);//me.add("/classes", StudentController.class);}4.到StudentController的save方法@Before(StudentValidator.class)public void save() {Student student = getModel(Student.class);student.save();forwardAction("/student");}5.被StudentValidator拦截protected void validate(Controller c) {// 验证表单域name,返回信息key,返回信息valuevalidateRequiredString("student.studentname", "studentnameMsg", "请输入学生名册");这里也可以用正则验证!validateRegex(field, regExpression, errorKey, errorMessage)}6.反馈7.转回/student,无参调用index()方法@Before(StudentInterceptor.class)public void index() {List<Student> list = Student.dao.find("select * from student");System.out.println(list);setAttr("studentList", list);render("/index.html");}8.被StudentInterceptor拦截public class StudentInterceptor implements Interceptor {public void intercept(ActionInvocation ai) {System.out.println("Before action invoking");ai.invoke();System.out.println("After action invoking");}}9.执行后render("/index.html");10.到index页面<#list studentList as student><tr><td> ${student.studentname} </td><td> ${student.studentage}</td><td> ${student.studentsex} </td><td>${student.getClasses().classesname} </td><td> <a href="/student/delete/${student.studentid}">删除</a> <a href="/student/get/${student.studentid}">修改</a> </td></tr></#list>2.关于delete1.在页面传值<a href="/student/delete/${student.studentid}">删除</a>2.同添加一样,转到StudentController的delete方法public void delete() {//获取表单域名为studentID的值//Student.dao.deleteById(getPara("studentID"));//获取url请求中第一个值Student.dao.deleteById(getParaToInt());forwardAction("/student");}3.关于update1.页面传值<a href="/student/get/${student.studentid}">修改</a>2.同添加一样,转到StudentController的get方法public void get() {Student student = Student.dao.findById(getParaToInt());setAttr("student", student);render("/index2.html");}3.转到index2,提取修改的内容<form action="/student/update"method="post"><input type="text"name="student.studentid"value="${student.studentid}"/>姓名:<input type="text"name="student.studentname"value="${student.studentname}"/><br/>年龄:<input type="text"name="student.studentage"value="${student.studentage}"/><br/>性别:<input type="text"name="student.studentsex"value="${student.studentsex}"/><br/>班级:<input type="text"name="student.classesid"value="${student.classesid}"/><br/><input type="submit"value="保存"/></form>4.提交到StudentController的update()方法public void update() {Student student = getModel(Student.class);student.update();forwardAction("/student");}4.设置view视图为JSPpublic void configConstant(Constants me) {me.setDevMode(true);me.setViewType(ViewType.JSP);}5.访问路径,同struts的命名空间/*** 配置路由*/public void configRoute(Routes me) {me.add("/", StudentController.class);me.add("/student", StudentController.class);//me.add("/classes", ClassController.class);}注解ActionKey(“/add”)将打破原有路由,可以直接访问/add,而不是/student/add @ActionKey("/add")public void add() {render("/add.html");}2014年12月11日星期四使用jfinal放到tomcat运行出错!1.MyEclipse中tomcat启动错误;原因是没有为tomcat 配置JDK2.在发布的项目里要写绝对路径,不然出现资源找不到错误1.开始使用jfinal自带服务是这样的<a href="/student/add">添加</a>2.删掉自带服务,放进tomcat后要配置路径<a href="${contextPath}/student/add">添加</a>3.需要在config里配置上下文路径public void configHandler(Handlers me) {me.add(new ContextPathHandler("contextPath"));//设置上下文路径}3.对映射路径的理解在访问index()方法时,里面可以使用render系列方法,这时候就要考虑到路径的问题。