JavaWeb核心之Servlet
一、Servlet简介
1.什么是Servlet
- Servlet是运行在服务端的Java小程序,是sun公司提供的一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。
- Servlet的实质就是Java代码,通过java的API动态的向客户端输出内容。
- Servlet规范的三大组件:
- Servlet
- Filter——过滤器
- Listener——监听器
2.Servlet的作用
- 用来处理从客户端发过来的请求,并对该请求作出响应。
- Servlet的任务:
- 获取请求数据。
- 完成请求。
- 完成响应。
3.Servlet入门
- Servlet规范要求:
- Servlet程序需要编写实现类,并在web.xml进行配置。
- 实现类:通常继承javax.servlet.Servlet类,并覆写其中的方法。
- 配置信息:在web.xml进行配置。
- 在实际的开发中,我们很少直接去实现Servlet接口,因为需要实现的抽象方法太多,我们一般创建类去继承Servlet的子类HttpServlet。
- 实现步骤:
- 创建类继承HTTPServlet类。
- 覆盖deGet()与doPost()。
- 在web.xml中进行Servlet的配置。
- 浏览器访问。
- TomCat处理客户端请求的步骤:
- 解析客户端发来请求的资源地址。
- 创建Servlet对象。
- 创建代表请求的Request对象和代表响应的Response对象(每次执行service方法都会创建新的Request和Response对象)。
二、Servlet的方法
1. init(ServletConfig config)
- Servlet对象创建的时候执行。默认第一次访问Servlet时创建该对象。
- ServletConfig:代表的是该Servlet对象的配置信息。
- ServletConfig的方法:
1. getServletName():获取Servlet的name。
2. getServletContext():获取ServletContext对象。
3. getInitParameter(String):获取指定的该Servlet的初始化参数。
4. getInitParameteNames():获取全部初始化参数名。
2. service(ServletRequest request,ServletResponse response)
- 每次请求都会执行。
- ServletRequest:代表请求,可认为内部封装的是http请求的信息。
- ServletResponse:代表响应,可认为要封装的是响应的信息。
3. destroy()
- Servlet对象销毁的时候执行。
- 服务器关闭Servlet销毁。
三、Servlet的配置(web.xml)
1.基本配置
<!-- servlet的类的配置 -->
<servlet>
<servlet-name>login</servlet-name>
<serlvet-class>cn.mrzhang.servlet.LoginServlet</serlvet-class>
<init-param>
<param-name>login</param-name>
<param-value>/login</param-value>
</init-param>
</servlet>
<!-- servlet的虚拟路径的配置 -->
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
- 其中url-pattern的配置方式:
- 完全匹配:访问的资源与配置的资源完全相同才能访问到。
<url-pattern>/login</url-pattern>
- 目录匹配:格式:/虚拟的目录…/* (*代表任意)
<url-pattern>/aaa/bbb/ccc/abc</url-pattern>
- 扩展名匹配:格式: * . 扩展名 (例如扩展名为abc)
<url-pattern>*.abc</url-pattern>
- 注意:目录匹配与扩展名匹配不能混用。例如:/aaa/bbb/ccc/abc.abc
2.服务器启动实例化Servlet配置
- Servlet对象默认第一次访问时创建。
- 当Servlet在配置时,加上一行配置 3 ,Servlet对象在服务器启动时就会创建。
- 内容中的数字代表优先级,数字越小,优先级越高。
<servlet>
<servlet-name>login</servlet-name>
<serlvet-class>cn.mrzhang.servlet.LoginServlet</serlvet-class>
<init-param>
<param-name>login</param-name>
<param-value>/login</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
3.缺省Servlet
- 将url-pattern配置为/,代表该Servlet是缺省的Servlet。
- 当你访问的资源资质所有的Servlet都不匹配时,缺省的Servlet负责处理。
- web应用中所有的资源的响应都是Servlet负责,包括静态资源。
4.欢迎页面
- 启动服务器默认打开的页面
- 默认配置
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
四、ServletContext对象
1.什么是ServletContext对象
- servletContext代表一个web应用的环境(上下文)对象,ServletContext对象内部封装的是web应用的信息。此对象一个web应用只有一个。
- ServletContext对象的生命周期:
- 创建:该web应用被服务器加载(前提:服务器启动)。
- 销毁:服务器关闭/web应用被移除。
2.获取方式
- ServletConfig中的方法getServletContext();
- Servlet对象方法this.getServletContext();
3.作用
- 获取web应用中全局的初始化参数。(在web.xml中配置)
<!-- 配置全局初始化参数 -->
<context-param>
<param-name>driverClassName</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
//获取方式
ServletContext context = this.getServletContext();
String initParamter = context.getInitParameter("driverClassName");
- 获取web应用中任何资源的绝对路径。
- 通过方法获取:
String path = context.getRealPath("相对于该web应用的相对地址");
- 通过类加载器获取:
String path = ContextServlet.class.getClassLoader().getResource("相对地址").getPath();
- ServletContext是一个域对象。
- 域对象:存储数据的区域。
- ServletContext域对象的作用范围是整个web应用(所有的web资源都可以随机向域中存取数据,数据可以共享)。
- 通用方法:
- setAtrribute(String name,Object obj);
- getAtrribute(String name);
- removeAttribute(String name);
//类1------------------------- this.getServletContext().setAttribute("name","zhangsan"); //类2------------------------- Object attribute = this.getServletContext().getAttribute("name");
五、HttpServletResponse
1.概述
- 我们在创建Servlet时回覆盖service()方法,或doGet() / doPost() ,这些方法都有两个参数,代表请求的request和代表响应的response。
- service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更强大。
2.运行流程
3.通过抓包工具获取HTTP响应
- 响应行
- 响应头
- 响应体
4.通过response设置响应行
- 设置响应行的状态码
- setStatus(int sc);
5.通过response设置响应头
- addHeader(String name,String value)
- addIntHeader(String name,int value)
- addDateHeader(String name,long date)
- setHeader(String name,String value)
- setDateHeader(String name,long date)
- setIntHeader(String name,int value)
- add表示添加,之前有就会在后面添加一个值,而set表示设置值,会将之前有的值覆盖掉。
6.通过response设置响应体
- 响应体设置文本
- PrintWriter getWriter()
- 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
- 关于设置中文的乱码问题:
- response缓冲区的默认编码是ISO8859-1,次编码表中没有中文。 - 解决方法:
- 设置response的编码为utf-8。
- setCharacterEncoding(String charset);
- 设置浏览器解析页面的编码为utf-8。
- setContentType(String type);
- 封装为一个方法(简写形式):
- response.setContentType(“text/html;charset=utf-8”);
- 响应头设置字节
- ServletOutputStream getOutputStream()
- 获得字节流,通过字节流的write(byte[] bytes)可以向response缓冲区中写入字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。
7.重定向
- 状态码:302
- 响应头:Location(重定向地址)
- 特点:
- 访问服务器两次或者多次。
- 地址栏会发生变化。
//1.设置状态码
response.setStatus(302);
//2.设置响应头Location
response.sendHeader("Location","地址");
//封装为一个方法
response.sendRedirect("地址");
六、HttpServletRequest
1.概述
-
- 我们在创建Servlet类时回覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个代表请求的request和代表响应的response。
- service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。
2.运行流程
3.通过抓包工具获取Http请求
- 请求行
- 请求头
- 请求体
4.通过request获得请求行
- 获得客户端的请求方式:
- String getMethod();
- 获得请求资源:
- String getRequestURI(); 地址(网络地址,磁盘地址,相对地址)
- StringBuffer getRequestURL(); 地址(网络地址,主机名,端口号,协议)
- String getContextPath(); web应用的名称。
- String getQueryString(); get提交的url地址后的参数字符串。例如:username=admin&password=admin。(几乎用不到)
- request可以获取客户端的一些信息(IP、端口号、用户名):
- request.getRomoteAddr(); 获取访问的客户端IP地址
- requset.getRomotePort(); 获取访问的客户端端口号
5.通过request获取请求头
- long getDateHeader(String name);
- String getHeader(String name);
- Enumeration getHeaderNames();
- Enumeration getHeaders(String name);
- int getIntHeader(String name);
- 请求头中referer的作用:指定该次访问的来源,可以做防盗链。
6.通过request获得请求体
- 请求体中的内容是通过post方式提交的请求参数,格式是:username=admin&password=1234&age=22
- **String getParameter(String name);**获得一个请求参数的值。
- String [ ] GetParameterValues(String name);获取复选框中的值,可能有多个。
- Enumeration< String , String [] > getParameterNames();获得所有请求参数的名称。
- Map getParameterMap();将所有请求参数以键值对形式存储到Map集合中。键为String类型参数的名称,值为String类型数组。
- 请求方式为get和post方式,都可以使用上述方法。
7.request的其他功能
(1)域对象
- request对象也是一个存储数据的区域对象,所以有如下方法:
- setAttribute(String name , Object o);
- getAttribute(String name);
- removeAttribute(String name);
- 作用范围:一次请求中。
(2)request完成请求转发
- 特点:
- 一次请求。
- 地址栏不变。
- 获得请求转发器——path是转发的地址:
- RequestDispatcher getRequestDispather(String path);
- 通过转发器对象转发:
- requestDispather.forward(ServletHttpRequest request , ServletHttpResponse response);
8.request补充
- ServletContext域与Request域的声明周期比较:
- ServletContext:
- 创建:服务器启动
- 销毁:服务器关闭
- 域的作用范围:整个web应用
- Request:
- 创建:访问时创建。
- 销毁:响应结束。
- 域的作用范围:一次请求中。
- 转发与重定向的区别:
- 重定向两次或多次请求,转发一次请求。
- 重定向地址栏的地址变化,转发地址不变。
- 重定向可以访问外部网站,转发只能访问服务器内部资源。
- 转发的性能要优于重定向。
- 客户端与服务器端地址的写法
- 客户端地址(直接输入地址,重定向地址):
- 是客户端访问服务器的地址,服务器外部地址。
- 特点:服务器有多个web应用,要写上具体的web应用的名称。
- 服务器端地址(转发):
- 服务器内部资源的跳转地址。