3、Servlet
Servlet就是Sun公司推出的一款开发动态Web的一个开源技术。Servlet运行在服务器中,由服务器调用。他是运行在服务器中的Java程序,其作用是接收客户端的请求,并响应数据给客户端
,是浏览器的请求和服务器上的数据库之间的中间层。
它是 SUN 公司作为 CGI 技术的替代品而推出的技术,对开发动态网站需要使用的原生 Java API 进行了封装,形成了Servlet API,但是在编写HTML时很麻烦,所以Servlet通常配合JSP技术一起使用,JSP 对 Servlet 再次进行了封装,JSP 在经过编译后依然是 Servlet。
Servlet 是 Java 语言中编写 Web 服务器扩展功能的重要技术,同时它也是 JSP 技术的底层运行基础。学习 Java Web 开发,首先就要掌握 Servlet 技术,它是一套WEB开发的标准,常见的实现了 Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为“Servlet 容器”。
Servlet、Filter过滤器、Listener监听器是JavaWeb的三大组件。
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
Servlet项目命名规范:
1、包名规范:com.***.servlet
2、类名规范:****Servlet
3、web.xml文件中的servlet-name等配置和类名保持一致
<!-- servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!--支持jsp的依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!--EL表达式的扩展jstl-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--JSTL和EL表达式使用必须添加standard-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
3.1、三种实现方式
在Servlet中一个网页对应着一个Servlet的类,通过web.xml将URL路径和类相关联,访问一个动态网页的过程,实际上是将对应的 Servlet 类加载、实例化并调用相关方法的过程。
Servlet 最顶层是一个名为 javax.servlet.Servlet 的接口,所有的 Servlet 类都要直接或者间接地实现该接口。 Servlet 内置了两个 Servlet 的实现类(抽象类),分别为 GenericServlet 和 HttpServlet,因此,创建 Servlet 类有三种方式:
- 实现 javax.servlet.Servlet 接口,重写其全部方法。
- 继承 javax.servlet.GenericServlet 抽象类,重写 service() 方法。
- 继承 javax.servlet.http.HttpServlet 抽象类,重写 doGet() 或 doPost() 方法。
3.1.1 Servlet接口
Javax.servlet.Servlet接口,是 Servlet API 的核心接口,所有的 Servlet 类都直接或间接地实现了这一接口。
内部共用五个方法,其中主要的是service方法,Tomcat服务器会调用此方法进行请求和响应。比较繁琐,很少使用该方法创建 Servlet。
public class DemoServlet implements Servlet {
//servlet的初始化方法,实例被创建后,调用一次进行初始化
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
//返回 ServletConfig 对象,包含 Servlet 的初始化参数
@Override
public ServletConfig getServletConfig() {
return null;
}
//Tomcat会找到service方法进行操作,主要进行请求和响应
@Override
public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取请求的数据
//响应数据
PrintWriter out = response.getWriter(); //获取输出的流
out.print("");
}
//返回关于 Servlet 的信息,例如作者、版本、版权等
@Override
public String getServletInfo() {
return null;
}
//销毁方法
@Override
public void destroy() {
}
}
3.1.2 GenericServlet
GenericServlet抽象类实现了Servlet接口的4个方法,所以继承了GenericServlet后只需要重写service方法就可以了。其他操作和直接实现serlvet接口类似。
GenericServlet 是一个通用的 Servlet 类,并没有针对某种场景进行特殊处理,尤其是 HTTP 协议,我们必须手动分析和封装 HTTP 协议的请求信息和响应信息。
package com.cy.demo.servlet
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class Demo2Servlet extends GenericServlet {
//其他四个方法抽象类GenericServlet已实现,只需要重写service即可
@Override
public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException {
}
}
3.1.3 HttpServlet
正常使用的时候最多的数通过继承 javax.servlet.http.HttpServlet来实现Servlet程序,它用于开发基于 HTTP 协议的 Servlet 程序。
在 HTTP/1.1 协议中共定义了 7 种请求方式,即 GET、POST、HEAD、PUT、DELETE、TRACE 和 OPTIONS。HttpServlet 针对这 7 种请求方式分别定义了 7 种方法,即 doGet()、doPost()、doHead()、doPut()、doDelete()、doTrace() 和 doOptions()。我们使用的请求方式主要是 GET 和 POST,只需要重写 doGet 或者 doPost 方法。
这种方式重写了Servlet的五个方法,并且添加了doGet和doPost方法,内部没有抽象方法。HttpServlet内部分析了Http的传输协议,提供了更多的使用方法。
创建Servlet类:
继承关系:创建的类继承→HttpServlet继承→GenericServlet实现→Servlet接口
由Servlet的接口定义好访问的规范,GenericServlet实现Servlet接口,对其中的方法空实现,并对ServletConfig类做一些使用方法,HttpServlet继承了GenericServlet了,实现了service方法,并对请求进行分发处理增加了post和get方法。我们只需要跟需求重新doGet和doPost即可。
//继承HttpServlet类
public class Demo3Servlet extends HttpServlet {
//重写doGet,doPost方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf=8");
//获得响应的流
PrintWriter out = response.getWriter();
out.print("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response); //調用doPost,可以不用區分post和get隨便使用兩個該方法
}
}