地址:这里 小项目必备 ,非常灵活实用
JFinalConfig这是个abstract class Config order:
- configConstant(),
- configRoute(),
- configEngine(),
- configPlugin(),
- configInterceptor(),
- configHandler()
com.jfinal.kit.Prop配置类,使用java.util.Properties
主类com.jfinal.core.JFinal 重要的
public static void start(String webAppDir, int port, String context) {
server = new JettyServerForIDEA(webAppDir, port, context);
server.start();
}
针对com.jfinal.server.JettyServerForIDEA implements IServer
其中IServer中,start(). stop()
{
private String webAppDir;
private int port;
private String context;
// private int scanIntervalSeconds;
private boolean running = false;
private Server server; //这里是Jetty
private WebAppContext webApp;
//...
}
这里需要学习Jetty的Server, 源码在这,主页,但我们只需要学会使用即可
sevelet引擎,还有tomcat,
顶层结构: Connectors Handlers Webapp
一个简单的例子如下:
public static void main( String[] args ) throws Exception
{
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.setConnectors(new Connector[] { connector });
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
context.addServlet(HelloServlet.class, "/hello");
context.addServlet(AsyncEchoServlet.class, "/echo/*");
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[] { context, new DefaultHandler() });
server.setHandler(handlers);
server.start();
server.join();
}
jfinal
中的启动:
m.out.println("Starting JFinal " + Const.JFINAL_VERSION);
server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(port);
server.addConnector(connector);
webApp = new WebAppContext();
webApp.setThrowUnavailableOnStartupException(true); // 在启动过程中允许抛出异常终止启动并退出 JVM
webApp.setContextPath(context);
webApp.setResourceBase(webAppDir); // webApp.setWar(webAppDir);
webApp.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
webApp.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false"); // webApp.setInitParams(Collections.singletonMap("org.mortbay.jetty.servlet.Default.useFileMappedBuffer", "false"));
persistSession(webApp);
server.setHandler(webApp);
// changeClassLoader(webApp);
// configureScanner
// if (scanIntervalSeconds > 0) {
// Scanner scanner = new Scanner(PathKit.getRootClassPath(), scanIntervalSeconds) {
// public void onChange() {
// try {
// System.err.println("\nLoading changes ......");
// webApp.stop();
// JFinalClassLoader loader = new JFinalClassLoader(webApp, getClassPath());
// webApp.setClassLoader(loader);
// webApp.start();
// System.err.println("Loading complete.");
// } catch (Exception e) {
// System.err.println("Error reconfiguring/restarting webapp after change in watched files");
// LogKit.error(e.getMessage(), e);
// }
// }
// };
// System.out.println("Starting scanner at interval of " + scanIntervalSeconds + " seconds.");
// scanner.start();
// }
try {
System.out.println("Starting web server on port: " + port);
server.start();
System.out.println("Starting Complete. Welcome To The JFinal World :)");
server.join();
} catch (Exception e) {
LogKit.error(e.getMessage(), e);
System.exit(100);
}
return;
}