# MVC功能

借助jboot提供的注解配置来支持web mvc功能,快速完成web开发访问.下面快速讲说明使用方法,更多信息看这里 (opens new window).

推荐目录结构

在开发WEB的MVC代码时,建议使用如下目录结构:
code_dirs

# 控制层

Controller 是Web MVC设计模式中的控制层.通过继承JwebController创建Controller类.并在类上添加注解@RequestMapping,即可完成控制层的编写.
例如,快速开始篇章中的IndexController类:

import cc.jweb.boot.app.JwebApplication;
import cc.jweb.boot.controller.JwebController;
import io.jboot.web.controller.annotation.RequestMapping;

@RequestMapping(value = "/")
public class IndexController extends JwebController {
    public static void main(String[] args) {
        JwebApplication.main(args);
    }

    public void index() {
        renderText("Hello World Jweb boot!");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

其中@RequestMapping中定义了该Controller的访问根路径为/,默认访问类的index方法. 可通过定不同类方法,并通过/{methodName}来访问相应的方法.

进阶

  1. 注解值支持从配置信息获取如@RequestMapping(value = "${index.mapping}"),然后jboot.properties中配置index.mapping=/
  2. 通过在方法上注解@ActionKey("{URI}")来个性化的方法访问URI(注意是绝对路径).
  3. 通过在方法上注解@NotAction来标志该方法不可通过/{methodName}访问

# 视图模板

jfinal使用Enjoy模板引擎来渲染视图,因此常用render("{模板路径}")来渲染输出内容
例如,修改Demo的IndexController的index方法如下:

@RequestMapping(value = "/")
public class IndexController extends JwebController {
    
    @ConfigValue("undertow.port")
    int port;

    public static void main(String[] args) {
        JwebApplication.main(args);
    }

    public void index() {
        setAttr("port", port);
        render("/WEB-INF/views/index.html");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

模板默认根目录为webroot目录,因此,会向所有被配置为WEB资源目录的目录列表中依次寻找模板文件/WEB-INF/views/index.html,直到找到一个为止.

WEB资源目录

jweb的WEB资源目录默认配置为:undertow.resourcePath=src/main/webapp,WebRoot,WebContent,classpath:webapp,webapp

在IDEA的src/main目录下创建webapp/WEB-INF/views目录(放在WEB-INF下,避免模板代码被外部访问到,本人习惯放在 WEB-INF/views/下).
然后在WEB-INF/views/下创建index.html模板文件.

<h1>Hello World Index.html #(port)</h1>
1

启动main方法,访问:http://localhost:8080/ (opens new window),将看到如下内容:

mvc_index

# 模型类

Model是 MVC 模式中的 M 部分。以下是 Model 定义示例代码:

@Table(tableName = "user", primaryKey = "user_id")
public class User  extends JbootModel<User> implements IBean {
    User dao = new User().dao();
}
1
2
3
4

然后就可以操作user表了:

以下为Model的一些常见用法:

// 创建title属性为James,age属性为25的User对象并添加到数据库
new User().set("title", "James").set("age", 25).save();
 
// 删除id值为25的User
User.dao.deleteById(25);
 
// 查询id值为25的User将其title属性改为James并更新到数据库
User.dao.findById(25).set("title", "James").update();
 
// 查询id值为25的user, 且仅仅取title与age两个字段的值
User user = User.dao.findByIdLoadColumns(25, "title, age");
 
// 获取user的title属性
String userName = user.getStr("title");
 
// 获取user的age属性
Integer userAge = user.getInt("age");
 
// 查询所有年龄大于18岁的user
List<User> users = User.dao.find("select * from user where age>18");
 
// 分页查询年龄大于18的user,当前页号为1,每页10个user
Page<User> userPage = User.dao.paginate(1, 10, "select *", "from user where age > ?", 18);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

详细使用方法,请前往

  1. jfinal的Model (opens new window)
  2. jboot的数据库 (opens new window)