1.Servlet
[1] Servlet简介
> Server + let
> 意为:运行在服务器端的小程序。
> Servlet实际上就是一个接口。
- 狭义上的Servlet,指的就是Servlet接口
- 广义上的我们认为凡是实现Servlet接口的类,我们都称他是一个Servlet *****
> Servlet的作用:
1.接收用户发送的请求
2.调用其他的java程序来处理请求
3.根据处理结果,返回给用户一个页面
> Servlet的HelloWorld
1.创建一个类并实现Servlet接口
2.在web.xml文件中对Servlet进行配置
<servlet>
<servlet-name>别名</servlet-name>
<servlet-class>全类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>别名</servlet-name>
<url-pattern>需要servlet处理的请求地址</url-pattern>
</servlet-mapping>
> Servlet的三个名字:
<servlet-name>
- Servlet的别名,程序员通过别名对Servlet进行配置
<servlet-class>
- Servlet的全类名,服务器通过全类名来创建Servlet的实例
<url-pattern>
- Servlet映射的请求地址,用户通过该地址访问Servlet
[2] Servlet的生命周期
> Servlet的生命周期,指Servlet的对象从被创建到被销毁的过程。
> Servlet的生命周期方法:
1.构造器:
- Servlet第一次处理请求时,会调用构造器,来创建Servlet实例。
- 只会调用一次,Servlet是单例模式,他是以多线程的方式调用service()方法.
- Servlet不是线程安全,所以尽量不要再service()方法中操作全局变量。
2.init()方法:
- 构造器调用之后马上被调用,用来初始化Servlet,只会调用一次。
3.service()方法:
- Servlet每次处理请求时都会调用service()方法,用来处理请求,会调用多次。
4.destroy()方法:
- Servlet对象销毁前(WEB项目卸载时)调用,用来做一些收尾工作,释放资源。
[3] 相关接口
①ServletConfig
代表:当前Servlet的配置信息,每一个Servlet都有其唯一对应的ServletConfig。
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.atguigu.servlet.AServlet</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123123</param-value>
</init-param>
</servlet>
获取:由Tomcat服务器创建,最终作为参数传递到init()方法中,我们可以在init()方法直接使用。
当我们通过继承HttpServlet创建Servlet时,由于父类已经实现ServletConfig接口,
所以我们可以在Servlet中直接调用ServletConfig的方法。
功能:
【1】 获取Servlet的别名
【2】 获取当前Servlet的初始化参数。
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123123</param-value>
</init-param>
【3】 获取当前WEB应用的ServletContext对象。
②ServletContext
代表:当前的WEB应用,一个WEB应用对应一个唯一的ServletContext对象,
ServletContext对象在项目启动时创建,在项目卸载时销毁。
获取:通过ServletConfig的getServletContext()方法获取。
功能:
【1】 可以获取整个WEB应用的初始化参数
<context-param>
<param-name>phone</param-name>
<param-value>1388888888</param-value>
</context-param>
【2】 可以获取资源的真实路径(物理路径),主要在文件的上传和下载时使用。
【3】 可以作为一个域对象在不同的web资源之间共享数据。(下回分解)
[4] GenericServlet
- 通用Servlet的父类
- 相比Servlet接口GenericServlet更加简单一些,但是我们最终实际上使用的HttpServlet
[5] HttpServlet
- HttpServlet继承了GenericServlet,而GenericServlet实现Servlet接口
- 所以我们可以同构继承HttpServlet来创建一个Servlet。
- HttpServlet重写service()方法:
1.在该方法中先将ServletRequest和ServletResponse
强转为了HttpServletRequest和HttpServletResponse。
2.然调用重载的service()方法,并将刚刚强转得到对象传递到重载的方法中。
- 重载service(HttpServletRequest request , HttpServletResponse response)
1.在方法中获取请求的方式(get或post)
2.在根据不同的请求方式去调用不同的方法:
如果是GET请求,则调用doGet(HttpServletRequest request , HttpServletResponse response)
如果是post请求,则调用doPost(HttpServletRequest request , HttpServletResponse response)
- 结论:
当通过继承HttpServlet来创建一个Servlet时,我们只需要根据要处理的请求的类型,来重写不同的方法。
处理get请求,则重写doGet()
处理post请求,则重写doPost()
[6] HttpServletRequest
代表:浏览器发送给服务器的请求报文。
获取:该对象由Tomcat服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用。
功能:
【1】获取用户发送的请求参数
request.getParameter("username");
【2】获取项目的名字(用来设置绝对路径)
request.getContextPath();
【3】作为一个域对象,在不同的WEB资源之间共享数据。
【4】请求的转发
request.getRequestDispatcher("target.html").forward(request, response);
[7] HttpServletResponse
代表:服务器发送给浏览器的响应报文。
获取:该对象由Tomcat服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用。
功能:
【1】响应给浏览器一个网页或者是网页片段(设置的是响应报文的响应体)
response.getWriter("");
【2】请求的重定向
response.sendRedirect("target.html");
转发和重定向:(掌握)
转发 重定向
请求的次数: 1 2
发生的位置 服务器内部 浏览器
浏览器地址栏 不改变 改变
浏览器的感知 不知道 知道
[8] 字符编码
> 当用户通过表单向Servlet发送中文请求参数时,Servlet获取到内容会产生乱码,
当Servlet向浏览器响应中文内容时,也会产生乱码。
> 浏览器和服务器之间通信时,中文内容时不能直接发送的,需要对中文进行编码。
> 编码:
- 将字符转换为二进制码的过程叫编码。
> 解码:
- 将二进制码转换为普通字符的过程叫解码。
> 编码和解码所采用的规则我们称为字符集。
> 产生乱码问题的根本原因:
编码和解码所采用的字符集不同。
> 解决方法:
统一编码和解码的字符集为UTF-8。
> 常见字符集:
1.ASCII
2.ISO8859-1
3.GBK
4.GB2312
5.UTF-8
> 请求编码
- 请求是浏览器发送给服务器的。
- 浏览器 --> 服务器
- 浏览器 编码
> 浏览器的会自动使用网页的字符集对参数进行编码
UTF-8的张三:%E5%BC%A0%E4%B8%89
GBK的张三:%D5%C5%C8%FD
> 所以我们只需要统一网页的字符集为UTF-8即可。
- 服务器 解码
post请求
> request解码时默认字符集时iso8859-1,但是iso压根就不支持中文
> post请求在servlet中解码,所以我们只需要指定request的字符集即可。
> 我们可以通过如下方法,来设置request的字符集:
request.setCharacterEncoding("utf-8");
> 注意:
该方法要在request.getParameter()第一次调用之前调用
get请求
> get请求是通过url地址传递请求参数,url中的请求参数将会被Tomcat服务器自动解码。
> Tomcat的默认编码是iso8859-1,但是iso压根就不支持中文,所以必然乱码。
> 只需要修改Tomcat的解码的默认字符集,修改配置文件server.xml
> 在server.xml的Connector标签中(改端口号的那个标签)添加如下属性:
URIEncoding="utf-8"
> 修改完配置文件以后,get请求的编码就不用再处理的,但是post请求还是老样子。
> 响应编码
- 响应是服务器发送给浏览器
- 服务器 --> 浏览器
- 服务器 编码
> 指定服务器的编码字符集为UTF-8。
> 指定response的字符集
response.setCharacterEncoding("utf-8");
> 虽然我们已经指定了response的字符集为utf-8,但是浏览器并不是用utf-8解码。
浏览器默认使用gb2312解码的,所以依然乱码,只不过没有那么乱。
- 浏览器 解码
> 浏览器的解码字符集可以通过浏览器来设置(不靠谱)
> 我们可以通过服务器来告诉浏览器,我们的内容的编码格式为utf-8
> 我们可以通过一个响应头来告诉浏览器,内容的编码格式:
Content-Type:text/html;charset=utf-8
> 通过response的方法,来设置响应头:
response.setHeader("Content-Type", "text/html;charset=utf-8");
解决方案:
1.设置响应头
response.setHeader("Content-Type", "text/html;charset=utf-8");
2.设置response的编码格式
response.setCharacterEncoding("utf-8");
> 当我们设置Content-Type这个响应头时,服务器会自动使用响应头中的字符集为内容编码。
> 最终方案:
response.setContentType("text/html;charset=utf-8");
总结:
post请求:
- 在request.getParameter()方法第一次调用之前,调用如下代码:
request.setCharacterEncoding("utf-8");
get请求:
- 修改server.xml配置文件
- <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
响应:
- 设置一个Content-Type响应头
response.setContentType("text/html;charset=utf-8");
[9] 路径问题
> URI和URL
- URL是URI的一种实现,也是URI最常见的实现方式。
- URI有两种实现方式URL和URN,URN用的很少
- 我们说URL和URI实际上可以理解为一个意思
> URL地址的格式
http://主机名:端口号/项目名/资源路径/资源名
①相对路径和绝对路径
> 相对路径
- 之前我们使用的路径全都是相对路径:
- 所谓的相对路径指相对于当前资源所在路径:
http://主机名:端口号/项目名/资源路径/
- 由于转发的出现,相对路径会经常发生变化,容易出现错误的链接
所以在开发中我们一般不使用相对路径,而是使用绝对路径。
> 绝对路径
- 绝对路径使用/开头
- 由浏览器解析的绝对路径中的/代表的是服务器的根目录:
http://主机名:端口号/
注意:需要加上项目名
- 由服务器解析的绝对路径中的/代表的项目的根目录:
http://主机名:端口号/项目名/
注意:不要加项目名
- 转发的路径由服务器解析,设置绝对路径时不需要加项目名
- 重定向的路径由浏览器解析,设置绝对路径时需要加上项目名
②常见的路径:
url-pattern:
转发的路径:
- url-pattern和转发中的路径都是由服务器解析的,
根目录是项目的根目录:
http://主机名:端口号/项目名/
- 所以这两个路径不需要加项目名
重定向的路径:
页面中的路径:
- 重定向和页面中的路径(HTML标签中的路径),由浏览器解析的,
根目录是服务器的根目录:
http://主机名:端口号/
- 所以这个两个路径必须加上项目名
[10]运行的流程

[11]HttpServlet

转载请注明出处!
http://www.cnblogs.com/libingbin/
感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。
- 【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期
一.Servlet简介 1.Servlet定义: Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交 ...
- JavaEE:Servlet简介及ServletConfig、ServletContext
Servlet简介 1.Servlet是sun公司提供的一门用于开发动态web资源的技术*静态web资源:固定数据文件*动态web资源:通过程序动态生成数据文件2.Servlet技术基于Request ...
- Servlet学习笔记【1】--- 背景和基础知识(CGI、Web服务器发展史、Servlet简介、任务、继承结构)
本文主要讲Servlet的基础知识和背景知识. 1 CGI简介 CGI(Common Gateway Interface 公共网关接口)是WWW技术中最重要的技术之一,有着不可替代的重要地位.CGI是 ...
- Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解
Servlet基础(一) Servlet基础和关键的API介绍 Servlet简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中. Servlet容器负责Servl ...
- Servlet简介及使用
javaweb学习总结(五)——Servlet开发(一) 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口 ...
- 1.1(学习笔记)Servlet简介及一个简单的实例
一.Servlet简介 Servlet是使用Java语言编写的服务器端程序,可以生产动态的Web界面. 主要运行在服务器端,Servlet可以方便的处理客户端传来的HTTP请求,并返回一个响应. 二. ...
- 二:Servlet简介
一.Servlet简介 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是 ...
- servlet简介及生命周期
Servlet 简介 Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上 ...
- (一)Servlet简介
相关名词解释 HTML:Hyper Text Markup Language,超文本标记语言 HTTP:Hyper Text Transfer Protocol,超文本传输协议 URL:Uniform ...
随机推荐
- C语言学习009:管道连接输入输出
现在我们需要对gpsdata.csv文件中的数据进行筛选,然后将符合条件的数据输出到output.json文件中,第一种方式当然是在之前的代码中进行修改,但是如果我们不想修改原来的代码就能得到我们期望 ...
- GitHub简单教程
Hello World程序是计算机编程中由来已久的惯例,这是一个当你在学习新事物的时候开始的一个简单的小练习.让我们开始GitHub的"Hello World". 你将学会: - ...
- 重写onStart()函数
Android开发中有时会遇到这种情况,在数据列表的Activity中点击添加按钮,弹出另一个Activity添加数据,这样返回数据列表的Activity时就需要刷新数据列表(因为添加了一条数据).这 ...
- Note: This element neither has attached source nor attached Javadoc and hence no Javadoc could be found.
在Eclipse中开发Android项目时,鼠标停放在想要查看帮助文档的类上面,发现没有显示帮助文档,显示了下面一句话: Note: This element neither has attached ...
- objective-c IOS应用更新
当前苹果已经禁止了,通过IOS应用直接跳转APP下载链接的方法.但是仍然可以使用另外一种方法直接跳转AppStore. 这种方法需要增加一个类库StoreKit.framework. 这里使用这功能是 ...
- jquery easyui 弹出消息框 (转载) jQuery EasyUI API 中文文档 - 消息框(Messager) http://www.cnblogs.com/hantianwei/archive/2012/03/19/2407113.html
<html> <head> <!-- 导入easyui插件的js和css样式; --> <link rel="stylesheet" ty ...
- cnodejs社区论坛1--登陆
- GJM : Unity3D - NetWork - Hight Level API ( HLAPI) [转载]
介绍在本系列教程中,我们将使用的网络高级API(HLAPI)来构建一个小型的多人网络案例.即使我们的例子很简单,但也会涵盖以下关键概念,这应该可以帮助大家使用HLAPI构建大型游戏项目. 在第一部分, ...
- Hibernate(九)__OpenSessionInView解决懒加载问题
什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关 ...
- 04Mybatis_搭建Mybatis的开发环境
第一步:导jia包: 1.导入Mybatis的核心jia包: