Servlet(1) Servlet的简介和配置

1 Servlet简介和配置

1.1 Servlet的简介

Servlet是JavaWeb三大组件之一,Servlet是JavaEE规范之一,规范就是接口,Servlet就是运行在服务器上的一个Java程序可以通过HTTP协议接收客户端发送来的请求,并回传给客户端

JavaWeb三大组件
	Servlet程序 Filter过滤器 Listener监听器

在Web程序中,前端的界面负责与用户交互,而后台用来处理逻辑和数据,可以通过Servlet将前端的数据传给后台

回看HTML的form标签:

<form action="" method="">
	<input type="text" name="userName">
	<input type="password" name="password">
	<input type="submit">
</form>

action:
	填写处理该表单数据的Servlet程序
	不同的表单就是不同的业务由不同的Servlet程序处理
	
method:
	可以选择get或post

form标签用来传递数据,将用户输入的数据通过Servlet传递到后台进行逻辑处理,一个Web工程有多个页面,多个form标签,负责登录,注册,搜索等等功能,当用户通过form标签提交数据后,不同的form标签由不同的Servlet程序负责处理

1.2 创建Servlet程序

创建Servlet程序前,需要先创建一个Web工程,Web工程的创建方式有两种

方式1,创建普通Java工程,通过add Framework support的形式
方式2,创建Java Enterpise工程

通过方式1的形式创建的Web工程,在使用有关Servlet的API前,需要将servlet-api.jar文件导入到工程中,这个jar文件就在Tomcat的lib目录下

在WEB-INF目录下创建一个lib目录将servlet-api.jar粘贴到此,并通过add as Library的方式添加方可使用有关Servlet的API

通过方式2的形式创建的Web工程,配置好Maven后可以直接使用

1.2.1 实现Servlet接口

通过实现Servlet接口创建Servlet程序的步骤

1,编写一个Servlet接口的实现类

2,实现service方法,分类处理get和post请求

3,在web.xml文件中配置此Servlet程序

实现Servlet接口并实现需要的方法:

/**
 * @author 雫
 * @date 2021/4/24 - 12:55
 * @function 实现Servlet接口来创建Servlet程序
 */
public class MyServlet implements Servlet {

    public MyServlet() {
        System.out.println("无参构造生成Servlet实例");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("Servlet实例初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

	// 处理来自客户端的请求
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("MyServlet被访问");

        // 为了能得知是get请求还是post请求 需要区分本次请求是哪种类型 HttpServletRequest有着getMethod()方法
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

        // 获取请求的方式 是GET或POST
        String requestType = httpServletRequest.getMethod();
        if("GET".equals(requestType)) {
            System.out.println("执行get请求的方法");
            doGet();
        } else {
            System.out.println("执行post请求的方法");
            doPost();
        }

    }

    // 执行get请求的操作
    private void doGet() {}

    // 执行post请求的操作
    private void doPost() {}

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("Servlet实例被销毁");
    }

}

在web.xml文件中配置该Servlet程序:

    <!-- servlet标签给Tomcat配置servlet程序 -->
    <servlet>
        <!-- 给servlet程序起一个别名 一般为类名 -->
        <servlet-name>MyServlet</servlet-name>
        <!-- 给出servlet程序所在的类全名 -->
        <servlet-class>com.coisini.servlet.MyServlet</servlet-class>
    </servlet>

    <!-- 给servlet程序配置一个访问地址 -->
    <servlet-mapping>
        <!-- 告诉服务器当前配置的地址给哪个servlet程序使用 -->
        <servlet-name>MyServlet</servlet-name>
        <!-- 配置访问地址
           这里的 / 就是工程路径 需要和Tomcat配置的虚拟路径相同
           在浏览器中输入localhost:8080/MyServlet
           就可以访问到MyServlet程序
         -->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

1.2.2 继承HttpServlet类

实现接口过于麻烦,且Servlet接口中的service方法不能区分get和post请求,还需要自己进行处理,所以一般不采用

通过继承HttpServlet类来创建Servlet程序的步骤:

1,编写一个类,继承HttpServlet类

2,根据业务需求,重写doGet和doPost中的方法

3,在web.xml文件中配置此Servlet程序

继承HttpServlet类并重写doGet和doPost方法:

/**
 * @author 雫
 * @date 2021/4/24 - 14:12
 * @function
 */
public class MyServlet2 extends HttpServlet {

    // get请求时被调用
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);

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

    // post请求时被调用
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);

        System.out.println("doPost");
    }

}

在web.xml文件中配置此Servlet程序:

    <servlet>
        <servlet-name>MyServlet2</servlet-name>
        <servlet-class>com.coisini.servlet.MyServlet2</servlet-class>
    </servlet>


    <servlet-mapping>
        <servlet-name>MyServlet2</servlet-name>
        <url-pattern>/MyServlet2</url-pattern>
    </servlet-mapping>

1.2.3 IDEA快速生成

在IDEA中可以快速生成Servlet类,只需要在web.xml文件中完善Servlet程序的配置即可

1,src-> 右键 -> new -> create new Servlet 
		-> 配置ServletName Package ServletClass
        	-> 取消注解 -> ok 
        		-> web.xml中配置<servlet-mapping> 配置地址

使用IDEA快速生成Servlet程序的过程:
在这里插入图片描述
在这里插入图片描述
生成的Servlet程序:

/**
 * @author 雫
 * @date 2021/4/24 - 14:39
 * @function
 */
public class MyServlet3 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

}

后续在web.xml文件中配置Servlet程序即可,如果src的new选项下没有create New Servlet选项,需要设置一下当前src路径为sources并勾选Facets中的Source Roots选项
在这里插入图片描述
在这里插入图片描述

1.3 Servlet的生命周期

Servlet是运行在服务器上的,有着自己的生命周期
看一个实现Servlet接口的Servlet程序:

/**
 * @author 雫
 * @date 2021/4/24 - 12:55
 * @function
 */
public class MyServlet implements Servlet {

    public MyServlet() {
        System.out.println("无参构造生成Servlet实例");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("Servlet实例初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("MyServlet被访问");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("Servlet实例被销毁");
    }

}

其中的构造方法,init方法,service方法,destroy方法在Servlet不同的生命周期被执行

创建Servlet实例时
	构造方法和init方法被调用

收到来自客户端的请求时
	service方法被调用

Tomcat停止运行时
	destroy方法被调用,Servlet实例被销毁

1.4 Servlet的简单使用

在index.jsp中创建3个表单,表单提交的数据种类不同,提交的方式也不同,这3个表单准备由3个不同的Servlet程序来处理
在这里插入图片描述
三个不同的Servlet程序负责处理3张表单的数据提交:

/**
 * @author 雫
 * @date 2021/4/24 - 16:48
 * @function 处理表单1的Servlet程序
 */
public class MyServlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("表单1的数据以post的方式提交");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("表单1的数据以get的方式提交");
    }

}

/**
 * @author 雫
 * @date 2021/4/24 - 16:49
 * @function 处理表单2的Servlet程序
 */
public class MyServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("表单2的数据以post的方式提交");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("表单2的数据以get的方式提交");
    }

}

/**
 * @author 雫
 * @date 2021/4/24 - 16:50
 * @function 处理表单3的Servlet程序
 */
public class MyServlet3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("表单3的数据以post的方式提交");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("表单3的数据以get的方式提交");
    }

}

web.xml文件中Servlet程序的配置:

    <!-- 处理表单1 -->
    <servlet>
        <servlet-name>MyServlet1</servlet-name>
        <servlet-class>com.coisini.servlet.MyServlet1</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet1</servlet-name>
        <url-pattern>/MyServlet1</url-pattern>
    </servlet-mapping>

    <!-- 处理表单2 -->
    <servlet>
        <servlet-name>MyServlet2</servlet-name>
        <servlet-class>com.coisini.servlet.MyServlet2</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet2</servlet-name>
        <url-pattern>/MyServlet2</url-pattern>
    </servlet-mapping>

    <!-- 处理表单3 -->
    <servlet>
        <servlet-name>MyServlet3</servlet-name>
        <servlet-class>com.coisini.servlet.MyServlet3</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet3</servlet-name>
        <url-pattern>/MyServlet3</url-pattern>
    </servlet-mapping>

使用示例:
在这里插入图片描述
可以看到用不同的Servlet程序处理了不同的表单,每次提交时,负责该表单的Servlet程序就会收到请求数据作出处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值