Core Servlets and JSP Volume I 读后感 Servlet(三)
一 Servlet工作
(1) 接收客户端显示数据,
(2) 接收HTTP隐式数据(报头、cookie),
(3) 负责与后台交互(EJB,WebService等),
(4) 发送显示数据到客户端,
(5) 发送隐式数据到客户端(如cookie信息)。
二 传统CGI技术与Servlet
效率:
并发(多进程"CGI",多线程"servlet"),
载入内存(运行一次CGI载入一次,只保留一份类)
缓存机制(不缓存"CGI",缓存"servlet")
servlet基于java平台,使这项技术
强大、安全、可移植、廉价、主流、便利
三 Servlet与JSP
Serlet:编译jsp代码、Request过来的代码,然后Response给客户端Html代码。
JSP:jsp其实就是Servlet的另外一种表达方式,只不过jsp更易于网页设计(表现),而Servlet更易于流程处理。
四 servlet的生命周期
servlet创建:一般在第一次访问URL的时创建,也可以配置web.xml在服务器加载的时候创建。
(1) init方法 "在首次servlet的时候,加载此方法,只执行一次"
常规初始化(初始化参数)。
(2) service方法 "每次访问创建一个线程调用此方法"
service:提供GET,POST,PUT,HEAD,OPTION,TRACE请求的自动支持。
(3) doXxx方法 "如doPost/doGet方法"
常用请求:
GET:正常的URL请求,没有指定METHOD的HTML表单
POST:METHOD=POST的HTML表单。
PUT,DELET,OPTIONS,TRACE,HEAD
(4) destroy
五 servlet SingleThreadModel模式
servlet可以通过SingleThreadModel的方式去独立访问一个servlet。
SingleThreadModel针对高并发servlet有非常大劣势:
(1) servlet访问排队时间长,导致IO堵塞。
(2) servlet的规范允许容器启动多个servlet实例以线程池的方式去访问,将导致同样的同步问题,或数据的不共享等问题。
解决方案:对于高并发的servlet,最好还是使用synchronized的方式去处理代码同步块儿。
六 Servlet 核心 API
HttpServletRequest
1.request封装:
Request-Line封装
Request-Line =Method SP Request-URL SP HTTP-Version CRLF
Method:最主要用到的是GET 和 POST方法
public abstract String getMethod();
Request-URL:URL地址
public abstract String getRequestURI();
public abstract StringBuffer getRequestURL();
public abstract String getQueryString();//GET请求的查询字符串
SP:空格
HTTP-Version:HTTP版本
CRLF:空行
报头封装
public abstract String getHeader(String s);
public abstract Enumeration getHeaders(String s);
public abstract Enumeration getHeaderNames();
//报头便利封装
public abstract String getAuthType();
public abstract long getDateHeader(String s);
public abstract int getIntHeader(String s);
public abstract String getCharacterEncoding();
public abstract String getContentType();
public abstract void setCharacterEncoding(String s);
public abstract void setContentLength(int i);
public abstract void setContentType(String s);
public abstract Cookie[] getCookies();
public abstract HttpSession getSession();
Servlet信息
public abstract String getPathInfo();
public abstract String getPathTranslated();
public abstract String getContextPath();
public abstract String getServletPath();
public abstract ServletOutputStream getOutputStream() throws IOException;
public abstract PrintWriter getWriter() throws IOException;
HttpServletResponse
2.response封装
//状态行封装:
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
HTTP-Version:HTTP版本
Status-Code:设置状态代码 public abstract void setStatus(int i);
eason-Phrase:原因短语
//报头封装
public abstract void addCookie(Cookie cookie);
public abstract boolean containsHeader(String s);
public abstract void setDateHeader(String s, long l);
public abstract void addDateHeader(String s, long l);
public abstract void setHeader(String s, String s1);
public abstract void addHeader(String s, String s1);
public abstract void setIntHeader(String s, int i);
public abstract void addIntHeader(String s, int i);
//设置服务器错误| 重发状态代码
public abstract void sendError(int i, String s)
throws IOException;
public abstract void sendRedirect(String s)
throws IOException;
//地址编码
public abstract String encodeURL(String s);
public abstract String encodeRedirectURL(String s);
七 绝对URL
对于HTML/JSP标签中的url,必需重整个web server应用位置开始
对于serverlt forward的url,必需相对于当前应用的位置开始
posted on 2009-11-05 21:32 john.huang 阅读(542) 评论(0) 编辑 收藏 举报