JSRUN 用代码说话

控制器(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 方法只有最后一次有效。

JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟