Servlet详解

Servlet基本原理

简介:

  • 是一种Web服务器端编程技术。是实现了特殊接口的Java类。
  • 由支持Servlet的Web服务器调用和启动运行。
  • —个Servlet负责对应的一个或一组URL访问请求,并返回相应的响应内容。

搭建Servletweb程序:

  • 创建一个普通java文件
  • Java文件的类名实现HttpServlet
  • 重写service的方法
  • 在WEB-INF下的web.xml中添加请求与servlet类的映射关系

代码:

编写Servlet类:

package com.wp;/*
 *@author wupeng
 *@time 2021/6/21-10:01
 */

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("first wen project");
        System.out.println("my fisrt wen project");
    }
}

配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--    配置Servlet的别名,同时在Servlet-class配置项中添加类的完全限定名, 包名-类名-->
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.wp.MyServlet</servlet-class>
    </servlet>
<!--    配置Servlet跟请求的映射关系-->
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>myServlet2</servlet-name>
        <servlet-class>com.wp.MyServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet2</servlet-name>
        <url-pattern>/second</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>servletLife</servlet-name>
        <servlet-class>com.wp.ServletLife</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletLife</servlet-name>
        <url-pattern>/life</url-pattern>
    </servlet-mapping>
</web-app>

servlet访问流程:

流程处理:

image-20210621214304364
  • url: http://localhost:8080/firstweb/first

  • 组成:

    • 服务器地址:端口/虚拟项目名/servlet的别名
    • uri:虚拟项目名/servlet别名
  • 过程:浏览器发送请求到服务器,服务器根据请求URL地址中的URI信息在webapps目录下找到对应的项目文件夹,然后再web.xml中检索对应的servlet,找到

    后调用并执行servlet

Servlet生命周期:

代码说明:

package com.wp;/*
 *@author wupeng
 *@time 2021/6/21-10:40
 */
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//接受到客户端的请求才会创建Servlet
public class ServletLife extends HttpServlet {
    @Override
    public void init() throws ServletException {
        /*
        完成Servlet对象的初始化
        在Servlet接受到第一次请求的时候创建对象
        生命周期:从第一次接受请求开始到服务器关闭之后销毁
        当再web.xml文件配置中,配置了load-up-start 1 ,默认服务器启动的时候创建Servlet 中间的数字表现优先级。
         */
        System.out.println("init");
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("servlet life");
        System.out.println("servlet life");
    }
    /*
        服务器停止之后调用
     */
    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

Servlet Service,doGet,doPost方法的区别:

package com.wp;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    Servlet类中可以有service方法,用来接受get  post请求
    如果Service和doGet或者doPost同时存在,默认调用service方法
    如果同时有Service,doGet和doPOST方法,在Service方法的实现中调用了super.service()会跳转到根据请求的方式跳转到Post,或者Get
       doGet用来接受Get请求
       doPost用来接受Post请求
    总结:编写servlet类的时候,不需要重新实现service方法,只需要重写doGet和dopost方法,只需要写doPost方法或者doGet可以接受getPost
    请求
 */
@WebServlet("/methodServlet")
public class MethodServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("method");
        System.out.println("method");
        super.service(req,resp);
    }
}

Servlet常见错误:

404:访问资源不存在,找不到对应的请求(请求路径与Web.xml中填写的不一致)

请求路径的项目虚拟名称填写错误

405:请求的方式跟Servlet中支持的方式不一致

500:(服务器内部错误)代码错误(web.xml中servlet类的名称错误)

posted @ 2021-06-23 22:13  IT小五  阅读(107)  评论(0)    收藏  举报