IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java Web 基础之Servlet概念详解(Servlet是什么?主要功能?基础重点运用?) -> 正文阅读

[Java知识库]Java Web 基础之Servlet概念详解(Servlet是什么?主要功能?基础重点运用?)


一、Servlet是什么

1.1 Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,泛指用 Java编写的服务器端程序。在编程过程中也指一切 实现了Servlet接口的类(约定以Servlet结尾命名)。

1.2 Servlet API

JAVA Servlet 作为JAVA EE中Web开发的重要技术之一,也是理解各种Java Web开发框架的重要基础,接下来看一下Servlet-api中主要包含哪些结构:

  • javax.servlet
    -作为servlet API的基础,包含Servlet类基类和Servlet与Servlet容器的契约
  • javax.servlet.annotation
    -包含标注信息,提供简单部署的方式
  • javax.servlet.descrptor
    -包含提供程序化登录Web应用程序的配置信息的类型
  • javax.servlet.http
    -包含HttpServlet,Servlet对Http协议的变体

在这里插入图片描述

二、Servlet的主要功能

2.1 Servlet的简单运用流程展示

Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:

1. 客户端发送请求至服务器端
2. 服务器将请求信息发送至 Servlet
3. Servlet 生成响应内容并将其传给服务器,响应内容动态生成
4. 服务器将响应返回给客户端

Servlet 看起来像是通常的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包。
一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然 Servlet 可以对任何类型的请求产生响应,但通常只用来扩展 Web 服务器的应用程序。
在这里插入图片描述
下面是一个简单实现的代码:

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/myservlet")//注解部署-javax.servlet.annotation部分
public class MyServlet implements Servlet {//Servlet属于javax.servlet核心部分
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
		//主要的功能函数-实现Request请求解析,以及进行处理和响应请求
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        String message=req.getParameter("message");
        res.setContentType("text/html");
        PrintWriter out=res.getWriter();
        out.print("<html><head>MyServlet Return Page</head>");
        out.print("<body><p style='background-color: "+message+"'>"+message+"</p></body></html>");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}

2.2 Servlet API常用功能概览

简单的类接口和功能概括如下图:(其中HttpServlet在javax.servlet.http中,其余在javax.servlet中)
在这里插入图片描述

2.2.1 Servlet

接口定义了如下5种方法:

//初始化,传入Tomcat实例化的一个ServletConfig进行配置
void init(ServletConfig config) throws ServletException
//主要功能函数-传入Tomcat转发封装好的一个ServletRequest实例,
//和封装好的出口ServletResponse输出即可
void service(ServletRequest req,ServletResponse res)throws ServletException,IOException
//在Servlet类销毁时调用,输出必要信息
void destory()
//以下略
String getServletInfo()
ServletConfig getServletConfig()
2.2.2 GenericServlet

该类是对于Servlet接口的简单实现:
由于直接实现Servlet接口需要实现5个方法,但是一般我们只管service方法,为了减少不必要的实现,使用GenericServlet对其进行简单实现。
继承GenericServlet的类只需要重写需要用到的方法即可

2.2.3HttpServlet

其作为更有效的扩展,是面对Http协议的专业Servlet封装:
对于传入的ServletRequest,该类会自动解析其Http包,然后调用doGet/doPost/doHead等方法,因此在实现继承该类时,只需要实现相应的方法即可,具体如下:

import *@WebServlet(urlPatterns = {"/books"})
public class BookControServlet extends HttpServlet {
    private static final int serialVersionUID=-123;
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException{
        List<Book> books=new ArrayList<>();
        books.add(new Book("isbn-1","YOUR NAME",120));
        books.add(new Book("isbn-2","MY NAME",100));
        books.add(new Book("isbn-3","HIS NAME",60));
        books.add(new Book("isbn-4","HER NAME",250));
        //给Request添加一些属性
        req.setAttribute("books",books);
        req.setAttribute("now",new Date());
        //转发到另外一个Servlet处理
        RequestDispatcher rd=req.getRequestDispatcher("/books.jsp");
        rd.forward(req,res);
    }
}
2.2.4 ServletRequest和ServletResponse

作为Servlet类(泛指)处理请求和输出的窗口
ServletRequest类包含请求体的所有消息:

+getContentLength():int//返回请求主体字节长度,未知返回-1
+getContentType():String//返回请求主体类型
+getProtocol():String//返回HTTP请求协议名

+getParameter(String):String//最常用,返回请求参数值Get请求参数在url有显示,见上(简单实现)

ServletResponse类包含相应请求的方式:

+setContentType(String)//设置响应格式,如"text/html"
+getWriter():java.io.PrintWriter//返回输出接口,具体见上(简单实现)
2.2.5 ServletConfig和ServletContext

ServletConfig作为Servlet类实例时的一个必要的配置信息,由服务器(容器)根据相关配置创建一个实例传入init(ServletConfig),实例如下:

import javax.servlet.*;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "MyServlet", urlPatterns = "/myservlet",
        initParams = {
                @WebInitParam(name="config_var_1",value = "value_1"),
                @WebInitParam(name="config_var_2",value = "value_2")
        }//初始配置
)
public class MyServlet extends GenericServlet {
    @Override
    public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException{
        ServletConfig servletconfig = getServletConfig();
        System.out.println(servletconfig.getInitParameter("config_var_1"));
        System.out.println(servletconfig.getInitParameter("config_var_2"));
    }
}

在这里插入图片描述
ServletContext则是所有Servlet类的容器信息,包含一个Web应用内所有Servlet的注册信息,在高级操作中可以通过该类实现动态注册Servlet类。(初级略)

2.2.5 RequestDispatcher和Filter

在这里插入图片描述其中Filter需要单独部署,由设计者单独实现一个Filter类,并部署相关拦截条件。
而RequestDispatcher则直接使用即可,见上(简单实现)

三、JSP也是一个Servlet类

3.1JSP(JavaServer Pages)的与众不同

一个JSP页面如下:

<%--//JSP指令--%>
<%@ page import="java.text.DateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.Enumeration" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%--//纯HTML内容--%>
<html>
<head>
    <title>$Title$</title>
</head>
<style>
    body {
        /*EL表达式*/
        background-color: ${cookie.color.value};
    }
</style>
<body>
<H1 style="background-color: darkgreen"><a href="books">BOOKS SHOW</a></H1>
hello World!!!<br/>

<%--//JSP动作--%>
<jsp:include page="extend.html"/>

<%--//标准标签--%>
<c:set var="x" value="100"/>
<c:out value="${x}"/>

<%--//JSP脚本--%>
<%
    DateFormat dateformat = DateFormat.getDateInstance(DateFormat.LONG);
    String s = dateformat.format(new Date());
    out.println("<br>Today is " + s + "<br>");
%>
<hr/>

<%
    for (Enumeration<String> e = request.getHeaderNames();
         e.hasMoreElements(); ) {
        String header = e.nextElement();
        out.println(header + ": " + request.getHeader(header) + "<br>");
    }
%>
<hr/>

<%
    out.println("BufferSize: " + response.getBufferSize() + "<br>");
    out.println("Session id: " + session.getId() + "<br>");
    out.println("Servlet name: " + config.getServletName() + "<br>");
    out.println("Server info: " + application.getServerInfo());
%>
</body>
</html>

在这里插入图片描述

3.2 Servlet的缺点和JSP基本用法

  1. 在之前的Servlet学习中,不难发现,输出一个html页面已经是非常繁琐,需要写一长串字符串,修改麻烦而且结构混乱。
  2. 其次,Servlet每次修改完,都需要一次编码载入才能使用,在较大规模开发的时候十分不方便。

于是诞生了JSP这种特殊的Servlet,他能够实现自动输出纯html语句,能够动态修改,不用每次修改都编译。

JSP语法简单,能够一定程度上实现前后端分离的需要,具体的内容主要包含三个部分:

3.2.1指令

基础语法是

<%@ introductName attribute1="value1" attribute2="value2"...%>
<%-- 注释:比如导入相关包 --%>
<%@ page import="java.util.Date" %>
<%-- 注释:比如引入标准标签库 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3.2.2脚本元素

脚本就是用<% … %>包含的Java语句,类比与HTML中的JavaScript脚本,比如:

<%--//JSP脚本--%>
<%
		//输出当前日期
    DateFormat dateformat = DateFormat.getDateInstance(DateFormat.LONG);
    String s = dateformat.format(new Date());
    out.println("<br>Today is " + s + "<br>");
%>
3.2.3动作

相当于JSP的函数,也可以看成标签具体如下:

<%-- 标准标签,设置变量和输出变量 --%>
<c:set var="x" value="100"/>
<c:out value="${x}"/>
<%-- 导入文件 --%>
<jsp:include page="extend.html"/>
3.2.4无需部署直接访问

直接在浏览器输入url指向JSP文件即可获取JSP动态加载后的页面,如下:
在这里插入图片描述

求支持

作者长期更新分享原创文章,如果觉得本文还算不错的话,请给我一个大大的赞!!!
如果非常赞同这篇文章,请关注我,持续了解更多精彩博文!!!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:20:30  更:2021-12-24 18:20:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:17:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码