JFinal开发环境配置

一、安装 Maven

Maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。
Maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展,利用 Maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。

1. 下载 Maven

http://maven.apache.org/download.cgi(Maven官方下载地址)

第二十章 基于JFinal的大数据框架快速开发 - 图1

2. 将下载后的压缩文件解压到任意目录,这里选择解压到 D:\Program Files目录下,并配置其环境变量(参考配置 JDK的环境变量)

配置 Maven环境变量前,先确认 “JAVA_HOME”这个环境变量是对应于JDK的安装目录。
第二十章 基于JFinal的大数据框架快速开发 - 图2

配置 Maven的系统变量。
第二十章 基于JFinal的大数据框架快速开发 - 图3

验证配置是否正确。
第二十章 基于JFinal的大数据框架快速开发 - 图4

修改默认仓库路径。到 D:\Program Files\apache-maven-3.3.9\conf目录下打开 settings.xml文件,修改默认的仓库路径。
第二十章 基于JFinal的大数据框架快速开发 - 图5

二、安装 IDEA

1. 下载 IDEA14或者 IDEA15

http://pan.baidu.com/s/1pLEixej

2. 鼠标双击安装程序开始安装

第二十章 基于JFinal的大数据框架快速开发 - 图6

第二十章 基于JFinal的大数据框架快速开发 - 图7

第二十章 基于JFinal的大数据框架快速开发 - 图8

3. 安装完成后打开IDEA,并完成激活

  1. License server address
  2. http://idea.lanyus.com/
  3. 备用的License server address
  4. http://0.idea.lanyus.com
  5. http://1.idea.lanyus.com
  6. http://2.idea.lanyus.com

第二十章 基于JFinal的大数据框架快速开发 - 图9

三、创建一个 JavaWeb工程项目

1. 新建项目

点击 IDEA菜单栏左上角的 “File” 选项,在出现的下拉列表中选择第一项 “New”,在 “New” 选项的右边再选择 “Project” 选项打开 “New Project” 对话框。
第二十章 基于JFinal的大数据框架快速开发 - 图10

设置 GroupId和 ArtifactId。
第二十章 基于JFinal的大数据框架快速开发 - 图11

设置 Maven的安装目录、settings.xml的文件位置和本地仓库的位置等信息。
第二十章 基于JFinal的大数据框架快速开发 - 图12

设置项目名称。
第二十章 基于JFinal的大数据框架快速开发 - 图13

项目创建完成。
第二十章 基于JFinal的大数据框架快速开发 - 图14

2. 在 pom.xml文件中添加 jar包依赖

第二十章 基于JFinal的大数据框架快速开发 - 图15

pom.xml文件说明:

project:pom.xml文件中的顶层元素;

modelVersion:指明 POM使用的对象模型的版本。这个值很少改动。

groupId:指明创建项目的组织或者小组的唯一标识。GroupId是项目的关键标识,典型的,此标识以组织的完全限定名来定义。比如,org.apache.maven.plugins是所有Maven插件项目指定的 groupId。

artifactId:指明此项目产生的主要产品的基本名称。项目的主要产品通常为一个 JAR文件。第二,象源代码包通常使用 artifactId作为最后名称的一部分。典型的产品名称使用这个格式: - . (比如:myapp-1.0.jar)。

version:项目产品的版本号。Maven帮助你管理版本,可以经常看到 SNAPSHOT这个版本,表明项目处于开发阶段。

name:项目的显示名称,通常用于 maven产生的文档中。

url:指定项目站点,通常用于 maven产生的文档中。

description:描述此项目,通常用于 maven产生的文档中。

要添加依赖我们要先到 maven仓库里面去查询。

Maven仓库地址:http://mvnrepository.com/

首先我们要添加一些基本的依赖关系如:

  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>javax.servlet-api</artifactId>
  4. <version>3.1.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>javax.servlet</groupId>
  8. <artifactId>jstl</artifactId>
  9. <version>1.2</version>
  10. </dependency>

第二十章 基于JFinal的大数据框架快速开发 - 图16

第二十章 基于JFinal的大数据框架快速开发 - 图17

第二十章 基于JFinal的大数据框架快速开发 - 图18

第二十章 基于JFinal的大数据框架快速开发 - 图19

3. 配置项目

打开 “Project Structure”。
第二十章 基于JFinal的大数据框架快速开发 - 图20

配置 “Project”。
第二十章 基于JFinal的大数据框架快速开发 - 图21

配置 “Modules”。
第二十章 基于JFinal的大数据框架快速开发 - 图22

配置 “Libraries”。

添加外部依赖的jar包。有时候将一些本地已存在的 jar包添加到了 src/main/webapp/WEB-INF/lib(该目录要手动创建)这个目录里,那么可以在这里设置将这些 jar包导进项目中而不需要通过在pom.xml中去添加这些jar包的依赖关系来导入。

第二十章 基于JFinal的大数据框架快速开发 - 图23

选中存放 jar包的文件夹。
第二十章 基于JFinal的大数据框架快速开发 - 图24

配置 “Facets”。
第二十章 基于JFinal的大数据框架快速开发 - 图25

配置 “Artifacts”。
第二十章 基于JFinal的大数据框架快速开发 - 图26

3. 配置Tomcat

打开配置。
第二十章 基于JFinal的大数据框架快速开发 - 图27

添加新Tomcat Server配置。
第二十章 基于JFinal的大数据框架快速开发 - 图28

第二十章 基于JFinal的大数据框架快速开发 - 图29

第二十章 基于JFinal的大数据框架快速开发 - 图30

第二十章 基于JFinal的大数据框架快速开发 - 图31

第二十章 基于JFinal的大数据框架快速开发 - 图32

启动 Tomcat。
第二十章 基于JFinal的大数据框架快速开发 - 图33

正确启动后会默认显示index.jsp页面的内容
第二十章 基于JFinal的大数据框架快速开发 - 图34

四、简单搭建 JFinal框架(搭建 JFianl框架之前请先学习 JFinal官方手册)

JFinal官网:http://www.jfinal.com/

详细语法说明请参考 JFinal官方手册:http://download.jfinal.com/upload/2.2/jfinal-2.2-manual.pdf

1. 搭建 JFinal项目步骤+说明

  1. 一个 JFinal项目一般至少包括三个部分:配置(com.hithinksoft.config)、实体类(com.hithinksoft.model)、控制器(com.hithinksoft.controller)。
  2. 在com.hithinksoft.config包中创建一个名为MyConfig(类名自定义)的类,它要继承 com.jfinal.config.JFinalConfig,并且要实现JFinalConfig中的五个抽象方法。这个类是必需的,它会对整个 web项目进行配置。
  3. com.hithinksoft.model包下的实体类都要继承 com.jfinal.plugin.activerecord.Model。
  4. com.hithinksoft.controller包下的控制器都要继承 com.jfinal.core.Controller。
  5. 下面编写一个示例:
    • 定义两个实体类: com.hithinksoft.model.User.java和 com.hithinksoft.model.Blog.java;
    • 定义两个控制器: com.hithinksoft.controller.UserController.java和 com.hithinksoft.controller.BlogController.java。
    • 定义页面:在 src\main\webapp\WEB-INF\pages\blogs下面定义四个页面,blogs.jsp、 blog.jsp、publish.jsp和 update.jsp。blogs.jsp页面时展示所有博客信息的,而 blog.jsp页面是展示某一条博客的详细信息的,publish.jsp页面是用来发布博客的,update.jsp页面是用来更改博客的;在 src\main\webapp\WEB-INF\pages\users下定义一个 login.jsp页面和 一个 register.jsp页面来进行登录和注册。

具体目录结构图:
第二十章 基于JFinal的大数据框架快速开发 - 图35

2. 添加依赖

  1. <dependency>
  2. <groupId>log4j</groupId>
  3. <artifactId>log4j</artifactId>
  4. <version>1.2.16</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>5.0.8</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>c3p0</groupId>
  13. <artifactId>c3p0</artifactId>
  14. <version>0.9.1.2</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>com.mchange</groupId>
  18. <artifactId>mchange-commons-java</artifactId>
  19. <version>0.2.12</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>com.jfinal</groupId>
  23. <artifactId>jfinal</artifactId>
  24. <version>2.2</version>
  25. </dependency>

3. 配置 web.xml文件

在 web.xml中添加一下代码

  1. <filter>
  2. <filter-name>jfinalFilter</filter-name>
  3. <filter-class>com.jfinal.core.JFinalFilter</filter-class>
  4. <init-param>
  5. <param-name>configClass</param-name>
  6. <param-value>com.hithinksoft.config.MyConfig</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>jfinalFilter</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>

上面标签中的是一样的,是自定义的。标签中的类就是上面的 MyConfig类。

4. 创建 com.hithinksoft.config.MyConfig类,继承 com.jfinal.config.JFinalConfig并实现其中的方法

  1. package com.hithinksoft.config;
  2. import com.jfinal.config.*;
  3. publicclassMyConfigextendsJFinalConfig{
  4. @Override
  5. publicvoid configConstant(Constants constants){
  6. }
  7. @Override
  8. publicvoid configRoute(Routes routes){
  9. }
  10. @Override
  11. publicvoid configPlugin(Plugins plugins){
  12. }
  13. @Override
  14. publicvoid configInterceptor(Interceptors interceptors){
  15. }
  16. @Override
  17. publicvoid configHandler(Handlers handlers){
  18. }
  19. }

5. 验证项目的搭建是否成功

添加以下内容进行验证:

  1. 在 MyConfig类的 configRoute方法中添加一个路由,例如:routes.add(“/“, HelloController.class) (也可以是别的Controller类)。
  2. 在 HelloController.java中添加一个 index方法(方法名称自定义),在 index方法里面添加一条 renderJsp(“index.jsp”)跳转语句。
  3. 在 src\main\webapp\WEB-INF\目录下的 index.jsp页面中随便添加一些内容。
  4. 启动Tomcat服务器,如果浏览器输入了 index.jsp页面的内容,则说明 JFinal项目的搭建成功。

6. MyConfig类的具体内容

  1. publicclassMyConfigextendsJFinalConfig{
  2. privatestaticString VIEWURL ="/WEB-INF/pages/";
  3. @Override
  4. publicvoid configConstant(Constants constants){
  5. /*开发模式常量devMode设置为true,这样程序运行时会打印一些调试信息等*/
  6. constants.setDevMode(true);
  7. /*设置编码格式为UTF-8*/
  8. constants.setEncoding("UTF-8");
  9. /**
  10. * 设置视图类型为JSP
  11. * 如果页面中使用了FreeMarker,则应该写成:
  12. * constants.setViewType(ViewType.FREE_MARKER);
  13. * */
  14. constants.setViewType(ViewType.JSP);
  15. }
  16. @Override
  17. publicvoid configRoute(Routes routes){
  18. routes.add("/",HelloController.class);
  19. /**
  20. * 当在浏览器中访问 “http://localhost:8080/blog/users/login”时,
  21. * 会映射到 UserController.java中的 login()方法。
  22. * 第三个参数 MyConfig.VIEWURL是个常量,它的值是: "/WEB-INF/pages/",
  23. * 它表示Controller返回的视图的相对路径,
  24. * 它的作用是:当调用了 UserController中的 login()方法的renderJsp("users/login.jsp")语句时,
  25. * 代码会将“/WEB-INF/pages/”与renderJsp中的参数 “users/login.jsp”拼接起来得到的
  26. * 路径作为即将打开的页面的路径。也就是说当在浏览器地址栏中输入了
  27. * “http://localhost:8080/blog/users/login”之后,浏览器会访问到
  28. * “/WEB-INF/pages/users/login.jsp”这个页面
  29. */
  30. routes.add("/users",UserController.class,MyConfig.VIEWURL);
  31. routes.add("/blogs",BlogController.class,MyConfig.VIEWURL);
  32. }
  33. @Override
  34. publicvoid configPlugin(Plugins plugins){
  35. /**
  36. * 通过 Prokit工具类加载db.txt文件,db.txt是自己创建的文件,里面填写了一些连接数据库时
  37. * 必要的参数相似的也可以将其他一些配置信息(如configConstant()方法中的的devMode、视图
  38. * 类型等等)放到一个文件中,然后通过这种方法来获取其中的参数。
  39. * */
  40. PropKit.use("db.txt");
  41. /*从db.txt文件中获取以下四个属性值作为C3p0Plugin的参数来创建一个C3p0Plugin对象*/
  42. C3p0Plugin cp =new C3p0Plugin(PropKit.get("jdbcUrl"),
  43. PropKit.get("user"),
  44. PropKit.get("password").trim(),
  45. PropKit.get("driverClass"));
  46. /*将C3p0Plugin这个插件初始化完成后添加到工程项目中*/
  47. plugins.add(cp);
  48. /**
  49. * C3p0Plugin是数据源,通过这个数据源创建一个ActiveRecordPlugin对象
  50. * ActiveRecordPlugin是ActiveRecord的支持插件,ActiveRecord中定义了:
  51. * addMapping(String tableName, Class<? extends Model> modelClass)方法
  52. * 该方法建立了数据库表名到Model的映射关系,这样就可以通过调用提供的 API去操作数据库了
  53. */
  54. ActiveRecordPlugin arp =newActiveRecordPlugin(cp);
  55. plugins.add(arp);
  56. arp.addMapping("user",User.class);
  57. arp.addMapping("blog",Blog.class);
  58. }
  59. @Override
  60. publicvoid configInterceptor(Interceptors interceptors){
  61. }
  62. @Override
  63. publicvoid configHandler(Handlers handlers){
  64. }

7. 用户登录

  1. webapp/WEB-INF/pages/blogs/login.jsp
  2. <form method="post" action="/blog/users/loginUser"
  3. style="width:200px;margin:100px auto;">
  4. 帐号:<input type="text" name="user.username"/><br/><br/>
  5. 密码:<input type="password" name="user.password"/><br/><br/>
  6. <input type="submit" value="登录"/>
  7. </form>

填写正确信息并点击“登录”按钮后,代码会根据 “/blog/users/loginUser”映射到 UserController里面的 loginUser()方法里面继续执行。

  1. com.hithinksoft.controller.UserController.java
  2. publicvoid loginUser(){
  3. User user = getModel(User.class);
  4. String username = user.getStr("username");
  5. String password = user.getStr("password");
  6. /*验证登录的账户和密码是否匹配,如果匹配就获取该 User对象*/
  7. user = user.validate(username, password);
  8. if(user !=null){
  9. setSessionAttr("user", user);
  10. redirect("/blogs/blogs");
  11. }else{
  12. redirect("/users/login.jsp");
  13. }
  14. }

getModel用来接收页面表单域传递过来的model对象,表单域的名称以“modelName.attrName”方式命名,如帐号中 name属性的命令方式为 “user.username”,密码中 name属性的命名方式为 “user.password”。上述代码中的 getModel(User.class)表示接收页面表单域传递过来的 User实体对象,它里面保存有在页面填写的账户和密码。
redirect(“/blogs/blogs”)方法的作用是跳转页面的,相当于在浏览器地址栏中输入了 “localhost:8080/blog/blogs/blogs”,代码会进入 com.hithinksoft.controller.BlogController中的 blogs()方法(注:redirect方法参数中的第一个“/”就代表根路径“localhost:8080/blog/”)。

  1. com.hithinksoft.controller.BlogController
  2. publicvoid blogs(){
  3. //查询所有的博客
  4. List<Blog> blogs =Blog.blogRepository.find("select * from blog");
  5. //将查询到的博客保存进 request作用域中,这样就可以在前端页面中获取到这些博客
  6. setAttr("blogs", blogs);
  7. renderJsp("blogs/blogs.jsp");
  8. }

上述代码最后是跳转到 “src/main/webapp/WEB-INF/pages/blogs/blogs.jsp”页面。
renderJsp是 render系列方法中的一种,它的作用就是渲染不同类型的视图并返回给客户端,简单地说就是按某种视图类型在浏览器中打开一个已经存在的页面。它与前面的 redirect的区别是 redirect是用来跳转请求的,redirect的请求结果是请求服务器来打开一个页面,而 render系列方法就是打开一个页面。这跟 Servlet中的请求分发和重定向类似。

8. 浏览博客

  1. com.hithinksoft.controller.BlogController
  2. publicvoid blog(){
  3. Integer blogId = getParaToInt(0);
  4. Blog blog =Blog.blogRepository.findById(blogId);
  5. setAttr("blog", blog);
  6. renderJsp("blogs/blog.jsp");
  7. }

跳转页面

  1. webapp/WEB-INF/pages/blogs/blog.jsp
  2. <div style="width:600px;margin:50px auto;border:1px solid #A9A9A9;padding:10px 20px;">
  3. <div style="padding:10px 0px 40px;border-bottom:1px solid #A9A9A9;text-align: center;position:relative;">
  4. <div>${blog.title}</div>
  5. <span style="position:absolute;right:40px;bottom:10px;">作者:&nbsp;${blog.getUser().username}</span>
  6. </div>
  7. <div style="padding:10px 0px;">
  8. ${blog.content}
  9. </div>
  10. </div>

9. 发布博客

  1. webapp/WEB-INF/pages/blogs/publish.jsp
  2. <form method="post" action="/blog/blogs/publishBlog/${user.id}" style="width:600px;margin:50px auto;border:1px solid #A9A9A9;padding:10px 20px;">
  3. 标题:
  4. <input type="text" name="blog.title" value="${blog.title}"
  5. style="width: 600px;padding: 4px;"/><br/><br/>
  6. 内容:
  7. <textarea name="blog.content" style="width:600px;padding:4px;height:400px;">
  8. ${blog.content}
  9. </textarea>
  10. <input type="submit" value="发布"/>
  11. </form>

上述代码也是个表单,所以它的表单元素的 name属性值得写法与 login.jsp页面的写法一样都是 “modelName.attrName”。当点击 “发布”按钮时代码会根据 action中的 “/blog/blogs/publishBlog/${user.id}”映射到 BlogController类中的 publishBlog方法,action最后面的 “/${user.id}”是要传递的参数(具体语法参考 JFinal官方文档),这个 user就是在登录后调用 setSessionAttr(“user”, user)方法保存到 session作用域中的 user。

  1. com.hithinksoft.controller.BlogController
  2. publicvoid publishBlog(){
  3. //获取 action传递过来的参数
  4. Integer userId = getParaToInt(0);
  5. Blog blog = getModel(Blog.class);
  6. blog.set("user_id", userId);
  7. //将发布的博客持久化到数据库中
  8. blog.save();
  9. redirect("/blogs/blogs");
  10. }

10. 修改已发布的博客

  1. webapp/WEB-INF/pages/blogs/update.jsp
  2. <form method="post" action="/blog/blogs/updateBlog/${blog.id}"
  3. style="width:600px;margin:50px auto;border:1px solid #A9A9A9;padding:10px 20px;">
  4. 标题:
  5. <input type="text" name="blog.title" value="${blog.title}"
  6. style="width: 600px;padding: 4px;"/><br/><br/>
  7. 内容:
  8. <textarea name="blog.content" style="width: 600px;padding: 4px;height: 400px;">
  9. ${blog.content}
  10. </textarea>
  11. <input type="submit" value="修改"/>
  12. </form>

点击 “修改”按钮进入 BlogController中的 updateBlog方法,并且用被修改的博客的id作为参数。

  1. com.hithinksoft.controller.BlogController
  2. publicvoid updateBlog(){
  3. Integer blogId = getParaToInt(0);
  4. Blog blog = getModel(Blog.class);
  5. blog.set("id", blogId);
  6. blog.update();
  7. redirect("/blogs/blogs");
  8. }

11. 删除已发布的博客

  1. com.hithinksoft.controller.BlogController
  2. publicvoiddelete(){
  3. Integer blogId = getParaToInt(0);
  4. Blog.blogRepository.deleteById(blogId);
  5. redirect("/blogs/blogs");
  6. }

五、IDEA的常用快捷键

  1. Alt+回车导入包,自动修正
  2. Ctrl+N 查找类
  3. Ctrl+Shift+N 查找文件
  4. Ctrl+Alt+L 格式化代码
  5. Ctrl+Alt+O 优化导入的类和包
  6. Alt+Insert生成代码(如get,set方法,构造函数等)
  7. Ctrl+E或者Alt+Shift+C 最近更改的代码
  8. Ctrl+R 替换文本
  9. Ctrl+F 查找文本
  10. Ctrl+Shift+Space自动补全代码
  11. Ctrl+空格代码提示
  12. Ctrl+Alt+Space类名或接口名提示
  13. Ctrl+P 方法参数提示
  14. Ctrl+Shift+Alt+N 查找类中的方法或变量
  15. Alt+Shift+C 对比最近修改的代码
  16. Shift+F6 重构-重命名
  17. Ctrl+Shift+先上键
  18. Ctrl+X 删除行
  19. Ctrl+D 复制行
  20. Ctrl+/ 或 Ctrl+Shift+/注释(// 或者/*...*/ )
  21. Ctrl+J 自动代码
  22. Ctrl+E 最近打开的文件
  23. Ctrl+H 显示类结构图
  24. Ctrl+Q 显示注释文档
  25. Alt+F1 查找代码所在位置
  26. Alt+1快速打开或隐藏工程面板
  27. Ctrl+Alt+ left/right 返回至上次浏览的位置
  28. Alt+ left/right 切换代码视图
  29. Alt+Up/Down在方法间快速移动定位
  30. Ctrl+Shift+Up/Down代码向上/下移动。
  31. F2 Shift+F2 高亮错误或警告快速定位
  32. 代码标签输入完成后,按Tab,生成代码。
  33. 选中文本,按Ctrl+Shift+F7 ,高亮显示所有该文本,按Esc高亮消失。
  34. Ctrl+W 选中代码,连续按会有其他效果
  35. 选中文本,按Alt+F3 ,逐个往下查找相同文本,并高亮显示。
  36. Ctrl+Up/Down光标跳转到第一行或最后一行下
  37. Ctrl+B 快速打开光标处的类或方法