首页 > 代码库 > servlet回顾
servlet回顾
-
servlet
- genericServlet抽象类
- HttpServlet抽象类
- ServletRequest接口
- HttpServletRequest接口
- ServletResponse接口
- HttpServletResponse接口
- ServletConfig接口
- ServletContext接口
- javaweb应用的生命周期
- Servlet的生命周期
- servletcontext共享数据
- servletcontextlistener 监听器
- 防止页面被缓存
- 文件下载
- 上传文件
- 生成动态图像
- 读写Cookie
- 请求转发
- 包含
- 请求范围
- 重定向
- 避免并发问题
servlet
首先明确,下面各种方法和接口由容器提供商实现。我们自己只需要重写部分方法。
?
?
5个方法,三个方法由容器调用。
- init(ServletConfig config)初始化对象。
- service(ServletRequest req,ServletResponsr res)响应客户请求
- destroy() 结束Servlet对象
代码可调用下两个方法。
- getServletConfig() 返回一个包含Servlet初始化参数信息的对象
- getServletInfo 返回包含servlet创建者 版权的字符串
genericServlet抽象类
为Servlet接口提供了通用实现,与网络层协议无关,还实现了servletconfig接口和 serializable接口
service()是其中唯一的抽象方法。
该类使用了装饰设计模式
HttpServlet抽象类
针对不同的请求方式,实现了相应的方法。但是默认的实现,都会返回一个错误。
为什么是抽象类?
先要明确,有抽象方法一定是抽象类,但是抽象类不一定有抽象方法。二,只是强调该类在开发者没有自定义实现的情况下无法被初始化而已,这叫适配器 。可参考 里氏替换原则
ServletRequest接口
获得客户机信息
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方法
HttpServletRequest接口
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中?后面的内容
ServletResponse接口
setCharacterEncoding()设置响应正文的字符编码
setContenLength() 设置响应正文长度
setContentType() 设置响应正文MIME类型
setBufferSize() 设置响应正文的缓冲区的大小
reset()清空缓冲区内正文数据,并且清空响应状态代码和响应头
resetBuffer() 仅仅清空缓冲区正文数据,不清空状态代码和响应头
flushBuffer() 强制把缓冲区的响应正文发送到客户端
isCommitted() 判断数据是否已经发送到了客户端
getOutputStream() 返回一个对象,用来输出二进制的正文数据
getWriter() 返回一个对象,用它来输出字符串形式的正文数据
注:
ServletResponse默认MIME类型是纯文本
HttpServletResponse默认MIME类型是html编码方式:以下三种方式是等价的:
?
HttpServletResponse接口
addHeader(String name,String value)向HTTP响应头加入一项内容
sendError(int) 向客户端发一个代表错误的Http响应状态码
sendError(int src,String msg) 向客户端发一个错误代码和一个具体错误消息
addCookie(Cookie cookie) 向HTTP响应中加入一个cookie
ServletConfig接口
作为servlet接口init(ServletConfig config)的参数,与servlet产生关联。servletconfig对象与servletcontext对象关联。
- getInitParameter(String name) 根据给定的初始化参数名,返回匹配的初始化参数值(静态方法,可以直接调用, String color = getInitParmeter("color"))
- getInitParameterNames()返回一个枚举对象,包含所有的参数名
- getServletContext() (静态方法)返回当前servletContext对象
在web.xml中,
<init-param>
<param-name>color</param-name>
<param-value>red</param-value>
</init-param>
ServletContext接口
本接口是Servlet与Servlet容器之间直接通信的接口。容器在启动web应用的时候,会创建一个ServletContext对象,每个web应用都有唯一的对象。
在web应用范围内存取共享数据的方法。
- setAttribute(String name, java.lang.Object object)把一个对象和参数名绑定,存入到ServletContext中。
- getAttribute(String name) 返回相应的属性值
etc
- 访问当前Web应用的资源
- getContentPath() 返回当前web应用的URL入口
- getInitParameter(String name) 根据给定参数名,返回初始化参数值(web.xml)中配置的
- 访问容器中的其他web应用
- 访问容器的相关信息
- 访问服务器端端文件系统资源
- 输出日志
- log(String msg) 向Servlet的日志文件中写日志
- log(String message,java.lang.Throwable throwable)向日志文件中写错误日志以及异常的堆栈信息
<context-param>
<param-name>email</param-name>
<param-value>hello@163.com</param-value>
</context-param>
javaweb应用的生命周期
- 启动 把web.xml加载到内存 创建servletcontext对象 对所有的Filter初始化 对需要在启动时就被初始化的Servlet进行初始化(创建servletconfig对象,把web.xml中的初始化值包含进来,调用init(servletconfig对象)
- 运行 如果servlet已经初始化了,就调用service() 如果还没被初始化,就先初始化,再调用service()方法
- 终止 销毁所有servlet 销毁Filter 销毁相关对象 如ServletContext
Servlet的生命周期
初始化阶段
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得到该对象
servletcontext共享数据
统计访问次数,就用serveletcontext设置一个属性(计数器)
servletcontextlistener 监听器
上述的统计方式会导致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中,在
servlet回顾