美文网首页
Java Web 之Servlet

Java Web 之Servlet

作者: CSeroad | 来源:发表于2021-12-03 18:20 被阅读0次

前言

学一学Java Web 三大组件之一Servlet。

简介

Servlet 是运行在Web服务器或者应用服务器上的Java程序,用来接收并响应来自Web客户端的请求。

创建servlet实例

IDEA创建HelloServlet类,并实现servlet接口

package com.guigu.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author cseroad
 */
public class HelloServlet 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("serlvet 被访问");
    }

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

    @Override
    public void destroy() {

    }
}

并修改web.xml文件,给servlet配置上可访问的URI映射地址

  <!-- servlet 标签tomcat配置servlet程序 -->
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <!-- servlet 别名,一般为类名 -->
    <servlet-class>com.guigu.servlet.HelloServlet</servlet-class>
    <!-- servlet 程序的全类名 -->
  </servlet>
  
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <!-- 当前配置给哪个servlet 程序使用 -->
    <url-pattern>/hello</url-pattern>
    <!-- 表示访问地址为http://ip:port/project/hello -->
  </servlet-mapping>

当访问 http://localhost:8080/Servlet/hello 时,就会映射到HelloServlet这个serlvet,进而查找到com.guigu.servlet.HelloServlet这个类。

image.png

过程如下:
Web客户端访问地址和端口,找到tomcat服务,进而访问Servlet工程,然后找到eclipse的Servlet工程下的hello,通过web.xml的url-pattern配置信息,找到映射的HelloServlet 程序,进而找到com.guigu.servlet.HelloServlet类名执行到service方法。

Servlet 生命周期

Servlet的生命周期定义了一个Servlet如何被加载、初始化、处理响应数据、销毁。
创建HelloServlet来观察Servlet 的生命周期。

package com.guigu.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author cseroad
 */
public class HelloServlet implements Servlet {
    public void HelloServlet(){
        System.out.println("1. 构造器方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2. init初始化方法");
    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //处理请求并响应数据
        System.out.println("serlvet 被访问");
    }

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

    @Override
    public void destroy() {
        System.out.println("4. destroy 销毁方法");
    }
}

生命周期主要阶段如下:
1、执行Servlet构造器方法
2、执行init()初始化方法
3、执行service()方法
4、执行destroy()销毁方法
过程如下:
当创建Servlet时,会调用构造器方法(只会调用一次),创建 Servlet 的实例对象。并调用 init()方法,完成Servlet实例对象的初始化(只会调用一次);
然后web客户端每次访问该serlvelt时,都会执行service()方法;
当Web工程停止或重启时,再执行destory()方法;

Servlet的三种创建方式

Servlet-api.jar包提供了三个基本接口或类用于创建Servlet:

  • 实现javax.servlet.Servlet接口
  • 继承javax.servet.GenericServlet类
  • 继承javax.servlet.http.HttpServlet类

而他们的关系是HttpServlet类继承GenericServlet类, GenericServlet类是实现的 Servlet接口。
如创建一个HelloServlet2类,继承HttpServlet类,并重写doGet()doPost()方法来体现请求的分发处理(即GET请求和POST请求)。

package com.guigu.servlet;

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet2 extends HttpServlet{

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

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

并配置web.xml

    <servlet>
        <servlet-name>Servlet2</servlet-name>
        <servlet-class>com.guigu.servlet.Servlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

再编写index.html,使用不同的HTTP请求访问地址

<html>
<body>
<form action="http://localhost:8080/Servlet/hello2" method="post">
  <input type="text" name="username" value="">
  <input type="submit" name="submit" value="submit">

</form>
</body>
</html>

HelloServlet2就会根据客户端不同的HTTP请求方式自动调用doget()dopost()方法。

image.png

过程如下:
1、编写类继承HttpServlet类;
2、重写doGet()doPost()方法;
3、再配置web.xml

ServletConfig 对象

ServletConfig对象是由每个Servlet的Web容器创建的。这个对象可用于从web.xml文件中获取配置信息。
在web.xml添加一些键值对,用来后续操作ServletConfig对象的方法。

      <servlet>
        <servlet-name>Servlet2</servlet-name>
        <servlet-class>com.guigu.servlet.Servlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet 别名,一般为类名 -->
        <servlet-class>com.guigu.servlet.HelloServlet</servlet-class>
        <!-- servlet 程序的全类名 -->
        <!-- init-param初始化参数 -->
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

在初始化方法里添加操作ServletConfig对象的方法。
如:
getServletName() 表示获取当前Servlet在web.xml中配置的名字;
getInitParameter(String name) 表示获取当前Servlet指定名称的初始化参数值;
getInitParameterNames() 表示获取当前Servlet所有初始化参数的名字组成的枚举;
getServletContext() 表示获取当前web应用的ServletContext对象;

    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2. init初始化方法");
        String servletName = servletConfig.getServletName();
        System.out.println("HelloServlet程序的别名是:"+servletName);
        System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
        System.out.println("当前ServletContext对象值是:"+servletConfig.getServletContext());
    }
image.png

ServletContext 对象

当WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用。并且它会被所有客户端共享。
在继承HttpServlet类的doGet()方法里操作ServletContext对象。
如:
getInitParameter() 表示获取web.xml配置上下文参数context-para;
getContextPath() 表示获取当前工程路径;
getRealPath() 表示获取应用部署绝对地址;
setAttribute(String name, Object obj); 表示设置指定元素上的某个属性值;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("servlet2的doget方法");
        ServletContext context = getServletConfig().getServletContext();
        String username = context.getInitParameter("username");
        //获取web.xml配置上下文参数context-param
        System.out.println("context-param 参数username的值是"+username);
        System.out.println("当前工程路径是"+context.getContextPath());
        System.out.println("当前应用部署路径是"+context.getRealPath("/"));
        context.setAttribute("name", "小明");
        Object name = context.getAttribute("name");
        System.out.println(name);
    }
image.png

HttpServletRequest 对象

通过HttpServletRequest 对象获取客户端所有的请求信息。
如:
getRequestURL()方法,表示返回客户端发出请求时的完整URL;
getHeaderNames()方法,表示获取客户端请求头信息;
getParameter() 方法,表示获取客户端单选框请求参数;
getParameterValues(String name)方法,表示获取客户端复选框请求参数;
setCharacterEncoding()方法,表示设置字符集编码格式;

简单制作表单并映射到Servlet2上。
demo.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="http://localhost:8080/Project_javaweb/hello2" method="get">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
    <input type="checkbox" name="hobby" value="java">java
    <input type="checkbox" name="hobby" value="js">JavaScript<br/>
    <input type="submit">
</form>
</body>
</html>

Servlet2类的doGet()方法

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("URI地址:"+request.getRequestURI());
        // 设置UTF-8编码格式
        request.setCharacterEncoding("UTF-8");
        // 获取所有Header请求头并依次打印
        Enumeration<String> enums = request.getHeaderNames();
        while (enums.hasMoreElements()) {
            String headerName = (String) enums.nextElement();
            String headerValue = request.getHeader(headerName);
            System.out.print("<b>" + headerName + "</b>: ");
            System.out.println(headerValue + "<br/>");
        }
        //获取复选框值并存进array
        System.out.println("选择的爱好"+ Arrays.asList(request.getParameterValues("hobby")));
    }

HttpServletResponse 对象

通过HttpServletResponse 对象获取服务器的响应信息。
setContentType()方法 表示设置响应编码格式;
getOutputStream()方法,表示获取字节流向客户端浏览器输出;
getWriter()方法,表示获取字符流向客户端浏览器输出;
比如在响应浏览器输出中文字符。

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data = "中国";
        OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流
        response.setHeader("content-type", "text/html;charset=UTF-8");
        byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换
        outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组
    }

Servlet 脑图

image.png

参考资料

https://blog.csdn.net/hu360983/article/details/114490231
https://www.bilibili.com/video/BV1Y7411K7zz?p=189
https://codeantenna.com/image/https://img-blog.csdn.net/20150111215251000

相关文章

  • Java Servlet 总结

    Servlet 是 Java Web 开发的起点,几乎所有的 Java Web 框架都是基于 Servlet 的封...

  • Servlet开始篇

    Java web应用程序中所有的请求-响应都是由servlet来完成的,servlet是java web的核心程序...

  • 第十章:配置SpringBoot支持自动装载Servlet

    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础之...

  • 2019-10-15 Java Web常见漏洞分析

    目录 Java vs PHP Java Web的常见概念 Java Web项目的目录结构 Servlet JSP(...

  • Java Web 之 Servlet

    本文包括: Servlet简介关于Servlet的一些类 Servlet生命周期 ServletConfig获得初...

  • Java Web 之servlet

    一、web服务器 相信大家都听过说web服务器,常用的J2EE开发--Tomcat,.NET开发--IIS等。HT...

  • Java Web 之Servlet

    前言 学一学Java Web 三大组件之一Servlet。 简介 Servlet 是运行在Web服务器或者应用服务...

  • Servlet概述

    # 一、Servlet概述 ## 1.1 什么是Servlet Servlet是基于Java技术的web组件,容器...

  • 学习路线

    1、java基础 2、linux命令,软件安装 3、java-web:servlet 4、java-web:spr...

  • Servlet笔记

    Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java...

网友评论

      本文标题:Java Web 之Servlet

      本文链接:https://www.haomeiwen.com/subject/fntgeltx.html