Servlet

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

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

1.服务器编译环境

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

在编译servlet或javabean servlet编译环境和编译方法_ide

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

  1. 在项目名称上右键选择Open Module Settings
  2. 点击Dependencise
  3. 点击右边的加号,选择Library
  4. 点击Java选择你的服务器
  5. 应用

2. Servlet的入门案例

  1. 自定义Servlet继承HttpServle
  2. 重写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);
    }
}
  1. 在web.xml配置servle
    声明自定义Servlet
    给自定义Servlet配置访问名称
<!--3.配置Servlet-->
    <!--声明Servlet-->
    <servlet>
        <!--servlet的名称-->
        <servlet-name>Servlet</servlet-name>
        <!--servlet的全类名-->
        <servlet-class>com.kaka.servlet.Servlet</servlet-class>
    </servlet>
    <!--
        给Servlet设置访问名称
    -->
    <servlet-mapping>
        <!--servlet的名称-->
        <servlet-name>Servlet</servlet-name>
        <!--servlet的访问名称-->
        <url-pattern>/Demo01</url-pattern>
    </servlet-mapping>

打印输出Servlet doGet

3. Servlet的执行流程

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

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

步骤如下:

  1. 浏览器发起请求: http://localhost:8080/day50/Demo01
  2. 在服务器中找访问名称为Demo01的Servlet -> Servlet
  3. 请求的处理就交给了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协议

<servlet>
        <servlet-name>TestServlet03</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet03</servlet-name>
        <url-pattern>/Demo03</url-pattern>
    </servlet-mapping>
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协议

<servlet>
        <servlet-name>TestServlet02</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet02</servlet-name>
        <url-pattern>Demo02</url-pattern>
    </servlet-mapping>
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协议

<servlet>
        <servlet-name>TestServlet01</servlet-name>
        <servlet-class>com.kaka.test_01.servlet.TestServlet01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet01</servlet-name>
        <url-pattern>/Demo01</url-pattern>
    </servlet-mapping>
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协议调用方法;