第二章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,分页还没有实现。
项目源码下载