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

JavaWeb基础

Tomcat

基础

Tomcat是什么;是服务器软件,是在靶场中发射子弹的枪。

一个可以发布到tomcat/webapp中的目录结构。

  • static
    • js: .js
    • img: .png .jpg
    • css: .css
  • page: .html
  • WEB-INF(受保护的资源目录)
    • classes:字节码根路径
    • lib:依赖jar包存放路径
    • web.xml:项目的配置文件

| static和page是属于视图相关的文件,可以随意编排。

部署项目的两种方式

  1. 直接扔到webapps

  2. 放到其他目录,在\Tomcat 10.1\conf\Catalina\localhost添加配置

    如果部署的项目文件夹为app,则添加如下配置 app.xml

    <Context path="/app" docBase="D:\myWebApp\app" />
    # path为应用上下文路径,即为url的路径,一般与项目文件名保持一致
    # docBase为应用的地址
    

要访问tomcat原有的管理项目,需要先设置tomcat密码。

在/cnf/tomcat-users.xml文件中添加如下代码:

<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>

访问http://localhost:8080/manager/html,输入admin/admin

image-20240905225545691

idea开发javaweb工程

image-20240905230416952

  1. 建立Tomcat和idea关联

    image-20240905231010999

  2. 使用idea创建javaweb工程,在web工程中开发代码

    首先配置JDK,模块,引用的库,Artifacts

    image-20240906135016605

  3. 如果使用了Servlet,模块中需要添加Tomcat依赖

    image-20240918100754679

  4. 使用idea将工程构建成一个可以发布的app

    当缺少WEB目录时,可以通过下面的方式添加

    image-20240906134403872

  5. 使用idea将构建好的app部署到tomcat中启动运行

    image-20240906135139569

    image-20240906135229823

idea运行javaweb工程的原理

| 疑问:为什么在idea中运行javaweb工程后,在对应的tomcat的workapp目录下并没有应用文件?

idea为了避免污染硬盘中的tomcat目录,没有直接把应用文件放到workapp中,而是根据需要部署的web应用,创建了一套配置文件,让tomcat根据那个配置文件进行运行。

image-20240906140645140

image-20240906140750343

继续打开 conf/Catalina/localhost中的 demo_war_exploded.xml,有下面的代码,配置了web应用的上下文路径和项目文件位置

<Context path="/demo_war_exploded" docBase="C:\Users\Timothy\Documents\WeChat Files\wxid_b7e193fz08w512\FileStorage\File\2024-09\知校聚合支付接口(demo是PC端扫码跳转)\java\demo\out\artifacts\demo_war_exploded" />

Servlet

Servlet简介

Servlet是什么?

静态资源与动态资源:预先生成好的资源;服务器接受用户请求参数,动态生成的资源。

image-20240918093912234

Servlet:能够处理客户请求并做出响应的一套Java技术标准,即Java代码生成动态资源的标准

Servlet运行在服务端,所以只能在Web项目中开发,且在Tomcat这样的服务容器中运行。

Servlet运行流程?

image-20240918094923041

用户请求 -> Tomcat -> Servlet -> Java类(Controller,Service,Mapper,DAO)

Servlet开发流程

基本流程

  1. 创建javaweb项目,同时将tomcat作为项目依赖

  2. 重写service方法,service(HttpServletRequest req, HttpServletResponse resp),定义业务处理代码

    public class UserServlet extends HttpServlet {   @Override   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       // 1.获取请求参数,只要是kv形式(无论在请求头还是请求体),都可以通过getParameter方法获取       String username = req.getParameter("username");       // 2.执行业务代码       String info = "Yes";       if("atguigu".equals(username)) {           info = "No";       }       // 3.响应数据       resp.setContentType("text/html");   // 设置响应头       PrintWriter writer = resp.getWriter();       writer.write(info);   }
    }
    
  3. 在web.xml中,配置Servlet的访问路径【可以直接用注解@WebServlet("/userName")替换】

    image-20240918112150995

注意事项:

  1. 如何导入servlet-api依赖
  • 通过在Web资源目录下新建lib文件夹,把依赖放进去
  • 通过Project Settings-Modules-Dependency指定

image-20240918112753870

Tomcat 10.1自动导入了jsp-apiservlet-api依赖

image-20240918113011074

Tomcat 10.1在哪里配置的?见“idea开发javaweb工程”中的第一步配置。

两种方式有什么区别?

区别在于是否会把依赖存放在打好的war包中。lib方式会把servlet依赖放到war包,另一种方式由于scope是provided,表示只会在编码时导入,不会放到war包。

如果不放到war包,程序怎么用servlet-api呢?

tomcat中部署的所有war包共享当前tomcat的lib库中的依赖。【所以自己导入后反而有可能由于冲突报错】

image-20240918113527443

  1. 怎么指定响应头的Content-type字段。
  • 对于静态资源,tomcat的web.xml维护了请求的静态文件的扩展名与响应头Content-type字段的对应关系。比如请求的是xxx.html文件,则Content-type为text/html

    image-20240918113926905

  • 对Servlet,默认的Content-type是html,如果数据需要作为其他类型解析,则要手动设置。具体设置的类型可以参考web.xml

Servlet生命周期

生命周期 执行者 时机
实例化 构造器 第一次请求/服务启动
load-on-startup
初始化 init 构造完毕
接受请求,处理请求 service 每次请求
销毁 destory 关闭服务

Servlet在Tomcat中是单例的,所以不建议在其中修改变量值。

DefaultServlet

Tomcat中提供了一个DefaultServlet用来返回静态资源。

当所有Servlet都无法匹配到路径时,DefaultServlet会接手,将其视为请求静态资源,然后把对应文件的内容放到请求体,并填充请求头的Content-type字段,进行返回。

配置文件:web.xml

image-20240918123901239

image-20240918124020933

Servlet继承结构

Servlet-GeneticServlet-HttpServlet-自定义的Servlet。

在自定义Servlet中,可以重写service方法,也可以只重写doXXX方法。

ServletContex:属于应用域,单例的,用于在不同Servlet之间做沟通。

请求转发与重定向

请求转发

image-20241007104827852

  • 对客户端透明
  • 目标资源只能是项目内的资源,不能是外部资源
  • 目标资源可以是servlet动态资源,也可以是html等静态资源
  • 目标资源可以是WEB-INF下的受保护资源,这也是访问受保护资源的唯一方式
@WebServlet("/servletA")
public class ServletA extends HttpServlet {   @Override   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       System.out.println("ServletA执行了");       // 请求转发给ServletB       // 1.获得请求转发器       RequestDispatcher requestDispatcher = req.getRequestDispatcher("servletB");       // 2.做出转发动作       requestDispatcher.forward(req, resp);       // (也可以转发给视图资源)       // req.getRequestDispatcher("a.html").forward(req, resp);       // (转发到 WEB-INF 目录下的资源,访问WEB-INF下受保护资源的唯一访问方式)       // req.getRequestDispatcher("WEB_INF/b.html").forward(req, resp);   }
}

响应重定向

image-20241007105250506

  • 客户端行为,客户端发送多次请求
  • 目标资源可以是外部资源
  • 目标资源可以是servlet动态资源,也可以是html等静态资源
  • 目标资源不能是WEB-INF下的受保护资源,这也是访问受保护资源的唯一方式
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {   @Override   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       System.out.println("servlet1运行了");       // 等价于 resp.setStatus(302); resp.setHeader("location", "servlet2");       resp.sendRedirect("servlet2");       // 外部资源       // resp.sendRedirect("http://baidu.com");   }
}

总结

客户端透明 内部资源 WEB-INF 外部资源
请求转发 ×
响应重定向 × ×

实现页面跳转时,优先使用重定向。

http://www.wxhsa.cn/company.asp?id=4634

相关文章:

  • 完整教程:瑞派虹泰环城总院 | 打造“一站式宠物诊疗空间”,定义全国宠物医疗新高度
  • BOE(京东方)携新能源领域新品亮相2025服贸会 引领绿色转型新动能
  • SpringBoot 集成支付宝支付,看这篇就够了
  • 工业智能终端赋能自动化生产线建设数字化管理 - 指南
  • 一道模拟赛题
  • Pycharm打包PaddleOCR过程及疑问解决途径
  • uni-app项目支付宝端Input不受控
  • 适合小型企业的项目管理系统推荐:Reddit 用户真实需求
  • 开启研究生学习阶段
  • 李航统计学习方法第二版 学习笔记
  • 如何拥有自己的一台永久免费云主机/云服务器
  • 第三周训练总结
  • godot格式化字符串
  • reLeetCode 热题 100-1 两数之和-扩展2 map实现 - MKT
  • 发现一个新的资源论坛 - 小小程序员
  • reLeetCode 热题 100-1 两数之和-扩展3 单向和双向链表实现 - MKT
  • codeforces1050div4题解
  • 深入解析:少儿舞蹈小程序(13)作品播放量累加及点赞
  • Ubuntu 24.04 安装最新版podman@5.6.1
  • 深入解析:Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口
  • 2025.9.15——知识点学习
  • C# Avalonia 13- MoreDrawing - CustomPixelShader
  • 详细介绍:拉帮结派下的制造麻烦
  • ubuntu安装docker
  • 使用标签Tag控制蒙太奇的触发时机-playmontageAndWait-Send GameplayEvent-WaitGameplayEvent
  • sql事务执行
  • GAS_Aura-Spawn FireBolt from Event
  • 在CentOS 7系统上创建SSL/TLS证书以启用HTTPS
  • 从Craigslist广告到BHIS安全顾问:非科班生的渗透测试求职之路
  • Java 微服务架构中的实践与挑战