Serverlet是用Java編寫的服務器端程序;主要用於交互地瀏覽和修改數據,生成動態Web內容;
一個serverlet就是一個繼承於HttpServlet抽象類的Java類;下面先看一個簡單的例子
import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws IOException{ res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html><head><title>Hello World!</title></head>"); out.println("<body>"); out.println("<h1>Hello World!</h1></body></html>"); } }
將這個Java代碼編譯成.class 類得到 HelloWorldServlet.class 文件;
然后就是將這個文件放入tomcat的一個站點的 ../WEB-INF/classes/ 下面
在對應的web.xml 里面添加如下內容:
<servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldServlet/*</url-pattern> </servlet-mapping>
OK,現在可以在瀏覽器里訪問了;
http://localhost:8080/webapp/HelloWorldServlet/ webapp為站點名;
下面介紹servlet是怎么樣被訪問的,首先瀏覽器發送的URL,服務器會在web.xml文件中尋找對應的<url-pattern>標簽,再找到對應的servlet對應的<servlet-name>,然后再根據<servlet-name>,找到對應的servlet-class類 , 然后new一個對象,執行里面的方法;
servlet生命周期:
1、加載(通過classloader加載類)
2、實例化(new 一個對象) 這時候會執行構造函數
3、執行初始化函數(init(servletcofig)函數)//servletcofig 這個參數記錄了 web.xml中關於這個servlet的配置信息
4、處理請求
5、銷毀(執行destroy函數)
注意,無論有N多用戶,對於一個符合J2EE標准的服務器,一個servlet的類,值產生一個servlet對象,所有用戶都使用這一個對象;
當第一個用戶訪問的時候,會執行步驟1~4 其他用戶訪問的時候,就只執行4,不會再執行1~3;
等待服務器關閉的時候,執行5;
實際上,servlet有這樣一個接口,singlethread(大概是這個名字),重寫這個函數,就可以使得每調用一次,創建一個對象,然而這樣會非常非常消耗內存;
servlet 設定自啟動及參數值在XML中配置的方法:
<servlet> <servlet-name>Log4JInitServlet</servlet-name> <servlet-class>Log4JInitServlet</servlet-class> <init-param> <param-name>log4j-properties-location</param-name> <param-value>C:/myTestJava/Log4JWeb/WebRoot/ini/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
import java.io.File; import java.io.IOException; //import org.apache.logging.log4j.core.Logger; import org.apache.log4j.*; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Log4JInitServlet */ public class Log4JInitServlet extends HttpServlet { private static Logger logger; public Log4JInitServlet() { super(); // TODO Auto-generated constructor stub } /** * @see Servlet#init(ServletConfig) */ public void init(ServletConfig config) throws ServletException { //super.init(config); ServletContext sc = config.getServletContext(); String log4jLocation = config.getInitParameter("log4j-properties-location"); try { System.out .println("當前路徑默認=======" + System.getProperty("user.dir")); System.out.println("---配置文件路徑---" + log4jLocation); logger = Logger.getLogger(Log4JInitServlet.class); PropertyConfigurator .configure("C:/myTestJava/Log4JWeb/WebRoot/ini/log4j.properties"); int i = 2; while ((i--) != 0) { logger.info("Info: this is info;"); logger.debug("Debug: this is Debug;"); logger.error("Error: this is Error;"); } System.out.println("------------------Init success"); } catch (Exception e) { System.out.println("Warning:there is an error:" + e.getMessage()); } } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
