本身最近在看《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 }