本身最近在看《How Tomcat Works》這本書。Tomcat是Servlet容器,在這本書裏面大量使用到了Servlet,可是本身對Servlet不是好清晰,因此花了2天時間讀了這本書。html
1.1 總結
整體的來講,《Head First Servelt&JSP》這本書仍是很是不錯的,對Servlet&Jsp介紹的挺細的且有主次區分,讓人理解起來輕鬆。由於《Head First》系列都是經過半漫畫形式講解,因此書較厚,不過讀起來輕鬆。由於本身以前就瞭解Servelt&Jsp,因此讀起來挺快的。web
1.2 目錄spring
本身看了第一、二、三、四、五、六、七、十一、1三、14章。關於JSP方面本身看的較少,一來本身以爲如今流行先後端分離,使用JSP技術應該愈來愈少;二來本身就不喜歡類型View方面的東西,仍是喜歡代碼 ^ - ^後端
1.3 章節解釋
第一章(爲何使用Servlet&Jsp):主要解釋了Web客戶端、服務器作了什麼,以及它們之間的通訊:HTTP協議。
第2、三章(Web應用體系框架、MVC迷你教程):我的以爲這一章講的挺好的,也挺有用的。尤爲對於知道怎麼使用Servlet&Jsp或者使用Servlet框架(SpringMVC或Struts2),它將會讓你瞭解整個Java Web的大致框架。如:一個HTTP請求的大致流程是什麼樣的;Web.xml的做用;爲何Web-INFO下是安全目錄等等。
第四章(做爲Servlet):主要講了Servlet的生命週期、Servlet如何處理請求等等。
第五章(做爲Web應用):主要講了ServletConfig與ServletContext、8個監聽器的使用、以及4個對象(ServletContext、ServletRequest 、ServletResponse、HttpSession)的生命週期、線程安全、做用域等等。
第六章(會話狀態):主要講了會話如何工做、如何建立、如何添加屬性等等。
第七章(做爲JSP):主要講了JSP與Servlet的關係,一些JSP的基本用法等等。
第十一章(部署Web應用):主要講了把Java Web項目部署到Servlet容器中使用(如Tomcat),與第一二章食用更佳。
第十三章(過濾器的威力):主要講了Servlet中的Filter(過濾器)的使用。
第十四章(企業設計模式):講了講企業開發中的一些組件、以及Struts的MVC模式(有點老了,如今版本與它說的都不同了)。設計模式
2.1 什麼是容器?
容器是用來部署Servlet的容器,處理一切與Servelt相關的請求。若是Web服務器應用(如Apache)獲得一個指向Servelt的請求(而不是其它請求,如請求靜態資源),這時服務器會把該請求交給部署該Servlet的容器,由容器向Servlet提供請求與響應對象,調用Servlet的service()方法處理請求。注:Tomcat實際上Web服務器與Servlet容器的結合體,它既處理靜態資源請求,也處理Servelt請求。安全
2.2 容器能提供什麼?服務器
2.3 容器如何管理Servletsession
2.4 ServletContext與ServletConfigmybatis
1 <!-- 配置DispatcherServlet --> 2 <servlet> 3 <servlet-name>seckill-dispatcher</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <!-- 配置springMVC須要加載的配置文件 6 spring-dao.xml spring-service.xml spring-web.xml 7 mybatis -> spring -> springMVC--> 8 <init-param> 9 <param-name>contextConfigLocation</param-name> 10 <param-value>classpath:spring/spring-*.xml</param-value> 11 </init-param> 12 <load-on-startup>1</load-on-startup> 13 </servlet> 14 <servlet-mapping> 15 <servlet-name>seckill-dispatcher</servlet-name> 16 <!-- 默認匹配全部的請求 --> 17 <url-pattern>/</url-pattern> 18 </servlet-mapping>
2.5 Servlet多線程
注:Servlet須要在web.xml中註冊
2.6 請求與響應
1 @WebServlet(loadOnStartup=1, urlPatterns={"/test"}) 2 public class TestServlet extends HttpServlet { 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 HttpSession session = req.getSession(); 6 Map<String, String[]> map = req.getParameterMap(); 7 System.out.println("HTTP Query String:"); 8 for (Map.Entry<String, String[]> entry : map.entrySet()) { 9 System.out.print("key: " + Arrays.toString(entry.getValue())); 10 System.out.println(" value: " + Arrays.toString(entry.getValue())); 11 } 12 String content = "<html>\r\n" + 13 "<head>\r\n" + 14 "</head>\r\n" + 15 "<body>\r\n" + 16 "Hello World" + 17 "</body>\r\n" + 18 "</html>"; 19 PrintWriter writer = resp.getWriter(); 20 resp.setContentType("text/html"); 21 writer.write(content); 22 writer.flush(); 23 writer.close(); 24 } 25 } 26 ----------萌萌的分割線--------- 27 Request: 28 GET /test?id=10086&name=kanyuxia HTTP/1.1 29 Host: localhost:8080 30 Connection: keep-alive 31 Cache-Control: max-age=0 32 Upgrade-Insecure-Requests: 1 33 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36 34 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 35 Accept-Encoding: gzip, deflate, sdch, br 36 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 37 Cookie: JSESSIONID=jp3o7r8iufda1c2dykdfzlk5t 38 39 ----------萌萌的分割線-------- 40 Response: 41 HTTP/1.1 200 OK 42 Date: Wed, 19 Apr 2017 07:39:58 GMT 43 Content-Type: text/html;charset=ISO-8859-1 44 Transfer-Encoding: chunked 45 Server: Jetty(8.1.14.v20131031) 46 Request Headers 47 view parsed 48 49 <html> 50 <head> 51 </head> 52 <body> 53 Hello World</body> 54 </html> 55 ----------萌萌的分割線--------- 56 server console: 57 HTTP Query String: 58 key: [kanyuxia] value: [kanyuxia] 59 key: [10086] value: [10086]
2.7 重定向與轉發
具體使用能夠看:《Spring實戰》讀書筆記--SpringMVC之forward與redirect
2.7 監聽器
Servlet中有8下監聽器,以下:
監聽器接口 | 事件類型 |
---|---|
ServletContextListener | ServletContextListener |
ServletContextAttributeListener | ServletContextAttributeEvent |
HttpSessionListener | HttpSessionEvent |
HttpSessionBindingListener | HttpSessionBindingEvent |
HttpSessionAttributeListener | HttpSessionBindingEvent |
HttpSessionAcctivatioinListener | HttpSessionEvent |
ServletRequestListener | ServletRequestEvent |
ServletRequestAttributeListener | ServletRequestAttributeEvent |
具體使用看API吧。注:監聽器須要在web.xml中註冊
1 @WebListener(value="TestListener") 2 public class TestListener implements HttpSessionListener { 3 public void sessionCreated(HttpSessionEvent se) { 4 HttpSession session = se.getSession(); 5 System.out.println("服務器建立了HttpSession, Session Id 爲:" + session.getId()); 6 } 7 public void sessionDestroyed(HttpSessionEvent se) { 8 HttpSession session = se.getSession(); 9 System.out.println("服務器銷燬了HttpSession, Session Id 爲:" + session.getId()); 10 } 11 } 12 ----------萌萌的分割線--------- 13 response: 14 Content-Type:text/html;charset=ISO-8859-1 15 Date:Wed, 19 Apr 2017 07:44:56 GMT 16 Expires:Thu, 01 Jan 1970 00:00:00 GMT 17 Server:Jetty(8.1.14.v20131031) 18 Set-Cookie:JSESSIONID=km2ogboi1e8i184272wq13myz;Path=/ 19 Transfer-Encoding:chunked 20 21 ----------萌萌的分割線--------- 22 server console: 23 服務器建立了HttpSession, Session Id 爲:1ttrgbo9io8gs11o9vwic1zvwx
2.8 Session與Cookies
Http協議是無狀態協議,不能都保存相關信息。因此建立了Cookies、Session來保存相關信息。
2.9 JSP
3.0 過濾器 Filter
咱們能夠配置Filter攔截請求,Filter與Struts2中的Intercept原理同樣。注:須要在web.xml中註冊
1 @WebFilter(urlPatterns = "/*") 2 public class EncodeFilter implements Filter { 3 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException { 4 request.setCharacterEncoding("UTF-8"); 5 chain.doFilter(request, response); 6 } 7 public void destroy() { 8 } 9 public void init(FilterConfig arg0) throws ServletException { 10 } 11 }