JFinalAsAndroid(第二天)


第二章JFinal

1 每一个表单的Action –>需要controllerkey与method 定位。

例如:
url 访问目标。
controllerKey 对应的Controller.index()方法。
controllerKey/method 对应的Controller.method()方法。
controllerKey/method/v0-v1 对应的Controller.method()方法–vo-v1参数。

Controller 可以通过 方法get到这些参数值。
getPara(int index)

2 提供ActionKey注解。

@ActionKey(“/login”)
public void regist(){
render(“login.html”);
}

3 分开前置路由。
后置路由
me.add(new IndexRoutes());//前端路由。
me.add(new AdminRoutes());//后端路由

4
配置插件。

C3p0 + ActiveRecord.

5理解getPara方法();
getPara(“title”);—>获得表单 域名为title的值。
getParaToInt(“age”)—>获得表单 域名为age的值。
getPara(0)—>
http://tomcat配置 /项目名/类 (admin包下的key为user的UserController控制器)/ alluser方法
http://localhost:8080/JFinalAsAndroid/admin/user/alluser/tan-wei-cheng
获得了第一个参数 tan
getPara(1)—>wei
getPara()—>就系全部了tan-wei-cheng

6 表单提交 form 表单里的属性。

官方用Model 来弄,那么久用model了。


用户名:



密码:


7
render 系列 :
渲染不同类型的视图返回给客户端。例如html,jsp ,json,text,……..
就android + jsp 足矣。
renderError(404,”404.html”);
renderError(505,”505.html”);
8
总结, 基本写完 crud 。
下次计划:aop+android.


项目分层
这里写图片描述
控制器
分两个 前台,后台。

前端路由
package com.weichengtan.jfandroid.controller.index;

import com.jfinal.core.Controller;

/**
 * @author:tanweicheng
 * 
 */
public class IndexController extends Controller {
    public void index() {
        renderText("IndexController --->前端路由");
    }
}

后端路由

package com.weichengtan.jfandroid.controller.admin;

import java.util.List;

import com.jfinal.core.ActionKey;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Page;
import com.weichengtan.jfandroid.bean.AdminUser;
import com.weichengtan.jfandroid.util.UtilNumber;

/**
 * @author:tanweicheng
 * 
 */
public class UserController extends Controller {
    // public void index() {
    // renderText("UserController --->后端路由-->管理员");
    // }
    // 默认跳转
    public void index() {
        render("/admin/login.jsp");
    }

    // 注册保存数据
    public void save() {
        if (getPara(0).equals("notdata")) {
            render("/admin/login.jsp");
            return;
        } else {
            try {
                getModel(AdminUser.class, "adminuser").save();
            } catch (Exception e) {
                System.err.println(e);
            }
            redirectthis();
        }
    }

    // 查看全部用户
    public void alluser() {
        Page<AdminUser> pagelist = AdminUser.adminuser.paginate(
                getParaToInt(0, 1), 10);
        setAttr("alluser", pagelist.getList());
        System.out.println("listsize" + pagelist.getList().size());
        render("/admin/admin_homepage.jsp");
    }

    // 删除操作。
    public void delete() {
        AdminUser.adminuser.deleteById(getParaToInt(0));
        redirectthis();
        // redirect("/admin/user/alluser");
    }

    // 更新数据
    public void update() {
        if (getPara(0) != null && UtilNumber.isNumeric(getPara())) {
            setAttr("adminuser", AdminUser.adminuser.findById(getPara(0)));
            render("/admin/updateuser.jsp");
        } else {
            getModel(AdminUser.class, "adminuser").update();
            redirectthis();
        }
    }

    /**
     * 重定向
     * 
     * @author:tanweicheng
     * @method:redirectthis
     */
    public void redirectthis() {
        redirect("/admin/user/alluser");
    }

}
package com.weichengtan.jfandroid.controller.admin;

import com.jfinal.core.Controller;

/**
 * @author:tanweicheng
 * 
 */
public class AdminController extends Controller {
    public void index() {
        renderText("AdminController --->后端路由--->后台登陆界面");
    }
}

后端路由分两个,(以后权限管理可能有用,所以这样分。)

package com.weichengtan.jfandroid.dao;

import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.weichengtan.jfandroid.bean.AdminUser;

/**
 * @author:tanweicheng
 * 
 */
public class MappingKit {
    public static void mapping(ActiveRecordPlugin arp) {
        arp.addMapping("adminuser", "id", AdminUser.class);
    }
}

dao层一般都是数据库操作。所以放映射java文件。


package com.weichengtan.jfandroid.config;

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.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.render.ViewType;
import com.weichengtan.jfandroid.bean.AdminUser;
import com.weichengtan.jfandroid.controller.HelloController;
import com.weichengtan.jfandroid.dao.MappingKit;
import com.weichengtan.jfandroid.routes.AdminRoutes;
import com.weichengtan.jfandroid.routes.IndexRoutes;

/**
 * @author:tanweicheng
 * 
 */
public class MyConfig extends JFinalConfig {
    /**
     * 配置常量
     */
    @Override
    public void configConstant(Constants me) {
        // 配置开发模式下默认视图jsp
        me.setDevMode(true);
        // 加载少量必要配置,随后可用PropKit.get(...)获取值
        PropKit.use("db_config.txt");
        me.setViewType(ViewType.JSP);
    }

    /**
     * 1 此方法配置JFinal访问路由,将/hello映射到HelloController中去。
     */
    @Override
    public void configRoute(Routes me) {
        // me.add("/hello", HelloController.class);
        me.add(new IndexRoutes());// 前端路由。
        me.add(new AdminRoutes());// 后端路由
    }

    @Override
    public void configPlugin(Plugins me) {
        loadPropertyFile("db_config.txt");
        // 配置C3p0数据库连接池插件
        C3p0Plugin C3p0Plugin = createC3p0Plugin();
        me.add(C3p0Plugin);

        // 配置ActiveRecord插件
        ActiveRecordPlugin arp = new ActiveRecordPlugin(C3p0Plugin);
        me.add(arp);
        // 所有配置在 MappingKit 中搞定
        // arp.addMapping("adminuser",AdminUser.class);
        MappingKit.mapping(arp);
    }

    public static C3p0Plugin createC3p0Plugin() {
        return new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("username"),
                PropKit.get("password").trim());
    }

    @Override
    public void configInterceptor(Interceptors me) {

    }

    @Override
    public void configHandler(Handlers me) {

    }

}

这个是JFinal的核心文件。什么鬼都在这里配置。


package com.weichengtan.jfandroid.bean.base;

import com.jfinal.plugin.activerecord.IBean;
import com.jfinal.plugin.activerecord.Model;

/**
 * @author:tanweicheng
 * 
 */
public abstract class BaseAdminUser<M extends BaseAdminUser<M>> extends
        Model<M> implements IBean {
    /**
     * @method:
     * @author:tanweicheng
     */
    private static final long serialVersionUID = 1L;

    public void setId(java.lang.Integer id) {
        set("id", id);
    }

    public java.lang.Integer getId() {
        return get("id");
    }

    public void setAdminname(java.lang.String adminname) {
        set("adminname", adminname);
    }

    public java.lang.String getAdminname() {
        return get("adminname");
    }

    public void setAdminpwd(java.lang.String adminpwd) {
        set("adminpwd", adminpwd);
    }

    public java.lang.String getAdminpwd() {
        return get("adminpwd");
    }

}

将bean类里的抽出一个BaseAdminUser类,为啥要这样做?官方都是这样。便于管理。


package com.weichengtan.jfandroid.bean;

import java.io.Serializable;

import com.jfinal.plugin.activerecord.Page;
import com.weichengtan.jfandroid.bean.base.BaseAdminUser;

/**
* @author:tanweicheng
*/
public class AdminUser extends BaseAdminUser implements Serializable {
/**
* @method:
* @author:tanweicheng
*/
private static final long serialVersionUID = 1L;
public static final AdminUser adminuser = new AdminUser();

/**
 * 所有 sql 与业务逻辑写在 Model 或 Service 中, 不要写在 Controller 中,养成好习惯,有利于大型项目的开发与维护
 */
public Page<AdminUser> paginate(int pageNumber, int pageSize) {
    return paginate(pageNumber, pageSize, "select *",
            "from adminuser order by id asc");
}

}
然后通过子类扩展方法。


项目运行截图。
这里写图片描述

程序基本实现了CRUD,分页还没有实现。
项目源码下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值