一、涉及的包
Servlet API涉及4个java包 :
javax.servlet Servlet容器
javax.servlet.http Servlet容器和http协议的关系
javax.servlet.annotation Servlet,filter,Listener 进行标注的注解
javax.servlet.descriptor 包含为web应用程序的配置信息提供编程式访问的类型。
二、Servlet的生命周期
2-0:HttpServlet和Servlet
HTTPServlet是关于于Http协议的;而Servlet是与具体的协议无关。
2-1:Servlet的创建
在一个应用中,每一个Servlet类型只能有一个实例,因此不要在Servlet的实现类中定义成员变量,类变量
Servlet创建有两种情况:
1. 在Servlet第一次接受请求的时候创建。(默认)
2.在服务器开启的时候创建。
在web.xml文件的<servlet>标签下加一个<load-on-startup>正数序号</load-on-startup>;服务器会根据序号决定创建顺序。
2-2:Servlet处理请求
当客户端发送请求到服务器。Tomcat会根据Servlet的URL,接入对应的Servlet对象的service()方法;
(在HttpServlet中,service会根据请求的类型,决定调用doGet()或者......)
2-3:Servlet销毁
当服务器关闭的前夕,会对Servlet进行销毁;Servlet销毁前,会调用destory()方法
2-4:Servlet其他方法
getServletInfo 返回Servlet的描述
getServletConfig 返回init()传入的ServletConfig
三、关于JAVA WEB的文件结构
- 项目根目录下放置的资源可以被URL直接访问。
- WEB-INF下的classes存放着java类编译的字节码文件
- WEB-INF下的lib下存放着WEB应用程序所要的jar包
- 注意:若要资源不直接被URL访问到,将资源放在WEB-INF即可。
- web.xml是java WEB的描述文件。
四、关于ServletRequest和ServletResponse
此处讨论HTTPServletRequest和HttpServletResponse。
4-1:HttpServletRequest
request是应用于封装客户端的所有请求数据
获取常用信息:
- 获取客户端IP:request.getRemotoAddr()
- 请求方式 request.getMethod()
- 获取请求头 String getHeader(String name);int getIntHeader(String name);long getDateHeader(String Date);..............
- 获取URL信息
获取请求参数
- String getParameter(String name) 指定参数名,获取单值参数值
- String[] getParametervalues(String name) 指定参数名,获取多值参数值
- Map<String,String[]> getParameterMap() 获取所有请求参数;返回键值对(key参数名,value 参数值)
- Enumeration<String> getParameterNames();获取所有请求参数名
关于请求转发和请求包含,请求重定向
- 请求转发:由下一个Servlet完成响应头,当前Servlet只可设置响应头。(留头不留体)
- 请求包含:由两个及以上的Servlet共同完成响应头(都有)
- 实现代码
//在
RequestDispatcher d=request.getRequestDispatcher("/BServlet");
//转发:
d.forward(request, response);
//包含
d.include(request, response);
重定向和转发的区别
转发是一个请求。重定向是两个请求。
转发:是服务器跳转,浏览器的地址栏不发生改变;request域不会被保留。
重定向:是客户端跳转;request域不会被保留。
关于防盗链
通过Referer响应头判断该url的跳转来源。
4-2HttpServletResponse
关于重定向实现
//方法1:设置响应码302,设置location响应头
response.setStatus(302);
response.setHeader("location", "....");
//方法2直接调用 sendRedirect
response.sendRedirect(".......");
//重定向填写url需要写/的。(http://localhost:8080/)
设置状态码
- sendError(int sc) 发送错误状态码
- sendError(int sc,String mgs) 发送错误状态码,还带一个错误信息
- sendStatus(int sc) 发送一个成功的状态码。可用于302
设置响应头
- response.setHeader(String name, String value); 适合单值的响应头
- response.addHeader(String name, String value);适合多值的响应头
- response.setIntHeader(String name, int value);适合单值的int响应头
- response.addIntHeader(String name, int value);适合多值的int响应头
- response.setDateHeader(String name, long value);适合单值的毫秒类型的响应头
- response.addDateHeader(String name, long value);适合多值的毫秒类型的响应头。
设置响应体
通常是html和图片
response有两个流:ServletOutputStream和printWriter
ServletOutputStream: 用于向客户端发送字节数据
printWriter:用于向客户端发送字符数据。
注意:两个流是不能同时使用的。(若同时用会抛出异常)
4-3:编码问题
注意:服务器和客户端使用的编码必须一致
编码问题分为 请求编码,响应编码
请求编码
Tomcat默认使用ISO-8859-1来处理请求参数。
- 关于POST请求
- 在获取参数之前,调用request.setCharacterEncoding("UTF-8");然后再获取参数。
- 关于GET请求
- 方法1: 设置服务器处理请求参数的默认编码。
- 例如Tomcat。在/conf/server.xml中配置 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
- 方法2:如下操作
-
String name =request.getParemeter("name"); byte[] b=name.getBytes("ISO-8859-1"); name=new String(b,"UTF-8")
-
- 方法1: 设置服务器处理请求参数的默认编码。
响应编码
若不设置,默认是ISO-8859-1
在使用响应流前使用如下操作
//设置字符流的编码
response.setCharacterEncoding("UTF-8");
//通知浏览器以UTF-8的形式解析 等价于 response.setHeader("content-Type", "text/html;chatset=utf-8");
response.setContentType("text/html;chatset=utf-8");
五、本章例子
例子: 包括 编码,重定向,转发,包含
六、注意
6-1:request中参数和属性的区别
- 参数是由客户端到服务器
- 属性是服务器到服务器的域