JFinal的简单使用
导入JFinal工程
首先要将JFinal工程放在你的工作空间目录下
然后直接在idea中打开该项目,可以运行。
展示结果
阅读JFinal的源码并对每一部分的功能进行介绍
导入完项目之后便开始看一下,JFinal开发的项目是什么样的。但是首先我是特别的蒙。并不是特别懂项目的结构。因为首先看来JFinal官方的简介。
Blog找到了,但只有这点儿内
而其中的set方法则是来源于
而get方法中的get+类型则是对属性进行一个取值,再返回。
随后又看了_JFinalDemoGenerator类下的getDataSource()方法。
这个方法顾名思义,就是获取数据源,也就是数据库中的数据表。
代码很短,但通过官网了解到ActiveReceord中定义了addMapping(String tableName, Class<? extends Model> modelClass>)方法,该方法建立了数据库表名到Model的映射关系。
另外,以上代码中arp.addMapping("user", User.class),表的主键名为默认为 "id",如果主键名称为 "user_id" 则需要手动指定,如:arp.addMapping("user", "user_id", User.class)。
接着看来service层的代码
Pageinate()方法是从数据库中查找数据对页面进行一个划分,分页操作实现需要的方法,并进行前端界面展示。
而findById则是通过主键查找到对象并返回
deleteById则通过主键对表中数据进行一个删除操作。
随后看controller层 的方法,该层则使用了service层的方法。
Index则是设置前端的界面如何展示,并且直接跳转到前端界面。
而save方法则是对前端界面新添加的界面进行返回并再跳转到前端界面
而edit方法则是对前端界面进行数据展示前端界面
而update方法则是对前端界面修改后的对象进行保存,并展示
而delete方法则是删除对象,再展示页面
而add方法应该会添加对象。
接着看intercept方法
Interceptor 可以对方法进行拦截,并提供机会在方法的前后添加切面代码,实现 AOP 的核心目标。Interceptor 接口仅仅定义了一个方法 public void intercept(Invocation inv)。
一定要调用一次 inv.invoke(),除非是刻意不去调用剩下的拦截器与 action,这种情况仍然需要使用 inv.getController().render()/renderJson() 调用一下相关的 render() 方法为客户端响应数据。
随后看BlogValidator方法
主要作用是对代码进行校验,并且进行错误处理。
DemoConfig中的配置代码,官方说的很详细了,都是对相关配置进行操作。
而且必须需要两个文件。
否则项目是无法启动的。
最后一个方法仅是跳转到首页。
Pageinate.html进行分页操作的核心
Blog.html
则是展示界面的核心
以上就是我了解到的核心代码
基于JFinal完成一个简单的学生信息管理系统
首先创建数据库
随后编写实体对象方法
public M setId(String id){
set("id",id);
return (M)this;
}
public String getId(){
return getStr("id");
}
public M setName(String name) {
set("name", name);
return (M)this;
}
public String getName(){
return getStr("name");
}
public M setClassid(String cd) {
set("classid", cd);
return (M)this;
}
public String getClassid(){
return getStr("classid");
}
public M setAge(String age) {
set("age", age);
return (M)this;
}
public String getAge(){
return getStr("age");
}
public M setHeight(String h) {
set("height", h);
return (M)this;
}
public String getHeight(){
return getStr("height");
}
public M setSex(String sex) {
set("sex", sex);
return (M)this;
}
public String getSex(){
return getStr("sex");
}
public M setSchoolin(String d) {
set("schoolin", d);
return (M)this;
}
public String getSchoolin(){
return getStr("schoolin");
}
接着编写service代码
public class BlogService {
/**
* 所有的 dao 对象也放在 Service 中,并且声明为 private,避免 sql 满天飞
* sql 只放在业务层,或者放在外部 sql 模板,用模板引擎管理:
* http://www.jfinal.com/doc/5-13
*/
private Student dao = new Student().dao();
public Page<Student> paginate(int pageNumber, int pageSize) {
return dao.paginate(pageNumber, pageSize, "select *", "from student order by id asc");
}
public Student findById(int ID) {
return dao.findById(ID);
}
public void deleteById(int ID) {
dao.deleteById(ID);
}
}
Validator代码
public class BlogValidator extends Validator {
protected void validate(Controller controller) {
validateRequiredString("student.name", "titleMsg2", "请输入学生姓名!");
validateRequiredString("student.no", "titleMsg1", "请输入学生学号!");
// validateRequiredString("student.Name", "titleMsg2", "请输入学生姓名!");
validateRequiredString("student.classid", "titleMsg3", "请输入学生班级!");
validateRequiredString("student.age", "titleMsg4", "请输入学生年龄!");
validateRequiredString("student.height", "titleMsg5", "请输入学生身高!");
validateRequiredString("student.sex", "titleMsg6", "请输入学生性别!");
validateRequiredString("student.schoolin", "titleMsg7", "请输入入学日期!");
}
protected void handleError(Controller controller) {
controller.keepModel(Student.class);
String actionKey = getActionKey();
if (actionKey.equals("/blog/save"))
controller.render("add.html");
else if (actionKey.equals("/blog/update"))
controller.render("edit.html");
}
}
随后编写前端的核心代码
Student.html
#@layout()
#define main()
<h1>Blog管理
<a href="/blog/add">创建学生</a>
</h1>
<div class="table_box">
<table class="list">
<tbody>
<tr>
<th width="10%">ID</th>
<th width="20%">姓名</th>
<th width="10%">班级</th>
<th width="10%">年龄</th>
<th width="10%">身高</th>
<th width="10%">性别</th>
<th width="20%">入学日期</th>
<th width="10%">操作</th>
</tr>
#for(x : blogPage.getList())
<tr>
<td style="text-align:left;">#(x.id)</td>
<td style="text-align:left;">#(x.name)</td>
<td style="text-align:left;">#(x.classid)</td>
<td style="text-align:left;">#(x.age)</td>
<td style="text-align:left;">#(x.height)</td>
<td style="text-align:left;">#(x.sex)</td>
<td style="text-align:left;">#(x.schoolin)</td>
<td style="text-align:left;">
<a href="/blog/delete/#(x.id)">删除</a>
<a href="/blog/edit/#(x.id)">修改</a>
</td>
</tr>
#end
</tbody>
</table>
#@paginate(blogPage.pageNumber, blogPage.totalPage, "/blog/")
</div>
#end
_form.html
<fieldset class="solid">
<legend>新增学生</legend>
<input type="hidden" name="student.id" value="#(student.id??)" />#(titleMsg)
<div>
<label>姓名</label>
<input type="text" name="student.name" value="#(student.name??)"/>#(titleMsg2)
</div>
<div>
<label>班级</label>
<input type="text" name="student.classid" value="#(student.classid??)"/>#(titleMsg3)
</div>
<div>
<label>年龄</label>
<input type="text" name="student.age" value="#(student.age??)"/>#(titleMsg4)
</div>
<div>
<label>身高</label>
<input type="text" name="student.height" value="#(student.height??)"/>#(titleMsg5)
</div>
<div>
<label>性别</label>
<input type="text" name="student.sex" value="#(student.sex??)"/>#(titleMsg6)
</div>
<div>
<label>入学日期</label>
<input type="text" name="student.schoolin" value="#(student.schoolin??)"/>#(titleMsg7)
</div>
<div>
<label> </label>
<input value="提交" type="submit">
</div>
</fieldset>