Servlet技术__JavaWeb笔记

一、Servlet 概念

Servlet 是 JavaEE 规范之一,即接口。Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。可以通过 “请求 - 响应” 编程模式来访问这个驻留在服务器内存里面的 servlet 程序。

二、Servlet 简介

1.Servlet 的生命周期

在每个Servlet实例的生命中有三种类型的事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法:
  1.init()。 当Servlet第一次被装载时,Servlet引擎调用这个Servlet的init()方法,只调用一次。如果某个Sevlet需要特殊的初始化需要。那么Servlet编写人员可以重写该方法来执行初始化任务。这是一个可选的方法。如果某个Servlet不需要初始化,那么默认情况下将调用它父类的init方法。系统保证,在init方法成功完成以前,是不会调用Servlet去处理任何请求的。
  2.service()。 这是Servlet最重要的方法,是真正处理请求的地方。对于每个请求,Servlet引擎将调用Servlet的service方法,并把Servlet请求对象和Servlet响应对象最为参数传递给它。
  3.destroy()。 这是相对于init的可选方法,当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中所分配的资源。

Servlet的生命周期可以被归纳为以下几步:
  (1) 装载Servlet,这一项操作一般是动态执行的。然而,Servlet通常会提供一个管理的选项,用于在Servlet启动时强制装载和初始化特定的Servlet
  (2) Server创建一个Servlet实例
  (3) Server调用Servlet的init方法
  (4) 一个客户端请求到达Server
  (5) Server创建一个请求对象
  (6) Server创建一个响应对象
  (7) Server激活Servlet的service方法,传递请求和响应对象作为参数
  (8) service方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
  (9) service方法使用响应对象的方法。将响应传回Server,最终到达客户端。Service方法可能激活其他方法以处理请求。如doGet,doPost或其他程序员自己开发的方法
  (10) 对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此servlet的service方法,将这两个对象作为参数传递给它,如此重复以上的循环,但无需再次调用init方法,Servlet一般只初始化一次
  (11) 当Server不再需要Servlet时,比如当Server要关闭时,Server调用Servlet的destroy
  在这里插入图片描述

2.Servlet 工作过程

Web服务器在与客户端交互时.Servlet的工作过程是:

  1. 在客户端对web服务器发出请求

  2. web服务器接收到请求后将其发送给Servlet

  3. Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给WEB服务器.

  4. web服务器将从Servlet实例对象中收到的响应结构发送回客户端.

在这里插入图片描述

3.Servlet 九大内置对象

servlet 与 jsp 的内置对象的一一对应
在这里插入图片描述

4.Web 中的相对路径和绝对路径

在 javaWeb 中,路径分为相对路径和绝对路径两种:

相对路径

. 表示当前目录
… 表示上一级目录
资源名 表示当前目录/资源名

绝对路径

http://ip:port/工程路径/资源路径

在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。

5.web 中 / 斜杠的不同意义

在 web 中 / 斜杠 是一种绝对路径。

/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/

<a href="/">斜杠</a>

/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径

<url-pattern>/servlet1</url-pattern>
servletContext.getRealPath(/);
request.getRequestDispatcher(/);

特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/

三、Servlet 类的继承体系

在这里插入图片描述
一般在实际开发项目中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。编写一个类去继承 HttpServlet 类,根据业务需要重写 doGet 或 doPost 方法。

1. HttpServletRequest 类

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的
信息。

HttpServletRequest 类的常用方法
方法作用
getRequestURI()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径)
getRemoteHost()获取客户端的 ip 地址
getHeader()获取请求头
getParameter()获取请求的参数
getParameterValues()获取请求的参数(多个值的时候使用)
getMethod()获取请求的方式 GET 或 POST
setAttribute(key, value)设置域数据
getAttribute(key)获取域数据
getRequestDispatcher()获取请求转发对象

常用方法示例

public class RequestAPIServlet extends HttpServlet {

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws 	ServletException,IOException {
	
		// i.getRequestURI() 获取请求的资源路径
		System.out.println("URI => " + req.getRequestURI());
		// ii.getRequestURL() 获取请求的统一资源定位符(绝对路径)
		System.out.println("URL => " + req.getRequestURL());
		// iii.getRemoteHost() 获取客户端的 ip 地址
		/**
		* 在 IDEA 中,使用 localhost 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
		* 在 IDEA 中,使用 127.0.0.1 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
		* 在 IDEA 中,使用 真实 ip 访问时,得到的客户端 ip 地址是 ===>>> 真实的客户端 ip 地址<br/>
		*/
		System.out.println("客户端 ip 地址 => " + req.getRemoteHost());
		// iv.getHeader() 获取请求头
		System.out.println("请求头 User-Agent ==>> " + req.getHeader("User-Agent"));
		// vii.getMethod() 获取请求的方式 GET 或 POST
		System.out.println( "请求的方式 ==>> " + req.getMethod() );
	}
}
获取请求参数

使用getParameter()getParameterValues() 获取请求的参数。

表单:

<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="get">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="java">Java
<input type="checkbox" name="hobby" value="js">JavaScript<br/>
<input type="submit">
</form>
</body>

Java 代码:

public class ParameterServlet extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
		// 获取请求参数
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		String[] hobby = req.getParameterValues("hobby");
		System.out.println("用户名:" + username);
		System.out.println("密码:" + password);
		System.out.println("兴趣爱好:" + Arrays.asList(hobby));
	}
}
请求的中文乱码问题

doGet 请求的中文乱码解决:

// 获取请求参数
String username = req.getParameter("username");
//1 先以 iso8859-1 进行编码
//2 再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");

doPOST 请求的中文乱码解决

使用setCharacterEncoding()方法。

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {

	// 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
	req.setCharacterEncoding("UTF-8");
	
	
	// 获取请求参数
	String username = req.getParameter("username");
	String password = req.getParameter("password");
	String[] hobby = req.getParameterValues("hobby");
	System.out.println("用户名:" + username);
	System.out.println("密码:" + password);
	System.out.println("兴趣爱好:" + Arrays.asList(hobby));
}
请求的转发

请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
在这里插入图片描述

2. HttpServletResponse 类

HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse

往客户端回传数据

要求 : 往客户端回传 字符串 数据。

public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 要求 : 往客户端回传 字符串 数据。
PrintWriter writer = resp.getWriter();
writer.write("response's content!!!");
}
}
响应的乱码解决

使用setContentType()方法。

resp.setContentType("text/html; charset=UTF-8");
请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
在这里插入图片描述

使用sendRedirect()方法。

resp.sendRedirect("http://localhost:8080");

四、Servlet与JSP的区别

SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句非常不方便。 后来SUN推出了JSP,大大简化和方便了网页的设计和修改。

1、JSP在本质上就是Servlet,但是两者的创建方式不一样.

2、Servlet完全是Java代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不方便.

3.JSP由HTML代码和JSP标签构成,可以方便地编写动态网页.

因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值