- 一、Servlet简介&快速入门
- 二、Servlet执行流程&生命周期
- 1、Servlet执行流程
- 2、Servlet生命周期
- 3、urlPattern配置
- 4、Request继承体系
- 5、Request获取请求数据
- 请求行
- 请求头
- 请求体
- 通用方式获取请求参数
- 中文乱码解决
- Request请求转发
- 6、Response
- 响应数据格式
- Response完成重定向
- 路径问题
- Response响应字符数据
- Response响应字节数据
- 7、实现登录和注册
- Servlet是Java提供的一种动态web资源开发技术
- Servlet是JavaEE规范之一,其实就是一个接口,需要我们定义Servlet类来实现Servlet接口,并由web服务器来运行Servlet
- Servlet开发步骤
-
1、创建Web项目,导入Servlet依赖
-
2、创建Servlet类,实现Servlet接口
-
3、配置:在类上使用@WebServlet注解,配置该Servlet访问路径
-
4、访问:启动tomocat,浏览器输入对应的URL访问
-
javax.servlet javax.servlet-api 3.1.0 provided
public class Servlet2 implements Servlet {
public void service(){}
}
@@WebServlet("/Servlet2")
public class Servlet2 implements Servlet
二、Servlet执行流程&生命周期
1、Servlet执行流程
- 1、Servlet对象由谁创建?方法由谁调用?
- Servlet对象由web服务器创建
- Servelt方法由web服务器调用
- 2、web服务器怎么知道Servlet一定有Servlet方法?
- 因为我们自定义的Servlet类,一定要实现Servlet接口并复写Servlet方法 ,而Servlet接口中有Servlet方法
- Servlet运行在Servlet容器(Web服务器)中,生命周期由Servlet容器管理,分为四个阶段
- 加载实例化:服务器第一次请求Servlet时创建Servlet对象
- 初始化:第一次请求Servlet时调用初始化方法init()
- 请求处理: 每一次请求Servlet时,容器都会调用service()方法队请求处理
- 服务终止:当需要释放内存或服务器关闭时,容器调用destroy()方法完成资源释放。
- Servlet想要被访问,必须要设置其访问路径
- 一个Servlet可以配置多个访问路径
- urlPattern配置规则
- 精确匹配
- 目录匹配
- 扩展名匹配
- 任意匹配
- tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到Servlet方法中
- 使用request对象,查阅JavaEE文档
- String getMethod():获得客户端向服务器端传送数据的方法
- String getContextPath():获取虚拟目录,项目访问路径
- StringBuffer getRequestURL():获取URL(统一资源占位符)
- String getRequestURI():获取统一资源标识符
- String getQueryString():获取请求参数(GET方式)
- String getHeader(String name):根据请求头名称,获得值
- ServeltInputStream getInputStream():获取字节输入流
- BufferedReader getReader():获取字符输入流
- Map
getParameterMap():获取所有参数Map集合 - String[] getParameterValues(String naem):根据键的名称获取参数值[数组]
- String getParameter(String name):根据键的名称获取单个参数值
- post解决方案,设置字符输入流格式
request.setCharacterEncoding("UTF-8")
- get解决方案
new String(name.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
- 此问题已在tomcat8中解决,tomcat的Maven依赖导入,pom.xml添加如下配置
Request请求转发alfresco-public https://artifacts.alfresco.com/nexus/content/groups/public alfresco-public-snapshots https://artifacts.alfresco.com/nexus/content/groups/public-snapshots true daily beardedgeeks-releases http://beardedgeeks.googlecode.com/svn/repository/releases org.apache.tomcat.maven tomcat8-maven-plugin 3.0-r1655215
- 实现方式
request.getRequestDispatcher("资源B路径").forward(request,response);
- 请求转发间资源共享数据,使用Request对象
- void setAttribute(String name ,Object o):存储数据到Request域中
- request.getAttribute(“name”):根据key获取值
- request.removeAttribute(“name”):根据key删除值
- 请求转发特点
- 浏览器地址栏不发生变化
- 只能转发到当前服务器内部资源
- 一次请求,可以在转发的request服务器之间共享数据
- 响应行 HTTP/1.1 200 OK
void setStatus(int sc):设置响应状态码
- 响应头 Content-Type:text/html
void setStatus(String name,String value):设置响应头键值对
- 响应体
PrintWriter writer = response.getWriter():获取字符输入流 ServletOutputStream outputStream = response.getOutputStream():获取字节输入流Response完成重定向
- 重定向:一种资源跳转方式
- 重定向代码
response.setStatus(int i):设置响应状态码
setStatus("Location","资源B的路径"):设置响应头
//简化方法
response.sendRedirect("资源B的路径");
- 重定向特点:
- 浏览器地址栏路径发生变化
- 可以重定向到任意位置的资源
- 两次请求,不能在多个资源使用request共享数据
- 浏览器使用需要加虚拟目录
- 服务器端使用不需要加虚拟目录
- 动态获取虚拟目录
response.sendRedirect(request.getContextPath()+"/ResponseDemo2")Response响应字符数据
- 使用
- 1、通过Response对象获取字符输出流:PrintWriter writer =response.getWriter();
- 2、写数据:writer.write("aaa")
- 3、写html数据,需要设置响应数据格式:response.setHeader("content-type","text/html");
- 注意
- 1、获取的流不需要关闭,会随着response对象销毁而关闭
- 2、简便字符流格式设置代码:response.setContentType("text/html;charset=utf-8");
- 使用
- 1、通过Response对象获取字符输入流:ServletOutputStream outputStream = response.getOutputStream();
- 2、写数据 :outputStream.write(字节数据);
例子:
FileInputStream fileInputStream = new FileInputStream("C://Users/DELL/Desktop/捕获.png");
ServletOutputStream outputStream = response.getOutputStream();
byte[] buff =new byte[1024];
int len = 0;
while ((len=fileInputStream.read(buff))!=-1){
outputStream.write(buff,0,len);
}
fileInputStream.close();
- 流的对拷可以使用IOUtils工具类,引入依赖:
commons-io commons-io 2.6
示例
FileInputStream fileInputStream = new FileInputStream("C://Users/DELL/Desktop/捕获.png");
ServletOutputStream outputStream = response.getOutputStream();
byte[] buff =new byte[1024];
// int len = 0;
// while ((len=fileInputStream.read(buff))!=-1){
// outputStream.write(buff,0,len);
// }
IOUtils.copy(fileInputStream,outputStream);
fileInputStream.close();
7、实现登录和注册
代码实现



