【JavaWeb】一文搞定JavaWeb核心之Servlet

一、Servlet简介

1.什么是Servlet

  • Servlet是运行在服务端的Java小程序,是sun公司提供的一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。
  • Servlet的实质就是Java代码,通过java的API动态的向客户端输出内容。
  • Servlet规范的三大组件:
    • Servlet
    • Filter——过滤器
    • Listener——监听器

2.Servlet的作用

  • 用来处理从客户端发过来的请求,并对该请求作出响应。
  • Servlet的任务:
    1. 获取请求数据。
    2. 完成请求。
    3. 完成响应。

3.Servlet入门

  • Servlet规范要求:
    • Servlet程序需要编写实现类,并在web.xml进行配置。
    • 实现类:通常继承javax.servlet.Servlet类,并覆写其中的方法。
    • 配置信息:在web.xml进行配置。
  • 在实际的开发中,我们很少直接去实现Servlet接口,因为需要实现的抽象方法太多,我们一般创建类去继承Servlet的子类HttpServlet。
  • 实现步骤:
    1. 创建类继承HTTPServlet类。
    2. 覆盖deGet()与doPost()。
    3. 在web.xml中进行Servlet的配置。
    4. 浏览器访问。
  • TomCat处理客户端请求的步骤:
    1. 解析客户端发来请求的资源地址。
    2. 创建Servlet对象。
    3. 创建代表请求的Request对象和代表响应的Response对象(每次执行service方法都会创建新的Request和Response对象)。

二、Servlet的方法

Servlet接口

1. init(ServletConfig config)

  • Servlet对象创建的时候执行。默认第一次访问Servlet时创建该对象。
  • ServletConfig:代表的是该Servlet对象的配置信息。
  • ServletConfig的方法: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补充

  1. ServletContext域与Request域的声明周期比较:
  • ServletContext:
    • 创建:服务器启动
    • 销毁:服务器关闭
    • 域的作用范围:整个web应用
  • Request:
    • 创建:访问时创建。
    • 销毁:响应结束。
    • 域的作用范围:一次请求中。
  1. 转发与重定向的区别:
  • 重定向两次或多次请求,转发一次请求。
  • 重定向地址栏的地址变化,转发地址不变。
  • 重定向可以访问外部网站,转发只能访问服务器内部资源。
  • 转发的性能要优于重定向。
  1. 客户端与服务器端地址的写法
  • 客户端地址(直接输入地址,重定向地址):
    • 是客户端访问服务器的地址,服务器外部地址。
    • 特点:服务器有多个web应用,要写上具体的web应用的名称。
  • 服务器端地址(转发):
    • 服务器内部资源的跳转地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张景_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值