1.简介
用于开发动态web项目的技术
运行在web服务器中的小型java程序
Servlet :Server+Let服务端的一个应用程序
Applet : Application + let 客户端的一个应用程序
注意:
修改了 web.xml /servlet 必须重启服务器
修改了 html/css/js 不用重启 刷新即可
2.三种创建方式
1.继承 HttpServlet 类
(1)创建一个类,继承于HttpServlet
(2)重写doGet()方法 和doPost()方法
2.继承GenericServlet类
(1)创建一个类,继承于GenericServlet类
(2)重写service()方法
3.实现Servlet接口
(1)创建一个类实现Servlet接口
(2)重写getServletConfig()
方法、getServletInfo()
方法、init(ServletConfig arg0)
方法、service(ServletRequest request, ServletResponse response)
方法、destroy()
方法
3.Servlet的生命周期
实例化(构造函数) –> 初始化(init) –> 服务(service) –> 销毁(destroy)
出生:实例化(构造函数) –> 初始化(init) 第一次访问Servlet 就 出生
活着:服务(service) 应用活着的 Servlet就活着
死亡:销毁(destroy) 应用卸载了 Servlet就销毁
4.web.xml配置
<servlet>
<!--名称 -->
<servlet-name>hello2</servlet-name>
<!--Servlet的全称类名 -->
<servlet-class>com.abc.web.servlet.HelloServlet</servlet-class>
<!--启动的优先级,数字越小越先起动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--映射配置 -->
<servlet-mapping>
<!--名称 -->
<servlet-name>hello2</servlet-name>
<!--资源的匹配规则:精确匹配 -->
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
在web.xml中 一个servlet标签 可以对应多个servlet-mapping 标签 可以设置多个路径 访问到同一个servlet
优先级:
从高到低
绝对路径 –> /开头匹配 –> 扩展名方式匹配
url-pattern : /demo_01
url-pattern : /abc/*
url-pattern : *.do 扩展名匹配 前面不要加/
* 通配符 代表任意字符串
匹配规则:
(1)精确路径匹配
例如 servletA 的url-pattern 为/a
servletB 的url-pattern 为/b
url-pattern 为/*
如果访问地址为 http://localhost:8080/项目名/a –>servletA
(2)最长路径匹配
例如 servletA 的url-pattern 为/test/*
servletB 的url-pattern 为/test/b/*
如果访问地址为 http://localhost:8080/项目名/test/b –>servletB
(3)扩展匹配
如果url最后一段包含扩展 会根据扩展 选择合适的servlet 例如 servletA的
url-pattern 为 *.php
5.ServletConfig的使用
用于封装Servlet的配置信息
代表当前Servlet在web.xml中的配置信息 (用的不多)
从一个Servlet被实例化后 对任何客户端在任何时候访问都有效
作用:
(1)获取Servlet配置信息
(2)获取ServletContext对象
获取ServletConfig 的三种方式
(1)重写 GenericServlet 的init方法 得到 ServletConfig 对象 调用
getInitParameter方法 根据名字 获取值
(2)通过 祖先 Servlet 的 getServletConfig()方法 获取 ServletConfig 对象
(3)HttpServlet 已经实现了 ServletConfig 接口
常用方法:
String getServletName()
获取当前servlet在web.xml中配置的名字
String getInitParameter(String name)
获取当前servlet在web.xml的初始化参数值
Enumeration getInitParameterNames()
获取所有初始化参数名字组成的枚举
ServletContext getServletContext()
获取 代表当前web应用的 ServletContext 上下文作用域
6.Servlet三大域对象
(1)ServletContext 整个web项目 上下文作用域
(2)HttpSession 一次会话 会话作用域
(3)ServletRequest 一次请求 请求作用域
ServletContext 上下文作用域
ServletContext: Servlet上下文
当Web服务器启动时 会为每一个web应用程序创建一个共享的存储区域
ServletContext也叫作 “公共区域” 在服务器启动时创建 服务器关闭时销毁 容器在启动的时候 会为每一个web应用创建一个唯一的对象 该对象 一般称之为 “Servlet上下文” 一个应用程序 只有一个ServletContext对象
获取方式:
(1)通过 ServletConfig 获取
ServletContext getServletContext()
获取
(2)在HttpServlet中直接获取this.getServletContext()
(3)通过HttpRequest获得request.getSession().getServletContext()
常用方法:
void setAttribute(String name,String value)
向ServletContext对象中添加数据
Object getAttribute(String name)
从ServletContext中获取数据
void removeAttribute(String name)
从ServletContext中移除数据
String getRealPath(String path)
根据资源名称 得到资源的绝对路径 可以得到当前应用 任何位置的任何资源
Servlet上下文的特点
作用:
1、获取真实路径 获取当前项目的发布路径
request.getSelectContext().getRealPath("/");
2、获取容器的附加信息
System.out.println(request.getServletContext().getServerInfo());
System.out.println(request.getServletContext().getContextPath());
3、全局容器
//设置信息到全局容器中
request.getServletContext().setAttribute("msg", "共享信息");
//获取数据
System.out.println(request.getServletContext().getAttribute("msg"));
//移除数据
request.getServletContext().removeAttribute("msg");
请求转发
理解:我借钱 这叫请求 他向别人借 叫转发
前端页面向后台服务器发送一个请求 然后利用方法 将请求转发出去 跳转到另一个Servlet/jsp中
getRequestDispatcher(String path)
转发到某个地址 参数 必须以 斜杠(/)开始
forward(request,response)
将请求和响应带过去
特点:地址栏不发生改变 还是原来的地址
7.请求 和 响应
HTTP协议 封装了 请求 和 响应
请求部分:
(1)请求消息行 GET/POST 请求方式
浏览器默认请求方式GET
URI:去掉 协议 IP地址 端口
协议/版本
(2)请求消息头
Accept:浏览器可以接收的MIME类型
告诉服务器客户端能够接收什么类型的文件
Accept-Encoding:浏览器嫩够进行解码的数据解码方式
Accept-Language:浏览器所希望的语言类型
Host:初始URL中主机及端口号
Referer:包含一个URL用户从该URL代表的页面出发 访问当前的请求页面
Content-Type:内容类型
User-Agent:浏览器类型
Content-Length:表示请求消息正文的长度
Cookie:这是最重要的
Date:请求时间
(3)请求正文
当请求方式是Post的时候 才能看到请求消息正文
(4)响应部分:
响应消息行
HTTP/1.1 200 ok
协议版本 响应状态码 一切正常
响应消息头
Location:通常 和 302/307一起使用 完成请求重定向
Server:显示服务器类型
Content-Encoding:服务器发送的数据采用的编码集
Content-Length 告诉浏览器正文的长度
Content-Language 服务器发送的文本语言 zh-cn
响应正文
和 网页 右键 “查看页面源代码”看到的内容一样
8.HttpRequest 请求作用域
web服务器收到客户端的http请求 会针对每一次请求 分别创建一个 request对象 和一个response对象
获取请求行中的信息常用方法:
getMethod() 获取请求方式
getRequestURL()
获取客户端发送请求时的完整URL地址
getRequestURI()
获取请求行中的资源名部分
getContextPath()
获取当前应用的虚拟目录
getQueryString()
获取请求行中的参数部分
获取请求头中的信息常用方法:
String getHeader(String name)
根据头名称 得到头信息
Enumeration getHeaderName()
得到所有头信息
Enumeration getHeaders(String name)
根据头名称 得到信息
获取请求正文与获取表单数据相关的方法
String getParameter(String name)
根据表单中name属性 获取value值
String[] getParameterValues(String name)
根据表单中复选框名字 获取值的数组
Map<String,String[]> getParameterMap()
得到表单提交的所有值
Enumeration getParameterNames()
得到表单提交的所有name属性
ServletInputStream getInputStream()
以字节流的形式获取所有表单数据
当表单提交方式为post时 请求消息正文有内容 可以使用getInputStream()来获取
9.BeanUtils
Apache公司提供的 用来专门进行javaBean操作的 在web层各种框架中都可
以被使用
步骤:
1.下载BeanUtils的jar包
commons-beanutils-1.8.3.jar
commons-logging-1.1.1.jar
2.web项目 下 lib目录 导包
常用方法:
BeanUtils.populate(Object obj,Map map)
因为该方法需要Map集合 所以必须先使用 request getParameterMap()方法 获取前端表单数据的Map集合
注意事项:
- 前端 表单项名 name 属性 必须 和 javaBean中的属性名保持一致
- String –> java.util.Date 不支持我们需要自定义转换器
自定义转换器:
1.实现Converter接口
2.注册转换器
ConvertUtils.register(转换器,目标类型.class);
结论: 一般不需要自定义转换器 只有Date需要
与请求转发相关的方法
RequestDispatcher getRequestDispatcher(String path)
ServletContext 和 HttpRequest 域对象的getRequestDispatcher()区别:
ServletContext 中的方法 参数 必须以 斜杠(/)开头被解释为相对于当前上下文根的路径
HttpRequest 中的方法 参数 可以写(/)也可以不写 如果路径以(/)开始 则被解释为相对于当前上下文根的路径 如果没有(/)开始 则被解释为相对于当前Servlet的路径
RequestDispatcher
forward(request,response) 转发
include(request,response) 包含
与操作非表单数据相关的方法
void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name);
与请求编码相关的方法
前端是 post 方式请求
setCharacterEncoding("编码集")
前端是 get 方式请求
username = new String(username.getBytes("iso-8859-1"),"utf-8");
10.HttpServletResponse
响应
1.响应行
setStatus(int sc) 设置响应状态码
2.响应头
sendRedirect(String location)请求重定向
setHeader(String name,String value)
设置响应头信息
3.响应正文
getWriter()
字符输出流
getOutputStream()
字节输出流
setCharacterEncoding(String charset)
设置响应编码集
setContentType(String type)
转发 和 重定向的区别
Servlet中 页面的跳转有两种方式 转发 和 重定向
1.转发 是 服务器行为 , 重定向 是客户端行为
2.转发 是浏览器发送了一次请求 ,重定向至少两次请求
3.转发 的地址栏不会发生改变, 重定向地址栏中的地址发生改变
4.转发 因为是一次请求 两次跳转之间 传输数据不会丢失
重定向是两次跳转 数据会丢失
5.转发 只能将请求跳转到同一个web应用中的页面
重定向可以指向任意页面 包括同一个web应用 同一个站点 其他网站
6.转发 是request域的方法
重定向 是 response对象的方法
req.getRequestDispatcher("response6").forward(req, resp);
resp.sendRedirect("response6");
servlet综合案例
链接:https://pan.baidu.com/s/1zmcff3aDeDs-WFeh_TWRLw 密码:mysh