day11 maven_tomcat_servlet

day11 maven_tomcat_servlet

1.web项目运行规则

1.web项目的结构与基本java项目不同

JavaSE

JavaEE 企业级web应用程序

2.运行时不用main方法运行 需要放到tomcat中运行

tomcat默认开放的目录时webapp目录

3.web项目需要打包 运行时与idea没有直接关系

打的包叫war包

2.maven项目管理工具

maven 1. 项目创建 项目编译 项目打包 测试 通过maven命令执行 可以成为开发工具插件

​ 2.jar包管理

image-20250807095743166

1.idea中maven插件配置

改settings.xml

文件位置 idea安装目录的插件中

image-20250807100800055

1改本地仓库地址
<localRepository>D:\maven\repository</localRepository>

image-20250807100613248

2改远程仓库镜像 改到alibaba镜像
	<mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>

image-20250807100717891

关闭idea再打开 查看配置信息

image-20250807100923690

2.通过maven创建和管理项目

创建基础java项目项目

image-20250807104056260

项目管理按钮

image-20250807103952295

通过骨架创建web项目

image-20250807104309949

创建完需要添加目录

java目录 /src/main/java

test目录 /src/test

image-20250807104557811

pom.xml配置文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.javasm</groupId>
  <artifactId>day11_mavenWeb</artifactId>
  <version>1.0-SNAPSHOT</version>
<!-- 说明性质的配置  -->
<!-- 项目部署后对外的名称  <name>day11_mavenWeb Maven Webapp</name>-->
<!-- 项目部署后的访问地址 <url>http://maven.apache.org</url>-->

<!--打包方式  打war包
             jar
             war
             pom  项目聚合 配合module使用 打包时可以打到一个项目

-->
<packaging>war</packaging>

<!--  dependencies  项目依赖 配置jar包-->
  <dependencies>
<!--  写jar包坐标 打包编译时自动打到项目中
      标红表示本地仓库没有

      <scope>test</scope>  表示jar包作用范围
      默认compile     编译打包运行都需要  默认值
         test        测试时需要
         provided    编译需要 运行不需要
         runtime     只运行时需要

 -->
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.38</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <version>8.3.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.13.4</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.83</version>
    </dependency>


  </dependencies>
<!-- 打包的项目名 默认用项目名  -->
<!--  <build>-->
<!--    <finalName>day11_mavenWeb</finalName>-->
<!--  </build>-->

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

注意:pom.xml是每个maven项目的核心配置文件 idea会根据pom.xml的配置生成idea中的配置文件

​ 1.每次改了配置都要刷新配置 不然不会生效

​ 2.根据不同的项目结构 需要配置不同的参数 (例子中是web项目需要的配置)

​ 3.统一jar包管理 只需要在dependencies中 标记依赖(dependency)的坐标 下载 编译时 自动由maven统一控制

3tomcat

静态资源 html css javascript 图片 声音 视频

动态资源 同一个地址 根据访问时间/参数不同 可以显示不同的内容和数据

web应用服务器 加载和运行html css javascript 还可以执行程序语言

​ tomcat 小型 免费 可商用的服务器 200个

​ weblogic 大型 收费 商用服务器

​ jetty 小型 免费 测试服务器

web服务器 加载和运行html css javascript

​ apache

​ nigix

tomcat 加载java动态资源 和静态资源 开放指定的目录 通过http协议访问

可以独立运行

image-20250807114138994

与IDEA集成

配置idea中的tomcat插件

image-20250807114228010

配置本地tomcat

image-20250807114314908

选择使用的tomcat服务器

image-20250807114441751

image-20250807114636008

部署配置

image-20250807114736948

Tomcat使用

tomcat界面和按钮

image-20250807143929167

注意 用debug启动 才可以打断点调试代码

image-20250807144054322

image-20250807144145555

image-20250807144216429

通过IDEA启动tomcat 没有使用默认的webapps目录 所以没有欢迎项目的加载

image-20250807144541600

重新加载代码

image-20250807144937870

热部署 改了代码服务器自动更新加载的代码 安装之后容易卡

如果代码有错误 需要检查控制台 有三份控制台

image-20250807145432576

tomcat写代码的位置和方式

1webapp目录 web项目的根目录

放静态资源文件 html css js.....

WEB-INF是受保护目录 不同通过url访问 不要在里边放代码

image-20250807150152730

2java目录 写java代码

普通的java代码不能直接运行 需要符合sun公司的标准类 Servlet 才可以运行

package com.javasm.test;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @className: MyTest2
 * @description:
 * @author: gfs
 * @date: 2025/8/7 15:04
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/test2")
public class MyTest2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


        PrintWriter writer = resp.getWriter();
        writer.write("hello.....");

    }
}

第一阶段与第二阶段的关系

image-20250807151234855

4Servlet标准

Servlet server applet (服务端程序)

/login 地址 对应一个类处理 Login

访问服务端的几种方式

都是get

1浏览器地址栏 敲网址

2a标签

3location.href

4表单提交

post

表单提交 指定method 是post

1Servlet 三种实现方式

1.继承HttpServlet 重写 service 不同的请求方式 用不同的方法处理 doGet doPost

package com.javasm.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @className: ServletDemo1
 * @description:
 * @author: gfs
 * @date: 2025/8/7 15:36
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get going.....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post going.....");
    }
}

2.继承GenericServlet重写 service

package com.javasm.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * @className: ServletDemo2
 * @description:
 * @author: gfs
 * @date: 2025/8/7 15:46
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service go.....");
        this.myMethod(servletRequest,servletResponse);
    }


    public void myMethod(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {


    }
}

3实现servlet接口 实现接口中的方法

package com.javasm.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * @className: ServletDemo3
 * @description:
 * @author: gfs
 * @date: 2025/8/7 15:48
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/demo3")
public class ServletDemo3 implements Servlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet  going.....");
    }


    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }



    @Override
    public String getServletInfo() {
        return "";
    }

    @Override
    public void destroy() {

    }
}

总结 HttpServlet service中有实现代码

​ GenericServlet service是抽象方法

​ Servlet 接口 service是抽象方法

通过url触发默认执行service() 如果有自定义方法 需要通过service()中的代码调用并执行

不分get post时的处理

package com.javasm.test;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @className: MyTest2
 * @description:
 * @author: gfs
 * @date: 2025/8/7 15:04
 * @version: 0.1
 * @since: jdk17
 */
@WebServlet("/test2")
public class MyTest2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


        PrintWriter writer = resp.getWriter();
        writer.write("hello.....");

    }
}

2Servlet配置方式

请求地址 与 类建立关联关系 服务器启动时 加载到核心容器中 当报文中提现到访问这个地址时 自动触发此类中的service()方法

注解

@WebServlet("/test2")
public class MyTest2 extends HttpServlet {

配置文件

在web.xml中配置

  <servlet>
    <servlet-name>test2</servlet-name>
    <servlet-class>com.javasm.test.MyTest2</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>test2</servlet-name>
    <url-pattern>/new2</url-pattern>
  </servlet-mapping>
3servlet生命周期
1 服务器启动时 默认不创建实例 配置地址与类的对应关系
2 实际访问到时 会创建实例对象 并指定service方法...  servlet单实例 
3 重复访问时 直接执行servcie方法....
4 服务器关闭时 销毁实例对象

5 如果有配置参数<load-on-startup>1</load-on-startup> 声明周期提前到web服务器启动创建实例
配置注意点

配置错误方式:

1多个类配置了同一个请求地址 服务器无法启动

名为 [com.javasm.test.MyTest2]和 [com.javasm.test.MyTest3] 的servlet不能映射为一个url模式(url-pattern) [/test2]

2配置请求地址 不带/ @WebServlet("test3") 服务器无法启动

servlet映射中的<url pattern>[test3]无效

1.类与地址的对应关系分开

2.请求地址要带/ 前边会配置项目名 放入核心容器

自己的控制台输出在tomcat中乱码处理

在启动参数中添加

-Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8

image-20250807163230905

5前后端数据传递过程

请求使用的api(读页面传来的数据)

req.setCharacterEncoding("utf-8");
处理请求乱码 
    
    //tomcat自动做urlEncode 编码 urlDecode解码
    //tomcat 如果是post方式 默认是iso-8859-1
    //req.setCharacterEncoding("utf-8")   指定字符编码
    //第一次读取参数前设置  读取后再设置就失效了    
String username = req.getParameter("username");
取请求参数 参数没有数据类型 都是字符串

//get post 参数出现位置不同
//get  出现在url中
//post 出现在请求体中
//req.getParameter("username") tomcat解析过请求报文 取请求参数....

响应使用api(给页面写数据)

resp.setContentType("text/html;charset=utf-8");
指定ContentType响应头 数据格式和字符编码
    注意 报文中的内容 不能有错字, 导致浏览器解析错误 直接复制
         需要在响应体输出之前执行 否则会失效
PrintWriter writer = resp.getWriter();   //获得输出流 可以使用字符
writer.print(username+"registok.....");  //输出信息 支持页面标签
writer.close();

html 注册页面 数据提交到服务器

​ 向页面输出注册成功 和注册的用户名信息

posted @ 2025-08-09 22:14  小胡coding  阅读(9)  评论(0)    收藏  举报