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

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

时间: 2024-10-09 23:59:27

Jfinal框架学习系列之二(JSP)的相关文章

Jfinal框架学习系列之图片上传

昨天学习了一下在jfianl中使用jsp,然后实现了一个基本的增删改查的demo示例,今天了解了一下在jfinal中实现文件上传的功能,这里配合 了uploadify实现图片上传...这里只是可以简单地实现上传的功能,有的时候也需要自己进行压缩处理,,,貌似视频上传的时候有些问题...因为也是参照51CTO上面的一个demo实现的... 工程结构截图: 具体实现代码如下: 1.DemoConfig核心配置类: /** * 文件说明 * @Description:扩展说明 * @Copyright

.net转php laraval框架学习系列(二)项目实战---Models

上一篇已经介绍开发环境的搭建,如果有问题可以在文章后留言. 这篇将从项目实战开发,一步一步了解laravel框架. 在开发mvc项目时,models都是第一步. 下面就从建模开始. 1.实体关系图, 由于不知道php有什么好的建模工具,这里我用的vs ado.net实体模型数据建模 下面开始laravel编码,编码之前首先得配置数据库连接,在app/config/database.php文件 'mysql' => array( 'driver' => 'mysql', 'read' =>

Spring框架学习之IOC(二)

Spring框架学习之IOC(二) 接着昨天的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包括: –@Component: 基本注解, 标识了一个受 Spring 管理的组件 –@Respository: 标识持久层组件 –@Service: 标识服务层(业务层)组件 –@Controller: 标识表现层组件 对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写.

WPF学习系列之二 (依赖项属性)

依赖属性;(dependency property)  它是专门针对WPF创建的,但是WPF库中的依赖项属性都使用普通的.NET属性过程进行了包装.从而可能通过常规的方式使用它们,即使使用他们的代码不理解WPF依赖项属性系统也是如此,使用旧技术包装新技术看起来有些奇怪,但这正是WPF能够改变基础组成部分,而不会扰乱.NET领域中其他部分的原因.三步:一:定义依赖项属性.public static readonly DependencyProperty MarginProperty;二:.在静态构

Yii框架学习笔记(二)将html前端模板整合到框架中

选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/topics/390807796 更多内容 百度:yii 前端 http://my.oschina.net/u/1472492/blog/221085 摘要 Yii框架学习笔记(二)将html前端模板整合到框架中 原文地址:http://www.ldsun.com/1309.html 上一节成功将Y

CAN总线学习系列之二——CAN总线与RS485的比较

CAN总线学习系列之二--CAN总线与RS485的比较 上 一节介绍了一下CAN总线的基本知识,那么有人会问,现在的总线格式很多,CAN相对于其他的总线有什么特点啊?这个问题问的好,所以我想与其它总线做一 下比较,首先呢,就比较一下大家耳熟能详的485总线,其实485总线只是一种电平标准,并不是什么新的协议,与232差不多,当然这么说不是很恰当,但 是有助于大家理解.       下面开始比较了: CAN(Controller Area Network)属于现场总线的范畴,它是一种有效支持分布式

使用腾讯云 GPU 学习深度学习系列之二:Tensorflow 简明原理【转】

转自:https://www.qcloud.com/community/article/598765?fromSource=gwzcw.117333.117333.117333 这是<使用腾讯云 GPU 学习深度学习>系列文章的第二篇,主要介绍了 Tensorflow 的原理,以及如何用最简单的Python代码进行功能实现.本系列文章主要介绍如何使用 腾讯云GPU服务器 进行深度学习运算,前面主要介绍原理部分,后期则以实践为主. 往期内容: 使用腾讯云 GPU 学习深度学习系列之一:传统机器学

jfinal框架学习参考资料汇总

jfinal框架教程-学习笔记(一) http://blog.csdn.net/zb0567/article/details/21083115 jfinal框架教程-学习笔记(二) http://blog.csdn.net/zb0567/article/details/21083021

Python学习系列(二)(基础知识)

Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比,避免陷入语法的苦海.我认为初学者学习语法的目标是学会使用即可,关于对概念的深入理解,剖析,没有一定的知识积累是很难做到的. 学习Python,基本语法不是特别难,有了C的基本知识,理解比较容易.本文的主要内容是Python基础语法,学完后,能熟练使用就好.(开发环境依然是Python2.7,简单使用