API里面说到jfinal框架支持JSP视图类型等多种视图类型,然后自己用的也是jsp,对jsp稍微熟悉一点,然后就想看看在jfinal中怎么使用jsp。这里实现一个小小的demo例子,还是基本的增删改查功能。分别使用Mysql和Oracle两种数据库。。。。。
数据库脚本:
1、Mysql
CREATE DATABASE jfinal_demo;
USE jfinal_demo;
CREATE TABLE `blog` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(200) NOT NULL,
`content` mediumtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `blog` VALUES (‘1‘, ‘JFinal Demo Title here‘, ‘JFinal Demo Content here‘);
INSERT INTO `blog` VALUES (‘2‘, ‘test 1‘, ‘test 1‘);
INSERT INTO `blog` VALUES (‘3‘, ‘test 2‘, ‘test 2‘);
INSERT INTO `blog` VALUES (‘4‘, ‘test 3‘, ‘test 3‘);
INSERT INTO `blog` VALUES (‘5‘, ‘test 4‘, ‘test 4‘);
2、Oracle(与上面类似,然后需要建序列)
------创建blog表
CREATE TABLE test_blog
(
id number(11) not null,
title varchar2(200) not null,
content varchar(2000) not null,
constraint pk_id primary key(id)
);
--删除test_blog表
--drop table test_blog;
select * from test_blog;
--创建序列
create sequence test_seq_blog
increment by 1
start with 1
minvalue 1
nomaxvalue
nocycle
cache 20;
--删除序列
--drop sequence test_seq_blog;
--select test_seq_blog.nextval from dual
工程结构截图:
所需jar包:
Mysql的跑通了之后,然后换成Oracle只需要在插件里面配置一下Oracle的相关配置(方言、驱动、大小写敏感等)即可。之后插入的时候设置序列就行了。。。
数据库配置文件信息:
#######Mysql数据库########
#jdbcUrl = jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
#user = root
#password = root
#devMode = true
#######Oracle数据库########
jdbcUrl = jdbc:oracle:thin:@192.168.1.189:1521:testdev
user = netschinaadmin
password = dreamtech
devMode = true
jdbcDriver=oracle.jdbc.driver.OracleDriver
1、核心配置类CoreConfig需继承于JFinalConfig类:
/**
* 文件说明
* @Description:扩展说明
* @Copyright: 2015 dreamtech.com.cn Inc. All right reserved
* @Version: V6.0
*/
package com.demo.config;
import com.demo.controller.blog.BlogController;
import com.demo.controller.index.IndexController;
import com.demo.model.Blog;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.render.ViewType;
/**
* 核心Config配置文件
* @Author: feizi
* @Date: 2015年4月20日 上午9:39:38
* @ModifyUser: feizi
* @ModifyDate: 2015年4月20日 上午9:39:38
* @Version:V6.0
*/
public class CoreConfig extends JFinalConfig {
/**
* 配置常量
* @Discription:扩展说明
* @Author: feizi
* @Date: 2015年4月20日 上午9:39:38
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午9:39:38
* @see com.jfinal.config.JFinalConfig#configConstant(com.jfinal.config.Constants)
*/
@Override
public void configConstant(Constants me) {
//加载系统属性配置文件 随后可用getProperty(...)获取值
loadPropertyFile("system_config_info.txt");
//设置开发模式
me.setDevMode(getPropertyToBoolean("devMode", false));
//设置视图类型为Jsp,否则默认为FreeMarker
me.setViewType(ViewType.JSP);
}
/**
* 配置路由
* @Discription:扩展说明
* @Author: feizi
* @Date: 2015年4月20日 上午9:39:38
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午9:39:38
* @see com.jfinal.config.JFinalConfig#configRoute(com.jfinal.config.Routes)
*/
@Override
public void configRoute(Routes me) {
//第三个参数为该Controller的视图存放路径
me.add("/", IndexController.class,"/index");
me.add("/blog", BlogController.class);
}
/**
* 配置插件
* @Discription:扩展说明
* @Author: feizi
* @Date: 2015年4月20日 上午9:39:38
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午9:39:38
* @see com.jfinal.config.JFinalConfig#configPlugin(com.jfinal.config.Plugins)
*/
@Override
public void configPlugin(Plugins me) {
/**
* 配置Mysql支持
*/
/*//配置c3p0数据库连接池插件
C3p0Plugin cp = new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password"));
me.add(cp);
//配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
me.add(arp);
//映射Blog表到Blog模型
arp.addMapping("Blog", Blog.class);*/
/**
* 配置Oracle支持
*/
//配置c3p0数据库连接池插件
C3p0Plugin cp = new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password"),getProperty("jdbcDriver"));
/*//配置Oracle驱动
cp.setDriverClass(getProperty("jdbcDriver"));*/
me.add(cp);
//配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
me.add(arp);
//配置Oracle方言
arp.setDialect(new OracleDialect());
//配置属性名(字段名)大小写不敏感容器工厂
arp.setContainerFactory(new CaseInsensitiveContainerFactory());
//映射test_blog表到Blog模型(我在Oracle数据库中建的表是这个表名)
arp.addMapping("TEST_BLOG","ID", Blog.class);
}
/**
* 配置全局拦截器
* @Discription:扩展说明
* @Author: feizi
* @Date: 2015年4月20日 上午9:39:38
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午9:39:38
* @see com.jfinal.config.JFinalConfig#configInterceptor(com.jfinal.config.Interceptors)
*/
@Override
public void configInterceptor(Interceptors me) {
}
/**
* 配置处理器
* @Discription:扩展说明
* @Author: feizi
* @Date: 2015年4月20日 上午9:39:38
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午9:39:38
* @see com.jfinal.config.JFinalConfig#configHandler(com.jfinal.config.Handlers)
*/
@Override
public void configHandler(Handlers me) {
}
/**
* 建议使用 JFinal 手册推荐的方式启动项目
* 运行此 main 方法可以启动项目,此main方法可以放置在任意的Class类定义中,不一定要放于此
*/
public static void main(String[] args) {
JFinal.start("WebRoot", 80, "/", 5);
}
}
2、控制器类Controller
/**
* 文件说明
* @Description:扩展说明
* @Copyright: 2015 dreamtech.com.cn Inc. All right reserved
* @Version: V6.0
*/
package com.demo.controller.blog;
import com.demo.interceptor.BlogInterceptor;
import com.demo.model.Blog;
import com.demo.validator.BlogValidator;
import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Page;
/**
* BlogController
* @Author: feizi
* @Date: 2015年4月20日 上午10:45:27
* @ModifyUser: feizi
* @ModifyDate: 2015年4月20日 上午10:45:27
* @Version:V6.0
*/
@Before(BlogInterceptor.class)
public class BlogController extends Controller {
/**
* 默认
* 方法说明
* @Discription:扩展说明
* @return void
* @Author: feizi
* @Date: 2015年4月20日 上午10:56:15
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午10:56:15
*/
public void index(){
Page<Blog> blogPage = Blog.dao.paginate(getParaToInt(0, 1), 10);
setAttr("blogPage", blogPage);
render("blog.jsp");
}
public void add(){
}
/**
* 保存
* 方法说明
* @Discription:扩展说明
* @return void
* @Author: feizi
* @Date: 2015年4月20日 上午10:56:25
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午10:56:25
*/
@Before(BlogValidator.class)
public void save(){
Blog blog = this.getModel(Blog.class);
//Oracle数据库使用序列
blog.set("id", "test_seq_blog.nextval");
blog.save();
forwardAction("/blog");
}
/**
* 编辑
* 方法说明
* @Discription:扩展说明
* @return void
* @Author: feizi
* @Date: 2015年4月20日 上午10:56:32
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午10:56:32
*/
public void edit(){
Blog blog = Blog.dao.findById(getParaToInt());
setAttr("blog", blog.put("page_title", "修改"));
}
/**
* 查看
* 方法说明
* @Discription:扩展说明
* @return void
* @Author: feizi
* @Date: 2015年4月20日 下午5:34:03
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 下午5:34:03
*/
public void view(){
this.setAttr("blog", Blog.dao.findById(getParaToInt()).put("page_title", "查看"));
}
/**
* 修改
* 方法说明
* @Discription:扩展说明
* @return void
* @Author: feizi
* @Date: 2015年4月20日 上午10:56:40
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午10:56:40
*/
@Before(BlogValidator.class)
public void update(){
Blog blog = this.getModel(Blog.class);
blog.update();
forwardAction("/blog");
}
/**
* 删除
* 方法说明
* @Discription:扩展说明
* @return void
* @Author: feizi
* @Date: 2015年4月20日 上午10:56:47
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午10:56:47
*/
public void delete(){
Blog.dao.deleteById(getParaToInt());
forwardAction("/blog");
}
}
/**
* 文件说明
* @Description:扩展说明
* @Copyright: 2015 dreamtech.com.cn Inc. All right reserved
* @Version: V6.0
*/
package com.demo.controller.index;
import com.jfinal.core.Controller;
/**
* IndexController业务类
* @Author: feizi
* @Date: 2015年4月20日 上午10:01:31
* @ModifyUser: feizi
* @ModifyDate: 2015年4月20日 上午10:01:31
* @Version:V6.0
*/
public class IndexController extends Controller {
public void index(){
render("index.jsp");
}
}
3、拦截器配置
/**
* 文件说明
* @Description:扩展说明
* @Copyright: 2015 dreamtech.com.cn Inc. All right reserved
* @Version: V6.0
*/
package com.demo.interceptor;
import com.jfinal.aop.Interceptor;
import com.jfinal.core.ActionInvocation;
/**
* BlogInterceptor
* @Author: feizi
* @Date: 2015年4月20日 上午10:59:12
* @ModifyUser: feizi
* @ModifyDate: 2015年4月20日 上午10:59:12
* @Version:V6.0
*/
public class BlogInterceptor implements Interceptor {
/**
* 方法说明
* @Discription:扩展说明
* @Author: feizi
* @Date: 2015年4月20日 上午10:59:12
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午10:59:12
* @see com.jfinal.aop.Interceptor#intercept(com.jfinal.core.ActionInvocation)
*/
public void intercept(ActionInvocation ai) {
System.out.println("================Before invoking " + ai.getActionKey());
ai.invoke();
System.out.println("================After invoking " + ai.getActionKey());
}
}
4、Model类
/**
* 文件说明
* @Description:扩展说明
* @Copyright: 2015 dreamtech.com.cn Inc. All right reserved
* @Version: V6.0
*/
package com.demo.model;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
/**
* Blog Model类
*
* @Author: feizi
* @Date: 2015年4月20日 上午10:03:51
* @ModifyUser: feizi
* @ModifyDate: 2015年4月20日 上午10:03:51
* @Version:V6.0 mysql> desc blog;
* +---------+--------------+------+-----+--------
* -+----------------+ | Field | Type | Null | Key | Default |
* Extra |
* +---------+--------------+------+-----+---------+--------
* --------+ | id | int(11) | NO | PRI | NULL | auto_increment | |
* title | varchar(200) | NO | | NULL | | | content | mediumtext |
* NO | | NULL | |
* +---------+--------------+------+-----+---------
* +----------------+
*/
public class Blog extends Model<Blog> {
private static final long serialVersionUID = -3649555563326235483L;
// 方便于访问数据库,不是必须
public static final Blog dao = new Blog();
/**
* 所有 sql 与业务逻辑写在 Model 或 Service 中 方法说明
*
* @Discription:扩展说明
* @param pageNumber
* @param pageSize
* @return
* @return Page<Blog>
* @Author: feizi
* @Date: 2015年4月20日 上午10:43:20
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午10:43:20
*/
public Page<Blog> paginate(int pageNumber, int pageSize) {
//这里体会到了jfinal的强大之处,mysql和oracle的分页都只需下面这一句就可以了。。
return paginate(pageNumber, pageSize, "select * ","from test_blog order by id asc");
}
}
5、验证类
/**
* 文件说明
* @Description:扩展说明
* @Copyright: 2015 dreamtech.com.cn Inc. All right reserved
* @Version: V6.0
*/
package com.demo.validator;
import com.demo.model.Blog;
import com.jfinal.core.Controller;
import com.jfinal.validate.Validator;
/**
* BlogValidator
* @Author: feizi
* @Date: 2015年4月20日 上午11:01:03
* @ModifyUser: feizi
* @ModifyDate: 2015年4月20日 上午11:01:03
* @Version:V6.0
*/
public class BlogValidator extends Validator {
/**
* 方法说明
* @Discription:扩展说明
* @Author: feizi
* @Date: 2015年4月20日 上午11:01:03
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午11:01:03
* @see com.jfinal.validate.Validator#validate(com.jfinal.core.Controller)
*/
@Override
protected void validate(Controller c) {
validateRequiredString("blog.title", "titleMsg", "请输入Blog标题!");
validateRequiredString("blog.content", "contentMsg", "请输入Blog内容!");
}
/**
* 方法说明
* @Discription:扩展说明
* @Author: feizi
* @Date: 2015年4月20日 上午11:01:03
* @ModifyUser:feizi
* @ModifyDate: 2015年4月20日 上午11:01:03
* @see com.jfinal.validate.Validator#handleError(com.jfinal.core.Controller)
*/
@Override
protected void handleError(Controller c) {
c.keepModel(Blog.class);
String actionKey = this.getActionKey();
if("/blog/save".equals(actionKey)){
c.render("add.jsp");
}else if("/blog/update".equals(actionKey)){
c.render("edit.jsp");
}
}
}
jsp中可以使用el表达式(需要引入jstl的jar包文件)对集合进行迭代:
如果是新增页面,只需要在表单中把具体的控件的name值设置成相应的Model类的属性即可,之后后台就可以取到页面中输入的值了
运行效果:
列表:
新增:
修改:
具体的demo示例已打包上传至csdn。
CSDN地址:http://download.csdn.net/detail/hu1991die/8617223
有需要的话可以去下载下来看看,都是免积分的。希望和大家共同学习!!!
原文:http://blog.csdn.net/hu1991die/article/details/45173485