Jfinal框架学习系列之二(JSP)

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

有需要的话可以去下载下来看看,都是免积分的。希望和大家共同学习!!!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。