JFinal入门(四)JFinal的Controller配置详解

版权声明:程序猴jwang版权所有 https://blog.csdn.net/qq_21046965/article/details/86710647

前言

      本章讲解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());

猜你喜欢

转载自blog.csdn.net/qq_21046965/article/details/86710647