【JavaWeb Servlet 06】

一、Servlet技术

1、何为Servlet

  • servlet本身就是一个接口,是javaEE的规范之一
  • servlet是javaWeb三大组件之一。三大组件分别是:Servlet程序,Filter过滤器,Listener监听器
  • servlet是运行在服务器上的一个Java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端

#案例:演示实现Servlet的简单程序

需求:

1、编写一个类去实现Servlet接口
2、实现service方法,处理请求,并响应数据
3、到web.xml中配置servlet程序的访问地址

#Servlet程序的实例代码

public class HelloServlet  implements Servlet{

 @Override //service方法是专门用来处理请求和响应的
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet 被访问了");
    }
}

//实现Servlet接口,会重写其接口内的方法

#web.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_3_1.xsd"
         version="3.1">
    <!--servlet标签给Tomcat配置servlet程序-->
    <servlet>
        <!--servlet-name标签 是servlet程序起的一个别名(一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class 是servlet程序的全类名-->
        <servlet-class>com.wufq.servlet.HelloServlet</servlet-class>
    </servlet>

    <!--servlet-mapping标签的作用是告诉服务器,我当前配置的地址是给哪个Servlet程序使用-->
    <servlet-mapping>
        <!--servlet-name 标签是告诉服务器,我当前配置的地址给那个Servlet程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 标签配置访问地址:
        / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径/
        /hello 表示地址为:http://ip:port/工程路径/hello
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

配置好以后,默认访问http://localhost:8080/,会直接访问web工程下的index.jsp文件,如果加上/hello,则会访问实现Servlet接口的service方法

2、servlet的生命周期

  • 第一步执行Servlet构造器方法
  • 第二步执行init初始化方法 (前面两步在第一次访问的时候创建Servlet程序会调用)
  • 第三步执行service方法(备注:这一步每次访问都会被调用)
  • 第四步执行destroy销毁方法(在web工程停止的时候调用)

3、serVlet的get和post请求的分发处理  (即:service方法,在前端执行get请求时可以执行get的服务,执行post请求执行post的服务)

#案例验证:

1)新建一个a.html文件设置一个表单,请求方式为:post

<body >
    <form action="http://localhost:8080/hello" method="post">
        <input type="submit"/>
    </form>
</body>

2)get、post请求分发

 @Override //service方法是专门用来处理请求和响应的
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        /*
        * service方法主要是处理请求和响应的方法,如何区分处理get和post请求呢?主要是用getNethod()方法,但是ServletRequest
        * 类没有此方法,但是ServletRequest的子类httpServletRequest有
        * */

        //类型转换
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

        //获取请求方式
        String method = httpServletRequest.getMethod();

        if("GET".equals(method)){
            doGet(); //get请求操作的方法
        }else if("POST".equals(method)){
            doPost(); //post请求操作的方法
        }

    }

4、通过继承HttpServlet实现Servlet程序

一般在实际项目开发中,都是使用 继承HttpServlet类的方式实现Servlet程序

#案例演示:

步骤:

  • 编写一个类去继承HttpServlet类
  • 根据业务需要重写doGet或doPost方法
  • 到web.xml中配置Servlet程序的访问地址

继承HttpServlet的类

public class HelloServlet2 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpSerVlet的get方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpSerVlet的post方法");
    }
}

//其实这就是服务端的代码

配置的web.xml文件

   <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>com.wufq.servlet.HelloServlet2</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>HelloServlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

客户端的代码

<body >
    <form action="http://localhost:8080/hello2" method="post">
        <input type="submit"/>
    </form>
</body>

5、为了便捷,可以直接在idea里面new Servlet

包-->右键-->new -->Servlet

6、Servlet类的继承体系

二、ServletConfig类

它主要是Servlet程序的配置信息类

Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象。并且两者都是由Tomcat负责创建

1、ServletConfig三大作用

cweb.xml中的配置:

    <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>com.wufq.servlet.HelloServlet2</servlet-class>
        
        <!--init-param初始化的参数,可以设置多个-->
        <init-param> 
            <!--参数名-->
            <param-name>username</param-name>
            <!--参数值-->
            <param-value>root</param-value>
        </init-param>

        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
        
    </servlet>

Servlet中的代码

 @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config); //注意:重写init方法里面一定要调用父类的init(ServletConfig)操作

//        1、可以获取Servlet程序的别名servlet-name的值
        System.out.println("HelloServlet2程序的别名:"+config.getServletName());
//        2、获取初始化参数init-param
        System.out.println("初始化参数username的值:"+config.getInitParameter("username"));
        System.out.println("初始化参数url的值:"+config.getInitParameter("url"));
//        3、获取ServletContext对象
        System.out.println("ServletContext对象:"+config.getServletContext());
    }

三、ServletContext类

1、什么是ServletContext?

  • 是一个接口,表示Servlet上下文对象
  • 一个web工程,只有一个ServletContext对象实例
  • ServletContext对象是一个域对象
  • ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁

什么是域对象?

域对象,是可以像Map一样存取数据的对象,叫域对象

这里的域指的是存取数据的操作范围,整个web工程

  存数据 取数据 删除数据
Map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute()

2、ServletContext类的四个作用

  • 获取web.xml中的配置的上下文参数context-param
  • 获取当前的工程路径,格式:/工程路径
  • 获取工程部署后在服务器硬盘上的绝对路径
  • 像Map一样存取数据
public class ContextServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletAContext对象
        ServletContext context = getServletContext();
        System.out.println(context);
        //存数据
        context.setAttribute("key1","value1");

        //取数据
        System.out.println("保存之后;context1获取key1的值是:"+context.getAttribute("key1"));
    }
}

四、HTTP协议

1、http请求分为2种:get请求和post请求

2、GET请求

1、请求行

  1)请求的方式:GET

  2)请求的资源路径[+?+请求参数]

  3)请求的协议的版本号   HTTP/1.1

2、请求头

  key:value  组成  不同的键值对,表示不同的含义

3、POST请求

1)请求行

  1)请求的方式:POST

  2)请求的资源路径[+?+请求参数]

  3)请求的协议的版本号   HTTP/1.1

2)请求头

  key:value  组成  不同的键值对,表示不同的含义

----请求头和请求体之间有一个空行

3)请求体  ==>就是发送给服务器的数据

 4、常用请求头的说明

  • Accept:表示客户端可以接收的数据类型
  • Accept-Languege:表示客户端可以接收的语言类型
  • User-Agent:表示客户端浏览器的信息
  • Host:表示请求时的服务器的ip和端口号

5、那些是get请求,那些是post请求

GET请求有哪些:

  • form标签 method=get
  • a标签
  • link标签引入css
  • script标签引入js文件
  • img标签引入图片
  • iframe引入html页面
  • 在浏览器地址栏中输入地址后敲回车

POST请求有哪些

  form标签  method=post

4、响应的HTTP协议格式

1)响应行

  •   响应的协议和版本号
  •   响应的状态码
  •   响应状态描述符

2)响应头

  •   key:value  不同的响应头,有其不同含义
  •     空行

3)响应体 --> 就是回传给客户端的数据

5、常用的响应码说明

200 表示请求成功

302 表示请求重定向

404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)

500 表示服务器已经收到请求,但是服务器内部错误(代码错误)

6、MIME类型说明

MIME是HTTP协议中的数据类型,多功能Interrnet邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应

常见的集中MIME类型

原文地址:https://www.cnblogs.com/frankruby/p/14913298.html