Servlet完全教程
Servlet 是一些遵從Java Servlet API的Java類,這些Java類可以響應請求。儘管Servlet可以響應任意型別的請求,但是它們使用最廣泛的是響應web方面的請求。 Servlet必須部署在Java servlet容器才能使用。雖然很多開發者都使用Java Server Pages(JSP)和Java Server Faces(JSF)等Servlet框架,但是這些技術都要在幕後通過Servlet容器把頁面編譯為Java Servlet。也就是說,瞭解Java Servlet技術的基礎知識對任何Java web開發者來說是很有用的。
在這個教程裡,我們將會通過下面的專題來全面瞭解Java Servlet技術。
目錄
- 編寫你的第一個Servlet
- Servlet生命週期方法
- 使用@WebServlet註解開發Servlet
- 打包和部署Servlet到Tomcat伺服器
- 編寫動態的Servlet響應內容
- 處理Servlet請求和響應
- 監聽Servlet容器事件
- 傳遞Servlet初始化引數
- 為特定的URL請求新增Servlet過濾器
- 使用Servlet下載二進位制檔案
- 使用RequestDispatcher.forward()轉發請求到另一個Servlet
- 使用HttpServletResponse.sendRedirect()重定向請求到另一個Servlet
- 使用Servlets讀寫Cookie
讓我們一起來一步步地學習Servlet。
編寫你的第一個Servlet
我們的第一個Servlet是一個只擁有少量程式碼的簡單Servlet,目的是讓你只需關注它的行為。
package com.howtodoinjava.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyFirstServlet extends HttpServlet { private static final long serialVersionUID = -1915463532411657451L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { // Write some content out.println("<html>"); out.println("<head>"); out.println("<title>MyFirstServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h2>Servlet MyFirstServlet at " + request.getContextPath() + "</h2>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Do some other work } @Override public String getServletInfo() { return "MyFirstServlet"; } }
為了在web容器裡註冊上面的Servlet,你要為你的應用建一個web.xml入口檔案。
<?xml version="1.0"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<welcome-file-list>
<welcome-file>/MyFirstServlet</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>com.howtodoinjava.servlets.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<url-pattern>/MyFirstServlet</url-pattern>
</servlet-mapping>
</web-app>
上面的Servlet做了一些重要的事情,你可能想了解的。
- MyFirstServlet類繼承了HttpServlet。這個繼承是必須的,因為所有的Servlet必須是要麼繼承了 javax.servlet.GenericServlet 的普通Servlet,要麼是繼承了 javax.servlet.http.HttpServlet 的HTTP Servlet。
- 重新 doGet() 和 doPost() 方法。這兩個方法都已在 HttpServlet 類裡定義了。當一個GET或POST請求到來時,它就會被對映到相應的方法裡。例如,如果你向這個servlet傳送一個HTTP GET請求,doGet()方法就會被呼叫。
- 這裡也有一些其他有用的方法。你可以重寫它們來在執行時控制應用。例如getServletInfo()。
- HttpServletRequest 和 HttpServletResponse 是所有doXXX()方法的預設引數。我們會在後面的章節裡詳細學習這些物件。
以上所有關於簡單Servlet的內容就是你需要知道的內容。
Servlet生命週期方法
在你的應用載入並使用一個Servlet時,從初始化到銷燬這個Servlet期間會發生一系列的事件。這些事件叫做Servlet的生命週期事件(或方法)。讓我們一起來進一步瞭解它們。
Servlet生命週期的三個核心方法分別是 init() , service() 和 destroy()。每個Servlet都會實現這些方法,並且在特定的執行時間呼叫它們。
1) 在Servlet生命週期的初始化階段,web容器通過呼叫init()方法來初始化Servlet例項,並且可以傳遞一個實現 javax.servlet.ServletConfig 介面的物件給它。這個配置物件(configuration object)使Servlet能夠讀取在web應用的web.xml檔案裡定義的名值(name-value)初始引數。這個方法在Servlet例項的生命週期裡只調用一次。
init方法定義與這類似:
public void init() throws ServletException { //custom initialization code } |
2) 初始化後,Servlet例項就可以處理客戶端請求了。web容器呼叫Servlet的service()方法來處理每一個請求。service() 方法定義了能夠處理的請求型別並且呼叫適當方法來處理這些請求。編寫Servlet的開發者必須為這些方法提供實現。如果發出一個Servlet沒實現的請求,那麼父類的方法就會被呼叫並且通常會給請求方(requester)返回一個錯誤資訊。
通常,我們不需要重寫(override)這個方法。
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
3) 最後,web容器呼叫destroy()方法來終結Servlet。如果你想在Servlet的生命週期內關閉或者銷燬一些檔案系統或者網路資源,你可以呼叫這個方法來實現。destroy() 方法和init()方法一樣,在Servlet的生命週期裡只能呼叫一次。
123 | public void destroy() { // } |
在大多數情況下,你通常不需要在你的Servlet裡重寫這些方法。
使用@WebServlet註解來開發Servlet
如果你不喜歡使用xml配置而喜歡註解的話,沒關係,Servlets API同樣提供了一些註解介面給你。你可以像下面的例子一樣使用 @WebServlet 註解並且不需要在web.xml裡為Servlet註冊任何資訊。容器會自動註冊你的Servlet到執行環境,並且像往常一樣處理它。
package com.howtodoinjava.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "MyFirstServlet", urlPatterns = {"/MyFirstServlet"})
public class MyFirstServlet extends HttpServlet {
private static final long serialVersionUID = -1915463532411657451L;
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
//Do some work
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//Do some other work
}
}
打包和部署Servlet到Tomcat伺服器
如果你在使用IDE(例如),那麼打包和部署你的應用只需要一個簡單的步驟。右擊專案> Run As > Run As Server。如果還沒配置伺服器先配置好伺服器,然後就可以準備開幹了。
如果你沒在使用IDE,那麼你需要做一些額外的工作。比如,使用命令提示符編譯應用,使用ANT去生成war檔案等等。但我相信,現在的開發者都在使用IDE來開發。所以我就不在這方面浪費時間了。
當你把我們的第一個Servlet部署到tomcat上並在瀏覽器輸入“http://localhost:8080/servletexamples/MyFirstServlet”,你會得到下面的響應。
編寫動態的Servlet響應內容
Java Servlets如此有用的原因之一是Servlet能動態顯示網頁內容。這些內容可以從伺服器本身、另外一個網站、或者許多其他網路可以訪問的資源裡獲取。Servlet不是靜態網頁,它們是動態的。可以說這是它們最大的優勢。
讓我們來舉個Servlet例子,這個Servlet會顯示當前日期和時間給使用者並且會顯示使用者名稱和一些自定義的資訊。讓我們來為這個功能編寫程式碼吧。
package com.howtodoinjava.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "CalendarServlet", urlPatterns = {"/CalendarServlet"})
public class CalendarServlet extends HttpServlet {
private static final long serialVersionUID = -1915463532411657451L;
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
Map<String,String> data = getData();
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
// Write some content
out.println("<html>");
out.println("<head>");
out.println("<title>CalendarServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>Hello " + data.get("username") + ", " + data.get("message") + "</h2>");
out.println("<h2>The time right now is : " + new Date() + "</h2>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
//This method will access some external system as database to get user name, and his personalized message
private Map<String, String> getData()
{
Map<String, String> data = new HashMap<String, String>();
data.put("username", "Guest");
data.put("message", "Welcome to my world !!");
return data;
}
}
當你在tomcat裡執行上面的Servlet並在瀏覽器裡輸入“http://localhost:8080/servletexamples/CalendarServlet”,你會得得下面的響應。
處理Servlet請求和響應
Servlet可以輕鬆建立一個基於請求和響應生命週期的web應用。它們能夠提供HTTP響應並且可以使用同一段程式碼來處理業務邏
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
String password = request.getParameter("password");
boolean success = validateUser(username, password);
try {
// Write some content
out.println("<html>");
out.println("<head>");
out.println("<title>LoginServlet</title>");
out.println("</head>");
out.println("<body>");
if(success) {
out.println("<h2>Welcome Friend</h2>");
}else{
out.println("<h2>Validate your self again.</h2>");
}
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
輯。處理業務邏輯的能力使Servlet比標準的HTML程式碼更強大。
現實世界裡的應用,一個HTML網頁表單包含了要傳送給Servlet的引數。Servlet會以某種方式來處理這些引數並且 返回一個客戶端能夠識別的響應。在物件是HttpServlet的情況下,客戶端是web瀏覽器,響應是web頁面。<form>的 action屬性指定了使用哪個Servlet來處理表單裡的引數值。
為了獲取請求引數,需要呼叫 HttpServletRequest 物件的 getParameter() 方法,並且傳遞你要獲取的輸入引數的id給該方法。
12 | String value1 = req.getParameter( "param1" ); String value1 = req.getParameter( "param2" ); |
一旦獲取了引數值,它們就會在需要時被處理。對客戶端的響應和我們上面部分討論的一樣。我們使用 HttpServletResponse 物件給客戶端傳送響應。
request和response處理的基本使用可以是這樣的:
為了傳送內容給客戶端,你需要使用從 HttpServletResponse 裡獲取的 PrintWriter 物件。任何寫到這個物件的內容都會被寫進outputstream裡,並會把內容傳送回給客戶端。
監聽Servlet容器事件
有時候,知道應用伺服器容器(the application server container)裡某些事件發生的時間是很有用的。這個概念適用於很多情況,但它通常用在開啟應用時初始化應用或者關閉應用時清理應用。可以在應用裡 註冊一個監聽器(listener)來顯示應用什麼時候開啟或者關閉。因此,通過監聽這些事件,Servlet可以在一些事件發生時執行相應的動作。
為了建立一個基於容器事件執行動作的監聽器,你必須建立一個實現 ServletContextListener 介面的類。這個類必須實現的方法有 contextInitialized() 和 contextDestroyed()。這兩個方法都需要 ServletContextEvent 作為引數,並且在每次初始化或者關閉Servlet容器時都會被自動呼叫。
為了在容器註冊監聽器,你可以使用下面其中一個方法:
1) 利用 @WebListener 註解。
2) 在web.xml應用部署檔案裡註冊監聽器。
3) 使用 ServletContext 裡定義的 addListener() 方法
請注意,ServletContextListener 不是Servlet API裡唯一的監聽器。這裡還有一些其他的監聽器,比如
javax.servlet.ServletRequestListener javax.servlet.ServletRequestAttrbiteListener javax.servlet.ServletContextListener javax.servlet.ServletContextAttributeListener javax.servlet.HttpSessionListener javax.servlet.HttpSessionAttributeListener |
根據你要監聽的事件選擇他們來實現你的監聽器類。比如,每當建立或銷燬一個使用者session時,HttpSessionListener 就會發出通知。
傳遞Servlet初始化引數
現在的大多數應用都需要設定一些在應用/控制器(controller)啟動時可以傳遞的配置引數(configuration parameters)。Servlet同樣可以接受初始化引數,並在處理第一個請求前來使用它們來構建配置引數。
顯然,你也可以在Servlet裡硬編碼配置值。但是這樣做的話,在Servlet發生改動時你需要再次重新編譯整個應用。沒有人喜歡這樣做。
<web-app>
<servlet>
<servlet-name>SimpleServlet</servlet-name>
<servlet-class>com.howtodoinjava.servlets.SimpleServlet</servlet-class>
<!-- Servlet init param -->
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
</web-app>
設定後,你就可以在程式碼裡呼叫 getServletConfig.getInitializationParameter() 並傳遞引數名給該方法來使用引數。就像下面展示的程式碼一樣:
1 | String value = getServletConfig().getInitParameter( "name" ); |
為特定的URL請求新增Servlet過濾器
Web過濾器在給定的URL被訪問時對請求進行預處理並呼叫相應的功能是很有用的。相 比於直接呼叫給定URL請求的Servlet,包含相同URL模式的過濾器(filter)會在Servlet呼叫前被呼叫。這在很多情況下是很有用的。 或許最大的用處就是執行日誌,驗證或者其他不需要與使用者互動的後臺服務。
過濾器必須要實現 javax.servlet.Filter 介面。這個介面包含了init(),descriptor()和doFilter()這些方法。init()和destroy()方法會被容器呼叫。 doFilter()方法用來在過濾器類裡實現邏輯任務。如果你想把過濾器組成過濾鏈(chain filter)或者存在多匹配給定URL模式的個過濾器,它們就會根據web.xml裡的配置順序被呼叫。
為了在web.xml裡配置過濾器,需要使用<filter>和<filter-mapping> XML元素以及相關的子元素標籤。
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LogingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果你要使用註解來為特定的servlet配置過濾器,你可以使用@WebFilter註解。
使用Servlet下載二進位制檔案
幾乎所有的web應用都必須有下載檔案的功能。為了下載一個檔案,Servlet必須提供一個和下載檔案型別匹配的響應型別。同樣,必須在響應頭裡指出該響應包含附件。就像下面的程式碼。
123 | String mimeType = context.getMimeType( fileToDownload ); response.setContentType( mimeType != null ? mimeType : "text/plain" ); response.setHeader( "Content-Disposition" , "attachment; filename=" " + fileToDownload + " "" ); |
通過呼叫 ServletContext.getResourceAsStream() 方法並傳遞檔案路徑給該方法,你可以獲取要下載的檔案(檔案儲存在檔案系統)的引用。這個方法會返回一個輸入流(InputStream)對 象,我們可以用這個物件來讀取檔案內容。當讀取檔案時,我們建立一個位元組快取區(byte buffer)從檔案裡獲取資料塊。最後的工作就是讀取檔案內容並且把它們複製到輸出流。我們使用while迴圈來完成檔案的讀取,這個迴圈直到讀取了文 件的所有內容才會跳出迴圈。我們使用迴圈來讀進資料塊並把它寫進輸出流。把所有資料寫進輸出流後,ServletOutputStream 物件的flush方法就會被呼叫並且清空內容和釋放資源。
看這段簡單的程式碼:
private void downloadFile(HttpServletRequest request, HttpServletResponse response, String fileToDownload) throws IOException
{
final int BYTES = 1024;
int length = 0;
ServletOutputStream outStream = response.getOutputStream();
ServletContext context = getServletConfig().getServletContext();
String mimeType = context.getMimeType( fileToDownload );
response.setContentType( mimeType != null ? mimeType : "text/plain" );
response.setHeader( "Content-Disposition", "attachment; filename="" + fileToDownload + """ );
InputStream in = context.getResourceAsStream("/" + fileToDownload);
byte[] bbuf = new byte[BYTES];
while ((in != null) && ((length = in.read(bbuf)) != -1)) {
outStream.write(bbuf, 0, length);
}
outStream.flush();
outStream.close();
}
使用RequestDispatcher.forward()轉發請求到另一個Servlet
有時候,你的應用需要把一個Servlet要處理的請求轉讓給另外的Servlet來處理並完成任務。而且,轉讓請求時不能重定向客戶端的URL。即瀏覽器位址列上的URL不會改變。
在 ServletContext 裡已經內建了實現上面需求的方法。所以,當你獲取了 ServletContext 的引用,你就可以簡單地呼叫getRequestDispatcher() 方法去獲取用來轉發請求的 RequestDispatcher 物件。當呼叫 getRequestDispatcher() 方法時,需要傳遞包含servlet名的字串,這個Servlet就是你用來處理轉讓請求的Servlet。獲取 RequestDispatcher 物件後,通過傳遞 HttpServletRequest 和HttpServletResponse 物件給它來呼叫轉發方法。轉發方法負責對請求進行轉發。
12 | RequestDispatcher rd = servletContext.getRequestDispatcher( "/NextServlet" ); rd.forward(request, response); |
使用HttpServletResponse.sendRedirect()重定向請求到另一個Servlet
儘管有時候,你不想在Servlet傳送重定向時通知使用者,就像我們在上面那段看到的一樣。但是在某些情況下,我們確實想要通知使用者。當應用內的特定URL被訪問時,你想把瀏覽器的URL重定向到另外一個。
要實現這種功能,你需要呼叫 HttpServletResponse 物件的sendRedirect()方法。
1 | httpServletResponse.sendRedirect( "/anotherURL" ); |
這個簡單的重定向,與servlet鏈(servlet chaining)相反,不需要傳遞目標地址的HttpRequest物件。
使用Servlet讀寫Cookie
很多應用都想在客戶端機器裡儲存使用者當前的瀏覽歷史。目的是當用戶再次使用應用時,他能夠從上次離開的地方開始瀏覽。為了實現這個需求,通常使用cookies。你可以把它看作是儲存在客戶端機器裡的鍵值對基本資料。當使用瀏覽器開啟應用時,應用可以對這些資料進行讀寫。
為了建立cookie,需要例項化一個新的 javax.servlet.http.Cookie 物件並且為它分配名稱和值。例項化cookie後,可以設定屬性來配置cookie。在這個例子裡,我們使用 setMaxAge() 和 setHttpOnly() 方法來設定cookie的生命週期和防範客戶端指令碼。
從Servlet3.0 API開始,已經可以把cookie標記為HTTP only了。這使cookie可以防範客戶端指令碼的攻擊,使cookie更加安全。
Cookie cookie = new Cookie( "sessionId" , "123456789" ); cookie.setHttpOnly( true ); cookie.setMaxAge(- 30 ); response.addCookie(cookie); |
這裡的response是傳遞給doXXX()方法的 HttpServletResponse 例項。
要讀取服務端的cookie資訊,使用下面程式碼:
Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { //cookie.getName(); //cookie.getValue() } |
這就是這篇教程裡關於Servlet技術的全部內容了。歡迎評論和回饋。
學習快樂!!
原文連結: howtodoinjava 翻譯: ImportNew.com - 進林譯文連結: http://www.importnew.com/14621.html
相關推薦
Servlet完全教程
Servlet 是一些遵從Java Servlet API的Java類,這些Java類可以響應請求。儘管Servlet可以響應任意型別的請求,但是它們使用最廣泛的是響應web方面的請求。 Servlet必須部署在Java servlet容器才能使用。雖然很多開發者都使用Jav
Servlet完全自學手冊(圖文教程)
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程式或服務聯結器,用Java編寫的伺服器端程式,主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。 狹義的Servlet是指Java語言實現的一個介面,廣義的Servlet是指任何實現了這個Servle
阿裏雲EC2+QEMU虛擬機+ROS完全教程!
detail yun mage 註意 med 遠程命令 rtx network with ---恢復內容開始--- 1、安裝centos6.5 x64 同時記錄,當前centos分配得到的IP,子網掩碼,網關,以及MAC!!! 查看IP、mac命令ip add 查看網關命令
[python + pillow] 自制桌布不完全教程
前言 最近想給自己打雞血,然後就想到經常給自己定義的一些目標之類的。可惜的是自己一直沒有做的很好~計劃定了千萬遍,可是依舊不能很好的執行。這大概就是執行力不夠,其實現實生活中很多事情我們之所以辦不好或許就是因為我們沒有下定決心去執行我們給自己定的計劃定的標準定的各種行為準則~ 扯
Thinkphp傳送郵件完全教程
個人學習thinkphp有一段時間了,期間用thinkphp開發過一些網站專案,當我的專案想有一個傳送郵件的功能的時候,自己在網上看了許多資料,從完全小白到學到這個花了半天時間,其實很簡單(只不過走了很多彎路),現在在這裡分享給大家,算是節約些時間吧 整合檔案下載 下面我來一步一步彙報如何完善這個
Ubuntu16.04安裝OpenCV3.4.0+OpenCV_contrib3.4.0+CUDA9.0完全教程
一、解除安裝已安裝的OpenCV 之前已經安裝了OpenCV3.4.3,但是這個版本好像和CUDA9.0不能相容,導致cuda的模組無法編譯,所以這裡先把它解除安裝掉。 進入opencv的安裝目錄,
Servlet基礎教程
目錄 請求方式 轉發器 5、重定向 Servlet簡介 Java Servlet 是執行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 伺服器上的資料庫或
Java Servlet 實戰入門教程-00-Servlet 系列教程彙總 Servlet 是什麼,Servlet與tomcat/j2EE的關係
系列文章彙總 寫作緣由 原來學習過多次 servlet,但是平時工作中一直使用 spring mvc 等框架。使用的時候寫幾個註解,實際原理並不知曉。 此係列文章,意在知其然,知其所以然。 學習之路,就是保持一顆好奇之心。 Servlet 概念 servlet是
kali linux 安裝sublime text3完全教程
點選進入官網 下載頁面 將滑鼠放在64 bit(64位系統)上右擊複製連結 開啟終端: #wget 路徑(貼上剛複製的) #tar -xvvf 剛剛下載的檔案檔名(解壓) #mv 解壓出來的檔名 /opt/ #cp /opt/解壓出來
Python講堂 路徑拼接os.path.join()函式完全教程
os.path.join()函式用於路徑拼接檔案路徑。 os.path.join()函式中可以傳入多個路徑: 1.會從第一個以”/”開頭的引數開始拼接,之前的引數全部丟棄。 2.以上一種情況為先。在上一種情況確保情況下,若出現”./”開頭的引數,會從”./”開頭的引數的上
使用gdb除錯程式完全教程
程式的除錯過程主要有:單步執行,跳入函式,跳出函式,設定斷點,設定觀察點,檢視變數。 本文將主要介紹linux下的強大除錯工具是怎麼完成這些工作的。之所以要除錯程式,是因為程式的執行結果和預期結果不一致,或者程式出現執行時錯誤。 除錯的基本思想是: 分析現象 ->
python路徑拼接os.path.join()函式完全教程
os.path.join()函式用於路徑拼接檔案路徑。 os.path.join()函式中可以傳入多個路徑: 會從第一個以”/”開頭的引數開始拼接,之前的引數全部丟棄。 以上一種情況為先。在上一種
時間序列完全教程(R)
簡介 在商業應用中,時間是最重要的因素,能夠提升成功率。然而絕大多數公司很難跟上時間的腳步。但是隨著技術的發展,出現了很多有效的方法,能夠讓我們預測未來。不要擔心,本文並不會討論時間機器,討論的都是很實用的東西。 本文將要討論關於預測的方法。有一種預測是跟時間相
SQL2008升級SQL2008R2完全教程
今天將由於需要就將我的SQL 2008升級到SQL 2008 R2. 說到為什麼要升級是因為,從另一臺機器上備份了一個數據庫,到我的機器上還原的時候提示“System.Data.SqlClient.Sqlerror:該資料庫是在執行版本10.50.2500的伺服器上備份的,該版本與此伺服器(執行版本10.00
64位作業系統Python2.7安裝numpy,matpoltlib,pandas完全教程
64位Python安裝numpy,matpoltlib,pandas完全教程 我是量化投資還有機器學習的入門者,在一些比較好的量化投資平臺比如ricequant這種,python的numpy,matpoltlib和pandas基本是入門必備的函式庫。但是網上關
OkHttp使用完全教程
上一節我們講述了Http請求的過程, 這一節我們就講述下OkHttp是怎麼完成Http請求的. (為了更好的理解這節內容,強烈推薦上一節文加圖, 理解Http請求與響應) 1. 歷史上Http請求庫優缺點 在講述OkHttp之前, 我們看下沒有OkHttp的時代, 我
Glide完全解析(一)初步使用完全教程教程
一、背景 現在Android上的圖片載入框架非常成熟,從最早的老牌圖片載入框架UniversalImageLoader,到後來Google推出的Volley,再到後來的新興軍Glide和Picasso,當然還有Facebook的Fresco。每一個都非常穩
Ubuntu完全教程,讓你成為Ubuntu高手!
Ubuntu的發音 Ubuntu,源於非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。瞭解發音是有意義的,您不是第一個為此困惑的人,當然,也不會是最後一個:) 大多數的美國人讀 ubuntu 時,將 u 作為母音發音,類似單詞 who 或者 boo ,重音在第二個音節即 u'buntu
OllyDbg完全教程 記憶體對映視窗[Memory map window]
記憶體對映視窗顯示了被除錯程式分配的所有記憶體塊。因為沒有標準的方法來完成這項任務,所以OllyDbg可能會把一個大的記憶體塊分成幾個部分。然而,在大多數情況下,並非一定要精確處理。如果想檢視由應用程式通過呼叫GlobalAlloc()和LocalAlloc()等申請的記憶體塊列表,請使用堆列表[Heap l
Linux GDB除錯完全教程
本文將主要介紹linux下的強大除錯工具是怎麼完成這些工作的。 之所以要除錯程式,是因為程式的執行結果和預期結果不一致,或者程式出現執行時錯誤。 除錯的基本思想是: 分析現象 -> 假設錯誤原因 -> 產生新的現象去驗證假設 偵錯程式(如GDB)的