目录
一、什么是Servlet
1.概念
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
2. Servlet 在 Web 应用程序中的位置
3.Servlet 任务
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
总结:读取客户端数据,处理数据,向客户端发回响应数据
二、servlet创建的方式
1.实现 Servlet 接口
Servlet 的生命周期:
- 1.实例化(使用构造方法创建对象)
- 2.初始化 执行init方法
- 3.服务 执行service方法
- 4.销毁 执行destroy方法
public class ServletDemo1 implements Servlet {
//public ServletDemo1(){}
//生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
public void init(ServletConfig arg0) throws ServletException {
System.out.println("=======init=========");
}
//生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hehe");
}
//生命周期方法:当Servlet被销毁时执行该方法
public void destroy() {
System.out.println("******destroy**********");
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
}
2.继承 GenericServlet 类
它实现了 Servlet 接口中的 service 的方法,不过这种方法我们极少用。
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("heihei");
}
}
3.继承 HttpServlet 方法
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("haha");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("ee");
doGet(req,resp);
}
}
三、servlet获取表单数据
很多情况下,要从浏览器传递一些信息到web服务器,最终交由后端代码来进行处理,有两种方法可以做到,GET方法和POST方法
1.GET方法和POST方法之间的区别
1、GET请求通过URL(请求行)提交数据,在URL中可以看到所传参数。POST通过“请求体”传递数据,参数不会在url中显示
2、GET请求提交的数据有长度限制(url长度根据浏览器及服务器的不同而有不同限制。 若要支持IE的话,最大的长度为2083字符,若是中文字符的话只有2083/9=231个字符),POST请求没有限制。
3、GET请求返回的内容可以被浏览器缓存起来。而每次提交的POST,浏览器在你按 下F5的时候会跳出确认框,浏览器不会缓存POST请求返回的内容。
4、GET对数据进行查询,POST主要对数据进行增删改!简单说,GET是只读,POST是写。
5、对于参数的数据类型,get只接受ASCII字符,而post没有限制。
2.Servlet 读取表单数据的方法
getParameter():可以调用 request.getParameter() 方法来获取表单参数的值。
String name = request.getParameter("name");
getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
Map<String,String[]> getParameterMap():获取所有参数的map集合
// 可以获取到请求中的所有的键值对,返回值是一个map集合
// 这个map集合的key是String,value是String[]
// username=admin,password=123456,hobby=a,b,c,gender=man
Map<String, String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> name : map.entrySet()) {
String key = name.getKey();
String[] value = name.getValue();
System.out.println(key + "--->" + Arrays.toString(value));
}
getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
System.out.println(parameterNames.nextElement());
}
3.设置响应内容类型
response.setCharacterEncoding("utf-8");
response.addHeader("content-type","text/html;charset=utf-8");
四、Request对象
1.request对象和response对象的原理
- request和response对象是由服务器创建的。我们来使用它们
- request对象是来获取请求消息,response对象是来设置响应消息
2. request对象继承体系结构
3.request功能
1. 获取请求消息数据
1.获取请求行数据
GET /day14/demo1?name=zhangsan HTTP/1.1
- 获取请求方式 :GET
String getMethod()
- (*)获取虚拟目录:/day14
String getContextPath()
- 获取Servlet路径: /demo1
String getServletPath()
- 获取get方式请求参数:name=zhangsan
String getQueryString()
- 获取请求URI:/day14/demo1
String getRequestURI(): /day14/demo1
StringBuffer getRequestURL() :http://localhost/day14/demo1
URL:统一资源定位符 : http://localhost/day14/demo1
URI:统一资源标识符 : /day14/demo1
- 获取协议及版本:HTTP/1.1
String getProtocol()
- 获取客户机的IP地址:
String getRemoteAddr()
2. 获取请求头数据
String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration getHeaderNames():获取所有的请求头名称
3. 获取请求体数据
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
- 获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据 - 再从流对象中拿数据
五、Response对象
1.设置响应消息
1. 设置响应行
1. 格式:HTTP/1.1 200 ok
2. 设置状态码:setStatus(int sc)
2. 设置响应头
setHeader(String name, String value)
3. 设置响应体:
使用步骤:
- 获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream() - 使用输出流,将数据输出到客户端浏览器
4.路径写法
1. 路径分类
1. 相对路径:通过相对路径不可以确定唯一资源
* 如:./index.html
* 不以/开头,以.开头路径
* 规则:找到当前资源和目标资源之间的相对位置关系
* ./:当前目录
* ../:后退一级目录
2. 绝对路径:通过绝对路径可以确定唯一资源
* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2
* 以/开头的路径
* 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
* 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
* 建议虚拟目录动态获取:request.getContextPath()
* <a> , <form> 重定向...
* 给服务器使用:不需要加虚拟目录
* 转发路径
五、ServletContext对象
- 概念:代表整个web应用,可以和程序的容器(服务器)来通信
- 获取:
- 通过request对象获取
request.getServletContext(); - 通过HttpServlet获取
this.getServletContext();
- 通过request对象获取
- 功能:
- 获取MIME类型:
- MIME类型:在互联网通信过程中定义的一种文件数据类型
- 格式: 大类型/小类型 text/html image/jpeg
- 获取:String getMimeType(String file)
- MIME类型:在互联网通信过程中定义的一种文件数据类型
- 域对象:共享数据
- setAttribute(String name,Object value)
- getAttribute(String name)
- removeAttribute(String name)
- ServletContext对象范围:所有用户所有请求的数据
- 获取文件的真实(服务器)路径
方法:String getRealPath(String path)
String b = context.getRealPath(“/b.txt”);//web目录下资源访问String c = context.getRealPath(“/WEB-INF/c.txt”);//WEB-INF目录下的资源访问
String a = context.getRealPath(“/WEB-INF/classes/a.txt”);//src目录下的资源访问
- 获取MIME类型:
六、HTTP协议
Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了,客户端和服务器端通信时,发送数据的格式。
- 请求消息:客户端发送给服务器端的数据
数据格式:1. 请求行 、2. 请求头、3. 请求空行、4. 请求体 - 响应消息:服务器端发送给客户端的数据
1. 响应行组成:协议/版本 响应状态码 状态码描述
2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
3. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
4. 2xx:成功。代表:200
5. 3xx:重定向。代表:302(重定向),304(访问缓存)
6. 4xx:客户端错误。代表:403: 拒绝访问 、404:请求路径没有对应的资源、405:请求方式没有对应的doXxx方法
7. 5xx:服务器端错误。代表:500(服务器内部出现异常)
- 响应头:
- 格式:头名称: 值
- 常见的响应头:
1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
- 响应体:传输的数据
面试题
1.转发和重定向的区别
1.重定向过程: 客户端浏览器发送http请求 → web服务器接收后发送30X状态码响应及对应新的location给客户浏览器 → 客户浏览器发现是30X响应,则自动再发送一个新的http请求,请求url是新的location地址
→ 服务器根据此请求寻找资源并发送给客户。
//java代码示例
response.sendRedirect("xxx.jsp或者servlet");
2.转发过程: 客户端浏览器发送http请求 → web服务器接受此请求 → 调用内部的一个方法在容器内部完成请求处理和转发动作 → 将目标资源发送给客户。
//java代码示例
request.getRequestDispatcher("xxx.jsp或者servlet").forward(request,response);
总结:
1.转发是服务器行为,重定向是客户端行为
2.重定向是两次请求的过程,而转发只有一次.由此可见重定向是由浏览器完成的,转发是服务器内部完成的。
3.在重定向的过程中,传输的信息会被丢失。
转发中传输的信息不会丢失。
4.重定向会改变地址栏的内容,转发不会
2.servlet 的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
Servlet 初始化后调用 init () 方法。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 销毁前调用 destroy() 方法。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。