编写
1.编写实现类
extends HttpServlet --> extends GenericServlet --> implements Servlet
复写:doGet(HttpServletRequest,HttpServletResponse)、doPost
2.配置servlet,在web.xml文件配置(注册、映射)
<servlet>
<servlet-name>
<servlet-class>
<servlet-mapping>
<servlet-name>
<url-pattern>
1.完全匹配:/a/b/c/xxxxx
2.不完全匹配: /xxx/* --> /*
3.通配符匹配:*.xxx (*.jsp、*.action等)
4.缺省路径: / (tomcat为缺省路径配置一个servlet,用于处理html页面、图片等)
servlet生命周期 (servlet 单实例,多线程)
init(ServletConfig):只会执行一次,默认第一次访问,如果配置服务器启动(web.xml )
service(ServletRequest,ServletResponse):每请求一次,将执行一次。
destroy() 服务器正常关闭时,将执行一次。
使用细节
1.完成初始化操作:
复写init() , 此访问时GenericServlet提供的。
注意:如果复写 init(ServletConfig) 必须手动再方法体中 super.init(config)。否则空指针
2.获得当前servlet初始化参数
this.getInitParameter(“”) ; GenericServlet 实现 ServletConfig 提供4个便捷方法
3.获得ServletContext对象
this.getServletContext() GenericServlet提供便捷方法
this.getServletConfig().getServletContext() 获得GenericServlet缓存ServletConfig对象之后再操作。
一个web项目,只有一个ServletContext对象,此对象在服务器启动时tomcat创建,服务器关闭时tomcat销毁。
ServletContext对象 一般被称为:web项目的上下文对象。(servlet管理者)
api
1.web项目共享数据:xxxAttribute (set、get、remove)
2.获得系统初始化参数 getInitParameter(name)
web.xml
3.获得web项目资源
getRealPath("/WEB-INF/web.xml") --> String d:/tomcat/webapps/day07/WEB-INF/web.xml
getResourceAsStream("") InputStream
回顾 http协议 响应
http响应包括:响应行、响应头、响应体
oracle(sun) 根据http协议规定 servlet相应规范(java接口),tomcat根据规范编写实现类。
接口:javax.servlet.ServletResponse、javax.servlet.http.HttpServletResponse
ServletResponse servlet通用规范,与协议无关。
HttpServletResponse就是与http协议有关规范。(提供与http协议有关的api)
response对象:服务器响应给浏览器的描述对象。
setStatus(int sc) 设置状态码
例如:
setStatus(404)
setStatus(HttpServletResponse. SC_NOT_FOUND)
setHeader(java.lang.String name, java.lang.String value) 设置指定的头,一般常用。
例如:setHeader("location","http://www.itheima.com");
setDateHeader(java.lang.String name, long date) 设置时间的(new Date().getTime())
setIntHeader(java.lang.String name, int value) 设置整形
例如:setIntHeader("expires", 1000) 设置过期时间的(缓存页面时间),如果0表示不缓存。现代浏览器不好使。
方式1:手动方案
response.setStatus(302)
response.setHeader("location","http://www.itheima.com");
方式2:使用api
response.sendRedirect("http://www.itheima.com")
提供字符流:PrintWriter getWriter() --> 提供write() 和 print()
提供字节流:ServletOutputStream getOutputStream() --> 提供write() 和print()
注意:所有的print()方法底层调用都是write() --> 流最后只使用一个write(int )
流的使用,一般情况下
如果发送的中文数据等,使用字符流。例如:一般内容 getWriter()
如果发送二进制数据(字节)等,使用字节流。例如:下载
一般情况,如果是流,必须关闭流。但servlet中如果使用可以不关闭。
如果没有关闭流,tomcat在请求结束时,将自动的关闭。
注意:response 的两个流不能同时使用。
response.setCharacterEncoding("UTF-8");
注意:只通知tomcat,但不控制浏览器行为
方式1:手动方案
response.setHeader("content-type", "text/html;charset=UTF-8");
方式2:使用api【】
response.setContentType("text/html;charset=UTF-8");
注意:建议浏览器应该使用编码,不能强制要求。
response中使用流向浏览器发送数据,首先数据将写入 数据流的缓存中,但缓存大小8k时,将自动刷新到浏览器。
api使用
isCommitted() 缓存是否刷新过
flushBuffer() 手动的刷新 输出缓存
getBufferSize() 获得大小
resetBuffer() 清空缓存
回顾 http协议 请求
包含:请求行,请求头,请求体
oracle 根据 http协议,定义 request相应规范(接口),tomcat实现request规范
接口:javax.servlet.ServletRequest、javax.servlet.http.HttpServletRequest
浏览器发送请求,tomcat将创建 request和response 对象,传递doGet/doPost方法,方法体可以具体对象。
HttpServletRequest接口 提供 getMethod() 获得GET/POST 请求方式
路径访问
//实际访问路径 http://localhost:8080/day08/Demo05Servlet?username=jack&password=1234
//1 统一资源标记符 。例如: /day08/Demo05Servlet
String uri = request.getRequestURI();
System.out.println(uri);
//2统一资源定位符:例如:http://localhost:8080/day08/Demo05Servlet
StringBuffer url = request.getRequestURL();
System.out.println(url);
//3 协议和版本 , 例如: HTTP/1.1
String protocol = request.getProtocol();
System.out.println(protocol);
//协议,例如: http
String scheme = request.getScheme();
System.out.println(scheme);
//4 主机(域名) , 例如:localhost ,如果使用ip地址,就显示ip
String serverName = request.getServerName();
System.out.println(serverName);
//5 端口 , 例如:8080
int port = request.getServerPort();
System.out.println(port);
//6 发布到tomcat下的项目名称 【】
String contextPath = request.getContextPath();
System.out.println(contextPath);
//7 servlet路径 , 例如:/Demo05Servlet【】
String servletPath = request.getServletPath();
System.out.println(servletPath);
//8 所有请求参数,及?之后所有 ,例如: username=jack&password=1234
String queryString = request.getQueryString();
System.out.println(queryString);
//9远程主机的ip地址【】
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
String getHeader(java.lang.String name) 获得指定头内容String【】
例如:request.getHeader("referer");
long getDateHeader(java.lang.String name) 获得指定头内容Date
int getIntHeader(java.lang.String name) 获得指定头内容int
Enumeration getHeaders(java.lang.String name) 获得指定名称所有内容
请求参数:
get请求参数:http://localhost:8080/day08/Demo07Servlet?username=jack&password=1234
post请求参数:
post请求和get请求,中文乱码处理方式不同。(不含tomcat8)
post 请求处理
request.setCharacterEncoding("UTF-8") 修改tomcat默认对请求体的编码方式
post请求内容存放请求体中,所以可以使用上面的api进行乱码处理。
get请求乱码处理
在获得数据的基础上,进行手动的编码。
new String(xxx.getBytes("ISO-8859-1") , "UTF-8")
request 属性操作,服务器内部事情,浏览器时不知晓的。
Servlet 3作用域对象:ServletContext、ServletRequest、HttpSession
3个对象都提供xxxAttribute (set、get、remove)
如果要使用request属性,必须和“请求转发”结合使用。
request属性特定:在一次请求中共享数据。一次请求可以涉及页面个数:默认情况1个,使用请求转发多个。
请求调度:从当前servlet A,调度另一个servlet B(资源:html、servlet、jsp等)
在服务器内部,从一个servlet去执行另一个servlet,浏览器不知道的。
获取
ServletRequest.getRequestDispatcher(String path) 获得请求调度对象,如果/开头,表示web项目根(context root)
ServletContext.getRequestDispatcher(String path) 获得请求调度对象,必须以/开头,表示web项目根
ServletContext.getNamedDispatcher(java.lang.String) (了解)
例如:
当前servlet路径: http://localhost:8080/day08/a/b/Demo01Servlet
另一个servlet路径:http://localhost:8080/day08/a/b/Demo02Servlet
ServletRequest (常用)
request.getRequestDispatcher(“Demo02Servlet”)
request.getRequestDispatcher(“/a/b/Demo02Servlet”) --注意:没有day08 , (扩展:对比重定向)
ServletContext
this.getServletContext().getRequestDispatcher("/a/b/Demo02Servlet ")
api
forward(ServletRequest request, ServletResponse response) 请求转发
A 转发 B,只输出B内容到浏览器。(如果A没有数据发送 response.isComitted = false,将清空缓存)
请求转发只输出最后一个servlet内容
如果 isCommitted = true ,在进行forward将抛异常。一般情况如果输出少量的数据,认为isCommitted=false
include(ServletRequest request, ServletResponse response) 请求包含
A 包含 B,先输出A内容到浏览器,在输出B的内容到浏览器。
请求包含,输出所有servlet 汇总后的内容。
应用场景
请求转发:第一个servlet处理数据,第二个servlet显示数据 -- MVC软件设计模式
思想:处理与显示相分离
AServlet{
//处理
** 使用dom4j 查询所有数据
List allBook = …
//将数据存request属性中(request作用域: 数据的作用范围)
request.setAttribute(“allBook”,allBook);
//请求转发
request.getRequestDispatcher(“Bservlet”).forward(1,2);
}
BServlet{
// 获得request属性中数据 – 此数据从服务器获得
List allBook = (List)request.getAttribute(“allBook”); //注意:request.getParameter(“”) 从浏览器
//显示
}
总结:
1.web项目根:(context root)
开发:G:\Workspaces\hei16\day08\WebRoot
运行:D:\java\tomcat\apache-tomcat-7.0.53\webapps\day08
2. web站点根:
运行:D:\java\tomcat\apache-tomcat-7.0.53\webapps
3.编码
页面(html、jsp)、servlet 请求和响应 编码 必须保持一致。
一般情况下:servlet开始2段内容
request.setCharacterEncoding(“UTF-8”);
response.setContentType(“text/html;charset=UTF-8”);
4.请求转发特点
* 请求路径没有改变,但可以涉及服务器端多个资源(你和媳妇)
* 可以在一次请求中,共享request作用域的数据。
* 一次请求,使用请求转发,tomcat将创建两个request,和一个response对象
两个request对象数据相同的(可以理解成对象被克隆了)