Head First Servlets and JSP笔记(一)
第一章 前言
GET和POST
GET | POST | |
---|---|---|
参数数据 | 只能放在请求行中 | 放在体(body)中 |
建立书签 | 可以(表单参数可以进入url,书签将包含第二次重建页面所需信息) | 不可以(由于书签只包含url,所有表单参数将丢失) |
幂等 | 是(不会对服务器造成改变) | 不是(可能对服务器造成 |
默认 | 是 | 不是 |
TCP端口
端口是16位数据,标识服务器硬件上特定的软件程序;
从0~1023的端口号已经被保留,定制的服务器程序不要使用这些端口;
URL(统一资源定位符)
以及可选查询串:如果这是一个GET请求额外的参数会追加到URL最后以"?“开头,各个参数(名/值对)以”&"分隔;
JSP
JSP页面就像是一个HTML页面,可以把java和java有关的东西插入到该页面中;
第二章 高层概述:Web应用体系
Tomcat
Servlet没有main()方法,它们受控于另一个java应用——容器;
容器提供:
通信支持——让servlet与服务器对话,无须自己创建ServerSocket,监听端口,创建流等;
生命周期管理——控制servlet加载类,初始化,垃圾回收等资源管理;
多线程——自动为servlet请求创建一个新的Java线程;
声明方式实现安全——使用XML配置安全性而不必硬编码到servlet类中;
JSP支持——将JSP代码翻译成Java;
servlet可以有多个名字——通过XML部署;
部署描述文件DD
将Servlet部署到Web容器时,会创建一个简单的XML文档,称为部署描述文件(DD)

MVC把业务逻辑从Servlet中抽出来,放在一个可重用的java类(模型)中,模型是业务数据和处理该类数据的方法的组合;
J2EE
Tomcat只是一个Web容器,而不是完整的J2EE应用服务器(因为没有EJB容器);
第三章 MVC实战
BUGreport(1):
在编写第二版servlet时,通过javac编译BeerSelect.java出错,未找到对应目录下的文件;
Solution:
直接编译,手动部署目录;
BUGreport(2)
在重启tomcat之后,访问http://localhost:8080/Beer-v1/form.html网页下submit之后资源响应报错;
Solution
反复排查之后发现使用javac调用servlet-api.jar的路径应该是tomcat/lib路径下的包,而不是JDK/lib路径下的包,更改之后,响应结果正确;
(调用模型实例过程略)
第四章 作为Servlet:请求和响应
Servlet受容器的控制
与http有关的都在javax.servlet.http包中,其余的通用类接口都在javax.servlet包中;
容器运行多个线程来处理对一个servlet的多个请求;
init()在第一个service调用之前完成;
ServletConfig:用于向servlet传递部署时信息;用于访问ServletContext;参数在部署描述文件中描述;
ServletContext:用于访问web应用参数,相当于公告栏,应用的其他部分可以访问这些消息;
常见ServletRequest和HttpServletRequest的API:
// 客户的平台和浏览器信息
String client=request.GetHeader("User-Agent");
//与请求相关的cookie
Cookie cookies[]=request.getCookies();
//与客户相关的会话
HttpSession session=request.getSession();
//请求的HTTP方法
String themethod=request.getMethod();
//请求的输入流——只包含请求体而不包含首部,有时请求体包含处理的文本和二进制内容
InputStream input=request.getInputStream();
大多数情况,使用响应只是为了向客户发回数据,会对响应调用两个方法:
setContentType() 和 getWriter() 此后只需要I/O将HTML写至流;
内容类型是HTTP响应中必须有的一个HTTP响应首部,常指MIME(Multipurpose Internet Mail Extensions)类型,如pdf, jpg等等;
ServletOutputStream 用于输出字节,PrintWriter 用于输出字符数据;
//样例
PrintWriter writer=response.getWriter();
writer.println("some text and html");
ServletOutputStream out=response.getOutputStream();
out.wirte(aByteArray);
PrintWriter有ServletOutputStream的引用,会把调用委托给ServletOutputStream;
setHeader()会覆盖现有的值;addHeader()会增加另一个值;
Servlet重定向让浏览器完成工作;
if(worksforme)
{
//handle the request
}
else{
response.sendRedirect("new http location");
}
sendRedirect() 使用相对URLs的两种用法(取的是一个String,而不是一个url对象)——斜线开头与非斜线开头;
第五章 作为Web应用:属性和监听者
servlet初始化参数
在每个特定的servlet的<servlet>元素中,只对配置了<init-param>的相应servlet可用;
在DD文件中(web.xml)中:
<init-param>
<param-name>adminEmail