IDEA手动创建JFinal项目(404问题处理)

公司项目使用jfinal有一段时间了,也有自己手动搭建过项目,但是没有使用demo中jetty方式启动过项目。这几天决定参考jfinal文档更好的学习下jfinal框架,其实创建项目挺简单,但是碰到了一个jetty报错404的问题,查询了论坛分享和网上一些创建方式也没也没解决,论坛和网上提到的基本上时路由配置问题,折腾了一段时间,这里做个记录希望同样碰到的人可以少折腾会儿。

创建项目

首先创建一个maven项目(使用模板)
create_project1
create_project2
这里使用了我自己的maven配置文件
create_project3
由于使用idea创建项目,这里我一般项目目录(Project location)和模块目录(Module file location)会分开。这样的话再新建模块的时候所有模块的目录层级更清晰点。
而这也是为后面的出404问题埋下了伏笔
create_project4
结束完成项目创建。

修改项目配置

  1. 增加maven依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <dependency>
       <groupId>com.jfinal</groupId>
       <artifactId>jfinal</artifactId>
       <version>3.3</version>
       </dependency>

       <dependency>
       <groupId>com.jfinal</groupId>
       <artifactId>jetty-server</artifactId>
       <version>8.1.8</version>
       <!-- <scope>provided</scope>-->
    </dependency>
  2. 修改maven项目结构配置
    project_structure
    project_structure1

简单代码编写

  1. 创建控制类
    TestController.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package com.yihengliu.test.controller;

    import com.jfinal.core.Controller;

    /**
    * 测试控制类
    *
    * @author liucheng
    * @version 0.1
    * @since 0.1 2018-01-30 下午2:31
    **/
    public class TestController extends Controller {
       public void index() {
       renderText("Hello, JFinal!");
       }
    }
  2. 创建配置类
    DemoConfig.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    package com.yihengliu.test;

    import com.jfinal.config.*;
    import com.jfinal.template.Engine;
    import com.yihengliu.test.controller.TestController;

    /**
    * jfinal配置类
    *
    * @author liucheng
    * @version 0.1
    * @since 0.1 2018-01-30 下午2:30
    **/
    public class DemoConfig extends JFinalConfig{
       @Override
       public void configConstant(Constants me) {

       }

       @Override
       public void configRoute(Routes me) {
           me.add("/", TestController.class);
       }

       @Override
       public void configEngine(Engine me) {

       }

       @Override
       public void configPlugin(Plugins me) {

       }

       @Override
       public void configInterceptor(Interceptors me) {

       }

       @Override
       public void configHandler(Handlers me) {

       }
       
       public static void main(String[] args) {
           JFinal.start("src/main/webapp", 9091, "/");
       }
    }
  3. web.xml文件配置

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

测试问题处理

DemoConfig类中运行main函数
run1

然后问题来了,页面怎么访问都是404,错误如图:
jfinal_error1
而不是jfinal报错(这种报错就肯定时jfinal路由配置的问题了):
jfinal_error2

其实很容易就能看出是因为没有读取web.xml配置,导致项目没有启动jfinal。论坛里面也有提到这种情况的,但是由于自己没有什么jetty使用经验,所以后面还是通过debug代码才发问题的原因。
原因就是前面建立项目提到的,在建立项目的时候project目录和module目录不在同一个目录,所以启动的地方需要修改相对目录,加上module目录。
JFinal.start("jfinal_test/src/main/webapp", 9091, "/");

最终,重启项目,顺利运行。
run2

总结

不得不说下jfinal使用确实很简单、方便,而自己搭建项目碰到问题没有快速定位也说明自己确实还有很多的东西需要学习、学习。

评论区

JFinal

2018-01-30 18:33

非常详细,感谢你的分享

再介绍一个比较简洁可靠的方法,利用一个现有的 maven 项目,里头有 src 目录,以及 pom.xml 文件,稍微改改 pom.xml 中的 groupid 之类的,然后导入到 eclipse/IDEA 中即可,导入的时候选择导入的是 maven 项目, 开发工具会自动生成各种配置文件

这种方法可以避免掉自己创建项目过程中有些选项或者输入拿不准的问题

具体操作时,可以下载 jfinal.com 首页的 jfinal-demo-form-maven 这个小 demo 作为蓝本去操作,再一个就是 github 上很多这种标准备的 maven 结构的项目可以直接利用

cc_cc

2018-01-30 18:42

@JFinal 感谢老大回复。主要是我在创建idea项目的时候project目录和module目录不在一个文件夹,导致使用“JFinal.start("src/main/webapp", 9091, "/");”启动的时候没有读到web.xml。需要加上module目录,在手动建src和pom.xml然后导入idea如果建立项目的时候project目录和module目录不在一个目录也可能出现这种情况。被坑了,所以分享下

JFinal

2018-01-30 21:05

@cc_cc 原来如此,对于有 module 的项目,很有价值,感谢你的分享

Joe88

2018-02-07 10:19

@JFinal 老大,idea下打包war后里面没有.class文件是啥原因昵

JFinal

2018-02-07 11:49

@Joe88 配置问题,找下相关资料

jones53

2018-05-25 18:04

今天也遇到了,调了好久,感谢分享

cc_cc

2018-06-05 16:23

@jones53 我当时也是折腾了很多,所以分享出来

jay763190097

2018-08-14 14:13

感谢楼主,我也碰到了。网上clone下来一个项目,里面有前端和后台两个文件夹,因为不想弄两个窗口,我用idea打开克隆下来的这个文件夹,然后手动加一个pom.xml,点击右边的maven工具栏刷新,idea能把后台那个文件夹变为module(此时为子module),但是“JFinal.start("src/main/webapp", 9091, "/");就一直404,看了楼主的贴子,顿时明白了。因为module根路径变了

板砖哥

2018-09-11 16:34

创建多module工程时,webAppDir的路径应该修改为JFinal.start("webappModuleName/src/main/webapp", 8086, "/"); webappModuleName的参数为archetype 为app的module的名称,否则启动虽然正常,但会一直报404,希望使用多module开发项目的不要再踩这个坑(解决idea下启动报404问题)

tom

2018-10-31 17:53

感谢分享!!!