hu1991die的gravatar头像
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

工程结构截图:

Jfinal框架学习系列之JSP视图实现基本的增删改查功能

 

所需jar包:

Jfinal框架学习系列之JSP视图实现基本的增删改查功能

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包文件)对集合进行迭代:

Jfinal框架学习系列之JSP视图实现基本的增删改查功能

Jfinal框架学习系列之JSP视图实现基本的增删改查功能

如果是新增页面,只需要在表单中把具体的控件的name值设置成相应的Model类的属性即可,之后后台就可以取到页面中输入的值了

 

Jfinal框架学习系列之JSP视图实现基本的增删改查功能

Jfinal框架学习系列之JSP视图实现基本的增删改查功能

运行效果:

列表页面:

Jfinal框架学习系列之JSP视图实现基本的增删改查功能

新增页面:

Jfinal框架学习系列之JSP视图实现基本的增删改查功能修改页面:

Jfinal框架学习系列之JSP视图实现基本的增删改查功能

ok,结束了。


打赏

已有1人打赏

复古风格嘎嘎嘎的gravatar头像

文件名:jfinal_demo_for_jsp.zip,文件大小:7022.764K 下载
最代码最近下载分享源代码列表最近下载
歪歪歪  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日
暂无贡献等级
暂无贡献等级
werbgd  LV2 2023年5月11日
qingsj  LV6 2023年3月2日
FF加菲猫  LV4 2023年1月2日
微信网友_6279530990882816 2022年12月27日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友