您的位置: 首页 - 站长

js 网站源码怎么注册晋江网站做的

当前位置: 首页 > news >正文

js 网站源码,怎么注册晋江网站做的,做全网营销型网站建设,废旧电脑做网站服务器1. 基本概念 1.1、前言 web开发#xff1a; web#xff0c;网页的意思#xff0c;www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化#xff01; 动态 web 淘宝#xff0c;几乎是所有的网站#xff1b;提供给所有人看的数据始终会发生变化#xf…1. 基本概念 1.1、前言 web开发 web网页的意思www.baidu.com·静态 web html,css提供给所有人看的数据始终不会发生变化 动态 web 淘宝几乎是所有的网站提供给所有人看的数据始终会发生变化每个人在不同的时间不同的地点看到的信息各不相同技术栈Servlet/JSPASPPHP
1.2、web应用程序 可以提供浏览器访问的程序 a.html、b.html.…. 多个 web 资源这些 web 资源可以被外界访问对外界提供服务你们能访问到的任何一个页面或者资源都存在于这个世界的某一个角落的计算机上。URL通过这个 URL 可以访问到某个电脑上的资源这个统一的web资源会被放在同一个文件夹下web应用程序 需要依赖 Tomcat服务器 来展示一个web应用由多部分组成静态web动态web) html,css,jsjsp,servletJava程序jar包配置文件Properties)
Web应用程序编写完毕后若想提供给外界访问需要一个服务器来统一管理 1.3、静态web *.htm .html 这些都是网页的后缀、如果服务器上一直存在这些东西我们就可以直接进行读取需要网络 下面是静态 web 的流程
静态web存在的缺点 Web页面无法动态更新所有用户看到都是同一个页面 轮播图点击特效伪动态下面是让静态页面可以动起来的两种技术JavaScript [实际开发中它用的最多]VBScript 它无法和数据库交互数据无法持久化用户无法交互
1.4、动态web 页面会动态展示“web 页面的展示效果因人而异” WebServer Plugin 一个处理静态资源一个处理动态资源静态资源就是上面那条路先走 WebServer去 File System 获取静态资源。动态资源会去请求动态资源 JSP/Servlet请求完了交给 WebServer
缺点 加入服务器的动态web资源出现了错误我们需要重新编写我们的后台程序重新发布重新发布就需要停机维护 优点 Web页面可以动态更新所有用户看到都不是同一个页面它可以与数据库交互数据持久化注册商品信息用户信息………
2、web服务器 2.1、技术讲解 ASP: 微软国内最早流行的就是 ASP在HTML中嵌入了VB的脚本ASPCOM在ASP开发中基本一个页面都有几千行的业务代码页面极其混乱 维护成本高C# 语言开发使用的是 IIS 服务器 php: PHP开发速度很快功能很强大跨平台代码很简单中国 70% 的网站都是 PHP 做的WP无法承载大访问量的情况局限性 JSP/Servlet: JSP 本质是 Servlet B/S 架构浏览器和服务器 C/S客户端和服务器 sun 公司主推的 B/S 架构基于 Java 语言的所有的大公司或者一些开源的组件都是用 Java 写的可以承载三高问题带来的影响高并发、高可用、高性能语法很像 ASP很容易从 ASP → \to → JSP加强市场强度 2.2、web服务器 服务器是一种被动的操作用来处理用户的一些请求和给用户一些响应信息比如 lIS IIS 是微软的用于运行 ASPWindows 中自带的一些程序 Tomcat 工作中面向百度编程 Tomcat 是 Apache 软件基金会Apache Software Foundation) 的 jakarta 项目中的一个核心项目最新的 Servlet 和 JSP 规范总是能在 Tomcat 中得到体现因为 Tomcat 技术先进、性能稳定而且免费因而深受 java 爱好者的喜爱并得到了部分软件开发商的认可成为目前比较流行的 Web 应用服务器。 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器属于轻量级应用服务器在中小型系统和并发访问用户不是很多的场合下被普遍使用是开发和调试 JSP 程序的首选。对于一个Java初学web的人来说它是最佳的选择 Tomcat 实际上运行JSP页面和Servlet。Tornct最新版为9.0 工作3-5年之后可以尝试手写 Tomcat 服务器 下载 Tomcat 安装 or 解压了解配置文件及目录结构这个东西的作用 3、Tomcat 3.1、安装tomcat tomcat 官网 http://tomcat.apache.org/ 我这里下载的 linux 版本
3.2、Tomcat启动和配置 1、右击“我的电脑” 选择“属性” 单击左侧栏 “高级系统设置” “高级”“环境变量” 2、在系统变量这一栏里配置Tomcat的环境变量 变量名CATALINA_HOME 变量值D:\Program Files\tomcat\apache-tomcat-9.0.93
找到Path变量点击编辑%CATALINA_HOME%\bin 注意还需要 JAVA 环境%JAVA_HOME%\bin 1、闪退说明我们环境没有配好或者没配Java的环境检查自己配置的变量 2、乱码如果界面是下面这样乱码这是因为我们的dos窗口和Tomcat编码类型不一致导致的 文件夹作用:
bin 目录下启动关闭 Tomcat
访问测试 http://localhost:8080/ 可能遇到的问题 Java环境变量没有配置闪退问题需要配置兼容性乱码问题配置文件中设置 可以修改 conf/logging.properties 中的 java.util.logging.ConsoleHandler.encoding GBK 解决乱码问题 3.3、配置 打开这个 server.xml 文件可以配置启动的端口号等 网页显示
端口设置
一个文件夹就是一个 web 应用默认给出了 5 个 web 应用
现在对 ROOT 中的文件夹下的 index.jsp 进行修改。jsp 实际上就是 js 中加入了 java 程序 然后通过 bin 文件下的 startup.bat 启动http://localhost:8080/ 可以看到改动了
现在我们改动端口将 conf 文件夹下的 server.xml 中的端口改为 8090重新启动8080 端口无法访问需要 http://localhost:8090/ 注意 localhost 在这里改了之后是无法访问的
平时看到可以 www.baidu.com 访问。为什么呢 在 C:\Windows\System32 下有一个 System32 文件夹里面有我们核心配置drivers 文件夹里面有很多核心驱动下面有一个 etc是配置文件里面有个 hosts 主机打开 添加 127.0.0.1 www.future.com (注意改动需要在管理员权限下先管理员权限运行记事本然后打开) www.future.com:8090成功访问
tomcat 的默认端口号为8080mysql:3306http:80https443 右键网页检查网络里面点击地址可看到默认端口号但是并不是所有网站都可以查看的
可以配置端口号 Connector port8080 protocolHTTP/1.1connectionTimeout20000redirectPort8443 /可以配置本地地址 默认的主机名为localhost-127.0.0.1默认网站应用存放的位置为webapps Host namewww.qinjiang.com appBasewebappsunpackWARstrue autoDeploytrue高难度面试题 请你谈谈网站是如何进行访问的 输入一个域名如 www.baidu.com 或者 localhost:8080 等回车检查本机的 C:\Windows\System32\drivers\etc\hosts 配置文件下有没有这个域名映射 有直接返回对应的ip地址这个地址中有我们需要访问的web程序可以直接访问比如我们上述配置的 127.0.0.1 www.future.com 没有去DNS服务器找找到的话就返回找不到就返回找不到 4.可以配置一下环境变量可选性 3.4、发布一个web网站 不会就先模仿 将自己写的网站放到服务器Tomcat) 中指定的 web 应用的文件夹webapps)下就可以访问了 Tomcat 原始网页是寻找 ROOT 下的内容现在 copy 一份命名为 future 除了 WEB-INF 的其他文件都可以删除WEB-INF 目录代表一个网站WEB-INF 下面有一个 web.xml这个是一定不能删除的。 打开 web.xml
现在开始写程序分为静态 Web 和动态的 Web先写一个静态的在 future 文件夹下创建一个 index.html并在网络上任意找了一段 html 代码如下放入到 index.html 中直接双击 index.html 就可以看到里面的内容 !DOCTYPE html htmlheadmeta charsetutf-8titleflex弹性布局-今日头条首页热门视频栏/titlestyle typetext/cssbody {margin: 0;padding: 0;}a{text-decoration: none;}.show-monitor {width: 320px;height: 600px;/
border: 2px solid red; /margin: 50px 0px 0px 50px;}.panel-head {display: flex;/ height: 100px; // 解除图标变形 /align-items: center;}.panel-head span.panel-head-title {/ 占满全部空间 /flex-grow: 1;font-size: 20px;margin-left: 10px;}.panel-head .panel-head-sx {font-size: 16px;color: red;margin-left: 5px;}.panel-con {height: 94px;/ background-color: antiquewhite; /margin-top: 20px;display: flex;}.panel-con .panel-con-img {width: 126px;/ 高度自动继承 // height: 94px; // background-color: aqua; /margin-right: 10px;flex-shrink: 0;}.panel-con .panel-con-img img {width: 100%;height: 100%;/ 裁剪图片 防止变形 /object-fit: cover;}.panel-con .panel-con-txt {/ background-color: aquamarine; // 占满剩余空间 /flex-grow: 1;display: flex;flex-direction: column;text-overflow: ellipsis;}.panel-con .panel-con-txt a{font-size: 16px;color: #222;/ 超过44px文字不再显示 /max-height: 44px;overflow: hidden;line-height: 22px;/ 弹性伸缩盒子模型显示 /display: -webkit-box;/ 设置或检索伸缩盒子对象的子元素的排列方式 /-webkit-box-orient: vertical;/ 限制在一个块级元素显示的文本的行数 /-webkit-line-clamp: 2;/ 文本溢出显示省略号 /text-overflow: ellipsis;}.panel-con .panel-con-txt span.like{font-size: 12px;background-color: #fff2f2;color: #f04142;/ 消除占满整行现象 变为内容实际所占宽度*/align-self: flex-start;padding: 3px 6px;border-radius: 5px;margin-top: 5px;}.panel-con .panel-con-txt .desc{font-size: 14px;color: #999;display: flex;justify-content: space-between;margin-top: 5px;}/style/headbodydiv classshow-monitordiv classpanel-headimg srcimages/icon-play.png alt width22span classpanel-head-title热门视频/spanimg srcimages/icon-sx2.png alt width16span classpanel-head-sx换一换/span/divdiv classpanel-condiv classpanel-con-imga hrefimg srcimages/toutiao-01.jpeg alt/a/divdiv classpanel-con-txta href司马南中国与俄罗斯的战线/aspan classlike1万评论/spandiv classdescspan148万次观看/spanspan司马南频道/span/div/div/divdiv classpanel-condiv classpanel-con-imga hrefimg srcimages/toutiao-02.jpeg alt/a/divdiv classpanel-con-txta href无论做什么鱼最忌放盐和料酒研制大厨教你绝招./aspan classlike1万评论/spandiv classdescspan148万次观看/spanspan司马南频道/span/div/div/divdiv classpanel-condiv classpanel-con-imga hrefimg srcimages/toutiao-03.jpeg alt/a/divdiv classpanel-con-txta href司马南中国与俄罗斯的战线/aspan classlike1万评论/spandiv classdescspan148万次观看/spanspan司马南频道/span/div/div/divdiv classpanel-condiv classpanel-con-imga hrefimg srcimages/toutiao-04.jpeg alt/a/divdiv classpanel-con-txta href司马南中国与俄罗斯的战线/aspan classlike1万评论/spandiv classdescspan148万次观看/spanspan司马南频道/span/div/div/div/div/body /html重新启动 Tomcat它会自动访问 ROOT 下面的内容进一步输入 localhost:8090/future/就会访问 future 文件夹下的资源实际会自动添加 localhost:8090/future/index.html静态 web不会动的
同理还可以通过 localhost:8090/docs/ 访问 docs 文件夹下的内容其他文件下的内容同理
重点是 examples 文件夹下有很多例子访问 localhost:8090/examples/
比如进入 Servlet Examples很多例子可以执行可以通过 Source 查看源码自学就可以通过这些例子来查看源码
网站应该有的结构 –webapps Tomcat服务器的web目录-ROOT-kuangstudy 网站的目录名- WEB-INF-classes : java程序-libweb 应用所依赖的jar包-web.xml 网站配置文件- index.html 默认的首页- static -css-style.css-js-img-…..HTTP 协议 面试 4.HTTP 4.2 什么是 HTTP? HTTP(hypertext transport protocol) 超文本传输协议。 文本 HTML字符串…超文本图片音乐视频定位地图…80 端口 HTTPSHyper Text Transfer Protocol over SecureSocket Layer是以安全为目标的 HTTP 通道在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL 层HTTPS 的安全基础是 SSL。 443 端口 4.2 两个时代 HTTP 1.0: HTTP/1.0客户端与 Web 服务器连接后只能获得一个 Web 资源然后就断开连接加入某个页面有多个图片资源需要加载那么需要连接多次影响服务器和客户端的性能。 HTTP 2.0: HTTP/1.1客户端可以与web服务器连接后可以获得多个web资源。 4.3 HTTP 请求 客户端 - 发送请求Request-服务器 百度 Request URL:https://www.baidu.com/ 请求地址 Request Method:GET get方法/post方法 Status Code:200 OK 状态码200 Remote远程 Address:14.215.177.39:443Accept:text/html
Accept-Encoding:gzip, deflate, br Accept-Language:zh-CN,zh;q0.9 语言 Cache-Control:max-age0 Connection:keep-alive1、请求行 请求行中的请求方式GET 请求方式GetPostHEAD,DELETE,PUT,TRACT… get请求能够携带的参数比较少大小有限制会在浏览器的URL地址栏显示数据内容不安全但高效post请求能够携带的参数没有限制大小没有限制不会在浏览器的URL地址栏显示数据内容安全但不高效。 2、消息头 Accept告诉浏览器它所支持的数据类型 Accept-Encoding支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accept-Language告诉浏览器它的语言环境 Cache-Control缓存控制 Connection告诉浏览器请求完成是断开还是保持连接 HOST主机…./.4.4 HTTP 响应 服务器 - 响应response -客户端 百度 Cache-Control:private 缓存控制 Connection:Keep-Alive 连接 Content-Encoding:gzip 编码 Content-Type:text/html 类型1、响应体 Accept告诉浏览器它所支持的数据类型 Accept-Encoding支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accept-Language告诉浏览器它的语言环境 Cache-Control缓存控制 Connection告诉浏览器请求完成是断开还是保持连接 HOST主机…./. Refresh告诉客户端多久刷新一次 Location让网页重新定位2、响应状态码 200请求响应成功 200 3xx请求重定向 重定向你重新到我给你新位置去 4xx找不到资源 404 5xx服务器代码错误 500 502:网关错误 常见面试题 当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来经历了什么

  1. Maven 在 JavaWeb 开发中需要使用大量的 jar 包我们手动去导入如何能够让一个东西自动帮我导入和配置这个jar包。 由此Maven诞生了 5.5 标记文件夹功能 通过选中文件夹将其标记为 maven 对应的文件夹 还有一种标记方式如下
    可以通过这里点击文件夹然后点击 Mark as 的一个标记来标记此文件夹
    5.6 在 IDEA 中配置 Tomcat 先创建一个maven项目选择 webapp
    结构如下 解决警告问题 必须要的配置为什么会有这个问题因为我们访问一个网站需要指定一个文件夹名字之前是默认 webapps 这个文件IDEA 配置 tomcat 时没有这个默认文件所以我们要手动配置 选择 war就配置好啦
    在这里点击启动
    成功访问
    可能存在 Maven 默认 Web 项目中的 web.xml 版本问题 替换为 webapp4.0 版本和 Tomcat 一致 ?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0metadata-completetrue/web-app5.7 部分其他问题 Maven 由于它的约定大于配置之后可以能遇到我们写的配置文件无法被导出或者生效的问题解决方案 在 pom.xml 中配置比如默认情况我们在资源文件 resources 下写的 properties 文件才会被打包在 java 源代码文件下撰写的 properties 文件最终是无法被导出的为了解决这个问题添加配置信息如下半部分 !–在build中配置resources来防止我们资源导出失败的问题– buildresourcesresourcedirectorysrc/main/resources/directoryincludesinclude/*.properties/includeinclude/.xml/include/includesfilteringtrue/filtering/resourceresourcedirectorysrc/main/java/directoryincludesinclude**/.properties/includeinclude/*.xml/include/includesfilteringtrue/filtering/resource/resources /build6. Servlet 简介 Servlet 就是 Sun 公司开发动态 Web 的一门技术 Sun 在这些 API Application Programming Interface应用程序接口中提供一个接口叫做Servlet如果你想开发一个Servlet程序只需要完成两个小步骤 编写一个类实现Servlet接口。把开发好的Java类部署到web服务器中。 把实现了 Servlet 接口的 Java 程序叫做Servlet 6.2 HelloServlet Serlvet 接口 Sun 公司有两个默认的实现类HttpServletGenericServlet 构建一个普通的 Maven 项目删掉里面的 src 目录以后我们的学习就在这个项目里面建立 Moudel这个空的工程就是Maven主工程建一个WebApp Maven项目勾选模板因为可以在项目内构建多个子工程每个子工程都有自己的 pom.xml
    尽可能的把所有依赖都导入到主工程的 pom.xml 中在 maven 仓库 中获取 servlet 的依赖加入到主工程中。 !– https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api – dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/versionscopeprovided/scope /dependency同时把 JSP 的依赖添加到主工程中 !– https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api – dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjavax.servlet.jsp-api/artifactIdversion2.3.3/versionscopeprovided/scope /dependency通常只有版本信息会变 version 字段
    构建一个 servlet 项目新建 Module
    由于 servlet 是一个 web 项目选中模版中的 org.apache.maven.archetypes:maven-archetype-webapp
    关于Maven父子工程的理解 父项目的 pom.xml 中会有 modulesmoduleservlet-01/module /modules如果多个子项目父项目的 pom.xml 中会有 modulesmoduleservlet-01/modulemodulesubproject-01/modulemodulesubproject-02/modulemodulesubproject-03/module…. /modules子项目中会有 parentartifactIdServlet/artifactIdgroupIdorg.example/groupIdversion1.0-SNAPSHOT/version /parent父项目中的 jar 包子项目可以直接使用但是子项目中的父项目不可以使用 son extends fatherMaven 环境优化 修改 web.xml 为最新的将 maven 的结构搭建完整 产生 servlet-01 子项目后第一步将 src/main/webapp/WEB-INF/web.xml 中的内容换为最新的初始版太老了 ?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0metadata-completetrue/web-app然后再 src/main 下新建 java、resources 并标记为 源代码文件和资源文件
    编写一个Servlet程序 编写一个普通类实现 Servlet 接口这里我们直接继承 HttpServlet 建包
    创建类 HelloServlet
    然后让类继承 HttpServlet 接口子工程会自动导包父工程 如果无法正常自动导包父工程中的 jar 包检查父工程 pom.xml 如下外层不要使用 dependencyManagement注释掉 scope 重写 getpost 方法 S1编写一个普通类 S2实现 Servlet 接口这里我们直接继承 HttpServlet 由于get或者post只是请求实现的不同的方式可以相互调用业务逻辑都一样 public class HelloServlet extends HttpServlet {//由于get或者post只是请求实现的不同的方式可以相互调用业务逻辑都一样Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//ServletOutputStream outputStream resp.getOutputStream();PrintWriter writer resp.getWriter(); //响应流writer.print(Hello,Serlvet);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }编写 Servlet 的映射 为什么需要映射我们写的是 Java 程序但是要通过浏览器访问而浏览器需要连接 Web 服务器所以我们需要在 Web 服务中注册我们写的 Servlet还需给他一个浏览器能够访问的路径 !–注册Servlet– servletservlet-namehello/servlet-nameservlet-classcom.uestc.servlet.HelloServlet/servlet-class /servlet !–Servlet的请求路径– servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern /servlet-mapping配置 Tomcat 注意 配置项目发布的路径就可以了 配置好后解决警告点击 Fix
    会进入到 Deployment选择项目 servlet-01war
    或者点击 号选择则 artifacts再设置其中 Application context 设置为 /s1表示请求
    启动测试OK 项目下面会产生一个 target 文件夹里面就是我们项目的信息
    成功访问我们设置的 8090 端口s1 下进行访问成功通常是 8080 端口
    网页上查找 hello 的请求路径
    会在 Servlet 的请求路径中查看 url-pattern找到 hello获取到 name 为 hello在 servlet 中找到 hello获取到对应的类如下
    6.3、Servlet原理 Servlet是由Web服务器调用浏览器会向 Web 容器发送 http 请求request 请求如果是首次访问会将我们编写的 java 类编译成 class 类去运行如果项目比较庞大第一次会比较慢后面就会很快。 web 容器会产生两个对象请求request和响应responseservlet 里面有个 service 方法这个方法可以处理请求和响应因此 请求request和响应response对象会去调用这个 service 方法。 Request 从 service 方法中拿到请求并把请求之后的响应交给 Response
    获取响应信息的过程如下
    获取到响应信息后就可以返回给客户端了整个流程如下
    6.4 Mapping 问题 Mapping 是请求映射的一个路径一个 Servlet 指定一个映射路径的情况 servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern /servlet-mapping一个 Servlet 指定多个映射路径的情况 servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern /servlet-mapping servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello2/url-pattern /servlet-mapping servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello3/url-pattern /servlet-mapping servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello4/url-pattern /servlet-mapping servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello5/url-pattern /servlet-mapping一个Servlet指定通用映射路径使用 /这个通配符 servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello//url-pattern /servlet-mapping默认请求路径就是什么都不写会走如下请求 !–默认请求路径– servlet-mappingservlet-namehello/servlet-nameurl-pattern/*/url-pattern /servlet-mapping指定一些后缀或者前缀等等…. !–可以自定义后缀实现请求映射注意点前面不能加项目映射的路径hello/sajdlkajda.qinjiang– servlet-mappingservlet-namehello/servlet-nameurl-pattern.qinjiang/url-pattern !– 不能写成 /.qinjiang – /servlet-mapping1. 使用 / (通用路径匹配) servlet-mapping servlet-namehello/servlet-name url-pattern/hello//url-pattern
    /servlet-mapping 匹配路径匹配所有以 /hello/ 开头的路径例如 /hello/abc 或 /hello/xyz/def。用途这种方式通常用于匹配某个特定前缀后的所有路径。可以让 servlet 处理以某个特定路径为前缀的所有请求。说明/
    会匹配 /hello/ 后面的所有路径和子路径。例如/hello/test、/hello/abc/xyz 都会被 hello servlet 处理。 2. 默认请求路径 /* !–默认请求路径–
    servlet-mapping servlet-namehello/servlet-name url-pattern//url-pattern
    /servlet-mapping 匹配路径这种配置会匹配所有的请求路径包括根路径和所有的子路径例如 /abc、/hello、/xyz/abc 等。用途适用于在没有明确指定路径的情况下处理所有请求。非常常见于默认 servlet 或通用处理请求的场景。需要谨慎使用因为它会拦截所有的请求包括静态资源如图片、CSS、JS 等。说明/
    匹配所有请求通常作为全局的默认映射。 3. 使用后缀自定义后缀 !–可以自定义后缀实现请求映射–
    servlet-mapping servlet-namehello/servlet-name url-pattern*.qinjiang/url-pattern
    /servlet-mapping 匹配路径只会匹配以 .qinjiang 为后缀的路径。例如/hello/something.qinjiang 会被 hello servlet 处理。用途用于将特定的 URL 后缀映射到指定的 servlet。例如某些特殊类型的文件请求可以由某个 servlet 处理而其他请求则交给其他 servlet 或静态资源处理。说明这种方式比较特殊通常用于基于文件后缀的请求路由。
    注意不能在前面加上 /因为 url-pattern 是通过匹配路径来识别请求的* 只能匹配文件名的后缀。 总结 /*例如 /hello/用于匹配以某个特定路径开头的所有请求支持多层级路径。/ 用于匹配所有请求路径全局匹配。.qinjiang 用于匹配特定后缀的请求通常用于指定文件类型的请求处理。 选择使用哪种方式取决于你的需求 如果你需要针对特定路径做处理使用 /hello/。如果你需要拦截所有请求使用 /*。如果你需要根据文件后缀进行处理使用 .qinjiang。 优先级问题 指定了固有的映射路径优先级最高如果找不到就会走默认的处理请求 !–404– servletservlet-nameerror/servlet-nameservlet-classcom.kuang.servlet.ErrorServlet/servlet-class /servlet servlet-mappingservlet-nameerror/servlet-nameurl-pattern//url-pattern /servlet-mapping6.5 ServletContext对象 Web 应用程序的上下文Web Application Context是指 Web 应用程序在运行时的环境和状态信息的集合。它提供了一个在整个应用程序范围内共享的区域包含了应用的配置、资源、参数和一些状态信息。在 Servlet 容器中ServletContext 就是表示 Web 应用程序上下文的对象。它提供了跨 Servlet 共享数据、访问应用参数、获取资源、日志记录等功能。 主要功能 共享资源通过 setAttribute() 和 getAttribute() 方法多个 Servlet 可以共享数据。访问应用参数通过 getInitParameter() 获取 web.xml 中的初始化参数。资源访问通过 getResource() 和 getResourceAsStream() 获取应用中的静态资源。日志记录使用 log() 方法记录应用日志。获取服务器信息使用 getServerInfo() 获取容器的基本信息。 举例 在 Servlet 容器中当应用启动时容器为每个 Web 应用程序创建一个 ServletContext 对象该对象管理该应用程序的配置、资源、生命周期等信息。 总结 Web 应用程序的上下文是一个虚拟环境包含了 Web 应用的配置、资源、共享数据和生命周期信息。它使得不同的组件如 Servlet、Filter 等能够在同一个 Web 应用内共享信息和资源。ServletContext 用于跨 Servlet 共享资源、访问应用级参数、获取资源及日志记录是 Web 应用的重要上下文对象。 先在父工程下新建一个 servlet-02 项目
    父工程的 pom.xml 多了一个模块
    更改 servlet-02 中的 src/main/webapp/WEB-INF/web.xml如下 ?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0metadata-completetrue/web-app添加 源码目录java和资源目录resources进行标记 如果Maven pom.xml 文件变灰且中间有一条横线的处理办法 是因为 pom.xml 文件被设置在maven忽略文件清单中 解决方法 file –setting–maven–Ignored Files 将清单中对应项目的pom.xml文件取消选中即可 创建 HelloServlet public class HelloServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(Hello); // 向后台输入也能测试 servlet} }然后在 web.xml 中注册 Servlet !–注册Servlet–servletservlet-namehello/servlet-nameservlet-classcom.uestc.servlet.HelloServlet/servlet-class/servlet!–Servlet的请求路径–servlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern/servlet-mappingTomcat 配置
    多了一个 servlet-02 war 包添加进入并去掉之前的 servlet-01:war需要保持这里面只有一个 war 包因为添加两个打包会很慢
    然后在网页上走 hello 这个请求 http://localhost:8090/s2/hello页面没有任何东西后台输出了 hello因为我们上面代码的 response 没有响应到页面只是让后台输出了 hello
    查看 HttpServlet 类中的方法
    下面我们重点来看 ServletContextweb 容器在启动的时候他会为每个 web 程序都创建一个对应的ServletContext 对象它代表了当前的 web 应用 思考一个问题不同的 Servlet 之间能否互相传送数据。能保存在 ServletContext 中其他 Servlet 直接读取里面的东西即可
    更改 Servelt-02 的 HelloServlet 如下将数据保存到 ServletContext public class HelloServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//this.getInitParameter() 初始化参数//this.getServletConfig() Servlet配置//this.getServletContext() Servlet上下文ServletContext context this.getServletContext();String username 青年有志; // 数据这里使用中文可以导致乱码context.setAttribute(username,username); //将一个数据保存在了ServletContext中名字为username 。值 username} }在 Servelt-02 中创建一个 GetServlet
    public class GetServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context this.getServletContext();String username (String) context.getAttribute(username);resp.setContentType(text/html);resp.setCharacterEncoding(utf-8); // 正常显示中文resp.getWriter().print(名字username);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }在 Servelt-02 下的 web.xml 中进行配置 配置名字为 getc自定义 servletservlet-namegetc/servlet-nameservlet-classcom.uestc.servlet.GetServlet/servlet-class/servletservlet-mappingservlet-namegetc/servlet-nameurl-pattern/getc/url-pattern/servlet-mapping重启 Tomcat我们先请求 getc为 null
    那么我们先请求 hello什么都没有很正常代码只实现了向 ServletContext 中写入数据
    再执行请求 getc成功获取
    6.5.1 共享数据 总结上述过程在一个 servlet 中保存的数据可以在另一个 servlet 中拿到 需要一个放置数据的类 public class HelloServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//this.getInitParameter() 初始化参数//this.getServletConfig() Servlet配置//this.getServletContext() Servlet上下文ServletContext context this.getServletContext();String username 秦疆; //数据context.setAttribute(username,username); //将一个数据保存在了ServletContext中名字为username 。值 username} }读取数据的类 public class GetServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context this.getServletContext();String username (String) context.getAttribute(username);resp.setContentType(text/html);resp.setCharacterEncoding(utf-8);resp.getWriter().print(名字username);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }最后注册 Servlet servletservlet-namehello/servlet-nameservlet-classcom.kuang.servlet.HelloServlet/servlet-class/servletservlet-mappingservlet-namehello/servlet-nameurl-pattern/hello/url-pattern/servlet-mappingservletservlet-namegetc/servlet-nameservlet-classcom.kuang.servlet.GetServlet/servlet-class/servletservlet-mappingservlet-namegetc/servlet-nameurl-pattern/getc/url-pattern/servlet-mapping6.5.2 获取初始化参数 context-param 元素在 web.xml 中的作用是为 Web 应用程序提供全局的上下文参数。这些参数可以在整个应用程序中被访问并且可以用于配置、初始化参数等。它们通常用于配置在整个 Web 应用中都需要访问的一些常量值例如数据库连接、API 密钥、文件路径等。 使用 context-param 的基本语法 context-paramparam-name参数名称/param-nameparam-value参数值/param-value /context-paramparam-name这是参数的名称定义了这个上下文参数的标识符。param-value这是参数的值通常是一个字符串可以是任意的配置信息。 典型的使用场景 数据库连接配置 在 Web 应用程序中你可能需要配置数据库连接的 URL、用户名、密码等信息可以通过 context-param 来提供这些信息。 context-paramparam-namedb.url/param-nameparam-valuejdbc:mysql://localhost:3306/mydatabase/param-value /context-param context-paramparam-namedb.username/param-nameparam-valueroot/param-value /context-param context-paramparam-namedb.password/param-nameparam-valuepassword123/param-value /context-param文件路径或配置路径 对于一些需要特定文件路径或者配置文件路径的情况也可以通过 context-param 来传递这些路径信息。 context-paramparam-nameconfig.file.path/param-nameparam-value/path/to/config.xml/param-value /context-param外部服务或 API 配置 如果应用需要访问外部 API 或服务可以通过 context-param 存储 API 密钥、URL 等信息。 context-paramparam-nameapi.key/param-nameparam-value12345abcdef/param-value /context-param访问 context-param 参数 一旦在 web.xml 中定义了 context-param你就可以在应用程序的 Java 代码中访问这些参数。访问方式通常是通过 ServletContext 对象下面是几种常见的访问方法 1. 使用 ServletContext 访问参数 // 获取 ServletContext 对象 ServletContext context getServletContext();// 获取参数值 String dbUrl context.getInitParameter(db.url); String dbUsername context.getInitParameter(db.username); String dbPassword context.getInitParameter(db.password);2. 在 Servlet 或 Filter 中使用 在 Servlet 或 Filter 中也可以轻松访问这些参数。比如 WebServlet(/example) public class ExampleServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取 context-param 参数ServletContext context getServletContext();String dbUrl context.getInitParameter(db.url);// 使用 dbUrl 做其他操作response.getWriter().write(Database URL: dbUrl);} }3. 在 Listener 中使用 如果你需要在应用启动时进行初始化操作也可以在 ServletContextListener 中访问这些参数 public class AppContextListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent sce) {ServletContext context sce.getServletContext();String dbUrl context.getInitParameter(db.url);// 在此处使用 dbUrl 进行初始化数据库连接等操作}Overridepublic void contextDestroyed(ServletContextEvent sce) {// 处理清理操作} }相关注意事项 参数名称唯一性param-name 应该具有唯一性以避免多个参数具有相同的名称导致混淆。 参数值类型param-value 中存储的通常是字符串类型的数据但也可以通过解析或转换来处理更复杂的配置。例如你可以将 JSON 配置字符串存储在 param-value 中启动时再将其解析为对象。 访问范围这些参数是全局的因此可以在整个 Web 应用程序中使用但需要注意如果多个模块需要不同的值最好分开使用不同的参数名称来避免冲突。 配置加载顺序Web 应用程序启动时web.xml 中的所有 context-param 会被读取并可供应用中的所有组件使用。所以这些参数的加载顺序是先于 Servlet、Filter 等组件的初始化。 示例web.xml 配置 web-app xmlnshttp://java.sun.com/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_1.xsdversion3.1context-paramparam-namedb.url/param-nameparam-valuejdbc:mysql://localhost:3306/mydatabase/param-value/context-paramcontext-paramparam-namedb.username/param-nameparam-valueroot/param-value/context-paramcontext-paramparam-namedb.password/param-nameparam-valuepassword123/param-value/context-paramservletservlet-nameexampleServlet/servlet-nameservlet-classcom.example.ExampleServlet/servlet-class/servletservlet-mappingservlet-nameexampleServlet/servlet-nameurl-pattern/example/url-pattern/servlet-mapping/web-app在上面的示例中context-param 用于配置数据库的连接信息这些信息可以在 Web 应用程序中的各个 Servlet 或其他组件中通过 ServletContext 来访问。 !–配置一些 web 应用初始化参数比如配置 jdbc 连接– context-paramparam-nameurl/param-nameparam-valuejdbc:mysql://localhost:3306/mybatis/param-value /context-param下面在 Servlet-02 中创建类 ServletDemo03并打印配置的 url ServletContext context this.getServletContext();String url context.getInitParameter(url);resp.getWriter().print(url);进行 Servlet 注册 servlet servlet-namegp/servlet-nameservlet-classcom.uestc.servlet.ServletDemo03/servlet-class /servlet servlet-mappingservlet-namegp/servlet-nameurl-pattern/gp/url-pattern /servlet-mapping然后重启 Tomcat然后请求 gplocalhost:8090/s2/gp就拿到了上述我们配置的 url
    6.5.3、请求转发 在 servlet-02 下面新建一个 ServletDemo04 Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context this.getServletContext();System.out.println(进入了ServletDemo04); // 查看是否成功进入//RequestDispatcher requestDispatcher context.getRequestDispatcher(/gp); //转发的请求路径当前页面下的 gp//requestDispatcher.forward(req,resp); //调用forward实现请求转发context.getRequestDispatcher(/gp).forward(req,resp); // 上面两行合并为一行 }注册 servlet servletservlet-namesd4/servlet-nameservlet-classcom.uestc.servlet.ServletDemo04/servlet-class/servletservlet-mappingservlet-namesd4/servlet-nameurl-pattern/sd4/url-pattern/servlet-mapping重启 Tomcat然后请求 sd4获取到的是请求 gp 时的内容这就是请求转发的效果但是路径是不会改变的还是 localhost:8090/s2/sd4后面讲的重定向才会发生改变
    A 想要拿到 C 的资源但是无法直接调用 C只能找到 B可以先 B 找 C 拿C 再给 BB 再给 A这就是请求转发这样 A 的路径是没有变化的只有转发的概念如下图上部分 什么是重定向A 告诉 B 要拿一个资源但是资源只有 C 有B 就告诉 A 去 C 哪里拿A 又去找 C到时候会发生跳转如下图下半部分 在 Java Web 开发中请求转发Request Forwarding是一种由服务器端处理的请求流转机制它允许将客户端的请求从一个 Servlet 转发到另一个 Servlet、JSP 页面或其他资源而无需客户端知道这一过程。 context.getRequestDispatcher(/gp).forward(req, resp); 语句是实现请求转发的一种方式 1. 什么是请求转发 请求转发是服务器端的一种处理方式其中服务器将客户端的请求HttpServletRequest转发到另一个资源如另一个 Servlet、JSP 页面、HTML 页面等。转发后客户端并不知道请求被转发到哪里它只知道发出了请求而最终的响应是由转发后的资源生成并返回的。 2. RequestDispatcher 接口 RequestDispatcher 是 Java Servlet API 中的一个接口它提供了两种主要的方法来转发请求或包括资源的内容 forward(ServletRequest request, ServletResponse response)将请求转发到另一个资源Servlet、JSP 页面等请求会继续在服务器端处理而客户端并不会知道这个过程。转发后控制权交给目标资源原请求的 request 和 response 会被传递给目标资源。include(ServletRequest request, ServletResponse response)将请求的响应内容包含在另一个资源的响应中。通常是将另一个 Servlet 或 JSP 页面的内容插入到当前页面中。 3. context.getRequestDispatcher(/gp).forward(req, resp) 解释 context.getRequestDispatcher(/gp).forward(req, resp); context: 这里的 context 是 ServletContext 对象它表示应用的上下文。可以通过 getServletContext() 方法获取它。getRequestDispatcher(/gp): getRequestDispatcher 方法返回一个 RequestDispatcher 对象表示可以将请求转发到指定路径的资源。这里的 /gp 是转发的目标路径它可以是 相对路径/gp 是从 Web 应用的根目录开始的相对路径也可以是 /contextPath/gp。如果路径是 /gp那么它会映射到 Web 应用根目录下的 gp 资源例如 gp 对应的 Servlet 或 JSP。绝对路径getRequestDispatcher(/somePath) 表示从 Web 应用根目录开始的路径。注意这里的路径是相对于 Web 应用的根路径的而不是相对于当前请求的路径。 forward(req, resp)这将把当前请求转发到 /gp 路径指定的资源并将原始的请求对象req和响应对象resp传递给目标资源。转发后控制权交给 /gp 对应的资源进行处理。 4. 请求转发的特点 服务器端操作请求转发完全由服务器处理客户端浏览器并不知道请求已经被转发。共享请求和响应对象在转发过程中原始的 request 和 response 对象会被传递给目标资源。因此转发后的资源可以访问到原始请求中的所有参数、属性等。URL 不变请求转发后客户端浏览器的 URL 不会发生变化仍然是最初请求的 URL。这是请求转发与重定向的一个主要区别。 5. 请求转发的应用场景 请求转发通常用于以下几种情况 请求链处理 在 Web 应用中一个请求可能需要经过多个 Servlet 或资源的处理。例如一个请求在一个 Servlet 中进行验证或设置了数据然后转发到另一个 Servlet 或 JSP 页面处理结果并展示给用户。示例用户登录后先由一个 Servlet 进行身份验证然后将验证结果转发到一个显示用户信息的页面。 JSP 页面之间的跳转 一个 Servlet 或一个 JSP 页面可以通过请求转发将请求传递给另一个 JSP 页面生成最终的响应。示例一个 Servlet 处理了表单提交的逻辑后将请求转发到一个 JSP 页面显示结果。 分布式 Web 应用中的请求处理 在某些分布式 Web 应用中一个 Servlet 可能会将请求转发到另一台服务器上的资源进行处理。 6. 转发与重定向的区别 请求转发和重定向都是 Web 开发中常用的请求处理方式它们有以下不同之处 特点请求转发 (forward)重定向 (sendRedirect)控制权由服务器控制客户端不知道转发过程由客户端控制浏览器会重新发起请求URL 变化不会变化浏览器 URL 不变会变化浏览器 URL 会更新为目标 URL请求传递请求对象和响应对象会传递给目标资源新的请求会发往服务器原请求信息丢失请求次数只有一次请求会发起两次请求一次到当前资源另一次到目标资源适用场景服务器端的资源跳转内部请求处理链客户端跳转或者跨应用的请求 7. 实际示例 假设我们有以下的 Web 应用结构 /webapp
    ├── /index.jsp
    ├── /loginServlet
    └── /welcome.jsp loginServlet 负责处理登录逻辑登录成功后将请求转发到 welcome.jsp 页面 LoginServlet.java WebServlet(/loginServlet)
    public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); // 假设验证成功 if (user.equals(username) pass.equals(password)) { // 登录成功转发到欢迎页面 request.getRequestDispatcher(/welcome.jsp).forward(request, response); } else { // 登录失败转发回登录页面 request.getRequestDispatcher(/index.jsp).forward(request, response); } }
    } welcome.jsp html
    body h1Welcome, you have logged in successfully!/h1
    /body
    /html 8. 总结 请求转发是服务器端的操作客户端无法察觉适用于在服务器端处理多个资源之间的请求。通过 RequestDispatcher 的 forward() 方法实现请求的转发。请求转发不会改变浏览器 URL且请求和响应对象保持一致适合用于多个资源的内部处理链。 6.5.4、读取资源文件 properties 文件内容 在 Web 应用中通常资源文件例如 db.properties会被放置在类路径中例如 WEB-INF/classes 目录下。在这种情况下您不需要硬编码绝对路径而是依赖于类路径来动态访问文件。下面我将详细说明如何在 Web 应用中通过 HTTP 请求加载 db.properties 文件。 1. 类路径概念 在 Java Web 应用中所有的 Java 类文件和资源文件例如 .properties 文件、.xml 文件等最终都会打包到应用的类路径中。通常 编译后的 .class 文件放在 WEB-INF/classes 目录下。资源文件如配置文件也应放在 WEB-INF/classes 或 WEB-INF 下的其他适当目录。 类路径是 Java 应用程序查找类文件和资源文件的地方。在 Web 应用中类路径通常是 Web 应用的根目录下的 WEB-INF/classes 目录所有的资源文件都会被部署到这个路径中。 2. Web 应用中的资源访问方式 在 Web 应用中使用 ServletContext 来访问 WEB-INF 下的资源文件。通过 getResourceAsStream() 方法可以从类路径中读取资源文件而不需要关心文件的绝对路径。 3. 加载 db.properties 配置文件的步骤 假设 db.properties 文件存放在 WEB-INF/classes/com/yourapp/config/db.properties 中您可以通过如下步骤从请求中加载该文件。 代码实现 import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties; public class ServletDemo extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 使用 getServletContext() 获取资源输入流路径为 /WEB-INF/classes/com/yourapp/config/db.properties InputStream is this.getServletContext().getResourceAsStream(/WEB-INF/classes/com/yourapp/config/db.properties); // 如果文件没有找到返回错误消息 if (is null) { resp.getWriter().print(db.properties not found!); return; } // 创建 Properties 对象用于读取配置文件内容 Properties prop new Properties(); prop.load(is); // 获取属性值例如数据库连接信息 String dbUrl prop.getProperty(db.url); String dbUser prop.getProperty(db.username); String dbPassword prop.getProperty(db.password); // 将读取到的配置信息输出到浏览器 resp.getWriter().print(Database URL: dbUrl br); resp.getWriter().print(Username: dbUser br); resp.getWriter().print(Password: dbPassword br); } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求调用 doGet 进行处理 doGet(req, resp); }
    } 解释 加载配置文件 getServletContext().getResourceAsStream(/WEB-INF/classes/com/yourapp/config/db.properties) 这行代码通过 ServletContext 来加载 db.properties 配置文件。路径 /WEB-INF/classes/com/yourapp/config/db.properties 表示相对于 Web 应用的根路径。getResourceAsStream() 会返回一个输入流 InputStream您可以用它来读取文件内容。 读取文件内容 使用 Properties 类来读取 .properties 文件的键值对。prop.load(is) 会从 InputStream 加载配置项。通过 prop.getProperty(db.url)、prop.getProperty(db.username) 和 prop.getProperty(db.password) 获取数据库连接的相关配置。 返回响应 将数据库的配置信息输出到网页上使用 resp.getWriter().print() 将信息打印到浏览器。 4. 重要概念和注意事项 getResourceAsStream 方法 getResourceAsStream() 是 ServletContext 提供的一个方法用于从 Web 应用的类路径中加载资源文件。这个方法会返回一个 InputStream可以用来读取文件内容。在这里它加载的是 WEB-INF/classes/com/kuang/servlet/aa.properties 文件。 路径问题 路径 /WEB-INF/classes/com/kuang/servlet/aa.properties 表示文件位于 Web 应用根目录下的 WEB-INF/classes/com/kuang/servlet 目录中。Web 应用启动时WEB-INF/classes 目录下的所有资源会被加入到类路径中从而能够通过 getServletContext().getResourceAsStream 来访问。 Properties 类 Properties 类是 Java 提供的一种用于处理属性文件如 .properties 文件的类。属性文件是以键值对形式存储配置的文本文件可以使用 getProperty(key) 方法根据键来获取值。 5. 路径配置 正确的路径设置 db.properties 文件放置在 WEB-INF/classes/com/yourapp/config/ 目录下。使用 getServletContext().getResourceAsStream(/WEB-INF/classes/com/yourapp/config/db.properties) 读取文件时路径 /WEB-INF/classes/ 是从 Web 应用根目录开始的。 如果您的文件路径不在 WEB-INF/classes/ 目录下而是放在 WEB-INF/ 或其他路径中您需要调整路径以正确访问。 6. 补充说明 路径中的前缀 / 在 getResourceAsStream() 中路径前面的 / 表示从 Web 应用的根目录开始查找。/WEB-INF 是 Web 应用的保密目录通常对外部不可直接访问但是可以通过 ServletContext 访问。 ServletContext 和路径问题 getResourceAsStream() 方法会从 Web 应用的类路径中查找文件。因此无论部署在哪里只要文件位于正确的位置ServletContext 都能加载到它。 7. 总结 使用 ServletContext 的 getResourceAsStream() 方法可以加载放置在 WEB-INF/classes 中的资源文件。通过这种方式可以避免硬编码绝对路径确保在开发和生产环境中都能够正确加载资源。配置文件如 db.properties通常会存放在 WEB-INF/classes 中而通过 Properties 类可以轻松读取和管理这些文件的内容。 会涉及到 properties 类 在 resources 文件夹下创建一个以 .properties 为后缀的文件并存储以下数据 uernameroot password123456之前的思路如何读取到 db.properties 这个文件下的内容 通过 properties 类通过绝对地址去 load 出来但是现在是 web 应用无法保证绝对地址是在服务器上获取内容需要观察它在服务器的什么位置。 下面先通过 maven 的 clean 清理干净target 文件就会被删除掉清理完成后重新启动 tomcat会产生一个 target 文件target/servlet-02/WEB-INF/classes/db.properties 下 先提到一个 classpath类路径的概念我们源代码 java 和资源文件 resources 的内容最终都会以相同的路径打包到类路径也就是 classes 文件夹下的
    如果我们在源代码 java 文件而不是资源文件 resources 下创建一个如 test.properties 文件观察它是否会被打包到 target 目录下
    重启 tomcat发现并没有生成 test.properties
    实际上在 maven 中已经讲过需要在 pom.xml 中进行配置如下从而打包 java 源码下的 properties 文件 !–在build中配置resources来防止我们资源导出失败的问题– buildresourcesresourcedirectorysrc/main/resources/directoryincludesinclude
    /.properties/includeinclude**/.xml/include/includesfilteringtrue/filtering/resourceresourcedirectorysrc/main/java/directoryincludesinclude/*.properties/includeinclude/*.xml/include/includesfilteringtrue/filtering/resource/resources /build在 java 目录中新建 properties在 resource 目录下新建 properties 发现都被打包到了同一个路径下classes我们称这个路径为 classpath 下面我们新建一个 ServletDemo05 类来从服务器上读取我们想要的文件内容 public class ServletDemo05 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {InputStream is this.getServletContext().getResourceAsStream(/WEB-INF/classes/com/kuang/servlet/aa.properties); // 获取文件路径Properties prop new Properties();prop.load(is);String user prop.getProperty(username);String pwd prop.getProperty(password);resp.getWriter().print(user:pwd); // 输入到网页上}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }并注册 servlet 命名为 sd5 servletservlet-namesd5/servlet-nameservlet-classcom.uestc.servlet.ServletDemo04/servlet-class/servletservlet-mappingservlet-namesd5/servlet-nameurl-pattern/sd5/url-pattern/servlet-mapping重启 tomcat请求 sd5localhost:8090/s2/sd5如果发生 500 错误检查文件路径是否正确正确尝试将 target 文件删除再使用
    成功获取
    6.6 HttpServletResponse Web 服务器接收到客户端的 http 请求针对这个请求分别创建一个代表请求的 HttpServletRequest 对象代表响应的一个 HttpServletResponse 如果想要获取客户端请求过来的参数找 HttpServletRequest如果要给客户端响应一些信息找 HttpServletResponse 6.6.1 简单分类 负责向浏览器发送数据的方法 ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;负责向浏览器发送响应头的方法 void setCharacterEncoding(String var1);void setContentLength(int var1);void setContentLengthLong(long var1);void setContentType(String var1);void setDateHeader(String var1, long var2);void addDateHeader(String var1, long var2);void setHeader(String var1, String var2);void addHeader(String var1, String var2);void setIntHeader(String var1, int var2);void addIntHeader(String var1, int var2);响应的状态码 int SC_CONTINUE 100; int SC_SWITCHING_PROTOCOLS 101; int SC_OK 200; int SC_CREATED 201; int SC_ACCEPTED 202; int SC_NON_AUTHORITATIVE_INFORMATION 203; int SC_NO_CONTENT 204; int SC_RESET_CONTENT 205; int SC_PARTIAL_CONTENT 206; int SC_MULTIPLE_CHOICES 300; int SC_MOVED_PERMANENTLY 301; int SC_MOVED_TEMPORARILY 302; int SC_FOUND 302; int SC_SEE_OTHER 303; int SC_NOT_MODIFIED 304; int SC_USE_PROXY 305; int SC_TEMPORARY_REDIRECT 307; int SC_BAD_REQUEST 400; int SC_UNAUTHORIZED 401; int SC_PAYMENT_REQUIRED 402; int SC_FORBIDDEN 403; int SC_NOT_FOUND 404; int SC_METHOD_NOT_ALLOWED 405; int SC_NOT_ACCEPTABLE 406; int SC_PROXY_AUTHENTICATION_REQUIRED 407; int SC_REQUEST_TIMEOUT 408; int SC_CONFLICT 409; int SC_GONE 410; int SC_LENGTH_REQUIRED 411; int SC_PRECONDITION_FAILED 412; int SC_REQUEST_ENTITY_TOO_LARGE 413; int SC_REQUEST_URI_TOO_LONG 414; int SC_UNSUPPORTED_MEDIA_TYPE 415; int SC_REQUESTED_RANGE_NOT_SATISFIABLE 416; int SC_EXPECTATION_FAILED 417; int SC_INTERNAL_SERVER_ERROR 500; int SC_NOT_IMPLEMENTED 501; int SC_BAD_GATEWAY 502; int SC_SERVICE_UNAVAILABLE 503; int SC_GATEWAY_TIMEOUT 504; int SC_HTTP_VERSION_NOT_SUPPORTED 505;HttpServletResponse 是 Java Servlet API 中的一个接口代表了服务器端对客户端的响应。它负责向客户端发送响应数据和设置响应头信息。你提到的几种方法可以分为两大类一类是处理响应数据的发送另一类是处理响应头的设置。 1. 向浏览器发送数据的方法 这类方法主要用于向客户端发送响应体内容。 ServletOutputStream getOutputStream() throws IOException; 这个方法返回一个 ServletOutputStream 对象允许你以二进制流的形式写入响应数据。 常用于发送图片、视频、文件等二进制数据。 例如 ServletOutputStream out response.getOutputStream(); out.write(byteArray); // 直接写入字节数组 out.flush(); // 确保所有数据都写入PrintWriter getWriter() throws IOException; 这个方法返回一个 PrintWriter 对象用于以字符流的方式写入响应数据。 通常用于发送文本数据例如 HTML、JSON 或 XML 格式的响应。 你可以使用 PrintWriter 的 println() 或 write() 方法向客户端发送字符数据。 例如 PrintWriter writer response.getWriter(); writer.println(htmlbodyh1Hello World/h1/body/html); writer.flush(); // 确保数据被发送到客户端2. 向浏览器发送响应头的方法 这些方法用于设置响应的头信息告知浏览器如何处理响应体的数据。 void setCharacterEncoding(String var1); 设置响应的字符编码。常用的字符编码包括 UTF-8、ISO-8859-1 等。 该方法需要在响应数据之前调用否则可能会导致乱码。 例如 response.setCharacterEncoding(UTF-8);void setContentLength(int var1); 设置响应体的长度以字节为单位。 对于文本响应可以通过 response.getWriter() 写入数据并自动计算长度或者手动设置长度。 例如 response.setContentLength(1024); // 设置响应体的字节长度为 1024 字节void setContentLengthLong(long var1); 这是 setContentLength 的长整型版本适用于内容长度大于 2GB 的情况。 例如 response.setContentLengthLong(5000000000L); // 设置一个非常大的响应体长度void setContentType(String var1); 设置响应内容的类型例如 text/html、application/json、image/png 等。 通过设置此头信息客户端会根据类型来解析响应数据。 例如 response.setContentType(text/html; charsetUTF-8);void setDateHeader(String var1, long var2); 设置响应头中的日期信息例如 Expires、Last-Modified 等。 var1 是日期头的名称var2 是日期的毫秒表示。 例如 long currentTime System.currentTimeMillis(); response.setDateHeader(Last-Modified, currentTime);void addDateHeader(String var1, long var2); 与 setDateHeader 类似但此方法会在已有的同名响应头后追加新的日期值而不是替换。 例如 response.addDateHeader(Expires, System.currentTimeMillis() 3600 * 1000); // 设置一个过期时间void setHeader(String var1, String var2); 设置一个自定义的响应头var1 为头的名称var2 为对应的值。 例如 response.setHeader(Cache-Control, no-cache);void addHeader(String var1, String var2); 与 setHeader 类似但此方法允许向同名响应头追加多个值。 例如 response.addHeader(Set-Cookie, usernameJohnDoe); response.addHeader(Set-Cookie, sessionIdabc123);void setIntHeader(String var1, int var2); 设置一个整数类型的响应头。 例如 response.setIntHeader(Retry-After, 3600); // 设置重试的时间间隔为 3600 秒void addIntHeader(String var1, int var2); 与 setIntHeader 类似但此方法允许向同名响应头追加多个整数值。 例如 response.addIntHeader(Warning, 298); // 添加一个警告头总结 向浏览器发送数据的方法如 getOutputStream() 和 getWriter()用于传输响应体的内容。设置响应头的方法如 setCharacterEncoding()、setContentType() 等用于配置响应的元数据例如字符集、内容类型和缓存策略等。 6.6.2 下载文件 给浏览器输出消息 下载文件 要获取下载文件的路径下载的文件名是什么设置浏览器使其支持下载的内容获取下载文件的输入流创建缓冲区获取 OutputStream 对象将 FileOutputStream 写入到 buffer 缓冲区使用 OutputStream 将缓冲区中的数据输出到客户端 新建一个子工程为 response
    添加 java、resources 文件以及修改 web.xml
    在 resources 文件下随意加入一个图片命名为 1.png
    创建类 FileServlet public class FileServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 要获取下载文件的路径String realPath /1.png;System.out.println(下载文件的路径realPath);// 2. 下载的文件名是啥String fileName realPath.substring(realPath.lastIndexOf(\) 1); // 截取项目名// 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码否则有可能乱码resp.setHeader(Content-Disposition,attachment;filename URLEncoder.encode(fileName,UTF-8));// 4. 获取下载文件的输入流FileInputStream in new FileInputStream(realPath);// 5. 创建缓冲区int len 0;byte[] buffer new byte[1024];// 6. 获取OutputStream对象ServletOutputStream out resp.getOutputStream();// 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端while ((lenin.read(buffer))0){out.write(buffer,0,len); // 写到缓冲区中}//流关闭in.close();out.close();}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }注册Servlet servletservlet-namefiledown/servlet-nameservlet-classcom.uestc.servlet.FileServlet/servlet-class /servlet servlet-mappingservlet-namefiledown/servlet-nameurl-pattern/down/url-pattern /servlet-mapping修改 tomcat 配置选择 responsewar
    重启 tomcat请求 down发生了如下错误
    查看后台输出的路径结果发现路径是 D 盘下的肯定不对
    获取 1.png 的绝对路径我的为D:\08Code\Servlet\response\target\classes\1.png
    因此更新代码更改地址
    然后 clean maven 项目后重启 tomcat再请求 down 成功 有几点可以优化和注意的地方 1. 文件路径问题 realPath 目前是硬编码的路径/1.png这意味着文件是从根目录中获取的。如果文件存在于项目的某个特定目录中建议使用 ServletContext.getRealPath() 获取文件的绝对路径。例如 String realPath getServletContext().getRealPath(/WEB-INF/files/1.png); 这会返回实际存储文件的路径/WEB-INF/files/1.png 是相对路径。 2. 文件路径分隔符 你的代码使用了 realPath.substring(realPath.lastIndexOf(\) 1) 来提取文件名这在 Windows 环境下是有效的。但为了跨平台建议使用 File.separator 来保证路径分隔符正确 String fileName realPath.substring(realPath.lastIndexOf(File.separator) 1); 3. 下载文件时的 Content-Type 在返回文件之前最好设置文件的 Content-Type 头告知浏览器如何处理文件。对于图片文件可以使用如下设置 resp.setContentType(image/png); 如果文件类型是动态的可以根据文件后缀设置不同的 MIME 类型。可以用一个工具类来根据文件扩展名返回合适的 MIME 类型。 4. 错误处理 当前代码中没有异常处理逻辑建议添加文件不存在或读取错误时的处理逻辑。例如 File file new File(realPath);
    if (!file.exists()) { resp.setStatus(HttpServletResponse.SC_NOT_FOUND); // 404错误 return;
    } 5. 优化流的关闭 虽然 Java 7 引入了 try-with-resources 语法来自动关闭流你可以使用它来避免手动关闭流。这样可以确保即使出现异常也能正确关闭流 try (FileInputStream in new FileInputStream(realPath); ServletOutputStream out resp.getOutputStream()) { int len 0; byte[] buffer new byte[1024]; while ((len in.read(buffer)) 0) { out.write(buffer, 0, len); }
    } catch (IOException e) { e.printStackTrace(); resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); // 500错误
    } 6. 文件大小 如果文件非常大你可能希望设置 Content-Length 头这样浏览器可以知道文件的大小。例如 File file new File(realPath);
    resp.setContentLengthLong(file.length()); 7. doPost 方法 你重写了 doPost 方法但是没有做任何事情。通常如果不需要处理 POST 请求可以不实现该方法或者抛出一个异常来阻止 POST 请求。 Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, POST method is not supported.);
    } 综合优化后的代码示例 import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.net.URLEncoder;
    import java.nio.file.Files; public class FileServlet extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取文件的实际路径 String realPath getServletContext().getRealPath(/WEB-INF/files/1.png); File file new File(realPath); if (!file.exists()) { resp.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } // 设置文件名 String fileName realPath.substring(realPath.lastIndexOf(File.separator) 1); // 设置 Content-Disposition 让浏览器进行下载 resp.setHeader(Content-Disposition, attachment;filename URLEncoder.encode(fileName, UTF-8)); // 设置Content-Type根据文件类型进行设置 String mimeType getServletContext().getMimeType(realPath); resp.setContentType(mimeType ! null ? mimeType : application/octet-stream); // 设置Content-Length resp.setContentLengthLong(file.length()); try (FileInputStream in new FileInputStream(realPath); ServletOutputStream out resp.getOutputStream()) { // 创建缓冲区 byte[] buffer new byte[1024]; int len; while ((len in.read(buffer)) 0) { out.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); // 500错误 } } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, POST method is not supported.); }
    } 6.6.3 验证码功能实现 验证怎么来的 前端实现后端实现需要用到 java 的图片类生成一个图片没有图片就没有验证码我们要把这个图片响应到前端 在上述 response 文件的 java 源码下创建一个 ImageServlet 类 public class ImageServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//如何让浏览器3秒自动刷新一次;resp.setHeader(refresh,3);//在内存中创建一个图片BufferedImage image new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);//得到图片Graphics2D g (Graphics2D) image.getGraphics(); //笔//设置图片的背景颜色g.setColor(Color.white);g.fillRect(0,0,80,20);//给图片写数据g.setColor(Color.BLUE);g.setFont(new Font(null,Font.BOLD,20));g.drawString(makeNum(),0,20);//告诉浏览器这个请求用图片的方式打开resp.setContentType(image/jpeg);//网站存在缓存不让浏览器缓存resp.setDateHeader(expires,-1);resp.setHeader(Cache-Control,no-cache);resp.setHeader(Pragma,no-cache);//把图片写给浏览器ImageIO.write(image,jpg, resp.getOutputStream());}//生成随机数private String makeNum(){Random random new Random();String num random.nextInt(9999999) ;StringBuffer sb new StringBuffer();for (int i 0; i 7-num.length() ; i) {sb.append(0);}num sb.toString() num;return num;}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }注册 Servelt servletservlet-nameImageServlet/servlet-nameservlet-classcom.uestc.servlet.ImageServlet/servlet-class/servletservlet-mappingservlet-nameImageServlet/servlet-nameurl-pattern/ImageServlet/url-pattern/servlet-mapping然后走 ImageServlet 这个请求成功产生并且每 3s 产生一次
    6.6.4 实现重定向 Web 资源 B 收到客户端 A 请求后通知 A 访问另一个 Web 资源 C 这个过程叫做重定向 常见场景 用户登录登录成功就会访问另一个页面 重定向是方法 sendRedirect 来实现 void sendRedirect(String var1) throws IOException;创建类 RedirectServlet使其重定位到上面我们注册的 ImageServlet 里 public class RedirectServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/resp.setHeader(Location,/response/ImageServlet);resp.setStatus(302);/resp.sendRedirect(/reseponse/ImageServlet);//重定向}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }注册 Servlet servlet servlet-nameRedirectServlet/servlet-nameservlet-classcom.uestc.servlet.RedirectServlet/servlet-class /servlet servlet-mappingservlet-nameRedirectServlet/servlet-nameurl-pattern/red/url-pattern /servlet-mapping启动tomcat请求 red成功重定向到之前的验证码 ImageServlet 中注意请求时加上我们设置的入口 reseponse不然进入的是 localhost:8090/ImageServlet少了 reseponse
    面试题重定向与转发的区别 相同点 页面都会实现跳转 不同点 请求转发的时候URL 不会发生变化重定向时候URL 地址栏会发生变化 6.6.4 简单实现登录重定向 index.jsp 注意 maven 下导入 JSP 的包 htmlbodyh2Hel1o World!/h2%–这里提交的路径,需要寻找到项目的路径–%%–\({pageContext. request, contextPath}代表当前的项目--%form action\){pageContext. request.contextPath}/login methodget用户名: input typetext nameusername br密码: input typepassword namepassword brinput typesubmit/form/body /html关键部分解释 ${pageContext.request.contextPath} 这是 JSP 表达式语言Expression Language, EL中的一个表达式用于动态获取当前项目的上下文路径。具体含义如下 pageContext 是一个隐式对象提供对页面范围内相关信息的访问。它封装了许多有用的属性比如 request、response 等。 request 是另一个隐式对象表示当前的 HTTP 请求。 contextPath 是 request 对象的一个属性返回当前 Web 应用程序的上下文路径。通常对应 Web 应用部署时的根路径比如 /myApp。 创建一个类 RequestTest.java public class RequestTest extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理请求System.out.println(进入了这个请求);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }注册 Servlet servletservlet-namerequset/servlet-nameservlet-classcom.uestc.servlet.RequestTest/servlet-class /servlet servlet-mappingservlet-namerequset/servlet-nameurl-pattern/login/url-pattern /servlet-mapping重启 Tomcat请求 login乱码是浏览器的问题不是我们代码的问题成功 但是输入账号密码后点击提交反应到了浏览器的地址中
    下面我们来处理上述的请求即提交后跳转页面。 新建一个 success.jsp内容只有一个 success 输出 % page contentTypetext/html;charsetUTF-8 languagejava % html headtitleTitle/title /head body h1 success /h1/body /html 然后获取 RequestTest 获取账号密码打印到后台并跳转到 success.jsp public class RequestTest extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理请求String username req.getParameter(username);String password req.getParameter(password);System.out.println(username:password);//重定向时候一定要注意路径问题否则404resp.sendRedirect(/response/success.jsp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }现在重启 Tomcat后台获得了这个账号密码并打印输出并且跳转到了 success.jsp
    6.7、HttpServletRequest HttpServletRequest 代表客户端的请求用户通过 HTTP 协议访问服务器HTTP 请求中的所有信息会被封装到 HttpServletRequest 通过这个 HttpServletRequest 的方法获得客户端的所有信息 获取前端传递的参数请求转发下面是四个获取参数的方法重点掌握两个
    下面新建一个子工程request
    添加 java 文件夹resources 文件夹进行标记并更新 web.xml
    并删除 index.jsp再新建一个 index.jsp会多一个头
    创建类 LoginServlet前面使用的都是 get 方法下面使用 post 方法
    在 index.jsp 中写入一个简单的前端注意下面的 form action%request.getContextPath()%/login methodget 中的 method“get” 在提交登录后会去调用 get 方法 %–Created by IntelliJ IDEA.User: 15592Date: 2024/7/25Time: 17:46To change this template use File | Settings | File Templates. –% % page contentTypetext/html;charsetUTF-8 languagejava % html headtitle登录/title /head bodyh1 登录成功 /h1 div styletext-align: centerform action%request.getContextPath()%/login methodget用户名 input typetext nameusername /input br密码 input typepassword namepassword /input br爱好input typecheckbox namehobbys value女孩 女孩input typecheckbox namehobbys value代码 代码input typecheckbox namehobbys value唱歌 唱歌input typecheckbox namehobbys value电影 电影brinput typesubmit value登录/form/div/body /html 把前面的 success.jsp 拿过来 %–Created by IntelliJ IDEA.User: 15592Date: 2024/7/25Time: 17:33To change this template use File | Settings | File Templates. –% % page contentTypetext/html;charsetUTF-8 languagejava % html headtitleTitle/title /head body h1 success /h1/body /htmlLoginServlet 类中获取 index.jsp 的内容注意与前面的 method“get”匹配执行下面 doGet 方法 public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding(utf-8); // 解决后端乱码问题resp.setCharacterEncoding(utf-8); // 解决输入到页面乱码问题String username req.getParameter(username);String password req.getParameter(password);String[] hobbys req.getParameterValues(hobbys);System.out.println();//后台接收中文乱码问题System.out.println(username);System.out.println(password);System.out.println(Arrays.toString(hobbys));System.out.println();System.out.println(req.getContextPath());//通过请求转发//这里的 / 代表当前的web应用req.getRequestDispatcher(/success.jsp).forward(req,resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }注册 Servlet servletservlet-namerequset/servlet-nameservlet-classcom.uestc.servlet.LoginServlet/servlet-class /servlet servlet-mappingservlet-namerequset/servlet-nameurl-pattern/login/url-pattern /servlet-mapping由于新建了 request 子工程需要重新配置 tomcat
    启动 tomcat
    点击登录后成功跳转
    References B站—【狂神说Java】JavaWeb入门到实战—笔记