Azkaban的Web Server源码探究系列10 : /对应的servlet解析

若是请求的URI是"/",对应的servlet如何响应?web

===================================================================ajax

ServletHolder indexRedirect = new ServletHolder(new IndexRedirectServlet(defaultServletPath));spring

root.addServlet(indexRedirect, "/");session

===================================================================app

因此须要分析IndexRedirectServletwebapp

  1)servlet的init方法ide

这里涉及到了3个类,分别是:学习

IndexRedirectServlet   LoginAbstractAzkabanServlet   AbstractAzkabanServletthis

首先找这3个类的init方法---第一个init方法在LoginAbstractAzkabanServlet   spa

因此须要从这个类的init方法开始看

AbstractAzkabanServlet.init

@Override

  public void init(ServletConfig config) throws ServletException {

  //看到这里了

    application =//获取以前的server实例

        (AzkabanServer) config.getServletContext().getAttribute(

            AzkabanServletContextListener.AZKABAN_SERVLET_CONTEXT_KEY);

 

    if (application == null) {

      throw new IllegalStateException(

          "No batch application is defined in the servlet context!");

    }

  //看到这里了

    Props props = application.getServerProps();

  //看到这里了

    name = props.getString("azkaban.name", "");//获取名字

    label = props.getString("azkaban.label", "");//label

    color = props.getString("azkaban.color", "#FF0000");//颜色

 

    if (application instanceof AzkabanWebServer) {//

      AzkabanWebServer server = (AzkabanWebServer) application;//转化

      //

      viewerPlugins = PluginRegistry.getRegistry().getViewerPlugins();//内容为空

      //

      triggerPlugins =

          new ArrayList<TriggerPlugin>(server.getTriggerPlugins().values());

    }

  }

---而后是

LoginAbstractAzkabanServlet.init

 

@Override

  public void init(ServletConfig config) throws ServletException {

    super.init(config);

    //继续

    multipartParser = new MultipartParser(DEFAULT_UPLOAD_DISK_SPOOL_SIZE);

    //上面是经过commons-upload来获取

    shouldLogRawUserAgent =

        getApplication().getServerProps().getBoolean("accesslog.raw.useragent",

            false);

  }

 

 -------------------

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// Set session id

// 入口在这

//获取session

Session session = getSessionFromRequest(req);

//记录本次访问行为

logRequest(req, session);

//第1次不执行

if (hasParam(req, "logout")) {

resp.sendRedirect(req.getContextPath());

if (session != null) {

getApplication().getSessionCache().removeSession(session.getSessionId());

}

return;

}

//不执行

if (session != null) {

if (logger.isDebugEnabled()) {

logger.debug("Found session " + session.getUser());

}

if (handleFileGet(req, resp)) {

return;

}

 

handleGet(req, resp, session);

} else {

if (hasParam(req, "ajax")) {

HashMap<String, String> retVal = new HashMap<String, String>();

retVal.put("error", "session");

this.writeJSON(resp, retVal);

} else {

//真正处理逻辑

handleLogin(req, resp);

}

}

}

因此,须要继续查看handleLogin的代码

private void handleLogin(HttpServletRequest req, HttpServletResponse resp, String errorMsg)

throws ServletException, IOException {

//1)生成数据

Page page = newPage(req, resp, "azkaban/webapp/servlet/velocity/login.vm");

if (errorMsg != null) {

page.add("errorMsg", errorMsg);

}

//渲染

page.render();

}

这部分跟springMVC就相似了,就不细说了!

主要看下azkaban/webapp/servlet/velocity/login.vm的内容

好,因此,,咱们就能看到了

怎么样,是否是很酷

 

---

经过学习azkaban,能够了解如下知识

Jetty  DBUtils  Velocity(渲染)。

相关文章
相关标签/搜索