jfinal如何不以web形式启动

前言

由于项目需要运行一些后台服务提供计算和结转,不想与之前的项目放在一起需要独立出来。但是jfinal是web形式的框架需要占用web端口,虽然占用也无所谓,主要是想单纯的使用jfinal提供的ActiveRecord、插件管理等功能。springboot是可以直接选择使用web或者非web形式启动的。这里说明下如何使用jfinal做一个win下的服务。

使用工具

Apache Commons Daemon将java项目在win下使用服务模式运行。


代码


创建JServletContext类用于提供伪ServletContext

public class JServletContext implements ServletContext {
    //这个随便返回点什么
    public String getContextPath() {
        return "E:/app";
    }

    
    public ServletContext getContext(String s) {
        return null;
    }

    
    public int getMajorVersion() {
        return 0;
    }

    
    public int getMinorVersion() {
        return 0;
    }

    public int getEffectiveMajorVersion() {
        return 0;
    }

    
    public int getEffectiveMinorVersion() {
        return 0;
    }

    
    public String getMimeType(String s) {
        return null;
    }

    
    public Set<String> getResourcePaths(String s) {
        return null;
    }

    
    public URL getResource(String s) throws MalformedURLException {
        return null;
    }

    
    public InputStream getResourceAsStream(String s) {
        return null;
    }

    
    public RequestDispatcher getRequestDispatcher(String s) {
        return null;
    }

    
    public RequestDispatcher getNamedDispatcher(String s) {
        return null;
    }

    
    public Servlet getServlet(String s) throws ServletException {
        return null;
    }

    
    public Enumeration<Servlet> getServlets() {
        return null;
    }

    
    public Enumeration<String> getServletNames() {
        return null;
    }

    
    public void log(String s) {

    }

    
    public void log(Exception e, String s) {

    }

    
    public void log(String s, Throwable throwable) {

    }

    
    public String getRealPath(String s) {
        return null;
    }

    
    public String getServerInfo() {
        return null;
    }

    
    public String getInitParameter(String s) {
        return null;
    }

    
    public Enumeration<String> getInitParameterNames() {
        return null;
    }

    
    public boolean setInitParameter(String s, String s1) {
        return false;
    }

    
    public Object getAttribute(String s) {
        return null;
    }

    
    public Enumeration<String> getAttributeNames() {
        return null;
    }

    
    public void setAttribute(String s, Object o) {

    }

    
    public void removeAttribute(String s) {

    }

    
    public String getServletContextName() {
        return null;
    }

    
    public ServletRegistration.Dynamic addServlet(String s, String s1) {
        return null;
    }

    
    public ServletRegistration.Dynamic addServlet(String s, Servlet servlet) {
        return null;
    }

    
    public ServletRegistration.Dynamic addServlet(String s, Class<? extends Servlet> aClass) {
        return null;
    }

    
    public ServletRegistration.Dynamic addJspFile(String s, String s1) {
        return null;
    }

    
    public <T extends Servlet> T createServlet(Class<T> aClass) throws ServletException {
        return null;
    }

    
    public ServletRegistration getServletRegistration(String s) {
        return null;
    }

    
    public Map<String, ? extends ServletRegistration> getServletRegistrations() {
        return null;
    }

    
    public FilterRegistration.Dynamic addFilter(String s, String s1) {
        return null;
    }

    
    public FilterRegistration.Dynamic addFilter(String s, Filter filter) {
        return null;
    }

    
    public FilterRegistration.Dynamic addFilter(String s, Class<? extends Filter> aClass) {
        return null;
    }

    
    public <T extends Filter> T createFilter(Class<T> aClass) throws ServletException {
        return null;
    }

    
    public FilterRegistration getFilterRegistration(String s) {
        return null;
    }

    
    public Map<String, ? extends FilterRegistration> getFilterRegistrations() {
        return null;
    }

    
    public SessionCookieConfig getSessionCookieConfig() {
        return null;
    }

    
    public void setSessionTrackingModes(Set<SessionTrackingMode> set) {

    }

    
    public Set<SessionTrackingMode> getDefaultSessionTrackingModes() {
        return null;
    }

    
    public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() {
        return null;
    }

    
    public void addListener(String s) {

    }

    
    public <T extends EventListener> void addListener(T t) {

    }

    
    public void addListener(Class<? extends EventListener> aClass) {

    }

    
    public <T extends EventListener> T createListener(Class<T> aClass) throws ServletException {
        return null;
    }

    
    public JspConfigDescriptor getJspConfigDescriptor() {
        return null;
    }

    
    public ClassLoader getClassLoader() {
        return null;
    }

    
    public void declareRoles(String... strings) {

    }

    
    public String getVirtualServerName() {
        return null;
    }

    
    public int getSessionTimeout() {
        return 0;
    }

    
    public void setSessionTimeout(int i) {

    }

    
    public String getRequestCharacterEncoding() {
        return null;
    }

    
    public void setRequestCharacterEncoding(String s) {

    }

    
    public String getResponseCharacterEncoding() {
        return null;
    }

    
    public void setResponseCharacterEncoding(String s) {

    }
}

创建JFilterConfig用于初始化何启动

JFilterConfig FilterConfig {

    String (String startClass) {
        .= startClass}

    String () {
        }

    ServletContext () {
        JServletContext()}

    String (String s) {
        }

    Enumeration<String> () {
        }
}

接下来EnginStart

public class EnginStart extends JFinalConfig {

    private static Logger logger = LoggerFactory.getLogger(EnginStart.class);

    /**
     * 启动入口,运行此 main 方法可以启动项目,此 main 方法可以放置在任意的 Class 类定义中,不一定要放于此
     */
    public static void main(String[] args) {
        startMain();
    }

    public static void startMain() {
        logger.info("项目启动开始");
        try {
            //这里添加EnginStart的全路径
            JFilterConfig jFilterConfig = new JFilterConfig("xxx.xxx.xxx.xxxx.EnginStart");
            new JFinalFilter().init(jFilterConfig);
        } catch (ServletException e) {
            logger.error("项目启动失败", e);
        }
    }

    /**
     * 配置常量
     *
     * @param me
     */
    @Override
    public void configConstant(Constants me) {
        // 加载配置文件,随后可用PropKit.get(...)获取值
        PropKit.use("dbconfig.properties");//本地环境
        // 设置编码格式
        me.setEncoding("utf-8");
        me.setJsonFactory(new FastJsonFactory());
    }

    @Override
    public void configRoute(Routes routes) {

    }


    @Override
    public void configEngine(Engine engine) {
    }

    /**
     * 配置插件
     *
     * @param me
     */
    @Override
    public void configPlugin(Plugins me) {
        // 数据库连接也可以使用以下的方式(Druid)
        DruidPlugin druid_oracle = DataSourceConnectPool.getOracleDruid();
        druid_oracle.addFilter(new StatFilter());
        me.add(druid_oracle);

        ActiveRecordPlugin Arp_oracle = new ActiveRecordPlugin(druid_oracle);
        Arp_oracle.setDialect(new OracleDialect());
        Arp_oracle.setContainerFactory(new CaseInsensitiveContainerFactory());
        Arp_oracle.getEngine().setSourceFactory(new ClassPathSourceFactory());

        MappingKit.mappingOracle(Arp_oracle);
        me.add(Arp_oracle);

        //定时任务控制插件
        me.add(new QuartzPlugin());
        //hbase插件
        me.add(new HBasePlugin());
    }

    /**
     * 配置全局拦截器,对所有请求进行拦截,类和方法使用@Before(Class.class)即能使用
     *
     * @param me
     */
    @Override
    public void configInterceptor(Interceptors me) {
    }

    /**
     * 配置处理器
     *
     * @param me
     */
    @Override
    public void configHandler(Handlers me) {
    }

    @Override
    public void afterJFinalStart() {
        logger.info("项目启动成功");
    }

    @Override
    public void beforeJFinalStop() {

    }


}

接下来直接运行就可以以非web模式运行jfinal了

这只是不想一个后台运行的服务占用一个端口而进行的操作,在大多数情况下并没有所谓。如果你也想使用jfinal做java后台服务的话可以按照我的尝试下

评论区

杜福忠

2019-03-29 11:32

不明觉厉!
我们一般独立使用插件的话,比如数据库跑个独立任务啥的,就是直接main方法启动了 https://www.jfinal.com/doc/5-15 ActiveRecordPlugin可以独立于java web 环境运行在任何普通的java程序中

zhc

2019-03-29 14:05

@杜福忠 不错不错,我居然漏了文档中的内容

chcode

2020-05-20 09:55

我还想用jfinal aop怎么办

热门分享

扫码入社