hu1991die
2015-04-22 14:24:47
原
Jfinal框架学习系列之JSP视图实现基本的增删改查功能
jfinal的官方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类的属性即可,之后后台就可以取到页面中输入的值了
运行效果:
列表页面:
新增页面:
ok,结束了。
猜你喜欢
- JFinal开发框架搭建实例及基本的增删改查和分页实现
- 快速开发框架之jfinal入门项目搭建实例
- JFinal+ExtJS整合实现增删改查的实例,数据库脚本在压缩包里
- Jfinal开发农副产品电子商城系统,完整前后台系统
- JFinal入门学习初级代码demo教程下载
- 【JFinal最省代码的框架】JFinal+Bootstrap实现后台管理系统主页
- jfinal开发的一个快速,极小的blog系统
- 基于Jfinal权限工作流管理系统
- jfinal开发企业门户网站系统
- vue+element-ui数据增删改查实例
- 基于JFinal的Springboot博客系统
- Jfinal,AmazeUI自主开发开源的java博客系统-LovePanda博客
请下载代码后再发表评论
文件名:jfinal_demo_for_jsp.zip,文件大小:7022.764K
下载
- /
- /jfinal_demo_for_jsp
- /jfinal_demo_for_jsp/.classpath
- /jfinal_demo_for_jsp/.project
- /jfinal_demo_for_jsp/.settings
- /jfinal_demo_for_jsp/.settings/.jsdtscope
- /jfinal_demo_for_jsp/.settings/org.eclipse.jdt.core.prefs
- /jfinal_demo_for_jsp/.settings/org.eclipse.wst.common.component
- /jfinal_demo_for_jsp/.settings/org.eclipse.wst.common.project.facet.core.xml
- /jfinal_demo_for_jsp/.settings/org.eclipse.wst.jsdt.ui.superType.container
- /jfinal_demo_for_jsp/.settings/org.eclipse.wst.jsdt.ui.superType.name
- /jfinal_demo_for_jsp/src
- /jfinal_demo_for_jsp/src/com
- /jfinal_demo_for_jsp/src/com/demo
- /jfinal_demo_for_jsp/src/com/demo/config
- /jfinal_demo_for_jsp/src/com/demo/controller
- /jfinal_demo_for_jsp/src/com/demo/controller/blog
- /jfinal_demo_for_jsp/src/com/demo/controller/index
- /jfinal_demo_for_jsp/src/com/demo/interceptor
- /jfinal_demo_for_jsp/src/com/demo/model
- /jfinal_demo_for_jsp/src/com/demo
- /jfinal_demo_for_jsp/src/com
- /jfinal_demo_for_jsp
相关代码
- 原证精 Jfinal开发农副产品电子商城系统,完整前后台系统
- 原 JFinal入门学习初级代码demo教程下载
- 【JFinal最省代码的框架】JFinal+Bootstrap实现后台管理系统主页
- 快速开发框架之jfinal入门项目搭建实例
- jfinal开发的一个快速,极小的blog系统
- 原证精 基于Jfinal权限工作流管理系统
- 原证精 jfinal开发企业门户网站系统
- 原 Jfinal,AmazeUI自主开发开源的java博客系统-LovePanda博客
- JFinal开发框架搭建实例及基本的增删改查和分页实现
- 原证精 基于JFinal的Springboot博客系统
- 原精 jfinal开发java web开源微信商城源码
- 原证精 JFinal-layui极速开发企业应用系统
最近下载
歪歪歪 LV8
2021年3月20日
guoxinming LV2
2020年10月15日
lyq3323 LV2
2020年4月1日
LKBBDD LV7
2020年3月5日
弥漫七里香1 LV4
2020年1月7日
1024171254 LV7
2019年10月21日
fabulous LV1
2019年9月29日
uzi123 LV3
2019年4月15日
阿宙666666 LV3
2019年2月26日
chenjiewen1107 LV10
2019年1月4日
最近浏览
sans111
4月1日
暂无贡献等级
lvhongquan LV11
2023年12月30日
李林112233 LV2
2023年12月4日
ezra77934 LV2
2023年9月15日
lhlhlhlh55
2023年6月13日
暂无贡献等级
微信网友_6516712266272768
2023年6月12日
暂无贡献等级
werbgd LV2
2023年5月11日
qingsj LV6
2023年3月2日
FF加菲猫 LV4
2023年1月2日
微信网友_6279530990882816
2022年12月27日
暂无贡献等级