[JavaWeb學習筆記]——Servlet
Servlet學習筆記
Servlet其實就一個執行在web伺服器上的小的Java程式,用於處理從web客戶端傳送的請求,並且對請求作出響應。
使用
Servlet介面作為入門使用:
- 實現Servlet介面
- 在web.xml中配置實現類
實際程式設計中一般使用HttpServlet類:
學習參考:https://www.cnblogs.com/libingbin/p/5960456.html
SUN設計之初,是有野心,以後的網際網路不僅僅只使用http協議,可以通過GenericSrvlet實現。HttpServlet是一個與協議相關的Servlet,是專門用來處理HTTP協議的請求。通常編寫一個Servlet 一般都會讓這個Servlet 繼承Httpervlet 重寫service方法。
在service方法內部根據請求方式不同執行不同的doXXX的方法(get 請求執行doGet方法,如果是post請求就會執行doPost方法)。
所以往往繼承了HttpServlet 之後不需要重寫service 方法,只需要重寫doGet和doPost方法即可。往往請求要處理的內容的程式碼都是一致的,所以需要讓doGet和doPost相互呼叫可以簡化程式設計。
學習參考:https://www.cnblogs.com/isme-zjh/p/11820298.html
生命週期
英文文件介紹:
This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence:
- The servlet is constructed, then initialized with the
init
- Any calls from clients to the
service
method are handled. - The servlet is taken out of service, then destroyed with the
destroy
method, then garbage collected and finalized.
ServletConfig物件
用來獲得Servlet的相關的配置的物件
程式碼演示:
web.xml配置
<servlet> <servlet-name>ServletConfig</servlet-name> <servlet-class>servlet.demo.ServletConfig</servlet-class> <init-param> <param-name>username</param-name> <param-value>root</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ServletConfig</servlet-name> <url-pattern>/config</url-pattern> </servlet-mapping>
繼承HTTPServlet的類:
public class ServletConfig extends HttpServlet {
@Override
public void init(jakarta.servlet.ServletConfig config) throws ServletException {
super.init(config);
System.out.println("初始化");
System.out.println("程式別名:"+config.getServletName());
System.out.println("初始化引數username的值:"+config.getInitParameter("username"));
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
或者直接這樣寫
@WebServlet(name = "Servlet", urlPatterns = "/config",
initParams = {
@WebInitParam(name = "username", value = "root")
}
)
public class ServletConfig extends HttpServlet {
@Override
public void init(jakarta.servlet.ServletConfig config) throws ServletException {
super.init(config);
System.out.println("初始化");
System.out.println("程式別名:"+config.getServletName());
System.out.println("初始化引數username的值:"+config.getInitParameter("username"));
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
ServletContext物件
獲取web專案資訊
SeryletContext: Servlet 的上下文物件。ServletContext 物件對Servlet之前和之後的內容
都知道。這個物件-個web專案只有一一個。 在伺服器啟動的時候為每個web專案建立一-個
單獨的ServletContext物件。
public class ServletContextDemo extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取檔案的MIME的型別
ServletContext servletContext = this.getServletContext();
String mimeType = servletContext.getMimeType("aa.txt");
System.out.println(mimeType);
//獲得請求路徑的工程名
String path = servletContext.getContextPath();
System.out.println(path);
//獲取全域性初始化引數
String username = servletContext.getInitParameter("username");
String password = servletContext.getInitParameter("password");
System.out.println(username+" "+password);
Enumeration<String> names = servletContext.getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = servletContext.getInitParameter(name);
System.out.println(name + " " + value);
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
web.xml配置
注意<context>
標籤寫在<servlet>
外面
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123123</param-value>
</context-param>
<servlet>
<servlet-name>ServletContext</servlet-name>
<servlet-class>servlet.demo.ServletContextDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletContext</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
讀取web專案下的檔案
之前使用I0流就可以讀取檔案(java專案中)。現在是-個web專案, web專案需要釋出到tomcat下才能訪問的。獲取web專案下的檔案如果使用傳統的10就會出現問題(原因:路徑中使用的是相對路徑,相對的是JRE環境)。
@WebServlet(name = "Servlet", urlPatterns = "/context")
public class ServletDemo extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Properties properties = new Properties();
//建立一個檔案的輸入流
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/servlet/demo/db.properties");
// String path = this.getServletContext().getRealPath("/WEB-INF/classes/servlet/demo/db.properties");
// System.out.println(path);
// InputStream is = new FileInputStream(path);
properties.load(is);
//獲取資料
String driverClassName = properties.getProperty("driverClassName");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println(driverClassName);
System.out.println(url);
System.out.println(username);
System.out.println(password);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
域物件:
域物件:指的是將資料存入到域物件中,這個資料就會有一定的作用範圍。域指的是一定的作用範圍。
ServletContext是在伺服器啟動的時候為每個web專案單獨建立一個ServletContext物件。當web專案從伺服器中移除,或者是關閉伺服器的時候ServletContext 物件會被銷燬。向ServletContext中儲存的資料一直存在 (當伺服器關閉的時候SenvletContext物件被銷燬,然後裡面資料才會失效)。範圍:整個web應用。