前言
由于项目需要运行一些后台服务提供计算和结转,不想与之前的项目放在一起需要独立出来。但是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后台服务的话可以按照我的尝试下
我们一般独立使用插件的话,比如数据库跑个独立任务啥的,就是直接main方法启动了 https://www.jfinal.com/doc/5-15 ActiveRecordPlugin可以独立于java web 环境运行在任何普通的java程序中