控制器
控制器
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访问的方法
在FastAction中允许开发者禁用某些方法不允许通过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>
public class TestAction extends FastAction {
/**
* 获得路由地址
* Get routing address
* @return
*/
@Override
protected String getRoute() {
return "/test";
}
public void login() {
String urlParam0 = getUrlParam(0);//值:param1
String urlParam1 = getUrlParam(1);//值:param2
responseText("登录成功!");
}
}
解说
由于 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>
public class TestAction extends FastAction {
/**
* 获得路由地址
* Get routing address
* @return
*/
@Override
protected String getRoute() {
return "/test";
}
public void updateUser(){
//获取前端用户相关参数,并自动合并转为map对象
Map<String, Object> userInfo = getParamToMap("user");//传入参数的前缀 user 即可
Object userNickName=userInfo.get("userNickName");
Object userId=userInfo.get("userId")
//获取前端部门相关参数,并自动合并转为map对象
Map<String, Object> deptInfo = getParamToMap("dept");//传入参数的前缀 dept 即可
Object deptId=deptInfo.get("deptId");
Object deptName=deptInfo.get("deptName")
/**省略其他业务判断逻辑**/
responseText("更新成功!");
}
}
解说
参数格式 {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>
public class TestAction extends FastAction {
/**
* 获得路由地址
* Get routing address
* @return
*/
@Override
protected String getRoute() {
return "/test";
}
public void updateUser(){
//获取参数前缀为user,并且包含下标[i]的参数,转为List<Map>格式
List<Map<String, Object>> users = getParamToMapList("user");
for (Map<String, Object> user : users) {
Object userId = user.get("userId");
Object userNickName = user.get("userNickName");
}
/**省略其他业务判断逻辑**/
responseText("更新成功!");
}
}
解说
参数格式 {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>
public class TestAction extends FastAction {
/**
* 获得路由地址
* Get routing address
* @return
*/
@Override
protected String getRoute() {
return "/test";
}
public void updateUser(){
//获取参数前缀为userId并且包含下标[i]的参数,转为List<String>格式
List<String> userId = getParamToList("userId");
/**省略其他业务判断逻辑**/
responseText("更新成功!");
}
}
解说
参数格式 {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>
public class TestAction extends FastAction {
/**
* 获得路由地址
* Get routing address
* @return
*/
@Override
protected String getRoute() {
return "/test";
}
public void updateUser(){
//获取前端用户相关参数,并自动合并转为map对象
FcUserEntity user = getParamToEntity("user", FcUserEntity.class);//传入参数的前缀 user 即可
//获取前端部门相关参数,并自动合并转为map对象
FcDeptEntity user = getParamToEntity("user", FcDeptEntity.class);//传入参数的前缀 dept 即可
/**省略其他业务判断逻辑**/
responseText("更新成功!");
}
}
解说
参数格式 {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>
public class TestAction extends FastAction {
/**
* 获得路由地址
* Get routing address
* @return
*/
@Override
protected String getRoute() {
return "/test";
}
public void updateUser(){
//获取参数前缀为user,并且包含下标[i]的参数,转为List<Map>格式
List<FcUserEntity> users = getParamToEntityList("user", FcUserEntity.class);
for (FcUserEntity user : users) {
}
/**省略其他业务判断逻辑**/
responseText("更新成功!");
}
}
解说
参数格式 {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("更新成功!");
}
}