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修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
jfinal手册
jfinal手册本文档是 jfinal 手册,主要介绍 jfinal 的各种用法。
该手册包含以下内容:一、jfinal简介二、安装jfinal三、jfinal的配置四、jfinal的常用API五、使用jfinal进行Web应用开发六、总结一、jfinal简介JFinal 是一个基于 Java 的 Web 开发框架,提供了一整套的开发工具,可以帮助开发者更快捷、高效的开发出企业级的 Web 应用。
它提供了一套简单而强大的 MVC 模型,允许开发者将业务逻辑与展示层分离,提高了代码的可读性。
JFinal 是一个轻量级的框架,它只有几十兆的 jar 包,其安装与配置非常容易,而且框架内部提供了大量的 API,可以满足企业级应用开发的需求。
二、安装 jfinal要使用 jfinal,首先需要安装它,安装 jfinal 的方法非常简单,只需要下载 jfinal 的 jar 包,然后把它添加到项目的 build path 中就可以了。
三、jfinal的配置配置 jfinal 是一个很重要的环节,因为它决定了 jfinal 的正常运行。
要配置 jfinal,需要在 web.xml 中添加 jfinal 的相关配置,如下所示:<servlet><servlet-name>jfinal</servlet-name><servlet-class>com.jfinal.core.JFinal</servlet-class> <init-param><param-name>configClass</param-name><param-value>com.xxx.xxx.xxx.xxx.JFinalConfig</param-value> </init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>jfinal</servlet-name><url-pattern>/</url-pattern></servlet-mapping>四、jfinal的常用APIJFinal 框架提供了一系列的 API,可以用来满足企业级应用开发的需求,下面列举出几个常用的 API:1. JFinalConfig:用于配置 jfinal 的配置类,用于定义jfinal 的基本配置。
jfinal框架功能进行总结介绍
jfinal框架功能进行总结介绍JFinal是基于Java语言的极速web开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展以及Restful。
以下是JFinal框架的主要功能特性:1. MVC架构:JFinal框架采用了MVC(Model-View-Controller)架构,这种架构将业务逻辑、数据和界面分离,提高了代码的可读性和维护性。
开发者可以专注于业务逻辑的开发,从而简化了开发过程。
2. ORM支持:JFinal框架内置了ActiveRecord模式,这使得数据库操作变得非常简单。
开发者无需编写繁琐的SQL语句,只需通过简单的API调用,即可完成数据库的增删改查操作。
3. 自动加载:JFinal框架提供了自动加载功能,可以自动扫描和加载项目中的Controller、Model、Plugin等类,无需手动配置。
4. 路由支持:JFinal框架提供了强大的路由功能,支持自定义URL路由规则,可以轻松地实现URL的美化和优化。
5. 拦截器:JFinal框架支持拦截器功能,可以在请求处理之前或之后执行特定的逻辑,如权限验证、日志记录等。
6. 视图技术:JFinal框架支持多种视图技术,如JSP、FreeMarker和Velocity等,开发者可以根据需求选择合适的视图技术来展示页面和与用户交互。
7. 插件机制:JFinal框架提供了插件机制,允许开发者通过编写插件来扩展框架的功能,以满足特定的业务需求。
8. 异常处理:JFinal框架提供了统一的异常处理机制,可以捕获和处理项目中的异常,保证程序的稳定性和可靠性。
9. 国际化支持:JFinal框架支持国际化功能,可以轻松地实现多语言支持,满足不同国家和地区用户的需求。
10. 日志记录:JFinal框架内置了日志记录功能,可以记录项目的运行日志和操作日志,方便开发者和运维人员进行故障排查和性能分析。
总之,JFinal框架是一个功能强大且易于使用的Java Web开发框架,它提供了丰富的功能和特性,可以帮助开发者快速构建高质量的Web应用程序。
4.JFinal开发框架使用经验交流分享
■目录
框架简介 前后台开发整体流程 框架提供的实用功能 常用UI组件使用说明 Any Questions?
■框架简介
JFinal框架是基于前台DWZ富客户端框架和后台Nutz轻量级开发框 架搭建,本意为指环,象征着团队精神。
DWZ框架展现的界面使用jQuery局部渲染技术,与后台交互方式完 全采用Ajax的方式进行。主界面固定分为四个区域,其中D区作为动态界 面展示区域,即我们编写 的JSP页面基本都是通过 点击左侧C区中的某个菜 单后渲染到D区来显示的。
■框架简介
Nutz框架本身不依赖于任何第三方类库,整体jar包体积大小不超1.5M。它 是一组轻便小型的框架的集合,各个部分可以被独立使用。Nutz以不损害运行时 效率为前提使Java 开发人员可以获得更快的开发速度和更少的代码量,从而最大 ቤተ መጻሕፍቲ ባይዱ度的提高Web开发人员的生产力。
MVC
• 注解…风格的配置,内置多文件上传功能
■Service服务层实现业务逻辑
1、首先需要在对应模块的service包 下创建接口并继承自IBaseService; 2、在service.impl包下创建对应的实 现类并继承自BaseServiceImpl,命名 规则接口以I开头,实现类取接口名称 去掉I并以Impl结尾; 3、实现类中定义有参构造方法并声明 @IocBean注解,args对应构造方法的 参数,name为Service在Ioc容器中的 名称。 4、接口中声明抽象方法,实现类中编 写个性化操作的业务代码。
■简单数据导出功能
■通用文件池设计
在Action方法上声明UploadAdapter类型的@AdapterBy注解后即 可作为文件上传的入口。若适配器UploadAdapter是从Ioc容器中获取的 attachUploadAdapter实例,那么在系统启动时,会自动在应用服务器 所在磁盘根目录创建upload/attach文件夹。当文件上传成功后,会自动 在attach子目录下创建固定格式的文件,并将上传文件的相关信息记录在 sys_upload表中,通过UploadFile实体可以查询或删除。
Java笔记之面向对象进阶(3)
Java中final的使用及抽象类与接口基础一.final关键字在Java中final也是一个比较常用的关键字。
声明类、变量和方法时,可以使用关键字final来修饰。
final标记的类不能被继承final标记的方法不能被子类覆写final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
(这里有一点规定:在Java中被final标记的变量最好用大写表示)全局常量:public static finalpublic:所有人都可以访问,访问权限最大。
static:静态的,是所有对象共享的。
final:常量。
二.抽象类概括来说,抽象类就是包含抽象方法的类。
而抽象方法就是一个只有声明而没有实现的方法。
抽象类中包括:1.已经定义好的方法。
如public void fun(){}2.未定义方法的方法名。
如abstract public void fun();抽象类与普通类的差别只在两处:1.比普通类的定义中多出至少一个抽象方法,普通类的所有定义在抽象类中都可以使用。
2.在类的声明处需要用关键字abstract声明为抽象类,抽象方法也必须用abstract来声明成抽象方法。
抽象类的使用规则:1.抽象类不能被直接实例化,也就是不能直接用new关键字去实例化对象。
2.抽象方法只需声明,而不需实现。
3.含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆写所有的抽象方法。
这里对第3条进行一个说明:抽象类必须有子类,并且子类如果不是抽象类的话就要全部覆写父抽象类中的抽象方法。
4.抽象类也依然属于Java中的单继承模式,即一个子类只能有唯一的父类。
5.抽象类本身是可以包含构造方法的,子类对象在实例化时依然先实例化父类中的属性,再实例化本类中的属性。
完全符合子类对象的实例化过程。
三.接口(interface)接口是抽象方法和常量的集合说明:抽象类中包含抽象方法,那如果该类中全部是抽象方法时,则用接口表示。
接口中还包括有全局常量:public static final接口中的访问权限永远是public接口的定义interface 接口名{数据类型变量名=值;返回值类型方法名([参数]);}接口的执行在程序中叫做实现,即一个接口必须通过子类实现。
jfinal 动态sql语句基本语法
jfinal 动态sql语句基本语法摘要:1.JFinal 简介2.动态SQL 语句的概念3.JFinal 中动态SQL 语句的基本语法4.示例正文:【1.JFinal 简介】JFinal 是一款基于Java 语言的Web 开发框架,它具有简洁、快速、安全的特点。
在JFinal 中,我们可以使用动态SQL 语句来构建动态的SQL 查询,从而满足不同场景下的查询需求。
【2.动态SQL 语句的概念】动态SQL 语句是指在程序运行时,根据程序的实际需求动态生成的SQL 查询语句。
与静态SQL 语句相比,动态SQL 语句具有更好的灵活性和可扩展性。
【3.JFinal 中动态SQL 语句的基本语法】在JFinal 中,我们可以使用`Sql`类和`SqlSegment`类来构建动态SQL 语句。
以下是一些基本的语法示例:- 构建简单的动态SQL 查询:```javaSql sql = new Sql();sql.select("id, name").from("user");```- 构建带条件的动态SQL 查询:```javaSql sql = new Sql();sql.select("id, name").from("user").where("age >", 18);```- 构建复杂的动态SQL 查询:```javaSql sql = new Sql();sql.select("id, name").from("user").where("age >", 18).and("gender =", "male");```- 使用`SqlSegment`构建动态SQL 查询:```javaSqlSegment sqlSegment = new SqlSegment("user", "id, name");sqlSegment.where("age >", 18);sqlSegment.and("gender =", "male");```【4.示例】以下是一个简单的示例,展示如何使用JFinal 的动态SQL 语句查询用户信息:```javapublic void queryUserInfo() {Sql sql = new Sql();sql.select("id, name, age, gender").from("user").where("age >", 18).and("gender =", "male");List<Map<String, Object>> userList = sql.queryForList();for (Map<String, Object> userInfo : userList) {System.out.println(userInfo);}}```通过以上示例,我们可以看到如何使用JFinal 的动态SQL 语句来查询满足条件的用户信息。
Java中final与static关键字总结
一.final总结1.final修饰类:表示该类不可继承final不能修饰interface接口2.final修饰方法:表示该方法不能被子类覆盖(即子类不能重写父类的final方法,可以继承)final不能修饰构造函数3.final修饰字段属性:表示属性值第一次初始化后不能被修改final属性可以直接初始化或在构造函数中初始化如果属性是直接初始化,则其值不能被其它函数(包括构造函数)修改4.final修饰函数参数参数值不能被函数修改5.final修饰函数中的局部变量局部变量被第一次初始化后不能被修改public void hello() {final String name;name = "hi"; //okname = "hello"; //error}使用final的意义:第一,为方法“上锁”,防止任何继承类改变它的本来含义和实现。
设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。
第二,提高程序执行的效率,将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里(内嵌机制)。
二.static总结1.static修饰成员函数:该成员函数不能使用this对象static不能修饰构造函数static不能修饰函数参数static不能修饰局部成员变量2.static修饰成员字段当类被虚拟机加载时,首先按照字段声明的先后顺序对static成员字段进行初始化3.static修饰语句块当类被虚拟机加载时,按照声明顺序先后初始化static成员字段和static 语句块static所修饰的方法和字段是只属于类,所有对象共享。
在static所修饰的函数和语句块中不能使用非static成员字段。
在Java不能直接定义全局变量,是通过static来实现的在Java中没有const,不能直接定义常量,通过static final来实现。
JAVA学习(final关键字,抽象类,接口,多实现)
四、多实现
JAVA中不支持多继承,因为会出现调用的不确定性,所以JAVA将多继承机制进行了改良,形成了多实现。 一个类可以实现多个接口(一个类在继承另一个类的同时,还可以实现多个接口) 例如: 1.定义接口A:
2.定义接口B:
3.类Person可以实现多个接口:
实现方法Hello同时覆盖了两个接口中的抽象方法
例如:
public abstract class animal { abstract void roar();
} public class dog extends animal{
void roar(){ System.out.println("汪汪");
} } public abstract class wolf extends animal{
写法规范:常量所有字母都大写,多个单词中间使用下划线连接。
二、抽象类
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。 使用abstract class来定义抽象类:
三、接口
当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface 定义接口使用interface关键字,而不是class关键字
类与类之间是继承关系,类与接口之间是实现关系。
对于接口常见的成员,这些成员都有固定的修饰符:
1.全局变量:public static final 2.抽象方法:public abstract
Java中final变量使用总结
Java中final变量使⽤总结final关键字可⽤于变量声明,⼀旦该变量被设定,就不可以再改变该变量的值。
通常final定义的变量为常量。
如:复制代码代码如下:final double PI = 3.14;当在程序中使⽤PI这个常量时,它的值就是3.14,如在程序中再次对定义为final的常量赋值,编译器将不能接受;final关键字定义的变量必须在声明时对其进⾏赋值操作。
final除了可以修饰基本数据类型的常量,还可以修饰对象引⽤。
由于数组也可以被⽤作⼀个对象引⽤,所以final可以修饰数组。
⼀旦⼀个对象引⽤被修饰为final后,它只能恒定指向⼀个对象,⽆法将其改变为另⼀个对象。
⼀个既是static⼜是final的字段只占据⼀段不能改变的存储空间。
如下例:import static ng.System.out;import java.util.Random;class Test{int i = 0;}public class FinalData {static Random rand = new Random();private final int VALUE_1 = 9;//final定义的变量必须使⽤⼤写字母命名private static final int VALUE_2 = 10;//并且使⽤下划线进⾏连接;private final Test test = new Test();private Test test2 = new Test();private final int[] a = {1,2,3,4,5,6};private final int i4 = rand.nextInt(20);private static final int i5 = rand.nextInt(20);public String toString(){return i4 + "" + i5 + "";}public static void main(String[] args) {FinalData data = new FinalData();//data.test = new Test();//data.VALUE_2++;data.test2 = new Test();for(int i=0; i<data.a.length; i++){//a[i] = 9;}out.println(data);out.println("data2");out.println(new FinalData());out.println(data);}}⼀个被定义为final的对象只能指向唯⼀⼀个对象,不可以将它指向其他对象,但是⼀个对象本⾝的值确实可以改变的,那么为了使⼀个常量真正做到不可更改,可以将常量说明为static final. 如下例:import static ng.System.out;import java.util.Random;public class FinalStaticData {private static Random rand = new Random();private final int a1 = rand.nextInt(10);private static final int a2 = rand.nextInt(10);public static void main(String[] args) {FinalStaticData fdata = new FinalStaticData();//实例化⼀个对象out.println("重新实例化对象调⽤a1的值:" + fdata.a1);out.println("重新实例化对象调⽤a2的值:" + fdata.a2);FinalStaticData fdata2 = new FinalStaticData();// 实例化新对象out.println("重新实例化对象调⽤a1的值:" + fdata2.a1);out.println("重新实例化对象调⽤a2的值:" + fdata2.a2);}}重新实例化对象调⽤a1的值:9重新实例化对象调⽤a2的值:2重新实例化对象调⽤a1的值:1重新实例化对象调⽤a2的值:2总结:定义为final常量不是恒定不变的,将随机数赋予final的变量,可以做到每次运⾏程序时改变a1的值,但是a2被定义为static final形式,所以内存中为a2开辟了⼀个恒定的区域,当再次实例化⼀个FianlStaticData对象时,仍然指向a2这块内存区域,所以a2的值保持不变。
- 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系列方法,这时候就要考虑到路径的问题。