Web应用开发 - 实训三 B Servlet基础

news2025/9/18 11:52:45

Web应用开发 - 实训三 B Servlet基础

    • 前言:
  • 零、前期准备
    • 准备工具
    • 创建项目
      • 导入 jar 包
      • 配置运行设置
  • 一、实训第一部分
    • 第一张图
    • 第二张图
    • 第三张图
  • 二、实训第二部分
    • 第一张图
    • 第二张图

前言:

eclipse 是不可能用的,并不是说它界面丑,也不是说它难用,而是它实在不适合我,idea 还能用一用,界面还挺符合我审美的,一些操作也比较合适。

注意:本篇文章使用的是工具是 IDEA,搭配 tomcat 10.1 使用

零、前期准备

准备工具

  • 下载 tomcat 10.1 并安装

下载地址:https://tomcat.apache.org/download-10.cgi
在这里插入图片描述

创建项目

直接新建项目,选择 Jakara EE,模板为“Web 应用程序”,接下来就直接下一步,创建。
在这里插入图片描述

导入 jar 包

  1. 找到 tomcat 的安装目录
    (默认是:C:\Program Files\Apache Software Foundation\Tomcat 10.1)
    在这里插入图片描述
  2. 回到 idea 中点击左上角的“文件” -> “项目结构”
    在这里插入图片描述
  3. 点击左侧的 “库” -> 点击 “+” -> 选择 java
    在这里插入图片描述
  4. 在弹出来的窗口中找到刚刚找到的 tomcat 安装目录,并找到 lib 文件夹下的 “servlet-api.jar ”,然后确认就好了
    在这里插入图片描述

配置运行设置

  1. 点击上方的“当前文件”,选择 “编辑配置”
    在这里插入图片描述
  2. 点击左上角的 “+”,找到 “Tomcat 服务器”本地
    在这里插入图片描述
  3. 点击 “部署”,选择 “工件”,并点击 “Servlet_war_exploded”
    在这里插入图片描述
    在这里插入图片描述
  4. 将下面的 “/Servlet_war_exploded” 改为 “/chapter03”
    在这里插入图片描述
    基本工作就到此结束,开始进入正题!!!

一、实训第一部分

第一张图

在图中目录创建 “HelloWorldServlet.java” ,代码如下:

package com.example.servlet;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;

import java.io.*;

@WebServlet(name = "HelloWorldServlet", value = "/cn/itcast/firstapp/servlet/HelloWorldServlet")
public class HelloWorldServlet extends GenericServlet {
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // 得到输出流 PrinterWriter 对象,Servlet 使用输出流来产生响应
        PrintWriter out = response.getWriter();
        // 使用输出流对象向客户端发送字符数据
        out.println("Hello World");
    }
}

点击右上角的三角形就可以运行项目了
在这里插入图片描述
在浏览器中打开 http://localhost:8080/chapter03/cn/itcast/firstapp/servlet/HelloWorldServlet
效果图如下所示
在这里插入图片描述

第二张图

将 “HelloWorldServlet.java” 中的代码修改成下面:

package com.example.servlet;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;

@WebServlet(name = "HelloWorldServlet", value = "/HelloWorldServlet")
public class HelloWorldServlet extends GenericServlet {
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init methed is called");
    }

    public void service(ServletRequest request, ServletResponse response) throws ServletException {
        System.out.println("Hello World");
    }

    public void destroy() {
        System.out.println("destroy method is called");
    }
}

重新运行程序

在这里插入图片描述

在浏览器中打开 http://localhost:8080/chapter03/HelloWorldServlet

可以看到终端,这边是我们需要的截图(只需要截终端的那部分)
在这里插入图片描述

第三张图

分别在图中的两个路径中创建 “RequestMethodServlet.java” 和 “form.html”

在这里插入图片描述

RequestMethodServlet.java 文件中的代码如下:

package com.example.servlet;

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

import java.io.*;

@WebServlet(name = "RequestMethodServlet", value = "/RequestMethodServlet")
public class RequestMethodServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response) throws IOException {
        PrintWriter out = response.getWriter();
        out.write("this is doGet method");
    }

    public void doPost(HttpServletRequest request,
                       HttpServletResponse response) throws IOException {
        PrintWriter out = response.getWriter();
        out.write("this is doPost method");
    }
}

form.html 文件中的代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/chapter03/RequestMethodServlet" method="post">
    姓名<input type="text" name="name"/><br/>
    密码<input type="text" name="psw"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

在浏览器中打开 http://localhost:8080/chapter03/form.html 截图,点击“提交”后截图
在这里插入图片描述
在这里插入图片描述

二、实训第二部分

第一张图

在如图文件夹中创建 “TestServlet02.java”

在这里插入图片描述
TestServlet02.java 文件代码如下

package com.example.servlet;


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

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

@WebServlet(name = "TestServlet02", value = "/TestServlet02",
        initParams = {@WebInitParam(name = "encoding", value = "UTF-8")})
public class TestServlet02 extends HttpServlet {
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        // 获得 ServletConfig 对象
        ServletConfig config = this.getServletConfig();
        // 获得参数名为 encoding 对应的参数值
        String param = config.getInitParameter("encoding");
        out.println("encoding=" + param);
    }

    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

在浏览器中打开 http://localhost:8080/chapter03/TestServlet02 并截图

在这里插入图片描述

第二张图

在如图路径中新建文件 “TestServlet03.java”

在这里插入图片描述
TestServlet03.java 文件代码如下:

package com.example.servlet;

import jakarta.servlet.ServletContext;
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;
import java.io.PrintWriter;
import java.util.Enumeration;

@WebServlet("/TestServlet03")
public class TestServlet03 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=utf-8");
        PrintWriter out = response.getWriter();
        // 得到 ServletContext 对象
        ServletContext context = this.getServletContext();
        // 得到包含所有初始化参数名的Enumeration 对象
        Enumeration<String> paramNames = context.getInitParameterNames();
        out.println("all the paramName and paramValue are following: ");
        // 遍历所有的初始化参数名,得到相应的参数值并打印
        while (paramNames.hasMoreElements()) {
            String name = paramNames.nextElement();
            String value = context.getInitParameter(name);
            out.println(name + ": " + value);
            out.println("<br />");
        }
    }

    public void doPost(HttpServletRequest request,
                       HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

在如图文件 “web.xml” 中添加如图部分代码

    <context-param>
        <param-name>companyName</param-name>
        <param-value>itcast</param-value>
    </context-param>
    <context-param>
        <param-name>address</param-name>
        <param-value>beijing</param-value>
    </context-param>

在这里插入图片描述
在浏览器中打开 http://localhost:8080/chapter03/TestServlet03 并截图

在这里插入图片描述

恭喜, 实训三到此结束!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Navicat导入Excel数据顺序变了

项目场景&#xff1a; Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中。但是&#xff0c;在导入的过程中&#xff0c;我们常会发现数据顺序出现了问题&#xff0c;导致数据错位&#xff0c;给数据的处理带来了极大的麻烦。 原因分析&#xff1a; 这个问题的…

【CVPR2020】DEF:Seeing Through Fog Without Seeing Fog论文阅读分析与总结

Challenge&#xff1a; 之前网络架构的设计假设数据流是一致的&#xff0c;即出现在一个模态中的对象也出现在另一个模态中。然而&#xff0c;在恶劣的天气条件下&#xff0c;如雾、雨、雪或极端照明条件&#xff0c;多模态传感器配置中的信息可能不对称。不同传感器在特征提取…

第六章 图 八、有向无环图的描述表达式

一、定义 有向无环图: 若一个有向图中不存在环&#xff0c;则称为有向无环图&#xff0c;简称DAG图(Directed Acyclic Graph) 解题方法:

如何将安防视频监控系统/视频云存储EasyCVR平台推流到公网直播间?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

C++ QT qml 学习之 做个登录界面

最近在学习QT&#xff0c;也初探到qml 做ui 的灵活性与强大&#xff0c;于是手痒痒&#xff0c;做个demo 记录下学习成果 主要内容是如何自己编写一个按钮以及qml多窗口。 参考WX桌面版&#xff0c;做一个登录界面&#xff0c;这里面按钮是写的一个组合控件&#xff0c;有 按…

HTTP协议的基本概念与理解!

一、什么是HTTP协议 HTTP&#xff08;超文本传输协议&#xff09;是一个基于请求与响应&#xff0c;无状态的&#xff0c;应用层的协议&#xff0c;常基于TCP/IP协议传输数据&#xff0c;互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷…

Fedora CoreOS 安装部署详解

《OpenShift 4.x HOL教程汇总》 Fedora CoreOS 的裸机安装方法_fedora coreos 安装-CSDN博客 OpenShift 4 - Fedora CoreOS (1) - 最简安装_fedora core 安装_dawnsky.liu的博客-CSDN博客 OpenShift 和 CoreOS 我们知道 Red Hat Enterprise Linux CoreOS&#xff08;简称RHCOS&…

SP2-1503|0152:CMD窗口的SQLPLUS命令无法登录Oracle

场景还原 今天有小伙伴把Oracle卸载后重新安装&#xff0c;尝试以下三种方案均无法登录数据库 1.、在使用PLSQL Developer时&#xff0c;输入账号密码机械能登录操作&#xff0c;弹出空白弹框界面 即没有任何提示错误代码 只有一个白板的框 2、利用自身的SQL PLUS登录直接窗…

【SpringBoot集成Redis + Session持久化存储到Redis】

目录 SpringBoot集成Redis 1.添加 redis 依赖 2.配置 redis 3.手动操作 redis Session持久化存储到Redis 1.添加依赖 2.修改redis配置 3.存储和读取String类型的代码 4.存储和读取对象类型的代码 5.序列化细节 SpringBoot集成Redis 1.添加 redis 依赖 …

运算放大器学习笔记

目录 一、基本定理二、基本定义三、负反馈电路四、同向放大电路五、反向放大电路六、差分放大电路 一、基本定理 【电路示意图】 开环放大公式 VOAvo(V-V-) 开环放大倍数&#xff08;增益&#xff09;非常大&#xff0c;105 或 106 输入阻抗超级大&#xff08;可以理解为电…

辅助驾驶功能开发-控制篇(03)-基于PID的请求角度转扭矩算法

1 文档概述 本文档主要描述请求角度转扭矩的功能、性能要求、算法程序设计,后续可作为程序编程和功能及性能测试参考文档。 2 功能要求 转角扭矩管理(SteeringTorqueManager)将方向盘请求转角转换为电机叠加扭矩,进行横向路径跟踪,并与驾驶员方向盘手感交互,实现自适应调整…

2023年五一杯数学建模B题快递需求分析问题求解全过程论文及程序

2023年五一杯数学建模 B题 快递需求分析问题 原题再现&#xff1a; 网络购物作为一种重要的消费方式&#xff0c;带动着快递服务需求飞速增长&#xff0c;为我国经济发展做出了重要贡献。准确地预测快递运输需求数量对于快递公司布局仓库站点、节约存储成本、规划运输线路等具…

红魔8SPro强解BL+完美ROOT权限-刷MIUI14系统-修复指纹丢失/内存等问题

早前我们刷过红魔8pro手机&#xff0c;该手机支持解锁BL刷入MIU14系统&#xff0c;红魔8Pro由于官方并没有修改解锁BL指令&#xff0c;所以我们的解锁BL非常简单&#xff0c;只需要在fastboot下一键完成。随着红魔8SPro的上架&#xff0c;红魔UI6.0的发布&#xff0c;官方解锁指…

【数据仓库设计基础1】关系数据模型理论与数据仓库Inmon方法论

文章目录 一. 关系数据模型中的结构1&#xff0e;关系2&#xff0e;属性3&#xff0e;属性域4&#xff0e;元组5. 关系数据库6&#xff0e;关系表的属性7&#xff0e;关系数据模型中的键 二. 关系完整性1&#xff0e;空值&#xff08;NULL&#xff09;2&#xff0e;关系完整性规…

2022/9/13总结

Vue 路由的封装抽离 为了便于维护 &#xff0c;我们通常需要将路由模块抽离出来 在vue中&#xff0c;如果要写路径&#xff0c;可以写绝对路径 使用 代表从src目录下去寻找&#xff0c;能避免出现很多错误 声明式导航 -- 导航链接 vue-router提供了一个全局组件router-l…

nodejs系列-使用nodejs链接MongoDB数据库问题总结

参考文档 mongodbMongoose 问题1. 不支持preferredcms_db_name、cms_db_collection选项 throw new error_1.MongoParseError(${optionWord} ${Array.from(unsupportedOptions).join(, )} ${isOrAre} not supported);^MongoParseError: options preferredcms_db_name, cms_db…

SVN 和 GIT 命令对比

参考 https://blog.csdn.net/justry_deng/article/details/82259470 # TortoiseSVN打分支、合并分支、切换分支 https://www.huliujia.com/blog/802a64152bbbe877c95c84ef2fdf3857a056b536/ # 版本控制&#xff1a;Git与Svn的命令对应关系 TortoiseSVN打分支、合并分支、切换…

Qt应用开发(基础篇)——菜单栏 QMenuBar

一、前言 QMenuBar类继承于QWidget&#xff0c;该类提供了一个水平菜单栏。 菜单栏使用 QMenuBar菜单栏&#xff0c;顾名思义是菜单QMenu和动作QAction的容器&#xff0c;一般在软件的顶部经常会见到它。菜单栏包含了一系列下拉的菜单&#xff0c;使用addMenu()函数添加QMenu菜…

【ICASSP 2023】ST-MVDNET++论文阅读分析与总结

主要是数据增强的提点方式。并不能带来idea启发&#xff0c;但对模型性能有帮助 Challenge&#xff1a; 少有作品应用一些全局数据增强&#xff0c;利用ST-MVDNet自训练的师生框架&#xff0c;集成了更常见的数据增强&#xff0c;如全局旋转、平移、缩放和翻转。 Contributi…

leetcode 673. 最长递增子序列的个数

2023.9.13 做本题之前先复习一下 最长递增子序列 &#xff0c;在此基础上还要加个count数组&#xff0c;用于记录当前下标 最长递增子序列的个数。 本题还是有些难度&#xff0c;日后再来二刷。