Controller接参与传参
3.0 概述
Controller是JFinal核心类之一,该类作为MVC模式中的控制器。基于JFinal的Web应用的控制器需要继承该类。Controller是定义Action方法的地点,是组织Action的一种方式,一个Controller可以包含多个Action。Controller是线程安全的。 public 方法称为Action,Action一般是没有返回类型的,即是void方法,需要返回的内容都是render系列方法进行返回。
3.1 接参:get / getPara 系列方法
getPara系列方法用来从请求中获取参数
/**
* 获取参数
*/
public void paraTest() {
String name = getPara("name");
int age = getInt("age");
renderText("成功!");
}
直接使用get方法获取的参数值是String类型的,除此之外还提供了获取特定类型的
getInt、getLong、getBoolean、getDate系列方法。
3.2 接参:getBean / getModel 系列
getModel :getModel 用来接收页面表单域传递过来的model对象,表单域名称以”modelName.attrName”方式命名,getModel使用的attrName必须与数据表字段名完全一样。
getBean: getBean方法用于支持传统JavaBean,包括支持使用jfinal生成器生成了getter、setter方法的Model,页面表单传参时使用与setter方法相一致的attrName,而非数据表字段名。
表单域需要使用 “user.name”、“user.age” 作为表单域的name属性,“user” 是类文件名称 "User"的首字母变小写, “name”
是User类中与setter方法相一致的attrName。如果希望表单域使用任意beanName,只需要在getBean时多添加一个参数来指定,
例如:getBean(User.class,“otherName”)。如果希望传参时避免使用beanName前缀,可以使用空串作beanName来实现:getBean(User.class,""); 这对开发纯API项目非常有用。(getModel 同样适用)
User user = getBean(User.class, “”);
如果希望在接收时跳过数据转换或者属性名错误异常可以传入true参:getBean(…, true)
区别:getModel与getBean区别在于前者使用数据库表字段名而后者使用与setter方法一致的属性名进行数据注入。建议优先使用getBean方法。
public void saveUser() {
User user = getBean(User.class, "");
System.out.println(user.getName());
System.out.println(user.getAge());
renderText("getBean提交成功");
}
3.3 作用域传参:setAttr / set 方法
将各种数据传递给View并在View中显示出来
其封装HttpServletRequest.setAttribute(String, Object)方法:
public void setTest() {
setAttr("name", "zhangsan");
set("age", 30);
}
3.4 sesion和cookie
3.4.1 sesion操作方法
可以通过下面几个方法操作session中的参数,这里JFinal底层操作的还是HttpSession,只是对方法做了一层封装。
//放置参数
setSessionAttr(String key, Object value)
//获取参数
getSessionAttr(String key)
//去除参数
removeSessionAttr(String key)
//还可以得到 session 对象从而使用全面的session API
getSession()
3.4.2 页面显示session数据
JFinal 页 面 不 能 直 接 获 取 session 中 的 数 据 , 需 要 添 加 一 个 已 有 的 拦 截 器SessionInViewInterceptor(),之后就可以通过session前缀获取里面的参数了。这里可以看下拦截器的源码,其实只是把session中的参数遍历放置到session参数中了,所以页面获取的时候需要使用这个前缀。
@Override
public void configInterceptor(Interceptors me) {
// 这个是为了在页面获取session中的数据添加的全局拦截器
me.add(new SessionInViewInterceptor());
}
3.4.3 cookie操作方法
//设置cookie,并指定有效时间(单位秒)
setCookie(String name, String value, int maxAgeInSeconds)
//获取cookie中的内容,有一系列方法可以获取指定类型
getCookie(String name)
//去除cookie信息
removeCookie(String name)
3.4.4 页面中使用cookie
JS操作:可以使用document.cookie获取所有的cookie,再自行解析处理就行了;
页面显示:参照SessionInViewInterceptor拦截器进行处理,也可以直接在页面显示。
3.4.5 session和cookie的区别
- 存储位置不同:session在服务端,cookie在客户端;
- 存储容量不同:单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于session来说并没有上限;
- 存储方式不同:cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。session中能够存储任何类型的数据;
- 跨域支持上不同:cookie支持跨域名访问。session不支持跨域名访问
3.5 跳转方式
forwardAction:请求转发,服务端行为,属于同一个请求;
redirect:请求重定向,客户端行为,属于不同的两个请求;
/**
* 请求转发演示
*/
public void forwardTest() {
System.out.println("forwardTest---");
set("address", "请求转发的地址");
forwardAction("/myController/setTest");
}
/**
* 重定向演示
*/
public void redirectTest() {
System.out.println("redirectTest---");
set("address", "重定向的地址");
redirect("/myController/setTest");
}
3.6 render系列方法(返回)
3.6.1 render(String view)
render(String view)是最常用的返回方法之一,render(String view) 方法将对 view 所指向的模板进行渲染,view 参数最终指向的模板文件
3.6.2 打破viewPath规则
当需要打破 baseViewPath 与 viewPath 这两个参数的限制时,view 参数以 “/” 打头即可。 view 参数以 “/” 打头时,将勿略掉 baseViewPath 与 viewPath 这两个值
3.6.3 renderJson(Object object)
最常用的返回方法之二,将Object对象转换成 json 并渲染,前端使用ajax提交的数据基本都是这种方式返回。同时还有一系列的类似方法:
// 将ret对象转换成 json 并渲染
renderJson(ret);
// 将所有setAttr(..)设置的变量转换成 json 并渲染
renderJson();
// 仅将setAttr(“user”, user)与setAttr(“blog”, blog)设置的属性转换成json并渲染
renderJson(new String[]{"user", "blog"});
// 以 "users" 为根,仅将 userList 中的数据转换成 json 并渲染
renderJson(“users”, userList);
// 直接渲染 json 字符串
renderJson("{\"age\":18}" );
3.6.4 其他常用方法
renderFile
renderCaptcha
renderQrCode
render(Render render)
renderError
renderNull
renderText
renderJavascript
renderHtml
renderXml
3.6.5 配置模板引擎
render(String view) 将根据 configConstant(Constants me) 中配置的me.setViewType(ViewType) 方法选择一种模板引进渲染模板文件,默认将选择 jfinal 内置的 enjoy 模板引擎渲染模板,如果没有明确配置使用的就是默认的。注意该配置仅仅针对 Controller.render(String view) 方法,其它 render 系方法完全不受影响。支持的ViewType有:JFINAL_TEMPLATE、FreeMarker、JSP、Velocity。同时针对不同的ViewType提供了专门的视图渲染方法,如下:
// 渲染名为test.html的视图,且视图类型为 JFinal Template
renderTemplate("test.html");
// 渲染名为test.html的视图,且视图类型为FreeMarker
renderFreeMarker("test.html");
// 渲染名为test.jsp的视图,且视图类型为jsp
renderJsp("test.jsp");
// 渲染名为test.html的视图,且视图类型为Velocity
renderVelocity("test.html");