JavaWeb之Servlet入门(零基础教程)

此文章承接上篇文章XML(从是什么到怎么用),篇幅较长,可以收藏慢慢学习

优质文章导读:
XML入门(零基础教程)
一文了解Java反射

文章概述与Tomcat

通过本文,可以了解到:

  • 了解Browser-Server (B/S) 模式
  • 掌握Servlet开发技巧
  • 掌握Servlet执行原理

Browser-Server(B/S)模式即浏览器和服务器架构模式
优点: 开发简单,无需安装客户端,数据易于共享
缺点: 相较于C/S模式,执行速度与用户体验相对较弱

B/S模式执行流程
在这里插入图片描述
举个例子,一个用户 打开了浏览器, 然后输出了www.baidu.com ,然后浏览器会根据这个网址去查询这个网址所对应的IP地址是什么,这个转换过程是由DNS 来完成的,然后查询到IP地址之后,浏览器就会将刚刚我们输出的网址或者一些附加的信息通过http协议发送给远程的服务器主机,然后服务器主机根据刚刚发送过来的数据包利用里面编写好的程序动态的去生成了HTML,然后服务器程序会将这份HTML返回给浏览器,然后浏览器将对HTML进行解释,展示给用户
在这里插入图片描述
请求与响应

  • 从浏览器发出送给服务器的数据包称为"请求(Request)"
  • 从浏览器返回给浏览器的结果称为"响应(Response)"

在这里插入图片描述
J2EE
在Java中如何开发BS应用程序呢,这就需要J2EE了

  • J2EE (Java 2 Platform Enterprise Edition) 是指"Java 2企业版"

  • 开发BS(Web)应用程序就是J2EE最核心的功能

  • J2EE由13个功能模块组成
    在这里插入图片描述Apache Tomcat
    如果想要我们的web应用程序能够动态的生成网页的话,就需要有一台web服务器,简略介绍一下在Java领域大名鼎鼎的一款web服务器程序

  • Tomcat是Apache软件基金会旗下一款免费的开放源代码的Web应用服务器程序

J2EE与Tomcat的关系

  • J2EE是一-组技术规范与指南,具体实现由软件厂商决定
  • Tomcat是J2EE Web (Servlet与JSP) 标准的实现者
  • J2SE是J2EE运行的基石,运行Tomcat离不开J2SE

Servlet
而有了Tomcat还不够,Tomcat装上了以后可以让我们的电脑变成一台服务器,而在服务器内部,程序是如何处理的,就要用到J2EE的核心组件Servlet来进行编码
Tomcat与Servlet的关系
在这里插入图片描述

Tomcat安装与运行

这里只是先学习Servlet,可以先在windows下进行安装
参考: win10下Tomcat的安装与运行

Tomcat的配置

建议参考这篇博文 使用IDEA配置Tomcat

Servlet创建与生命周期

标准Java Web 工程结构

组织结构描述
tomcat安装目录/webapps/Tomcat应用根目录
/web应用目录/Java Web应用目录
/web应用目录/index.html |.jsp默认首页
/WEB-INFWEB应用的安全目录,用于存放配置文件
/WEB-INF/web. xmIweb.xml是“部署描述符文件”,是该Web项目核心配置文件
/NWEB-INF/classes存放编译后的classes文件
/WEB-INF/lib用于存放web应用依赖的jar文件
/META-INF/MANIFEST.MF包含Web应用的版本等信息

Servlet 开发步骤

  • 创建Servlet类,继承HttpServlet
  • 重写service方法,编写程序代码
  • 配置web.xml,绑定URL

在配置好Tomcat的前提下,我们来创建一个FirstServelet类,实现最基本的操作

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

//HttpServlet是所有我们自己写的Servlet服务器小程序的父类,必须进行继承才可以开发我们自己的程序
public class FirstServlet extends HttpServlet {
    @Override
    //重写service函数,req 代表的是request(请求) 包含浏览器向服务器发送的请求的数据
    // resp 代表的是response(响应) 包含从服务器生成,要发送回浏览器的信息
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收请求发来的参数
        String name = req.getParameter("name");
        String html = "<h1 style='color:red'>Hi," + name +"! </h1><hr/>";
        //这相当于从服务器向浏览器返回的输出流
        PrintWriter out = resp.getWriter();
        //将html返回给浏览器
        out.println(html);

    }
}

我们写好这个之后,还需要在web.xml中进行配置
打开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_4_0.xsd"
         version="4.0">
    <!-- 声明Servlet -->
    <servlet>
        <!-- servlet的别名 -->
        <servlet-name>first</servlet-name>
        <!-- 类的完整路径 -->
        <servlet-class>FirstServlet</servlet-class>
    </servlet>
    <!-- 将Servlet与URL绑定 -->
    <servlet-mapping>
        <!-- 此处的<servlet-name>与上方的声明必须保持一致 -->
        <servlet-name>first</servlet-name>
        <url-pattern>/hi</url-pattern>
    </servlet-mapping>
</web-app>

J2EE设置这个别名,有两个好处

  • 使用别名,比较简洁,让配置看起来比较舒服
  • 而我们的类的完整路径,在系统中是敏感信息,不应该轻易的暴露,这样使用别名来绑定URL,这样可以提高程序的安全性

Servlet访问方法

  • http://IP地址:端口/context-path/url-mapping
  • 远程访问使用IP地址,本地访问localhost(127.0.0.1)
  • context- path为"上下文路径"默认为工程名

请求参数

  • 请求参数是指浏览器通过请求向Tomcat提交的数据
  • 请求参数通常是用户输入的数据,待Servlet进行处理
  • 参数名1=值1&参数名2=值2&参数名n=…

在这里插入图片描述

划重点

在我们上述过程中,浏览器和Tomcat之间是如何互动的呢,我做一个解释:
首先,对于浏览器来说,我们在地址栏里面输入了 localhost:8080/FirstServe_war_exploded/hi?name=yumao 以后,这个信息会通过请求发送给Tomcat,当Tomcat收到了这个信息以后,会从web.xml文件中去查找有没有与之匹配的servlet-name(我们设置的映射为hi,它的servlet-name是first),接着去查找对应的类,然后会创建一个和寻找到的类相同名的对象并且执行其中的service()方法(这就是之前为什么要重写service()方法的原因 ,service()方法用意就是为了为servlet提供响应和支持),之后Tomcat会将输出的字符串(也就是html代码)通过response响应原封不同的发送给浏览器,然后浏览器会解析这串代码并展示出来.

Servlet接收请求参数

  • request.getParameter() - 接收单个参数
  • request.getParameterValues() -接收多个同名参数

Get与Post请求方法

  • Get方式是将数据通过在URL附加数据显性向服务器发送数据。http://localhost:8080/FirstServlet/sample?name=zhangsan
  • Post方式会将数据存放在”请求体”中隐性向服务器发送数据 http://localhost:8080/FirstServlet/sample 请求体: name= zhangsan
    这两个方法比较而言,Get方法可读性更好,Post方法数据更加的隐秘
    在这里插入图片描述
    如果想用Post请求,可以在后面加上 method=“post”
    在这里插入图片描述

Get与Post应用场景

  • Get常用于不包含敏感信息的查询功能
    例如:https://www.baidu.com/s?wd=yumao&rsv_ spt=1
  • Post用于安全性要求较高的功能或者服务器的”写"操作
    用户登录
    用户注册
    更新公司账目

Servlet生命周期

  1. 装载 - web.xml
  2. 创建 - 构造函数
  3. 初始化 - init()
  4. 提供服务 - service()
  5. 销毁 - destroy()

注释配置Servlet

注释简化配置

  • Servlet 3.x之后引入了"注解Annotation" 特性
  • 注解用于简化Web应用程序的配置过程
  • Servlet核心注解: @WebServlet
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
/*写了注解@WebServlet(映射URL) 之后就不用切换去写web.xml里面的东西了
*因为有了这句话之后,在启动的时候,Tomcat会扫描所有的字节码文件,这个类里面写了@WebServlet并且配置了
* 对应的URL,就会按照这个规则加载进去,其实@WebServlet就像是一个标志,告诉Tomcat当前的类是一个Servlet,
* 要将它绑定到/anno就可以了
*/
@WebServlet("/anno")
public class AnnotationServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("I'm annotationServlet servlet!");
    }
}

启动时加载Servlet

  • web.xml使用< load-on-startup>设置启动加载
  • <load-on-startup>0~9999 </load-on-startup> (0~9999为优先级)
  • 启动时加载在工作中常用于系统的预处理

其实很简单

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
/**
 * urlPatterns 是URL的值,即使可能不会用到,也要写入
 * loadOnStartup 是优先级的值 0最大 9999最小
 */
@WebServlet(urlPatterns = "/anno",loadOnStartup = 0)
public class AnnotationServlet extends HttpServlet {
    
    @Override
    public void init() throws ServletException {
        System.out.println("正在创建");
    }
}

若有错误,请各位指正,文章持续更新,关注羽毛,我们一同成长

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽 毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值