学习笔记六(Servlet)

servlet简介

为什么需要Servlet?
点击链接显示页面的全过程:
在这里插入图片描述
什么是servlet?
Servlet(Server Applet)作为服务器端的一个组件,本意是服务器端的小程序。
理解:
Servlet = java + html(url)

Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口:
狭义:javax.servlet.Servlet接口及其子接口
广义:指实现了Servlet接口的实现类

servlet接口的使用:

对象由Servlet容器创建(web服务器(Tomcat)也称为servlet容器)。(为了让开发者可以专注于逻辑层面,后面很多的对象都是通过框架或容器创建的。)

Servlet作为服务器端的一个组件,它的本意是“服务器端的小程序”。
Servlet的实例对象由Servlet容器负责创建;Servlet的方法由容器在特定情况下调用;Servlet容器会在Web应用卸载时销毁Servlet对象的实例。

使用Servlet接口的方式
1、创建一个类实现Servlet接口
2、在web.xml中“注册”这个实现类
3、Tomcat(Servlet容器)会创建实现类对象(通过反射)
具体如下:
1、创建javax.servlet.Servlet接口的实现类:MyFirstServlet
2、在service(ServletRequest, ServletResponse)方法中编写如下代码,输出响应信息:

@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		//1.编写输出语句,证明当前方法被调用
		System.out.println("Servlet worked...");
		//2.通过PrintWriter对象向浏览器端发送响应信息
		PrintWriter writer = res.getWriter();
		writer.write("Servlet response");
		writer.close();
	}

3、在web.xml配置文件中注册MyFirstServlet

<!-- 声明一个Servlet -->
<servlet>
   <!-- 为Servlet指定一个名称,以便于引用 -->
   <servlet-name>MyFirstServlet</servlet-name>
   <!-- 注册Servlet实现类的全类名 -->
   <servlet-class>com.atguigu.servlet.MyFirstServlet</servlet-class>
</servlet>

<!-- 建立一个从虚拟路径到Servlet之间的映射关系 -->
<servlet-mapping>
   <!-- 引用Servlet名称 -->
   <servlet-name>MyFirstServlet</servlet-name>
   <!-- 映射到Servlet的虚拟路径:“/MyFirstServlet” -->
   <url-pattern>/MyFirstServlet</url-pattern>
</servlet-mapping>

4、在WebContent目录下创建index.html
5、在index.html中加入超链接
< a href=“MyFirstServlet”>To Servlet< /a>
6、点击超链接测试Servlet

Servlet工作原理(执行流程)
1、请求
2、web.xml中url
3、servlet-name -> servlet-class -> 找到指定Servlet
4、默认执行service(),处理请求,做出响应。

浏览器端发送请求,定位到web.xml中的servlet的url,通过servlet-name得到servlet-class(全类名),找到指定的Servlet(这一步是使用servlet-class反射得到的),最后默认执行service(),处理请求作出响应。
在这里插入图片描述
在这里插入图片描述

Servlet生命周期:从创建到消亡的过程

Servlet对象是Servlet容器创建的,生命周期方法都是由容器调用的。

Servlet生命周期的主要过程

①Servlet对象的创建
默认情况下,Servlet容器第一次收到HTTP请求时创建对应Servlet对象。容器之所以能做到这一点是由于我们在注册Servlet时提供了全类名,容器使用反射技术创建了Servlet的对象。
②Servlet对象初始化
●Servlet容器创建Servlet对象之后,会调用init(ServletConfig config)方法,对其进行初始化。在javax.servlet.Servlet接口中,public void init(ServletConfig config)方法要求容器将ServletConfig的实例对象传入,这也是我们获取ServletConfig的实例对象的根本方法。
③处理请求
●在javax.servlet.Servlet接口中,定义了service(ServletRequest req, ServletResponse res)方法处理HTTP请求,同时要求容器将ServletRequest对象和ServletResponse对象传入。
④Servlet对象销毁
●服务器重启或服务器停止执行时会销毁Servlet对象,而销毁之前为了执行一些诸如释放缓存、关闭连接、保存数据等操作,所以设计了public void destroy()方法。

总结如下:

* 构造器
	* 执行次数:在整个生命周期中执行一次。
	* 执行时机:第一次接收HTTP请求时执行
* init():初始化
	* 执行次数:在整个生命周期中执行一次。
	* 执行时机:第一次接收请求时执行
* service()
	* 执行次数:在整个生命周期中执行多次。
	* 执行时机:每次接收请求时执行
* destroy()
	* 执行次数:在整个生命周期中执行一次。
	* 执行时机:关闭服务器时执行

ServeltConfig与ServletContext区别

ServletConfig接口封装了Servlet配置信息,这一点从接口的名称上就能够看出来。但同时,代表当前Web应用的ServletContext对象也封装到了ServletConfig对象中,使ServletConfig对象成为了获取ServletContext对象的一座桥梁。
1、ServeltConfig对象的主要作用:
①获取当前Servlet的名称
②获取当前Servlet的初始化参数(只能是当前的Servlet才能获取, 其他Servlet不能得到)
③获取ServletContext对象

Web容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用——作用很像餐厅的经理。一个Web应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象也被称为 application 对象(Web应用程序对象)。在应用程序中能够获取运行环境或容器信息的对象通常称之为“上下文对象”,因此也称为上下文对象。
2、ServletContext对象的只要功能:
①获取当前Web应用的初始化参数(web.xml中注册的所有的Servlet 都可以获取)
②获取服务器端资源的真实路径(文件的上传下载时需要用到)
③它是一个域对象(后面讲解)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获取ServletContext对象
		ServletContext context = this.getServletContext();
		//获取初始化参数
		String paramValue = context.getInitParameter("ParamName");
		//2.获取index.html的本地路径
		//index.html的虚拟路径是“/index.html”,其中“/”表示当前Web应用的根目录,
		//即WebContent目录
		String realPath = context.getRealPath("/index.html");
		//realPath=D:\DevWorkSpace\MyWorkSpace\.metadata\.plugins\
		//org.eclipse.wst.server.core\tmp0\wtpwebapps\MyServlet\index.html
		System.out.println("realPath="+realPath);
	}

虚拟路径:浏览器访问Web应用中资源时所使用的路径。
本地路径:资源在文件系统中的实际保存路径。

HttpServlet类

继承HttpServlet类,也称之为Servlet。
继承于HttpServlet的类会自动的在web.xml中注册相应的servlet,不用自己去注册。
EndServlet : HttpServlet : GenericServlet : Servlet(继承关系。最后GenericServlet实现了Servlet接口)

当请求过来的时候,服务器先发送给service(),在由service()发送给doGet()或doPost()。

  • HttpServlet
    1. override service()(重写了service)
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
    1. overload service()(重载了service)
String method = request.getMethod();
if(method.eq("GET")){
		doGet();
	}else if(method.eq("POST")){
		doPost();
	}
  • GenericServlet
  1. getServletConfig() getServletContext()
  2. abstract service()

请求的转发与重定向

请求:客户端向服务器

类型: HttpServletRequest request
定义:代表了客户端向服务器发送的请求报文,该对象由服务器(web容器|Servlet容器)创建,同时发送给Service(),Service()发送给doGet()或doPost()。
作用
1、获取请求参数

  • request.getParameter(“username”);
  • request.getParameterValues(name)

2、获取项目的虚拟路径

  • request.getContextPath();

3、转发(路径跳转)

  • request.getRequestDispatcher("").forward(request, response);

4、域对象(四个,后面再说)

响应:服务器向客户端

类型: HttpServletResponse response
定义:代表了服务器向客户端发送的响应报文,该对象由服务器(web容器|Servlet容器)创建,同时发送给Service(),Service()发送给doGet()或doPost()。
作用
1、服务器向客户端做出响应(文本|html)

  • response.getWriter();
  • write();|print();

2、 重定向(路径跳转)

  • response.sendRedirect();

转发与重定向

请求的转发与重定向是Servlet控制页面跳转的主要方法。
请求的转发:
Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部“转发”给其他Servlet程序继续处理。在这种情况下浏览器端只发出了一次请求,浏览器地址栏不会发生变化,用户也感知不到请求被转发了。转发请求的Servlet和目标Servlet共享同一个request对象。

//1.使用RequestDispatcher对象封装目标资源的虚拟路径
RequestDispatcher dispatcher = request.getRequestDispatcher("/index.html");
//2.调用RequestDispatcher对象的forward()方法“前往”目标资源
//[注意:传入的参数必须是传递给当前Servlet的service方法的
//那两个ServletRequest和ServletResponse对象]
dispatcher.forward(request, response);

请求的重定向:
Servlet接收到浏览器端请求并处理完成后,给浏览器端一个特殊的响应,这个特殊的响应要求浏览器去请求一个新的资源,整个过程中浏览器端会发出两次请求,且浏览器地址栏会改变为新资源的地址。重定向的情况下,原Servlet和目标资源之间就不能共享请求域数据了。

//1.调用HttpServletResponse对象的sendRedirect()方法
//2.传入的参数是目标资源的虚拟路径
response.sendRedirect("index.html");

转发与重定向的区别:
在这里插入图片描述

1、转发地址栏不变,重定向地址栏改变。
2、转发客户端发送一次请求,重定向客户端发送两次请求。
3、转发可以访问WEB-INF下资源,重定向不能。因为WEB-INF目录属于Web应用的私有目录(客户端无法直接访问)
4、转发可以携带request对象,重定向不能。
在这里插入图片描述

Web应用中路径问题

在请求转发模式下,超链接地址如果使用相对路径,以自身为基准,会导致浏览器URL地址解析错误,所以应避免使用相对路径。

什么是绝对路径:以“/”开头的路径,称之为绝对路径。
“/”代表意思
1、由服务器解析,代表着当前项目路径:http://localhost:8080/day06_servletdemo2

  • 以下两种情况由服务器解析
    1. web.xml中的url
    2. 请求转发中的地址

2、由浏览器解析,代表着当前服务器路径:http://localhost:8080

  • 以下两种情况由浏览器解析
    1. html中的路径,eg:src:script|img href:link|a action:form
    2. 重定向中的地址

浏览器中常使用<.base >标签作为基准,后面的路径都是基于base的路径,可以写相对路径,可以避免大量的代码。
如:

<base href = "/day06_servletdemo2/">

Web应用中乱码问题

编码:将字符转换为二进制的过程称之为编码
解码:将二进制转换为字符的过程称之为解码

乱码:编码与解码不一致时,出现乱码现在

  • 请求乱码:客户端编码与服务器解码不一致
  • 响应乱码:服务器编码与客户端解码不一致

默认客户端与服务器端编码与解码请情况

  • 服务器的编码与解码默认一致为:ISO-8859-1
  • 客户端(浏览器)
    • 编码默认为:< meta charset=“UTF-8”>(这个是当时编写HTML文件时指定的)
    • 解码默认为:GBK

解决web中乱码问题
1、请求乱码

  • POST请求:request.setCharacterEncoding(“UTF-8”);(需要注意的是,这个操作一定要在调用getParameter()方法之前进行)
  • GET请求:server.xml中修改,URIEncoding=“UTF-8”(GET请求是在URL地址栏中传递请求参数的,它会被Tomcat服务器自动解码,而Tomcat服务器默认的字符集也是ISO-8859-1)
    • eg:< Connector port=“8080” URIEncoding=“UTF-8”/>

2、响应乱码
①直接将服务器编码设置为GBK

  • response.setCharacterEncoding(“GBK”);

②将服务器编码与浏览器解码设置为UTF-8

  • response.setContentType(“text/html;charset=UTF-8”);

注:Tomcat8.0之前默认编码为:ISO-8859-1
Tomcat8.0之后(含8.0)默认编码为:UTF-8

交互方式分析

基本原理:
在这里插入图片描述
URL地址构成

在这里插入图片描述
查找过程
①根据主机地址找到一个具体的服务器
②根据Web应用虚拟路径找到Web应用
③根据Web应用下资源的虚拟路径访问具体资源
[1]如果资源是静态的,那么Tomcat会返回资源本身
[2]如果资源是动态的,例如Servlet,那么Tomcat会先执行Servlet程序,返回Servlet程序的运行结果
④无论访问的目标资源是不是静态的,浏览器最终得到的都是静态数据:图片或字符串。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值