標籤:coder 初始化 常用 method ebs rate protected local com
Servlet概述
Servelt是使用Java Servlet應用程式介面及相關類和方法的Java程式。
Servlet是用Java編寫的Server端程式,它與協議和平台無關。Servlet運行於Java伺服器中。
Java Servlet API 定義了Servlet和伺服器之間的標準介面,這使得Servlet具有跨伺服器平台的特性。
通常,Servlet採用一種無狀態的“要求-回應”模型來訪問。它能處理用戶端傳來的Http請求,從中提取參數,處理商務邏輯,最終返回資料或輸出HTML。它還可以訪問資料庫,進行計算,並和Enterprise JavaBean 組件進行通訊。
Servlet的運行原理
見之前的JSP運行原理。
Servlet的生命週期
有javax.servlet.Servlet定義。
裝載類--->初始化(init())--->服務(service())--->銷毀(destroy())
Servlet常見結構
@WebServlet("/Name")public class Servlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet()
* init() */ public Servlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
* 處理get請求 */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
* 處理post請求 */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub }}Servlet擷取請求中的參數
類似於JSP,採用getParameter()方法,常用的具體如下:
public String getParameter(String name); //擷取指定名稱的參數值public String[] getParameterValues(String name); //適用於一個參數名對應多個值的情況public java.util.Enumeration getParameterNames(); //返回一個包含請求訊息中所有參數名的枚舉對象。public java.util.Map getParamterMap(); //返回所有參數名和對應參數值的map
資料亂碼問題:
POST方法:按HTML頁面指定的編碼進行編碼。
在Servelt類的請求處理方法需先調用HttpServletRequest介面的setCharacterEncoding(String enc)方法使資料按參數編碼。
通常使用response.setContentType("text/html;charset=utf-8")即可。
GET方法:參數被拼接到URL後面提交。即上述方法已經不起作用。
在發送這些資料前先手工把他們按頁面指定的編碼方式編碼好:java.net.URLEncoder.encode(String s,String enc)方法。然後再發送。
再Servlet類的請求處理方法中再手工解碼:java.net.URLDecoder.decode(String s,String enc)方法。
最好的做法是再URL中不要使用中文等非ASCII字元。
重新導向 && 請求指派
| 絕對URL |
以“/”開頭的路徑,指的是相對於Web應用根目錄的路徑。 |
| 相對URL |
不是以“/”開頭的路徑,指的是相對於當前路徑目錄的路徑。 |
重新導向
相關方法: HttpServletRequest介面提供的sendRedirect()
說明:不僅可以重新導向到當前應用程式中的其他資源,還可以重新導向到同一容器中的其他應用程式中的資源,甚至是使用絕對URL重新導向到其他網站的資源。
public void sendRedirect(String location) throws IOException; //location可使用絕對URL和相對URL
注意:重新導向會將當前URL改變為定向後的程式的URL,即Get方法不能通過重新導向傳遞給後者。發起者和被調用者使用各自的request和response執行個體。
工作原理:
請求指派
相關方法: Servlet API中定義了一個RequestDispatcher介面,俗稱請求指派器。它定義了如下兩個方法:
public void forward(ServletRequest request,ServletResponse response) throws ServletException, IOException;public void include(ServletRequest request,ServletResponse response) throws ServletException, IOException;
說明:擷取RequestDispatcher執行個體的方法有兩種
調用ServletContext介面提供的getRequestDispatcher(String url) URL必須為絕對路徑
調用ServletRequest介面提供的getRequestDispatcher(String url) URL可以為相對路徑,也可以為相對路徑
只能將請求轉寄給同一個Web應用中的其他組件,不能轉寄到其他網站的資源。
注意:請求轉寄過程接受後,瀏覽器保持初始的URL地址不變。並且發起者和被調用者共用一個request和response執行個體。
工作原理:
另外:因為公用一個request、response執行個體,則該方法可以利用setAttribute(String name, Oject obj)以及getAttribute(String name)等方法來利用請求域屬性傳遞對象資料。執行個體如下:
boolean isError=true;request.setAttribute("error", isError);request.getRequestDispatcher("servletcom.jsp").forward(request, response);
boolean a=(boolean)request.getAttribute("error");跳轉的另一端直接擷取即可Servlet的調用
1)URL調用:當在設定檔中指定Servlet映射地址後,可直接從瀏覽器調用Servlet,如:
http://localhost:8080/helloworld
2)JSP檔案中調用:可使用<jsp:include>或者<jsp:forward>語句在JSP頁面中調用一個Servlet,如:
<jsp:include page="/Servlet" flush="true"/>
頁面執行中,當遇到這一句會跳轉到響應的Servlet,當Servlet執行結束後控制權又回到原來的JSP頁面中。
也可以用<jsp:forward>進行跳轉。
JSP/Servlet Web 學習筆記 DayFour