2014-11-25 11 views
0

這是我第一次在一個使用的HttpServlet的Java項目上工作。這個HttpServlet的service()方法到底是什麼?

所以我知道的的HttpServlet是一個Web應用程序服務器,並作爲從HTTP服務器上的Web瀏覽器或其他HTTP客戶端和數據庫或應用程序未來的請求之間的中間層上運行的程序。所以這個servlet擴展了我的應用服務器的能力。

我有一些疑問,以瞭解這個servlet成立到我的項目,工作完全進入的web.xml文件我發現這個配置:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE web-app PUBLIC 
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
     "http://java.sun.com/dtd/web-app_2_3.dtd">  
<web-app> 

    <display-name>My Project</display-name> 

    <listener> 
     <listener-class>it.sistinf.ediweb.quartz.QuartzListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>edimon</servlet-name>  
     <servlet-class>it.sistinf.ediweb.monitor.servlets.Monitoraggio</servlet-class> 
     <load-on-startup>0</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>edimon</servlet-name>  
     <url-pattern>/edimon.do/*</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
     <welcome-file>/logon.jsp</welcome-file> 
    </welcome-file-list> 

    <taglib> 
     <taglib-uri>displaytag</taglib-uri> 
     <taglib-location>/WEB-INF/displaytag-11.tld</taglib-location> 
    </taglib> 

</web-app> 

所以,閱讀一些文件似乎明白,我有告訴servlet容器(或應用服務器)要部署哪些servlet以及將servlet映射到哪個URL。

在前面的情況下,我配置了一個名爲edimonMonitoraggio類實現的servlet。

然後它將該servlet映射到URL或URL模式。在這種情況下,edimon servlet正在與/edimon.do/* URL模式進行映射。所以當它被稱爲與之前的模式相匹配的東西時,edimon servlet就會執行。

然後進入我的Monitoraggio類實現的HttpServlet我發現服務()方法:

public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 
     LoggerMDC.setup(req, res); 
     Logger logger = (Logger) Logger.getStdLogger(Monitoraggio.class); // do not declare 'logger' as static field in order to work with MDC 

     String service = req.getParameter("serv"); 

     char serviceId = Utility.getServizio(req.getParameter("serv")); 

     if (checkSession(req, serviceId) == false) { 
      gotoPage(ConfigurationFactory.getPropertiesPages().getProperty("pagina_errore_session"), req, res); 
      return; 
     } 

     LoggerWatch loggerWatch = new LoggerWatch(Monitoraggio.class, Long.valueOf(System.getProperty(Constants.Keys.CONFIG_STATS_WARNING_THRESHOLD, String.valueOf(LoggerWatch.DEFAULT_WARNING_THRESHOLD))).longValue()); 
     if (logger.isTraceEnabled()) 
      logger.trace("lanciaServizio() | logger threshold: " + loggerWatch.getWarningThreshold()); 

     loggerWatch.start(); 
     loggerWatch.info(new StringBuffer("service() | servizio: [").append(service).append("] | service start").toString()); 

     String paginaDaLanciare = lanciaServizio(serviceId, req, res); 
     String executionTime = loggerWatch.getInfoTime(); 

     //Modifica per export 
     if (req.getSession().getAttribute("export") == null) { 
      gotoPage(paginaDaLanciare, req, res); 
     } 

     loggerWatch.info(new StringBuffer("service() | servizio: [").append(service).append("] | [").append(executionTime).append("] after forward to ").append(paginaDaLanciare).toString(), true); 
     loggerWatch.stop(); 

     req.getSession().removeAttribute("export"); 
     req.getSession().removeAttribute("stringaXML"); 
     req.getSession().removeAttribute("downbyte"); 

     return; 
    } 

對文檔的閱讀它接收來自公共服務方法標準HTTP請求和將它們發送到在這個類中定義的doXXX方法

那麼這種方法究竟做了什麼呢?我無法理解servlet如何加載JSP

回答

1

您閱讀的文檔描述了默認情況下HttpServlet的service()方法的功能。由於您的servlet覆蓋了service()方法並提供了不同的實現,因此它不再那樣做。相反,它確實...方法中的代碼執行的是什麼。

一個servlet不會「加載JSP」。我沒有看到JSP如何與您發佈的servlet代碼有任何關係。也許gotoPage()確實告訴容器將請求轉發給JSP。您應該查看該方法的文檔和/或代碼以瞭解其功能。