1.概述
Controller 是 JFinal 核心类之一,该类作为 MVC 模式中的控制器。基于 JFinal 的 Web 应用的控制器需要继承该类。Controller 是定义 Action 方法的地点,是组织 Action 的一种方式,一个 Controller 可以包含多个 Action。Controller 是线程安全的。
2 Action
Controller 以及在其中定义的 public 无参方法称为一个 Action。Action 是请求的最小单位。Action 方法必须在 Controller 中声明,该方法必须是 public 可见性且没有形参。
以上代码中定义了两个 Action:HelloController.index()、HelloController.test()。在 Controller中提供了 getPara、getModel 系列方法 setAttr 方法以及 render 系列方法供 Action 使用。
3 getPara 系列方法
Controller提供了getPara系列方法用来从请求中获取参数。getPara系列方法分为两种类型。第 一 种 类 型 为 第 一 个 形 参 为 String 的 getPara 系列方法。 该 系 列 方法是对HttpServletRequest.getParameter(String name) 的封装, 这 类 方 法 都 是 转 调 了HttpServletRequest.getParameter(String name)。第二种类型为第一个形参为 int 或无形参的getPara 系列方法。该系列方法是去获取 urlPara 中所带的参数值。getParaMap 与 getParaNames分别对应 HttpServletRequest 的 getParameterMap 与 getParameterNames。
记忆技巧:第一个参数为 String 类型的将获取表单或者 url 中问号挂参的域值。第一个参数为int 或无参数的将获取 urlPara 中的参数值。
getPara 使用例子:
4 getModel 系列方法
getModel 用来接收页面表单域传递过来的 model 对象,表单域名称以”modelName.attrName”方式命名,除了支持 JFinal 的 Model 对象以外,getModel 同时也支持传统的 Java Bean。以下是一个简单的示例:
上面代码中,表单域采用了”blog.title”、”blog.content”作为表单域的 name 属性,”blog”是类文件名称”Blog”的首字母变小写,”title”是 blog 数据库表的 title 字段,如果希望表单域使用任意的 modelName ,只需要在 getModel 时 多 添 加 一 个 参 数 来 指 定 , 例 如 :getModel(Blog.class, ”otherName”)。
5 getFile 文件上传
Controller 提供了 getFile 系列方法支持文件上传。特别注意:如果客户端请求为 multipart request(form 表单使用了 enctype="multipart/form-data"),那么必须先调用 getFile 系列方法才能使 getPara 系列方法正常工作,因为 multipart request 需要通过 getFile 系列方法解析请求体中的数据,包括参数。
6 setAttr 方法
setAttr(String, Object)转调了 HttpServletRequest.setAttribute(String, Object),该方法可以将各种数据传递给 View 并在 View 中显示出来。
7 session 操作方法
通过setSessionAttr(key, value)可以向session 中存放数据,getSessionAttr(key)可以从session中读取数据。还可以通过 getSession()得到 session 对象从而使用全面的 session API。
8 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 方法使用例子:
注意:
1:IE 不支持 contentType 为 application/json,在 ajax 上传文件完成后返回 json 时 IE 提示下载文件 , 解 决 办 法 是 使 用 : render(new JsonRender().forIE()) 或者 render(new JsonRender(params).forIE())。这种情况只出现在 IE 浏览器 ajax 文件上传,其它普通 ajax 请求不必理会。
2:除 renderError 方法以外,在调用 render 系列的方法后程序并不会立即返回,如果需要立即返回需要使用 return 语句。在一个 action 中多次调用 render 方法只有最后一次有效。