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包管理

1.idea中maven插件配置
改settings.xml
文件位置 idea安装目录的插件中

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

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>

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

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

项目管理按钮

通过骨架创建web项目

创建完需要添加目录
java目录 /src/main/java
test目录 /src/test

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协议访问
可以独立运行

与IDEA集成
配置idea中的tomcat插件

配置本地tomcat

选择使用的tomcat服务器


部署配置

Tomcat使用
tomcat界面和按钮

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



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

重新加载代码

热部署 改了代码服务器自动更新加载的代码 安装之后容易卡
如果代码有错误 需要检查控制台 有三份控制台

tomcat写代码的位置和方式
1webapp目录 web项目的根目录
放静态资源文件 html css js.....
WEB-INF是受保护目录 不同通过url访问 不要在里边放代码

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.....");
}
}
第一阶段与第二阶段的关系

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

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 注册页面 数据提交到服务器
向页面输出注册成功 和注册的用户名信息

浙公网安备 33010602011771号