动态资源
servlet就是在服务器端,接收请求并完成响应的java类
生命周期
三个方法
init(ServletConfig config) //第一次访问Servlet调用
servlet() //接受请求并返回响应的方法
destroy() //销毁Servlet调用
其他方法:
getServletConfig() //返回ServletConfig对象,该对象是 init(ServletConfig config)中 服务器传过来的, 记录起来即可返回
ServletConfig类是什么?
封装了servlet的一些配置参数, 通过ServletConfig的各种方法可以参数的详细信息
Enumeration<String> getInitParameterNames() //获取参数键的集合
String getInitParameter(String name) //根据 键 获取参数值
String getServletName() //获取配置名称
ServletContext getServletContext()
GenericServlet //封装好了 原始Servlet要必须实现的方法和一些必须操作, 减少用户进行一些无脑操作
线程安全问题:
Servlet是线程不安全的, 不能用成员变量去保存与线程相关的参数
Servlet的创建实例时机:在servlet注册的时候, 添加属性
<load-on-startup>3</load-on-startup>
<!-- load-on-startup 用于让servlet随项目启动而启动
填写一个正整数:0~5之间,
数字越小启动优先级越高
-->
设置访问路径:
相对路径配置:
/AServlet => http://localhost:8080/项目名称/AServlet
/ABC/AServlet => http://localhost:8080/项目名称/ABC/AServlet
/ABC/* => http://localhost:8080/项目名称/ABC/XXXXX /ABC/ 后面的xxx可以随意写, 都能访问
后缀名匹配 => 在servlet中很少使用
原则:1、匹配范围越大, 优先级越低
2、不能同时使用相对路径匹配和后缀名匹配
ServletContext Servlet的上下文对象
生命周期:随项目启动而启动, 项目关闭而消亡
功能:
可获取项目参数:
参数设置:在web.xml文件中添加参数
<context-param>
<param-name>name</param-name>
<param-value>jerry</param-value>
</context-param>
参数获取:通过servletContext的以下方法
getInitParameterNames() //返回一个Enumeration<String> 集合对象,封装了参数的key
en.hasMoreElements() + en.nextElement(); //通过这个集合对象遍历 key 获得value
域功能:
Servlet三大域:
application
request
session
jsp技术中的域
page
Servlet(服务器组建)之间的通讯, 通过外部一个类, 在该类中定义静态变量(Map), 要发送信息的Servlet通过改变该类的静态变量去传递消息,接收的Servlet通过获取该类的静态变量去获取消息, 该类即是 ServletContext
application 域:这里就是一个Map, 是一个全局共享的域
操作域的方法:
Enumeration<String> getAttributeNames();
//向ServletContext中的map(域)放数据
sc.setAttribute("car", "BMW");
//从ServletContext中的map(域)中获取数据
String value = (String) sc.getAttribute("car");
//删除ServletContext中域的值
sc.removeAttribute(key);
这里xxxAttribute(xxx)方法封装的操作实际是对map的操作
获得项目内的资源功能:
以输入流的形式来获取
InputStream is = new FileInputStream("D:\\xxx\\xxx\\xxx.xml"); //这种方式是以绝对路径的形式来获取的, 当路劲发生改变将无法运行
ServletContext 中设计 动态获取项目资源的方法 --> 使用相对路径
InputStream is = sc.getResourceAsStream("/xxx.xml"); // '/' 代表根目录下 完整代表WebRoot下的xxx.xml资源
注:src目录下的文件, java文件会被编译成class文件放在classes文件下 , 非java文件会被原封不动的放在classes目录下
Response中文乱码:都是因为编码码表和解码码表不一致, 输出中文建议使用字符流
解码码表设置字符流和字节流一样 ----> response.setHeader("Content-type", "text/html;charset=码表");字节流编码:
编码码表设置 ---->直接在 getBytes("码表")
字符流编码:
编码码表设置 ---> response.setCharacterEncoding("GBK");
还有一个java封装好的码表设置方法 response.setContentType(""text/html;charset=码表); 该方法会同时设置编码码表和解码码表
注:码表的设置一定要放在输出之前, 字符流与字节流不能同时使用
Request
中文乱码问题:页面编码与服务器解码码表不一致
GET请求
页面编码:发送端的编码码表 决定 浏览器显示时的解码码表
所以是由用户的html/jsp文件指定的
服务器解码码表:默认码表由tomcat的配置文件server.xml文件中
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" /> //大概在70行位置
URIEncoding="UTF-8"指定的
也可以手动将 乱码的字符串 ----->转回解码前的0100100111 ------>将其用浏览器编码码表转回来
POST请求
post请求与get请求的 区别 在于他们的解码时间节点不同
get请求解码时间在 请求到达服务器时立即解码, 因为服务器必须对请求url全部解码,才知道访问的是哪一个Servlet, 而参数又直接写在url上的
post请求解码时间在调用获得参数时, 因为参数写在请求正文中
解决:
只要在调用获得参数带码前设置解码码表即可
//设置解码码表 req.setCharacterEncoding("UTF-8");
请求转发:
处理由两个或多个Servlet处理, AServlet处理一部分, 然后转到BServlet处理, 这个过程就叫做请求转发
实际是 ----》Servlet 与 JSP(JSP本质就是一个Servlet)结合 Servlet处理一部分逻辑, JSP处理一部分显示
语法:
req.getRequestDispatcher("/EServlet").forward(req, resp);
(请求转移) (发送转发)
域:在一个请求之内共享数据
用于请求转发时,数据的共享
注意:1、在转发的Servlet中不能向浏览器输出任何响应内容
但是可以添加响应头
留头不留体
2、在转发之后不能再在本Servlet中操作request和response对象
重定向与转发的区别:
1、发送请求的次数: 重定向2次, 转发1次
2、能否访问外部地址:重定向不能, 转发可以
3、能不能使用request域共享数据:重定向不能, 转发可以
4、地址栏是否会发生变化:重定向(可能)会, 转发一定不会
5、请求方式是否会变化:重定向 可能会 因为重定向第二个请求一定是get
转发 一定不会
请求包含:
往往在两个或多个jsp中使用. 其中一个jsp封装相同部分, 其他jsp凡是需要显示相同部分,就可以把转载相同部分的jsp包含进来
与转发的对比:
1、转发中留头不留尾
包含中留头又留尾
2、转发中要求转发完成后,不能在操作request和response
包含中没有这个限制
语法:
req.getRequestDispatcher("/GServlet").include(req, resp);
(获取转移) (发送包含)