[Servlet]
● Servlet(Java服务器小程序),是用Java编写的服务器端程序。可以看成是用Java编写的CGI,但是功能和性能比CGI强多了。
● 为了简化开发,我们编写的Servlet一般直接继承自HttpServlet,HttpServlet类封装了编写Http协议Servlet的大部分功能。
HttpServlet类继承自javax.servlet.GenericServlet,间接实现了Servlet, ServletConfig 接口。
A subclass of HttpServlet must override at least one method, usually one of these:
* doGet, if the servlet supports HTTP GET requests
* doPost, for HTTP POST requests
* doPut, for HTTP PUT requests
* doDelete, for HTTP DELETE requests
* init and destroy, to manage resources that are held for the life of the servlet
* getServletInfo, which the servlet uses to provide information about itself
● HTTP 1.1 协议支持7种请求方法:GET、POSt、HEAD、OPTIONS、PUT、DELETE、TRACE。在Internet应用中,最常用的请求方法是GET和POST。
● GET方法是通过URL将数据传送给服务器端,可以直接在url中注明参数,也可以通过表单的方式<form action="xxx" method="get">。存在url的明文传送和数据大小限制的问题。这是默认调用的方式。
● POST方法则可以隐藏发送给服务器端的数据,而不是url的明文传送。所以安全性好些,适合发送大量数据。它是通过表单的方式<form action="xxx" method="post">来发送参数。
● GET方法、POST方法都是通过request.getParameter("xxx")来获取对应参数数据。
● Servlet规范规定,所有的Servlet都必须在Web配置文件web.xml中声明。部署Servlet时,必须在相应web项目的web.xml文件中指定这个servlet的名字和类,同时做servlet的映射。
● Servlet规范规定,在WEB-INF目录下的内容是私有的,对Web客户端来说不可访问,当然Web应用本身则可以完全访问。
● Servlet规范规定,首先加载WEB-INF/classes目录中的资源,然后才是WEB-INF/lib目录。
● 有关Servlet的官方DTD描述:(DTD可以看做是标记语言的语言文件,它是一套定义XML标记如何使用的规则。)
(摘自 http://java.sun.com/dtd/web-app_2_3.dtd )
<!-- The servlet element contains the declarative data of a servlet. If a jsp-file is specified and the load-on-startup element is present, then the JSP should be precompiled and loaded. Used in: web-app --> <!ELEMENT servlet (icon?, servlet-name, display-name?, description?, <!-- The servlet-class element contains the fully qualified class name of the servlet. Used in: servlet --> <!ELEMENT servlet-class (#PCDATA)> <!-- The servlet-mapping element defines a mapping between a servlet and a url pattern Used in: web-app --> <!ELEMENT servlet-mapping (servlet-name, url-pattern)> <!-- The servlet-name element contains the canonical name of the servlet. Each servlet name is unique within the web application. Used in: filter-mapping, servlet, servlet-mapping --> <!ELEMENT servlet-name (#PCDATA)> |
● 所有的JSP都必须编译成Servlet,并且在Servlet容器中执行。但Servlet必须手动编译成类,而修改JSP时只要修改它的源程序,容器会对发生改变的JSp进行自动编译。
JSP会被web服务器编译成Servlet(在tomcat中生成的.java文件和.class文件是存放在 %CATALINA_HOME%\work\Catalina目录下)。如果JSP页面中没有使用Page指令特别指定method属性,则JSP中所有的Scriptlet会被合并包含在该Servlet的Service方法(即_jspService()方法)中。所以在Scriptlet中可以包含任何合法的java注释,可以调用其他类(只需在page指令中import);任一小段Scriptlet中定义的变量或方法都可以再另一小段Scriptlet中调用。
● JSP可以把显示和内容分离,实现的方法就是借助JavaBean。重新编译JavaBean时,tmd还得重启Tomcat服务器?
● 一般的JSP项目,可以采用JSP+Servlet+JavaBean的模式,此模式遵循视图控制器(MVC)模式,在此模型中,javaBean作为模型的角色,封装数据;Servlet作为控制器,处理业务逻辑;最后由JSP进行显示。
● Java Servlet API中有几个比较重要的类,它们决定了Web应用的请求/响应方式及各种共享数据的存放地点“
* HttpServletRequest,Servlet组件从HttpServletRequest对象中读取用户的请求数据;此外HttpServletRequest可以存放request范围内的共享数据。
* HttpServletResponse,用于生成Http响应结果。
* HttpSession,存放session范围的共享数据 。
* ServletContext,存放application范围的共享数据。
● Servlet类使用javax.servlet.RequestDispatcher.forward()方法来转发它所收到的Http请求。
● 清楚 session,attribute,cookies,querystring等的区别。
A: 客户端一关闭,session就失效了。
● 清楚 request,response的作用,构成元素。
A: request有header,response也有header
● 以下是《More Servlet and JSP》的读书笔记。
1. HTML文档的 DOCTYPE行的好处是告诉HTML验证程序使用的是何种版本的HTML,以便验证程序知道依据何种规范检查HTML文档。
2. Servlet的service方法检查HTTP请求类型(GET,POST,PUT,DELETE等),并适当地调用doGet,doPost等方法。其他方法(如put,delete等)是有客户机产生的。
3. 如果希望你的servlet阻止多线程地访问,可以使servlet继承自SingleThreadModel接口。
在jsp中,则可以通过<@ page isThreadSafe>属性来指定。
4. HTTP的请求头是直接由浏览器设置并跟在开始的GET或POST请求行之后立即发送的。
5. HTTPSession对象位于服务器上,它们只是通过某种后台机制,如cookie或URL重写与客户机自动关联。
6. 什么时候需要synchronized代码块。线程跟进程的区别?
7. ServletContext是全部Servlet共享的上下文,
ServletConfig是全部Servlet共享的配置对象(即web.xml信息)
而PageContext仅仅是单个JSP文件的上下文;Servlet是没有PageContext对象的。
8. servlet可以发送请求到同一服务器的任意位置。
9. 网页中的image,css等如果使用了相对路径,则最好是相对于服务器的根,而不是相对于目的页的实际位置。
否则程序如果使用了servlet.forward(),则可能出现路径错误的bug.
10. Web应用的简单验证包括用户再HTML表单或对话框中输入用户名和口令,更强的验证包括使用由客户机发送到服务器的X509证书。
11. 为防范攻击者在网络数据传输中窃取数据;此过程涉及使用SSL(Secure Sockets Layer安全套接层),对浏览器及服务器之间的通信进行加密。
12. 利用声明性的安全性(例如在web.xml中指定),就不用单个servlet或jsp去处理安全方面的代码。而可以在web.xml中声明某些
URL需要保护,某些URL只能利用SSL来访问。
13. ServletRequest的getScheme()方法对常规请求返回"http",对SSL请求返回"https"。同时,isSecure()方法对常规请求返回false,对
SSL请求返回true。