`
文鸯
  • 浏览: 305672 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

《Head First Servlets & JSP(中文版)》书摘

阅读更多

一直觉得自己Servlet的基础还有待加强,所以利用5.1七天假搞了本《Head First Servlets & JSP(中文版)》重新补一下基础,看的过程中摘录了一些知识点,罗列如下(括号中为知识点所在的页号):

第4章 作为servlet:请求和响应

★ 每个请求都在一个单独的线程中运行!
   容器运行多个线程来处理对一个servlet的多个请求。
   对应每个客户请求,容器会生成一对新的HttpServletRequest和HttpServletResponse对象。
   任何特定servlet类都只有一个实例。(101)

★ 不要在servlet的构造方法中放任何东西!
   初始化工作应放在init()方法中。
   servlet的构造方法只是让它成为一个普通的对象,容器调用它的init()方法后,它才成为了一个servlet。
   init()方法使servlet可以访问ServletConfig和ServletContext对象。(103)

★ 每个servlet有一个ServletConfig对象,每个Web应用有一个ServletContext。(104)

★ HttpServletRequest和HttpServletResponse接口由容器来实现。
   具体怎么实现的不用我们操心。(107)

★ HTTP请求方法确定究竟是运行doGet()还是doPost()。
   客户的请求总是包括一个特定的HTTP方法。如果这个HTTP方法是GET,service()方法就会调用doGet()。如果这个HTTP方法是POST,service()方法就会调用doPost()。
   当然,还有些其它的HTTP方法,包括HEAD、TRACE、OPTIONS、PUT、DELETE和CONNECT,但对于servlet开发人员,这些方法很少用到。(108)

★ GET和POST的区别除了有参数数据大小、安全性和书签问题外,还有请求是否是幂等的问题。
   GET请求本质上讲(根据HTTP规范)是幂等的。它们应当能多次而不会对服务器产生任何副作用。GET请求不应该修改服务器上的任何东西,但是你也可以写一个非幂等的doGet()方法(不过这是很糟糕的做法)。
   POST本质上讲不是幂等的,所以要由你来适当地设计和编写代码,如果客户错误地把一个请求发送了两次,你也能正确地加以处理。(111)

★ 表单的默认方法是GET。(118)

★ HttpServletRequest的getServerPort()、getLocalPort()和getRemotePort()很容易搞混!
   如果是一个servlet请求,就意味着客户是远程的,所以getRemotePort()是指“得到客户的端口”。
   getServerPort()说“请求原来发送到哪个端口?”,getLocalPort()则是说“请求最后发送到哪个端口?”。尽管请求要发送到一个端口(服务器所监听的端口),但是服务器会为每个线程找一个不同的本地端口。(123)

★ 对于输出,你有两个选择:字符或者字节。
   ServletResponse接口只提供了两个可以选择的流:ServletOutputStream用于输出字节,PrintWriter用于输出字符数据。(132)

★ setHeader()和addHeader()的区别
   如果响应中还没有某个首部(方法的第一个参数),setHeader()和addHeader()就会增加一个首部和相应的值。
   二者的区别是,如果有这样一个首部,setHeader()会覆盖现有的值,addHeader()会增加另外一个值(addHeader()的API DOC中提到:This method allows response headers to have multiple values)。(133)

 

第5章 作为Web应用:属性和监听者

★ 覆盖init()方法
   容器调用的是init(ServletConfig)方法,而init(ServletConfig)方法会调用无参数的init()方法,所以如果需要覆盖init()方法,只需覆盖无参数的版本就行了。(151)

★ 要把初始化参数认为是部署时常量!
   可以在运行时得到这些初始化参数,但是不能设置。根本没有setInitParameter()。(160)

★ 上下文属性和会话属性都不是线程安全的。
   可以对上下文或会话同步来保护它们的属性。
   servlet的实例变量也不是线程安全的,所以一般servlet中不要放实例变量。
   只有请求属性和servlet服务方法中的局部变量是线程安全的。(192-202)

★ 如果已经提交了响应,就不能再转发请求或重定向了!(205)

 

第6章 会话管理

★ 会话有3种死法:超时;调用会话对象的invalidate()方法;应用结束。
   在web.xml中指定超时是以分为单位,而在程序中调用会话对象的setMaxInactiveInterval()方法设置超时是以秒为单位!(243)

★ cookie.setMaxAge(-1)表示浏览器退出时cookie就会消失。
   而session.setMaxInactiveInterval(负数)表示session永远不会到期。(249)

★ HttpSessionBindingListener不用在web.xml中注册。
   如果一个类实现了HttpSessionBindingListener,当这个类的一个实例增加到一个会话或从会话删除时,容器就会调用事件处理回调方法(valueBound()和valueUnbound())。(254)

★ 在分布式Web应用中,除了HttpSession对象外,所有其它对象都会在另一个VM上复制!
   会话对象不会复制,而只是移动。
   当会话对象从一个VM移动到另一个VM时,如果某个会话属性不是Serializable(或属性对象的某个实例变量不是Serializable),可以让属性对象类实现HttpSessionActivationListener,并使用激活/钝化回调方法来解决会话属性的串行化问题。(255-258)

 

第7章 使用JSP

★ JSP元素:
   scriptlet: <% %>  
   表达式:    <%= %>
   声明:      <%! %>
   指令:      <%@ %>
   注释:      <%-- --%>
   动作:      标准动作如<jsp:include>,其它动作如<c:set>
   EL表达式:  ${}     (286,292,302,321)

★ JSP指令有3种:page、include和taglib。(285)

★ JSP隐式对象:
           out --- JspWriter
   pageContext --- PageContext (封装了其它隐式对象,可以得到其它隐式对象的引用)
       request --- HttpServletRequest
      response --- HttpServletResponse
       session --- HttpSession
   application --- ServletContext
        config --- ServletConfig
     exception --- JspException (只有指定为“错误页面”的页面才能使用)
          page --- Object     (296)

★ 容器将JSP转换成一个servlet,这个servlet实现了HttpJspPage接口。
   这个servlet中有3个关键方法:
   jspInit() -- 这个方法在servlet的init()方法中调用。可以覆盖jspInit()。
   jspDestroy() -- 这个方法在servlet的destroy()方法中调用。可以覆盖jspDestroy()。
   _jspService() -- 这个方法在servlet的service()方法中调用。不能覆盖_jspService()。(303)

★ 在JSP页面中禁用scriptlet或EL表达式:
   禁用scriptlet:在web.xml中设置<scripting-invalid>。
   禁用EL表达式:在web.xml中设置<el-ignored>或在JSP页面中设置page指令的isELIgnored属性。(319-320)

 

第8章 无脚本的JSP

★ EL隐式对象:
   pageScope
   requestScope
   sessionScope
   applicationScope   (这4个是作用域属性的Map)
   param
   paramValues        (这2个是请求参数的Map)
   header
   headerValues       (这2个是请求首部的Map)
   cookie             (cookie的Map)
   initParam          (上下文初始化参数的Map)
   pageContext        (pageContext对象的实际引用,不是Map)
   除了pageContext外,其它都是Map。(381)

★ EL运算符和保留字:
   算术运算符:
     加法:   +
     减法:   -
     乘法:   *
     除法:   /和div
     取模:   %和mod
   逻辑运算符:
     与:   &&和and
     或:   ||和or
     非:    !和not
   关系运算符:
     等于:     ==和eq
     不等于:   !=和ne
     小于:      <和lt
     大于:      >和gt
     小于等于: <=和le
     大于等于: >=和ge
   其它保留字:
     true
     false
     null
     instanceof
     empty     (392)

★ EL能妥善地处理null值
   如果找不到EL表达式中指定名的属性/性质/键,也会显示页面,而不会抛出异常。
   在算术表达式中,EL把null值看作是0。
   在逻辑表达式中,EL把null值看作是false。(395)

★ “[]”操作符比“.”操作符更强大
   “.”的左边只能是Map或bean,“[]”左边除了可以是Map或bean外,还可以是List或数组;
   “[]”里可以包含命名变量的表达式,而且可以做任意层次的嵌套,即如果中括号里的内容没有用引号引起来,容器就会进行计算;
   “[]”里的Map键可以是不遵循正常的Java命名规则的String,如包含点号的String。(370-376,396)

★ include指令在转换时发生,<jsp:include>标准动作在运行时发生。(402)

 

第9章 使用JSTL

★ <c:set>有两种不同的设置:var和target。
   var“版本”用于设置作用域属性,target“版本”用于设置作用域属性的字段或Map值。(445)

★ 容器会在4个位置查找TLD:
   直接在WEB-INF目录中查找
   直接在WEB-INF的一个子目录中查找
   在WEB-INF/lib下的JAR文件中的META-INF目录中查找
   在WEB-INF/lib下的JAR文件中的META-INF目录的子目录中查找     (476)

 

第10章 定制标记开发

★ 容器会在4个位置查找.tag标记文件:
   直接在WEB-INF/tags目录中查找
   在WEB-INF/tags的子目录中查找
   在WEB-INF/lib下的JAR文件的META-INF/tags目录中查找
   在WEB-INF/lib下的JAR文件的META-INF/tags的子目录中查找
   如果标记文件部署在一个JAR中,这个标记文件必须有一个TLD,相应的TLD项只描述具体标记文件的位置。(499)

 

第11章 Web应用部署

★ 要成功地部署一个Web应用,必须遵循以下目录结构:
   WEB-INF一定要直接放在应用上下文之下;
   classes目录必须直接放在WEB-INF目录中,classes目录中必须是该类的包结构;
   lib目录要直接置于WEB-INF目录下,JAR文件必须放在lib中;
   META-INF目录必须是JAR中的顶级目录;
   不在JAR中的TLD必须放在WEB-INF下的某个位置,JAR中的TLD文件要放在META-INF目录下的某个位置(可以在任何子目录中,目录名不必是TLDs);
   不在JAR中的标记文件(扩展名为.tag或.tagx的文件)必须放在WEB-INF/tags下的某个地方,JAR中的标记文件必须放在META-INF/tags下的某个地方;
   web.xml必须直接放在WEB-INF目录下。(576)

★ 在META-INF/MANIFEST.MF文件中指定库依赖性
   将Web应用打包成WAR文件后,会生成这个文件。你的容器的类路径(不是应用的类路径)上可能有一些可选的包,你也许会依赖于其中某些包,或者你可能会依赖某个特定版本的库!有了MANIFEST.MF文件,就能告诉容器你必须访问哪些可选的库。如果容器无法提供这些库,就不能成功地部署应用。(583)

★ 在web.xml中配置servlet时,根据每个servlet加载所需的时间和使用的频度来决定是否使用<load-on-startup>元素。(596)

 

第12章 Web应用安全

★ servlet安全的4大要素:认证、授权、机密性和数据完整性。(621,630)

★ 4种认证类型:基本(BASIC)、摘要(DIGEST)、客户证书(CLIENT-CERT)、表单(FORM)。(645)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics