本文源碼: GitHub·點這裡 || GitEE·點這裡
一、核心API簡介
1、Servlet執行流程
Servlet是JavaWeb的三大元件之一(Servlet、Filter、Listener),它屬于動态資源。Servlet的作用是處理請求,伺服器會把接收到的請求交給Servlet來處理,在Servlet中通常需要:接收請求資料;處理請求;完成響應。
2、核心API簡介
API | 作用描述 |
---|---|
ServletConfig | 擷取servlet初始化參數和servletContext對象。 |
ServletContext | 在整個Web應用的動态資源之間共享資料。 |
ServletRequest | 封裝Http請求資訊,在請求時建立。 |
ServletResponse | 封裝Http響應資訊,在請求時建立。 |
二、ServletConfig接口
1、接口簡介
容器在初始化servlet時,為該servlet建立一個servletConfig對象,并将這個對象通過init()方法來傳遞并儲存在此Servlet對象中。核心作用:1.擷取初始化資訊;2.擷取ServletContext對象。
2、代碼案例
- 配置檔案
<servlet>
<init-param>
<param-name>my-name</param-name>
<param-value>cicada</param-value>
</init-param>
<servlet-name>servletOneImpl</servlet-name>
<servlet-class>com.node02.servlet.impl.ServletOneImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletOneImpl</servlet-name>
<url-pattern>/servletOneImpl</url-pattern>
</servlet-mapping>
- API用法
public class ServletOneImpl implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
String servletName = servletConfig.getServletName() ;
System.out.println("servletName="+servletName);
String myName = servletConfig.getInitParameter("my-name") ;
System.out.println("myName="+myName);
Enumeration paramNames = servletConfig.getInitParameterNames() ;
while (paramNames.hasMoreElements()){
String paramKey = String.valueOf(paramNames.nextElement()) ;
String paramValue = servletConfig.getInitParameter(paramKey) ;
System.out.println("paramKey="+paramKey+";paramValue="+paramValue);
}
ServletContext servletContext = servletConfig.getServletContext() ;
servletContext.setAttribute("cicada","smile");
}
}
三、ServletContext接口
一個項目隻有一個ServletContext對象,可以在多個Servlet中來擷取這個對象,使用它可以給多個Servlet傳遞資料,該對象在Tomcat啟動時就建立,在Tomcat關閉時才會銷毀!作用是在整個Web應用的動态資源之間共享資料。
- 擷取方式
1、ServletConfig#getServletContext();
2、GenericServlet#getServletContext();
3、HttpSession#getServletContext()
4、ServletContextEvent#getServletContext()
2、四大域對象
ServletContext是JavaWeb四大域對象之一:
1、PageContext;
2、ServletRequest;
3、HttpSession;
4、ServletContext;
所有域對象都有存取資料的功能,因為域對象内部有一個Map,用來存儲資料。
3、代碼案例
<context-param>
<param-name>my-blog</param-name>
<param-value>2019-11-19</param-value>
</context-param>
<servlet>
<servlet-name>servletTwoImpl</servlet-name>
<servlet-class>com.node02.servlet.impl.ServletTwoImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletTwoImpl</servlet-name>
<url-pattern>/servletTwoImpl</url-pattern>
</servlet-mapping>
public class ServletTwoImpl extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 1、參數傳遞
ServletContext servletContext = this.getServletContext() ;
String value = String.valueOf(servletContext.getAttribute("cicada")) ;
System.out.println("value="+value);
// 2、擷取初始化參數
String myBlog = servletContext.getInitParameter("my-blog") ;
System.out.println("myBlog="+myBlog);
// 3、擷取應用資訊
String servletContextName = servletContext.getServletContextName() ;
System.out.println("servletContextName="+servletContextName);
// 4、擷取路徑
String pathOne = servletContext.getRealPath("/") ;
String pathTwo = servletContext.getRealPath("/WEB-INF/") ;
System.out.println("pathOne="+pathOne+";pathTwo="+pathTwo);
response.getWriter().print("執行:doGet; value:"+value);
}
}
四、ServletRequest接口
HttpServletRequest接口繼承ServletRequest接口,用于封裝請求資訊,該對象在使用者每次請求servlet時建立并傳入servlet的service()方法,在該方法中,傳入的servletRequest将會被強制轉化為HttpservletRequest對象來進行HTTP請求資訊的處理。核心作用:1.擷取請求封包資訊;2.擷取網絡連接配接資訊;3.擷取請求域屬性資訊。
<servlet>
<servlet-name>servletThreeImpl</servlet-name>
<servlet-class>com.node02.servlet.impl.ServletThreeImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletThreeImpl</servlet-name>
<url-pattern>/servletThreeImpl</url-pattern>
</servlet-mapping>
public class ServletThreeImpl extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// http://localhost:6003/servletThreeImpl?myName=cicada
String method = request.getMethod();
System.out.println("method="+method); // GET
String requestURL = request.getRequestURL().toString();
// http://localhost:6003/servletThreeImpl
System.out.println("requestURL="+requestURL);
String requestURI = request.getRequestURI();
System.out.println("requestURI="+requestURI); // /servletThreeImpl
String queryString = request.getQueryString() ;
System.out.println("queryString="+queryString); // myName=cicada
String myName = request.getParameter("myName");
System.out.println("myName="+myName); // cicada
}
}
五、ServletResponse接口
HttpServletResponse繼承自ServletResponse,封裝了Http響應資訊。用戶端每個請求,伺服器都會建立一個response對象,并傳入給Servlet.service()方法。核心作用:1.設定響應頭資訊;2.發送狀态碼;3.設定響應正文;4.重定向;
<servlet>
<servlet-name>servletFourImpl</servlet-name>
<servlet-class>com.node02.servlet.impl.ServletFourImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletFourImpl</servlet-name>
<url-pattern>/servletFourImpl</url-pattern>
</servlet-mapping>
public class ServletFourImpl extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8") ;
response.setCharacterEncoding("UTF-8");
response.setStatus(200) ;
response.getWriter().print("Hello,知了");
}
}
3、轉發和重定向
- 轉發
伺服器端進行的頁面跳轉的控制 ;
request.getRequestDispatcher("/轉發位址").forward(request, response);
- 重定向
服務端響應跳轉資訊,浏覽器端進行的頁面跳轉 ;
response.sendRedirect("重定向位址");
- 轉發和重定向對比
差別 | ||
---|---|---|
位址欄 | 不變 | 變化 |
跳轉 | 服務端跳轉 | 浏覽器端跳轉 |
請求次數 | 一次 | 兩次 |
域中資料 | 不會丢失 | 丢失 |
六、源代碼位址
GitHub·位址
https://github.com/cicadasmile/java-base-parent
GitEE·位址
https://gitee.com/cicadasmile/java-base-parent