Servlet的环境及实现Servlet的三种方式

法国女足世界杯 4856

Servlet

传统的Java代码无法获取请求参数,只有使用Java程序中的Servlet技术才可以获取,但是需要服务器编译环境的支持;

Servlet就是一个Java程序,一个Java类;可以和浏览器进行交互,是一个动态资源;Servlet的使用需要有服务器编译环境的支持需要导入Servlet的API;

1.服务器编译环境

Extenal Libaries中必须要有服务器的jar包,如下图:

当前工程配置web服务器的编译环境:

在项目名称上右键选择Open Module Settings

点击Dependencise

点击右边的加号,选择Library

点击Java选择你的服务器

应用

2. Servlet的入门案例

自定义Servlet继承HttpServle

重写doGet方法和doPost方法

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

//1.自定义类继承HttpServlet

public class Servlet extends HttpServlet {

//2.重写doGet和doPost方法

//在doget中调用doPost方法

//处理get请求

@Override

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

System.out.println("Servlet doGet");

}

//处理post请求

@Override

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

doGet(req, resp);

}

}

在web.xml配置servle

声明自定义Servlet

给自定义Servlet配置访问名称

Servlet

com.kaka.servlet.Servlet

Servlet

/Demo01

打印输出Servlet doGet

3. Servlet的执行流程

HttpServlet继承于GenericServlet、GenericServlet实现于Servlet,也就是说Servlet是顶层接口;

在Servlet接口中定义了一个方法service,它的主要作用是处理来自浏览器的请求操作。在service方法的重载的方法中,对请求方式进行判断,如果是GET就会调用doGet方法,如果是POST就会调用doPost方法。

步骤如下:

浏览器发起请求: http://localhost:8080/day50/Demo01

在服务器中找访问名称为Demo01的Servlet -> Servlet

请求的处理就交给了Servlet的实例,根据请求方式get/post,决定是给doGet还是doPost方法

注意:

不管是get请求还是post请求,对于服务器来说是没差别的;

get请求将请求参数放到请求网址;

post请求将请求参数放到请求正文;

不管哪种方法服务器最终都是通过getParameter()方法来获取请求参数的;

4. 实现Servlet的三种方式

Servlet是一个运行在服务器上java动态资源。Sun对于servlet定义,就是一个javax.servlet.Servlet接口;

创建Servlet的三种方式:

方式一:实现Servlet接口

在servlet接口中,没有doGet和doPost方法,处理请求是service方法(抽象的),没有针对Http协议;

TestServlet03

com.kaka.test_01.servlet.TestServlet03

TestServlet03

/Demo03

public class TestServlet03 implements Servlet{

@Override

public void init(ServletConfig servletConfig) throws ServletException {

}

@Override

public ServletConfig getServletConfig() {

return null;

}

@Override

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

System.out.println("实现Servlet接口");

//想要针对HTTP需要手动强转

HttpServletRequest request = (HttpServletRequest) servletRequest;

HttpServletResponse response = (HttpServletResponse) servletResponse;

}

@Override

public String getServletInfo() {

return null;

}

@Override

public void destroy() {

}

}

方式二:继承GenericServlet类

在GenericServlet类中,没有doGet和doPost方法,处理请求是service方法(抽象的),没有针对Http协议;

TestServlet02

com.kaka.test_01.servlet.TestServlet02

TestServlet02

Demo02

public class TestServlet02 extends GenericServlet {

@Override

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

System.out.println("继承GenericServlet");

//想要针对HTTP需要手动强转

HttpServletRequest request = (HttpServletRequest) servletRequest;

HttpServletResponse response = (HttpServletResponse) servletResponse;

}

}

方式三:继承HttpServlet类

在HttpServlet中,重写GenricServlet类中的service方法,会由GenericServlet给service方法提供请求对象(ServletRequest)、响应对象(ServletResponse),不针对Http协议!!所以需要强转成HttpServletRequest、HttpServletResponse,之后调用另外一个service方法,传入HttpServletRequest、HttpServletResponse;

​ 获取到请求方式,如果是get请求,就调用doGet方法,如果是post请求,就调用doPost方法;

在开发中,应用比较多的是使用extends HttpServlet,优点是它是与http协议相关的,封装了http协议相关的操作也就是针对http协议有优化,有针对Http协议;

TestServlet01

com.kaka.test_01.servlet.TestServlet01

TestServlet01

/Demo01

public class TestServlet01 extends HttpServlet {

@Override

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

System.out.println("继承HTTPServlet");

}

@Override

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

doGet(req,resp);

}

}

将ServletRequest和ServletResponse分别强转为HttpServletRequest和HttpServletResponse,因为HttpServletRequest和HttpServletResponse有针对http协议做优化,ServletRequest和ServletResponse没有针对Http协议做优化无法专门针对http协议调用方法;