前言
本章讲解JFinal的控制器类Controller的配置详解
方法
1.概念
和其他框架一样,JFinal也是要有action/controller的。
Controller是JFinal核心类之一,该类作为MVC模式中的控制器。基于JFinal的Web应用的控制器需要继承该类。Controller是定义Action方法的地点,是组织Action的一种方式,一个Controller可以包含多个Action。Controller是线程安全的。
package cn.edu.ccut.controller;
import com.jfinal.core.Controller;
/**
* JFinal的控制器类
*/
public class HelloController extends Controller {
//控制器的默认访问方法,相当于Struts的execute
public void index(){
//返回text文本
renderText("Hello JFinal");
}
//控制器的普通访问方法
public void hello(){
//返回页面
render("hello.jsp");
}
}
2.获取页面传递的参数
首先我们定义一个表单:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JFinal</title>
</head>
<body>
<form action="hello/hello" method="post">
username:<input type="text" name="username"/><br/>
password:<input type="password" name="password"/><br/>
<input type="submit" value="login"/>
</form>
</body>
</html>
1)getPara 系列方法
Controller提供了getPara系列方法用来从请求中获取参数。getPara系列方法分为两种类型。第一种类型为第一个形参为String的getPara系列方法。该系列方法是对HttpServletRequest.getParameter(String name)的封装,这类方法都是转调了HttpServletRequest.getParameter(String name)。
第二种类型为第一个形参为int或无形参的getPara系列方法。该系列方法是去获取urlPara中所带的参数值。getParaMap与getParaNames分别对应HttpServletRequest的getParameterMap与getParameterNames。
2)getBean与getModel系列
这里有必要讲解一下:
getBean方法大家自行去理解,和我们原始的bean中添加属性和get/set是一样的。JFinal创新性的一点就是他的实体类可以如此简洁:
package cn.edu.ccut.bo;
import com.jfinal.plugin.activerecord.Model;
public class User extends Model<User> {
public static final User dao = new User().dao();
}
也就是说,他是纯粹依靠数据库字段的!!!
那么,getModel方法就是专门为此而服务的,使用Oracle的同志们需要做如下配置:
public void configPlugin(Plugins me) {
DruidPlugin dp = new DruidPlugin("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
me.add(dp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
me.add(arp);
//配置数据库方言
arp.setDialect(new OracleDialect());
// 配置属性名(字段名)大小写不敏感容器工厂
arp.setContainerFactory(new CaseInsensitiveContainerFactory());
arp.addMapping("users", User.class);
}
使用上面示例中使用的表单即可。
controller方法做如下定义:
//控制器的普通访问方法
public void hello(){
User user = getModel(User.class,"");
System.out.println(user);
//返回页面
render("/hello.jsp");
}
这样就可以获取表单传过来的参数!!
注意:getModel方法的第一个参数为实体类型,第二个参数为参数前缀,我们这里默认不加前缀
可以加前缀user,那么表单的name属性即为:user.username,user.password
默认的前缀为实体类首字母小写,也可以自定义!
3.页面获取controller传递参数
1)setAttr方法
JFinal专门提供了setAttr方法来设置传递到前台页面的参数
拿上面表单传递过来的user对象传递到hello.jsp
//控制器的普通访问方法
public void hello(){
User user = getModel(User.class,"");
System.out.println(user);
setAttr("user",user);
//返回页面
render("/hello.jsp");
}
hello.jsp进行参数接收:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JFinal</title>
</head>
<body>
${user.username}
</body>
</html>
程序运行结果如下所示:
2)setSessionAttr方法
此外,通过setSessionAttr(key, value)可以向session中存放数据,getSessionAttr(key)可以从session中读取数据。还可以通过getSession()得到session对象从而使用全面的session API。
4.页面跳转
1)render系列方法
render系列方法将渲染不同类型的视图并返回给客户端。JFinal目前支持的视图类型有:JFinal Template、FreeMarker、JSP、Velocity、JSON、File、Text、Html、QrCode 二维码 等等。除了JFinal支持的视图型以外,还可以通过继承Render抽象类来无限扩展视图类型。
通常情况下使用Controller.render(String)方法来渲染视图,使用Controller.render(String)时的视图类型由JFinalConfig.configConstant(Constants constants)配置中的constants. setViewType(ViewType)来决定,该设置方法支持的ViewType有:JFINAL_TEMPLATE、FreeMarker、JSP、Velocity,不进行配置时的缺省配置为JFINAL_TEMPLATE。
上面的例子就是跳转到hello.jsp
接下来着重测试一下Ajax功能,前台编写Ajax如下:
$(function () {
$("#test").click(function () {
$.ajax({
url:"/hello/test",
data:{username:"username",password:"password"},
success:function(data){
alert(data.username);
}
});
});
});
后台controller方法如下:
//Ajax测试
public void test(){
User user = getModel(User.class,"");
renderJson(user);
}
经测试,完全可以使用!!
更多render方法如下所示:
// 渲染名为test.html的视图,且视图类型为 JFinal Template
renderTemplate(”test.html”);
// 生成二维码
renderQrCode("content");
// 渲染名为test.html的视图,且视图类型为FreeMarker
renderFreeMarker(”test.html”);
// 渲染名为test.html的视图,且视图类型为Velocity
renderVelocity(“test.html”);
// 将所有setAttr(..)设置的变量转换成 json 并渲染
renderJson();
// 以 "users" 为根,仅将 userList 中的数据转换成 json 并渲染
renderJson(“users”, userList);
// 将user对象转换成 json 并渲染
renderJson(user);
// 直接渲染 json 字符串
renderJson("{\"age\":18}" );
// 仅将setAttr(“user”, user)与setAttr(“blog”, blog)设置的属性转换成json并渲染
renderJson(new String[]{"user", "blog"});
// 渲染名为test.zip的文件,一般用于文件下载
renderFile("test.zip");
// 渲染纯文本内容 "Hello JFinal"
renderText("Hello JFinal");
// 渲染 Html 内容 "Hello Html"
renderHtml("Hello Html");
// 渲染名为 test.html 的文件,且状态为 404
renderError(404 , "test.html");
// 渲染名为 test.html 的文件,且状态为 500
renderError(500 , "test.html");
// 不渲染,即不向客户端返回数据
renderNull();
// 使用自定义的MyRender来渲染
render(new MyRender());