标签:isp scheme 回顾 tom setbuf 入口 attach 连接 print
首先明确,下面各种方法和接口由容器提供商实现。我们自己只需要重写部分方法。
?
?
5个方法,三个方法由容器调用。
代码可调用下两个方法。
为Servlet接口提供了通用实现,与网络层协议无关,还实现了servletconfig接口和 serializable接口
service()是其中唯一的抽象方法。
该类使用了装饰设计模式
针对不同的请求方式,实现了相应的方法。但是默认的实现,都会返回一个错误。
为什么是抽象类?
先要明确,有抽象方法一定是抽象类,但是抽象类不一定有抽象方法。二,只是强调该类在开发者没有自定义实现的情况下无法被初始化而已,这叫适配器 。可参考 里氏替换原则
获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
获得客户机请求头
getHeader(string name)方法
getHeaders(String name)方法
getHeaderNames方法
获得客户机请求参数(客户端提交的数据)
getParameter(name)方法 一个数据时使用,多个数据时使用下一个GPV方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
getScheme()方法返回请求的计划,比如http,https或者ftp.
getServerName()方法返回被发送请求的服务器的主机名
getServerPort()方法返回被发送请求的端口号。
getContextPath()返回请求地址的根目录,以"/"开关,但不是以"/"结尾。
一个常用的获得服务器地址的连接字符串是:
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
getCookies() 取得cookie
getMethod() 取得请求方法,如get,post或put
getRequestURL() 取得请求URL(统一资源定位符)
getRequestURI() 取得请求URI(统一资源标识符)
getSession() 取得对应session
getQueryString() 取得请求中的查询字符串,即URL中?后面的内容
setCharacterEncoding()设置响应正文的字符编码
setContenLength() 设置响应正文长度
setContentType() 设置响应正文MIME类型
setBufferSize() 设置响应正文的缓冲区的大小
reset()清空缓冲区内正文数据,并且清空响应状态代码和响应头
resetBuffer() 仅仅清空缓冲区正文数据,不清空状态代码和响应头
flushBuffer() 强制把缓冲区的响应正文发送到客户端
isCommitted() 判断数据是否已经发送到了客户端
getOutputStream() 返回一个对象,用来输出二进制的正文数据
getWriter() 返回一个对象,用它来输出字符串形式的正文数据
注:
ServletResponse默认MIME类型是纯文本
HttpServletResponse默认MIME类型是html
编码方式:以下三种方式是等价的:
?
addHeader(String name,String value)向HTTP响应头加入一项内容
sendError(int) 向客户端发一个代表错误的Http响应状态码
sendError(int src,String msg) 向客户端发一个错误代码和一个具体错误消息
addCookie(Cookie cookie) 向HTTP响应中加入一个cookie
作为servlet接口init(ServletConfig config)的参数,与servlet产生关联。servletconfig对象与servletcontext对象关联。
在web.xml中,
<init-param>
<param-name>color</param-name>
<param-value>red</param-value>
</init-param>
本接口是Servlet与Servlet容器之间直接通信的接口。容器在启动web应用的时候,会创建一个ServletContext对象,每个web应用都有唯一的对象。
在web应用范围内存取共享数据的方法。
etc
<context-param>
<param-name>email</param-name>
<param-value>hello@163.com</param-value>
</context-param>
初始化阶段
1.容器加载Servlet类,将.class文件的数据读入到内存中
2.容器创建ServletConfig对象,容器使其与当前web应用的ServletContext对象关联
3.创建Servlet对象
4.调用servlet对象init(ServletConfig config)
下面两种情况,servlet会进入初始化
1.第一次被访问
2.web.xml配置了
运行阶段
销毁阶段
一个web应用一个context,一个servlet一个config,config可调用静态的getContext得到该对象
统计访问次数,就用serveletcontext设置一个属性(计数器)
上述的统计方式会导致web应用重启后数据消失,由监听器监控web生命周期,当周期结束时,把计数写入数据库。
设置响应头
?
第一种用于HTTP1.0的浏览器 第二种用于HTTP1.1 第三种都可以 表示过期时间
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
OutputStream out; //输出响应正文的输出流
InputStream in; //读取本地文件的输入流
//获得filename请求参数
String filename=request.getParameter("filename");
if(filename==null){
out=response.getOutputStream();
out.write("Please input filename.".getBytes());
out.close();
return;
}
//创建读取本地文件的输入流
in= getServletContext().getResourceAsStream("/store/"+filename);
int length=in.available();
//设置响应正文的MIME类型
response.setContentType("application/force-download");
response.setHeader("Content-Length",String.valueOf(length));
response.setHeader("Content-Disposition", "attachment;filename=\""+filename +"\" ");
/** 把本地文件中的数据发送给客户 */
out=response.getOutputStream();
int bytesRead = 0;
byte[] buffer = new byte[512];
while ((bytesRead = in.read(buffer)) != -1){
out.write(buffer, 0, bytesRead);
}
in.close();
out.close();
}
}
在html中,在
标签:isp scheme 回顾 tom setbuf 入口 attach 连接 print
原文地址:http://www.cnblogs.com/caidongzhou/p/servlet.html