Servlet知识点整理
一、Servlet介绍
1、概念
Servlet(Server Applet)被定义为Java Servlet的一种缩略形式,并且也可被称为小型服务程序或服务接口。它是由Java语言编写的服务器端应用程序,并具备完全脱离平台及协议环境的能力。其主要作用体现在通过交互式的方式访问和生成数据内容,并最终能够动态地生成Web页面内容。
2、实现过程
客户端发送请求至服务器端;
服务器将请求信息发送至 Servlet;
Servlet被用来生产响应内容并传递给服务器;响应内容是动态地生产出来的,并且通常是基于客户端的请求进行定制化的生成。
服务器将响应返回给客户端。
3、生命周期
客户端请求该 Servlet;
加载 Servlet 类到内存;
实例化并调用init()方法初始化该 Servlet;
服务功能(基于请求的方法被调用来执行不同的网络操作如GET和POST等;此外还提供HEAD、PUT、跟踪、删除以及销毁相关功能)
注册与实例化 Servlet的过程通常是动态触发的行为。然而,在服务器配置中包含一项管理选项以确保在服务器启动时自动加载并初始化指定Servlet。
图示:

4、Servlet接口定义的方法
//被创建:执行init方法,只执行一次
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
//提供服务:执行service方法,执行多次
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
public String getServletInfo() {
return null;
}
//被销毁:执行destroy方法,只执行一次
public void destroy() {
}
二、Request对象(获取请求消息)
1、获取相应消息数据

2、获取请求参数
String getParameter(String name):根据参数名称获取参数值
String[] getParameterValues(String name):该方法基于输入参数名称返回相应的字符串数组
Enumeration
Map<String,String[]> getParameterMap():获取所有参数的map集合
3、请求转发:
从请求对象中获取到一个转发器实例:RequestDispatcher getRequestDispatcher(String path)
基于RequestDispatcher对象的转发功能负责处理ServletRequest请求并返回对应的ServletResponse响应。
4、共享数据
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
5、post乱码解决
在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
三、Response对象(设置响应消息)
1、设置响应消息

2、重定向
方法 :response.sendRedirect("路径");
特点 :1. 地址栏发生变更
2. 重定向允许通过访问其他站点及其资源
3. 每次重定向都代表一次独立的网络请求,并禁止使用request对象来共享数据
重定向与转发的区别 :
forward:一般用于用户登陆的时候,根据角色转发到相应的模块。
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等。
3、虚拟目录动态获取
request.getContextPath()
4、设置编码
response.setContentType("text/html;charset=utf-8");
综合案例演示:
//1、获取请求参数,文件名称
String filename = request.getParameter("filename");
//2、使用字节输入流加载文件进内存
//找到文件服务器的真实路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//使用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//3、设置response的响应头
//设置响应头类型
String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type",mimeType);
//解决文件名中文乱码的问题
//获取user-agent请求头
String agent = request.getHeader("user-agent");
//使用工具类编码文件名
filename = DownLoadUtils.getFileName(agent, filename);
//设置响应头打开方式
response.setHeader("content-disposition","attachment;filename="+filename);
//4、将输入流的数据写入到输出流中
ServletOutputStream sos = response.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len= fis.read(bytes)) != -1){
sos.write(bytes,0,len);
}
