控制器(Controller)
编辑教程控制器(Controller)
Controller 是 JFinal 核心类之一,该类作为 MVC 模式中的控制器。基于 JFinal 的 Web 应 用的控制器需要继承该类。
Controller 是定义 Action 方法的地点,是组织 Action 的一种方式, 一个 Controller 可以包含多个 Action。Controller 是线程安全的。
Action
Controller 以及在其中定义的 public 无参方法称为一个 Action。Action 是请求的最小单位。
Action 方法必须在 Controller 中声明,该方法必须是 public 可见性且没有形参。
ublic class HelloController extends Controller {
public void index() { renderText("此方法是一个action");
}
public void test() { renderText("此方法是一个action");
}
}
以上代码中定义了两个 Action:HelloController.index()、HelloController.test()。在 Controller中提供了 getPara、getModel 系列方法 setAttr 方法以及 render 系列方法供 Action 使用。
getPara 系列方法
Controller 提供了 getPara 系列方法用来从请求中获取参数。getPara 系列方法分为两种类型。
第一种类型为第一个形参为String的getPara系列方法。该系列方法是对HttpServletRequest.getParameter(Stringname)的封装,这类方法都是转调了HttpServletRequest.getParameter(Stringname)。
第二种类型为第一个形参为int或无形参的getPara系列方法。该系列方法是去获取urlPara中所带的参数值。getParaMap与getParaNames分别对应HttpServletRequest的getParameterMap与getParameterNames。
记忆技巧:第一个参数为 String 类型的将获取表单或者 url 中问号挂参的域值。第一个参数为int 或无参数的将获取 urlPara 中的参数值。
getPara 使用例子:
方法调用 | 返回值 |
---|---|
getPara(”title”) | 返回页面表单域名为“title”参数值 |
getParaToInt(”age”) | 返回页面表单域名为“age”的参数值并转为 int 型 |
getPara(0) | 返回 url 请求中的 urlPara 参数的第一个值,如 http://localhost/controllerKey/method/v0-v1-v2 这个请求将 返回”v0” |
getParaToInt(1) | 返回 url 请求中的 urlPara 参数的第二个值并转换成 int 型,如 http://localhost/controllerKey/method/2-5-9 这个请求将返回 5 |
getParaToInt(2) | 如 http://localhost/controllerKey/method/2-5-N8 这个 请求将返回 -8。注意:约定字母 N 与 n 可以表示负 号,这对 urlParaSeparator 为 “-” 时非常有用。 |
getPara() | 返回 url 请求中的 urlPara 参数的整体值, 如 http://localhost/controllerKey/method/v0-v1-v2 这个 请求将返回”v0-v1-v2” |
getModel 与 getBean 系列方法
getModel 用来接收页面表单域传递过来的 model 对象,表单域名称以”modelName.attrName” 方式命名。除了 getModel 以外,还提供了一个 getBean 方法用于支持传统的 Java Bean。以下 是一个简单的示例:
// 定义Model,在此为Blog
public class Blog extends Model<Blog> {
public static final Blog me = new Blog();
}
// 在页面表单中采用modelName.attrName形式为作为表单域的name
<form action="/blog/save" method="post">
<input name="blog.title" type="text">
<input name="blog.content" type="text">
<input value="提交" type="submit">
</form>
public class BlogController extends Controller {
public void save() {
// 页面的modelName正好是Blog类名的首字母小写
Blog blog = getModel(Blog.class);
// 如果表单域的名称为 "otherName.title"可加上一个参数来获取 blog = getModel(Blog.class, "otherName");
}
}
上面代码中,表单域采用了”blog.title”、”blog.content”作为表单域的 name 属性,”blog”是类 文件名称”Blog”的首字母变小写,”title”是 blog 数据库表的 title 字段,如果希望表单域使用任 意的 modelName , 只 需 要 在 getModel 时 多 添 加 一 个 参 数 来 指 定 , 例 如 : getModel(Blog.class, ”otherName”)。
如果希望传参时避免使用 modelName 前缀,可以使用空串作为 modelName 来实现:getModel(Blog.class, “”); 这对开发纯 API 项目非常有用。
setAttr 方法
setAttr(String, Object)转调了 HttpServletRequest.setAttribute(String, Object),该方法可以将 各种数据传递给 View 并在 View 中显示出来。
getFile 文件上传
Controller 提供了 getFile 系列方法支持文件上传。
注意:如果客户端请求为 multipart request(form 表单使用了 enctype="multipart/form-data"),那么必须先调用 getFile 系列方法才 能使 getPara 系列方法正常工作,因为 multipart request 需要通过 getFile 系列方法解析请求体中 的数据,包括参数。
文件默认上传至项目根路径下的 upload 子路径之下,该路径称为文件上传基础路径。可以 在 JFinalConfig.configConstant(Constants me)方法中通过 me.setBaseUploadPath(baseUploadPath) 设置文件上传基础路径,该路径参数接受以”/”打头或者以 windows 磁盘盘符打头的绝对路径, 即可将基础路径指向项目根径之外,方便单机多实例部署。当该路径参数设置为相对路径时, 则是以项目根为基础的相对路径。
renderFile 文件下载
Controller 提供了 renderFile 系列方法支持文件下载。
文件默认下载路径为项目根路径下的 download 子路径之下,该路径称为文件下载基础路径。
可以在 JFinalConfig.configConstant(Constants me)方法中通过me.setBaseDownloadPath(baseDownloadPath) 设置文件下载基础路径,该路径参数接受以”/”打 头或者以 windows 磁盘盘符打头的绝对路径,即可将基础路径指向项目根径之外,方便单机多实例部署。
当该路径参数设置为相对路径时,则是以项目根为基础的相对路径
session 操作方法
通过 setSessionAttr(key, value)可以向 session 中存放数据,getSessionAttr(key)可以从 session中读取数据。还可以通过 getSession()得到 session 对象从而使用全面的 session API。
render 系列方法
render 系列方法将渲染不同类型的视图并返回给客户端。JFinal 目前支持的视图类型有: FreeMarker、JSP、Velocity、JSON、File、Text、Html 等等。
除了 JFinal 支持的视图型以外,还可以通过继承 Render 抽象类来无限扩展视图类型。
通常情况下使用 Controller.render(String)方法来渲染视图,使用 Controller.render(String)时 的 视 图 类 型 由 JFinalConfig.configConstant(Constants constants) 配置中的constants. setViewType(ViewType)来决定,该设置方法支持的 ViewType 有:FreeMarker、JSP、Velocity, 不进行配置时的缺省配置为 FreeMarker。
此外,还可以通过constants.setMainRenderFactory(IMainRenderFactory) 来设置 Controller.render(String)所使用的视图,IMainRenderFactory 专门用来对 Controller.render(String) 方法扩展除了 FreeMarker、JSP、Velocity 之外的视图。
假设 在 JFinalConfig.configRoute(Routes routes) 中有 如下 Controller 映射配置 :routes.add(“/user”, UserController.class, “/path”), render(String view)使用例子:
方法调用 | 描述 |
---|---|
render(”test.html”) | 渲染名为 test.html 的视图,该视图的全路 径 为”/path/test.html” |
render(”/other_path/test.html”) | 渲染名为 test.html 的视图,该视图的全路 径 为”/other_path/test.html”,即当参数以”/”开头时将 采用绝对路径。 |
其它 render 方法使用例子:
方法调用 | 描述 |
---|---|
renderFreeMarker(”test.html”) | 渲染 名为 test.html 的视图 , 且 视图类型为 FreeMarker。 |
renderJsp(”test.html”) | 渲染名为 test.html 的视图,且视图类型为 Jsp。 |
renderVelocity(“test.html”) | 渲染名为 test.html 的视图,且视图类型为 Velocity。 |
renderJson() | 将所有通过 Controller.setAttr(String, Object)设置 的变量转换成 json 数据并渲染。 |
renderJson(“users”, userList) | 以”users”为根,仅将 userList 中的数据转换成 json 数据并渲染。 |
renderJson(user) | 将 user 对象转换成 json 数据并渲染。 |
renderJson(“{\”age\”:18}” ) | 直接渲染 json 字符串。 |
renderJson(new String[]{“user”, “blog”}) | 仅将 setAttr(“user”, user)与 setAttr(“blog”, blog)设置的属性转换成 json 并渲染。 使用 setAttr 设置的 其它属性并不转换为 json。 |
renderFile(“test.zip”); | 渲染名为 test.zip 的文件,一般用于文件下载 |
renderText(“Hello JFinal”) | 渲染纯文本内容”Hello JFinal”。 |
renderHtml(“Hello Html”) | 渲染 Html 内容”Hello Html”。 |
renderError (404 , “test.html”) | 渲染名为 test.html 的文件,且状态为 404。 |
renderError (500 , “test.html”) | 渲染名为 test.html 的文件,且状态为 500。 |
renderNull() | 不渲染,即不向客户端返回数据。 |
render(new XmlRender()) | 使用自定义的 XmlRender 来渲染。 |
注意:
IE 不支持 contentType 为 application/json,在 ajax 上传文件完成后返回json时IE提示下载文件, 解决办法是使用 : render(new JsonRender().forIE()) 或者 render(new JsonRender(params).forIE())。这种情况只出现在 IE 浏览器 ajax 文件上传,其它普通 ajax 请求 不必理会。
除 renderError 方法以外,在调用 render 系列的方法后程序并不会立即返回,如果需要立即 返回需要使用 return 语句。在一个 action 中多次调用 render 方法只有最后一次有效。
选择支付方式:
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间