Servlet学习笔记

本文深入讲解Servlet技术,包括Servlet的生命周期、实现步骤、配置方法,以及与Servlet相关的API如ServletContext、HttpServletResponse和HttpServletRequest的使用。同时,探讨了请求转发与重定向的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

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

servlet规范:包含三个技术点
1)servlet技术
2)filter技术—过滤器
3)listener技术—监听器

实现步骤:
1)创建类实现Servlet接口
2)覆盖尚未实现的方法—service方法
3)在web.xml进行servlet的配置

但在实际开发中,不会直接去实现Servlet接口,因为那样需要覆盖的方法太多, 一般创建类继承HttpServlet
实现步骤:
1)创建类继承HttpServlet类
2)覆盖doGet和doPost
3)在web.xml中进行servlet的配置

Servlet的API(生命周期)

(1)Servlet接口中的方法

1)init(ServletConfig config)
何时执行:servlet对象创建的时候执行
ServletConfig : 代表的是该servlet对象的配置信息

2)service(ServletRequest request,ServletResponse response)
何时执行:每次请求都会执行
ServletRequest :代表请求 认为ServletRequest 内部封装的是 http请求的信息
ServletResponse :代表响应 认为要封装的是响应的信息

3)destroy()
何时执行:servlet销毁的时候执行

Servlet的生命周期
1)Servlet何时创建
默认第一次访问servlet时创建该对象
2)Servlet何时销毁
服务器关闭servlet就销毁了
3)每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法

ServletContext对象

ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,ServletContext对象一个web应用只有一个。(一个web应用有多个servlet对象)

ServletContext对象的生命周期?
创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状 态))
销毁:web应用被卸载(服务器关闭,移除该web应用)

获得ServletContext对象
1)ServletContext servletContext = config.getServletContext();
2)ServletContext servletContext = this.getServletContext();

ServletContext作用
获得web应用中任何资源的绝对路径
方法:String path = context.getRealPath(相对于该web应用的相对地址);

ServletContext是一个域对象
存储数据的区域就是域对象

ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享

域对象的通用的方法:
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);

在这里插入图片描述

HttpServletResponse

在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大

HTTP响应
在这里插入图片描述

因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体

  1. 通过response设置响应行
    设置响应行的状态码
    setStatus(int sc)

  2. 通过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表示设置

  1. 通过response设置响应体
    (1)响应体设置文本
    PrintWriter getWriter()
    获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览 器端。

关于设置中文的乱码问题
原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(String charset) 设置response的编码

但我们发现客户端还是不能正常显示文字
原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系 统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以 手动修改浏览器的编码是UTF-8。

我们还可以在代码中指定浏览器解析页面的编码方式,
通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8
response.setContentType(“text/html;charset=UTF-8”);

上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含setCharacterEncoding的功能,所以在实际开发中只要编写 response.setContentType(“text/html;charset=UTF-8”);就可以解决页面输出中文乱码问题。

(2)响应头设置字节
ServletOutputStream getOutputStream()
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

  1. 通过response重定向
    response.sendRedirect(location);

HttpServletRequest

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。

HTTP请求
在这里插入图片描述

因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请求头和请求体

  1. 通过request获得请求行
    获得客户端的请求方式:String getMethod()
    获得请求的资源:
    String getRequestURI()
    StringBuffer getRequestURL()
    String getContextPath() —web应用的名称
    String getQueryString() ---- get提交url地址后的参数字符串
    username=zhangsan&password=123

注意:request获得客户机(客户端)的一些信息
request.getRemoteAddr() — 获得访问的客户端IP地址

  1. 通过request获得请求头
    long getDateHeader(String name)
    String getHeader(String name)
    Enumeration getHeaderNames()
    Enumeration getHeaders(String name)
    int getIntHeader(String name)

referer头的作用:执行该此访问的的来源
做防盗链

  1. 通过request获得请求体
    请求体中的内容是通过post提交的请求参数,格式是:
    username=zhangsan&password=123&hobby=football&hobby=basketball
    key ---------------------- value
    username [zhangsan]
    password [123]
    hobby [football,basketball]

以上面参数为例,通过一下方法获得请求参数:
String getParameter(String name)
String[] getParameterValues(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()

  注意:get请求方式的请求参数 上述的方法一样可以获得

  解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");
  解决get提交的方式的乱码:
        parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
  1. request的其他功能
    (1)request是一个域对象
    request对象也是一个存储数据的区域对象,所以也具有如下方法:
    setAttribute(String name, Object o)
    getAttribute(String name)
    removeAttribute(String name)
    注意:request域的作用范围:一次请求中
    (2)request完成请求转发
    获得请求转发器----path是转发的地址
    RequestDispatcher getRequestDispatcher(String path)
    通过转发器对象转发
    requestDispathcer.forward(ServletRequest request, ServletResponse response)

ServletContext域与Request域的生命周期比较?
ServletContext:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用
request:
创建:访问时创建request
销毁:响应结束request销毁
域的作用范围:一次请求中

转发与重定向的区别?
1)重定向两次请求,转发一次请求
2)重定向地址栏的地址变化,转发地址不变
3)重新定向可以访问外部网站 转发只能访问内部资源
4)转发的性能要优于重定向

注意:客户端地址与服务器端地址的写法?
	客户端地址:
		是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名称
		
		直接输入地址
		重定向
		

	服务器端地址:
		服务器内部资源的跳转的地址,特点:不需要写web应用的名称

		转发
request获得行的内容
	request.getMethod()
	request.getRequestURI()
	request.getRequestURL()
	request.getContextPath()
	request.getRemoteAddr()
request获得头的内容
	request.getHeader(name)
request获得体(请求参数)
	String request.getParameter(name)
	Map<String,String[]> request.getParameterMap();
	String[] request.getParameterValues(name);
	注意:客户端发送的参数 到服务器端都是字符串

	获得中文乱码的解决:
		post:request.setCharacterEncoding(“UTF-8”);
		get:
parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”);

request转发和域
	request.getRequestDispatcher(转发的地址).forward(req,resp);
	request.setAttribute(name,value)
	request.getAttribute(name)```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值