JFinal 入门

1. 创建MyAppConfig.java

首先创建MyJFinal的配置类MyAppConfig.java:

在方法中添加如下代码:


@Override

public void configConstant(Constants me) {

me.setDevMode(true);

me.setEncoding("utf-8");

me.setViewType(ViewType.JSP);

}

@Override

public void configHandler(Handlers me) {

me.add(new ContextPathHandler("basePath"));

}

2. 修改web.xml

既然MyAppConfig.java是入口,那么,在Tomcat这个容器中,就需要配置这个入口,使得Tomcat启动的同时加载这个入口类。

打开web.xml,追加内容:


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

<display-name>MyJFinalApp</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<filter>

<filter-name>jfinal</filter-name>

<filter-class>com.jfinal.core.JFinalFilter</filter-class>

<init-param>

<param-name>configClass</param-name>

<param-value>cn.myapp.config.MyAppConfig</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>jfinal</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

</web-app>

3. 创建JSP页面文件

在创建JSP页面之前先修改一下JSP文件的默认字符集。如下图所示,打开菜单Windows-->Perferences,在弹出的窗口中修改默认字符集为utf-8即可:

文件名为index.jsp,并放入WebContent中:


<body>

<form action="${basePath}/sayHello" method="post">

请输入您的名字:

<input type="text" name="userName" />

<input type="submit" value="确定"/>

</form>

</body>

同样的步骤,再创建一个hello.jsp,并在<body>标签中追加如下代码:


<body>

<p>${sayHello}</p><p><a href="${basePath}/"></a></p>

</body>

4. 创建Controller类

创建IndexController.java用于响应页面请求,如下图:

并添加代码:


public class IndexController extends Controller {

public void index(){

this.render("/index.jsp");

}

public void sayHello(){

String userName = this.getAttr("userName");

String sayHello = "Hello " + userName + ",welcome to JFinal world.";

this.setAttr("sayHello", sayHello);

this.render("/hello.jsp");

}

}

5. 注册Controller路由

JSP页面和Controller都准备完成后,就需要在MyAppConfig.java中将两者关联起来,JFinal里称之为Route(路由),下面是MyAppConfig类中追加的路由代码:


@Override

public void configRoute(Routes me) {

me.add("/", IndexController.class);

}

2. 发布、运行与调试

2.1. 发布

打开浏览器,并输入URL:http://localhost:8080/MyJFinalApp/,应该可看到如下画面:

小白们,感动吧,终于将JFinal环境搭建起来了。

在输入框中输入“小白”,点击确定,出现下面的画面:

调试

很明显,页面中出现了错误,红框中标识的内容是null,而不是期待的“小白”。

再看看控制台的输出:

在页面中输入的字串正确地传给了后台IndexController.sayHello()方法,那么,为什么没有显示出来呢?请小白在IndexController.sayHello()中追加断点:

然后再次打开URL:http://localhost:8080/MyJFinalApp/,在输入框中输入“小白”,点击确定。这时,Eclipse进入调试模式。通过调试查看userName取得的值为null:

仔细分析发生错误的这行代码,或直接查看此方法的源码,原来,getArrt("userName")方法取到的是HttpServletRequest中的属性,而不是请求参数。应该改成从取参数的getPara("userName")方法:


public void sayHello(){

String userName = this.getPara("userName");

。。。。。。

又一次打开UR:http://localhost:8080/MyJFinalApp/,在输入框中输入“小白”,点击确定,终于出现了令人期待的结果:

为小白解惑

实际上,除去Eclipse和Tomcat的准备以外,配置及编码那块在熟练的人手里只需要10分钟左右,当之无愧的极速WEB开发。当然,前面只是使用到了JFinal的WEB框架,ORM框架在后面的教程中会介绍到。

这一章节,将粗略地讲解一下JFinal的WEB部分是如何搭载在Tomcat容器中,启动并响应用户操作的过程。

另外,推荐小白们看完此章节后研究下张剑峰同学写的《JFinal技术架构浅析》一文。

JFinal启动

前面,小白们创建MyAppConfig.java,同时修改web.xml。这就为启动JFinal做好了准备,下面我们就来分析下Tomcat启动的同时是怎么初始化MyJFinalApp的。

先来看web.xml:


<filter>

<filter-name>jfinal</filter-name>

<filter-class>com.jfinal.core.JFinalFilter</filter-class>

<init-param>

<param-name>configClass</param-name>

<param-value>cn.myapp.config.MyAppConfig</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>jfinal</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

xml中首先声明了<filter>,它是JFinalFilter,同时定义了<init-param>,指向应用程序的配置类MyAppConfig.java。

在<filter-mapping>中,定义了<url-pattern>为“/*”,也就是说,此Web应用所有的URL都将将由JFinalFilter这个过滤器来处理。

Tomcat启动过程:

过程中,对于JFinal开发人员来说,最有用操作就是“调用MyAppConfig各方法”,也就是执行了如下代码:


@Override

public void configConstant(Constants me) {

me.setDevMode(true);

me.setEncoding("utf-8");

me.setViewType(ViewType.JSP);

}

@Override

public void configHandler(Handlers me) {

me.add(new ContextPathHandler("basePath"));

}

@Override

public void configRoute(Routes me) {

me.add("/", IndexController.class);

}

各方法的作用请参考《JFinal-手册-1.5.pdf》,此处不再复述手册可从官网http://www.jfinal.com/下载。

响应用户操作

应用中,创建了两个JSP页面,分别是“index.jsp”和“hello.jsp”,在浏览器中访问http://localhost:8080/MyJFinalApp/时明显打开了index.jsp页面。经历过SSH或SpringMVC的小白应该会很奇怪,明明没有像SpringMVC那样用注解声明Controller,也没有在注解方法对应的URL,而JFinal却正确地打开了index.jsp。

首先请看MyAppConfig.configRoute()方法中的URL路由代码:


me.add("/", IndexController.class);

这句代码实际上已经配置了URL与Controller之间的对应关系,第一个参数"/"就是指的根。当用户访问根URL时,依据约定JFinal会将其路由到IndexController.index()方法。

那么,在访问http://localhost:8080/MyJFinalApp/时,JFinal如何知道访问的是"/"(根)呢?

首先请小白双击Tomcat配置项:

在弹出的Tomcat实例属性窗口中找到Ports选项:

这里说明Tomcat实例使用的是8080端口,也就是通过http://localhost:8080可访问此Tomcat。

然后请小白打开部署的Tomcat实例的server.xml:

在server.xml底部,我们可以发现MyJFinalApp的配置:


<Context docBase="MyJFinalApp" path="/MyJFinalApp" reloadable="true" source="org.eclipse.jst.jee.server:MyJFinalApp"/>

请看path参数,它的值为"/MyJFinalApp"(一定要和前面Context root配置一样),说明此应用部署到Tomcat的后使用的根URL为“http://localhost:8080”+ “/MyJFinalApp” = “http://localhost:8080/MyJFinalApp”。

提示:修改reloadable的值为false,在调试状态,修改MyJFinalApp的代码时Tomcat不会频繁重新加载应用,节省开发调试时间。

通过上面,我们已经知道,通过访问http://localhost:8080/MyJFinalApp/,JFinal会将其路由到IndexController.index()方法,为什么是index()方法?其实这是一个约定,具体的约定请参考《JFinal-手册-1.5.pdf》。

那么它是如何打开index.jsp文件的呢?我们来查看index()方法的代码:


public class IndexController extends Controller {

public void index(){

this.render("/index.jsp");

}

。。。。。。

只有一句代码,作用是渲染\WebContent\index.jsp这个文件后返回给浏览器。小白们又糊涂了,为什么不return一个字串来指定渲染页面呀?这里就是JFinal设计者的聪明之处了,渲染页面可能不止常见的JSP、FREE_MARKER、VELOCITY等几种类型,随着技术的发展,模板页面类型会层出不穷。JFinal中,只需要扩展Render就可轻松支持,赞呀^_^。

打开index.jsp后,用户在页面中输入名字,然后点击确定,这里调用的是如下action代码:


<form action="${basePath}/sayHello" method="post">

请输入您的名字:

<input type="text" name="userName" />

<input type="submit" value="确定"/>

</form>

action的值为"${basePath}/sayHello",那么${basePath}是什么东东呢?有点JSP基础的人都知道,basePath必须设置到HttpServletRequest中才能在页面中使用。那么又是什么时候设置进去的呢?请注意前面创建MyAppConfig.java中的一段代码:


@Override

public void configHandler(Handlers me) {

me.add(new ContextPathHandler("basePath"));

}

在这里配置了一个ContextPathHandler,构造参数是"basePath",难道它们有联系!没错,小白们可直接查看此Handler的源码就可以发现,一行代码已经做必须的事情:


public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {

request.setAttribute(contextPathName, request.getContextPath());

nextHandler.handle(target, request, response, isHandled);

}

ContextPathHandler就只做了这么一件事情,就是在每次(注意是每次)请求时将Context Path(此应用中的值为"/MyJFinalApp")设置到HttpServletRequest的属性"basePath"中,这样,页面就可以使用了。

为了证实这一点,可在浏览器中打开index.jsp返回的html源码:

此页面中,点击确定,就将用户输入的”userName”,通过Post方式调用http://localhost:8080/MyJFinalApp/sayHello地址。最终,调用的是IndexController.sayHello()方法。

JFinal是怎么知道调用的是此方法呢?其实很简单,在JFinal的路由规则中,首先会去匹配地址”/sayHello”。显然是找不到的,因为在MyAppConfig.configRoute()方法中根本就没有配置与”/sayHello”对应的Controller。所以JFinal会截掉最后一个”/”后的内容再次匹配,”/sayHello”截取掉后就成了”/”,也就匹配到了IndexController。根据约定,被截取的内容”sayHello”应该是方法名,所以,也顺序定位到了IndexController.sayHello()方法。

小白们,明白了吧,JFianl的路由约定抛弃掉了繁琐的注解,这就是一种简洁美。这种设计在JFianl中处处都存在,随着对JFinal了解的加深,大家会慢慢体会到约定大于配置不单单是一句口号。

有部分人也提出了质疑:注解能规范编码,一目了然……等等。但如果回过头来想,注解实际上也就是一种显示的约定而已,而JFianl将其当成了隐式约定。使用注解功能更强了点吗?答案是没有,SSH和SpringMVC的这类注解与JFinal的实际提供的路由在功能上没有任何区别,没有脱离Servlet的范畴。

来自:http://my.oschina.net/u/1175852/blog/261235

时间: 2024-10-08 20:57:10

JFinal 入门的相关文章

Jfinal资料汇总(慢慢更新)

Jfinal入门视频下载链接: http://yun.baidu.com/share/link?shareid=4213402466&uk=3107304168 Jfinal-FreeMarker的使用: http://pan.baidu.com/s/1dD8kS3v bootstrap视频(不是我录得) http://pan.baidu.com/s/1gdiucSz

新手入门-如何使用JFinal开发javaweb(1)

博主本人是菜鸟.写这篇博客的原因是为了让和我一样的入门级菜鸟少走弯,还有就是加深我的理解. JFinal框架是国产的很轻量级的开发框架.能让程序员写的代码精简很多,开发效率从而更快. 我是写了一个JFinal版的数据库验证+跳转的Demo. 介绍开始: 编辑器:MyEclipse; 数据库:MySQL; 服务器:tomcat; 1 首先新建web项目 要强调的是Target runtime必须选择为None.然后点击两次Next,选中创建web.xml.finish~~~ 2 导入支撑项目的ja

jFinal 2.2入门学习之一:搭建框架输出helloword

官方推荐用Eclipse IDE for Java EE Developers 做为开发环境 1.创建 Dynamic Web Project 2.修改 Default Output Folder,推荐输入 WebRoot\WEB-INF\classes 3.修改 Content directory,推荐输入 WebRoot 4.去官网下载最新的jfinal框架(我这是JFinal-2.2) 把jetty-server-8.1.8.jar jfinal-2.2-bin.jar和jfinal-2.

JFinal+maven+freemarker 入门教程

写在前面的话 前两天听说了JFinal,简介甚是牛擦,号称java框架终结者,也是醉了,言归正传,我们就不研究他的宣传语了.不过他这个框架确实有他所说的一些特性,一起看看. 官网 http://www.jfinal.com/ JFinal 极速开发 JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful. 在拥有Java语言所有优势的同时再拥有ruby.python.php等动态语言的开发效率!

SpringMVC入门示例教程(一)

其实之前刚刚学习框架的时候就已经听说过SpringMVC了,那个时候还不知道SpringMVC是干嘛的,感觉作用应该类似于Spring啥的,然后工作当中也很少用到SpringMVC,当然,工作经验本身就蛮少,也就没怎么去了解SpringMVC了,这几天突然想了解一下SpringMVC,然后就是各种度娘了,貌似学习所有的框架技术基本上都是先从一个简单的demo示例开始,例如hello world,像之前了解过的SSH框架,SSI框架.jFinal框架等等,,至少我是这样的,先把一个简单的Demo框

Jfinal开发微信公众平台

http://blog.csdn.net/lyq8479/article/details/8937622 方法就是柳峰老师发的教程,jfinal的区别就是核心servlet的处理可以用拦截器结合controller实现. 1.定义一个验证请求的拦截器 public class CoreFilterInterceptor implements Interceptor { // 验证请求来源拦截器 public void intercept(ActionInvocation ai) { Contro

新书《Jfinal极速开发实战》正式发布

JfinalUIB学习交流QQ群 :309647612 书籍整个创作周期从2015年8月1日开始到2015年9月10日,时间仓促,难免有瑕疵,希望大家能够指出存在的问题,我会不断的更新纠正,谢谢大家! 前四章免费阅读,内容会持续定期更新,紧随Jfinal的发展,希望大家看看做出评价,谢谢!   百度阅读地址 :http://yuedu.baidu.com/ebook/3fc54b55d5bbfd0a7956739f 目录 Jfinal极速开发实战... 为什么要写这本书... 3 读者对象...

Activit最入门学习文档,从如何创建项目开始共20章,看完,任何Java项目集成无压力

Activit流程引擎 本人水平,刚自学java一个多月,然后看视频做的笔记,全部傻瓜式截图教程,反正我学习之前没在网上搜索到任何小白教程, Activit官方的教程真心看不懂,因为都是文字 没具体创建步奏,所以对新手来说很无奈, 然后吧,就把自己的学习经验贡献出来啦 最小白的文档,看完之后,集成到任何java项目中都无压力,我最后的是做了个Jfinal集成,估计这是网上搜到最全的容易懂的入门学习文档,本人自学java一个月,反正我看官方例子什么的都看不懂,然后各搜素也没收到教程视频,还好有别人

《Jfinal极速开发实战》正式发布

----------------------------------------------------------------------- 百度阅读地址 :http://yuedu.baidu.com/ebook/3fc54b55d5bbfd0a7956739f 定价55.55元,百度阅读抽取三成,剩下为作者所得,谢谢大家支持! 暂时没有出纸质版本是因为费用实在太高(3-5W),个人无法承受,望大家体谅. -------------------------------------------