跳至主要內容

控制器

大约 9 分钟

控制器

FastChar 控制器的核心基类: FastAction

介绍

FastAction类承担着MVC中的控制器的作用,是FastChar的核心类之一,与struts2的action或springboot的controller概念类似。

提示

FastAction是线程安全的

开始尝试第一个Action类,如下:

public class TestAction extends FastAction {
    /**
     * 获得路由地址
     * Get routing address
     * @return
     */
    @Override
    protected String getRoute() {
        return "/test";
    }
 
    public void index() {
        responseText("搭建成功!");
    }
}

访问url地址 /test 默认进入FastAction类里的 index 方法

注册

提示

无论是自动注册还是手动注册,FastChar都做了去重处理!所以不用担心会出现重复注册的问题。

自动注册

当系统启动后,FastChar的扫描器会自动注册项目中所有【包含引用的Jar包】继承FastAction的类。

手动注册

如果开发者需要手动注册一个FastAction类,则在全局初始化的时候注册即可,如下代码:

public class FastCharWeb implements IFastWeb {
    /**
     * web启动初始化
     * @param engine
     */
    @Override
    public void onInit(FastEngine engine) throws Exception {
        
        //获取action集装器,并注册自定的TestAction类
        engine.getActions()
                .addAction(TestAction.class);
                
        /**此处省略其他配置代码**/
    }
    /**此处省略其他方法代码**/
}

当FastAction类完成注册后,FastChar核心解析器利用Java反射技术开始分析FastAction类,并识别所有公开的对象方法。

禁用FastAction

如果需要禁止访问FastAction,通过 AFastAction 注解配置即可,如下


@AFastAction(enable = false)
public class TestAction extends FastAction {
    //省略其他代码
}

确定方法的url地址

在FastAction类里定义的方法名即为url地址,如下

public class TestAction extends FastAction {
    /**
     * 获得路由地址
     * Get routing address
     * @return
     */
    @Override
    protected String getRoute() {
        return "/test";
    }
 
    public void login() {
        responseText("登录成功!");
    }
}

相对url地址组成规则是: getRoute 方法的返回值通过 / 符号拼接 方法名

所以最终的url地址为 http://***/test/login 即可访问到 TestAction里的 login 方法

不同url地址访问同一个方法

如果需要不同的url地址方法同一个方法,则可以通过 AFastRoute 注解配置更多的url地址,如下:

 @AFastRoute(value = {"/login1", "/login2","/login3"})
 public void login() {
    responseText("登录成功!");
 }

访问login方法的url地址有: /test/login /test/login1 /test/login2 /test/login3

注意

如果 url 地址未匹配到 FastAction 里的方法,则默认执行 FastAction 类里的 index 方法

无法通过url访问的方法

  • private 修饰的方法,例如:
private void test(){
    /**方法体**/
}
  • static 修饰的方法,例如
public static void test(){
    /**方法体**/
}
  • abstract 修饰的方法,例如:
public abstract void test();
  • transient 修饰的方法,例如:
public transient void test(){
    /**方法体**/
};

请求参数获取

FastAction默认解析处理了请求携带的所有参数,包括附件,所以开发者按照规则调用即可。

显式获取参数

FastAction提供了getParam相关方法,可以快速的获取请求携带的参数,如下:

public void login(){
    //获取参数
    
    String username = getParam("username");
    String password = getParam("password");
    
    //自动转换为int类型
    int code=getParamToInt("code")
    
    /**省略其他业务判断逻辑**/
    
    responseText("登录成功!");
}

方法形参获取参数

通过方法形参定义参数,FastChar会触发参数转换器进行数据转换,如下:


//形参注入
public void login(String username,String password,int code){

    /**省略其他业务判断逻辑**/
    
    responseText("登录成功!");
}

获取上传的附件

FastAction自动解析附件并保存了附件,所以开发者获取上传附件的方法极其简单,如下:

public void updateUser(){
    //获取参数
    FastFile<?> userHeadImg = getParamFile();
    
    //获取附件保存后的相对的url地址 ,例如:attachments/images/test.jpg
    String fileUrl=userHeadImg.getUrl();
    /**省略其他业务判断逻辑**/
    
    responseText("更新成功!");
}

修改附件默认保存的目录

FastChar 附件默认保存的目录是相对项目的 attachments 文件夹,开发者可以在全局初始化时自行修改,如下:

public class FastCharTestWeb implements IFastWeb {
    /**
     * web启动初始化
     * @param engine
     */
    @Override
    public void onInit(FastEngine engine) throws Exception {
        
        //设置系统附件默认保存的路径
        engine.getPath()
                .setAttachmentPath("保存附件的绝对路径");
        
        /**此处省略其他配置代码**/
    }
}

获取 URL 参数

FastAction允许获取url地址中 / 分割的多余地址,如下:

<form action="http://****/test/login/param1/param2" method="post" >
    <input type="text" name="userNickName"/>
    <input type="submit" title="提交"/>
</form>

解说

由于 TestAction 类里未匹配到 方法 param2 和 方法 param1 ,匹配到 login 方法, 而未匹配到的将以url参数形式传递给方法 login

获取 Map 参数

FastAction 支持按照 {prefix}.{attr} 格式提交参数,并在后台转为 Map 对象,如下:

<form action="http://****/test/updateUser" method="post" >
    <input type="text" name="user.userId" value="1"/>
    <input type="text" name="user.userNickName" value="用户昵称"/>
    <input type="text" name="dept.deptId" value="2"/>
    <input type="text" name="dept.deptName" value="部门名称"/>
    <input type="submit" title="提交"/>
</form>

解说

参数格式 {prefix}.{attr}FastAction 调用 getParamToMap 方法,并传入 参数前缀 {prefix} 即可将相同前缀的参数合并为 Map 对象, Map的 key 为 {attr} ,value 为 参数值

获取 List<Map> 参数

FastAction 支持按照 {prefix}[i].{attr} 格式提交参数,并在后台转为 List<Map> 对象,如下:

<form action="http://****/test/updateUser" method="post" >
    <input type="text" name="user[0].userId" value="1"/>
    <input type="text" name="user[0].userNickName" value="用户昵称1"/>
    
    <input type="text" name="user[1].userId" value="2"/>
    <input type="text" name="user[1].userNickName" value="用户昵称2"/>
    
    <input type="text" name="user[2].userId" value="3"/>
    <input type="text" name="user[2].userNickName" value="用户昵称3"/>
    
    <input type="submit" title="提交"/>
</form>

解说

参数格式 {prefix}[i].{attr}FastAction 调用 getParamToMapList 方法,并传入 参数前缀 {prefix} 即可将相同前缀的参数合并为 List<Map> 对象。

每项 Map 的 key 为 {attr} ,value 为 参数值

注意

其中 i 是可变的数字,仅用来 正序排序 参数,不代表 List 中的子项 下标

获取 List<?> 参数

FastAction 支持按照 {prefix}[i] 格式提交参数,并在后台转为 List<?> 对象,如下:

<form action="http://****/test/updateUser" method="post" >
    <input type="text" name="userId[0]" value="1"/>
    
    <input type="text" name="userId[1]" value="2"/>
    
    <input type="text" name="userId[2]" value="3"/>
    
    <input type="submit" title="提交"/>
</form>

解说

参数格式 {prefix}[i]FastAction 调用 getParamToList 方法,并传入 参数前缀 {prefix} 即可将相同前缀的参数合并为 List<?> 对象。

注意

其中 i 是可变的数字,仅用来 正序排序 参数,不代表 List 中的子项 下标

获取 FastEntity 数据库实体 参数

FastAction 支持按照 {prefix}.{attr} 格式提交参数,并在后台转为 FastEntity 对象,如下:

<form action="http://****/test/updateUser" method="post" >
    <input type="text" name="user.userId" value="1"/>
    <input type="text" name="user.userNickName" value="用户昵称"/>
    <input type="text" name="dept.deptId" value="2"/>
    <input type="text" name="dept.deptName" value="部门名称"/>
    <input type="submit" title="提交"/>
</form>

解说

参数格式 {prefix}.{attr}FastAction 调用 getParamToMap 方法。

第一个方法参值为: 参数前缀 {prefix}

第二个方法参值为:FastEntity.class

即可将相同前缀的参数合并为 FastEntity 对象,

FastEntity 的 key 为 {attr} ,value 为 参数值

获取 List<FastEntity> 数据库实体 参数

FastAction 支持按照 {prefix}[i].{attr} 格式提交参数,并在后台转为 List<FastEntity> 对象,如下:

<form action="http://****/test/updateUser" method="post" >
    <input type="text" name="user[0].userId" value="1"/>
    <input type="text" name="user[0].userNickName" value="用户昵称1"/>
    
    <input type="text" name="user[1].userId" value="2"/>
    <input type="text" name="user[1].userNickName" value="用户昵称2"/>
    
    <input type="text" name="user[2].userId" value="3"/>
    <input type="text" name="user[2].userNickName" value="用户昵称3"/>
    
    <input type="submit" title="提交"/>
</form>

解说

参数格式 {prefix}[i].{attr}FastAction 调用 getParamToMapList 方法。

第一个方法参值为: 参数前缀 {prefix}

第二个方法参值为:FastEntity.class

即可将相同前缀的参数合并为 List<FastEntity> 对象。

每项 FastEntity 的 key 为 {attr} ,value 为 参数值

注意

其中 i 是可变的数字,仅用来 正序排序 参数,不代表 List 中的子项 下标

获取Session

开发者按照如下方式即可获取到Session对象,如下:

public class TestAction extends FastAction {
    /**
     * 获得路由地址
     * Get routing address
     * @return
     */
    @Override
    protected String getRoute() {
        return "/test";
    }
 
    public void updateUser(){

         FastHttpSession session = getSession();
         
        /**省略其他业务判断逻辑**/
        
        responseText("更新成功!");
    }
}
上次编辑于:
贡献者: Janesen