Maven项目架构管理工具
核心思想:约定大于配置
阿里云镜像
<mirror>
<id>aliyun-maven</id>
<name>aliyun maven</name>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
<mirrorOf>central</mirrorOf>
</mirror>

本地仓库
<localRepository>D:\maven\apache-maven-3.9.11\maven-repo</localRepository>

配置pom文件
maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
6.Servlet
-
Servlet就是sun公司开发动态web的一门技术
-
Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个- - --Servlet程序,只需要完成两个小步骤
-
编写一个类,实现Servlet接口
-
把开发好的]ava类部署到web服务器中
-
把实现了Servlet接口的Java程序叫做,Servlet
-
HelloServlet
1.maven
构建一个Maven(org.apache.maven.archetypes:maven-archetype-quickstart)
2.关于Maven父子工程
父项目中
<modules>
<module>MavenWebapp01</module>
</modules>
子项目中
<parent>
<groupId>org.example</groupId>
<artifactId>MavenClear</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
3.Maven环境优化
1.修改web.xml为最新的
2.将maven的结构搭建完整(main下创建java目录和resources)
4.编写一个Servlet程序
1.编写一个普通类
2.实现Servlet接口(Sun公司有默认的两个实现类:HttpServlet和GenericServlet)
package com.lyj.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了DoGet方法");
resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("UTF-8");
// 只使用一种输出流(这里保留字符流用于文本输出)
PrintWriter writer = resp.getWriter();
writer.print("hello---Servlet啊啊啊啊");
// 注意:如果需要输出二进制数据(如图片),才使用字节流:
// ServletOutputStream outputStream = resp.getOutputStream();
// outputStream.write(...)
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 可以根据需要实现POST请求处理逻辑
// 例如:调用doGet方法复用逻辑
doGet(req, resp);
}
}
5.编写Servlet的映射
原因:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在wen服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<display-name>Welcome to Tomcat</display-name>
<description>Welcome to Tomcat</description>
<!-- 注册Servlet-->
<servlet>
<servlet-name>hiservlet</servlet-name>
<servlet-class>com.lyj.servlet.HelloServlet</servlet-class>
</servlet>
<!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/hiservlet111</url-pattern> <!-- 修正为合法格式 -->
</servlet-mapping>
</web-app>
6.配置Tomcat(参考)
7.启动测试
resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("UTF-8");
//可以加上这个防止中文乱码
Servlet原理

Mapping问题
1.一个Servlet可以指定一个映射路径
<!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/hiservlet111</url-pattern> <!-- 修正为合法格式 -->
</servlet-mapping>
2.一个Servlet可以指定多个映射路径
<!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/hiservlet111</url-pattern> <!-- 修正为合法格式 -->
</servlet-mapping><!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/hiservlet222</url-pattern> <!-- 修正为合法格式 -->
</servlet-mapping>
3.一个Servlet可以指定通用映射路径
<!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/hiservlet111/*</url-pattern> <!-- 修正为合法格式 -->
</servlet-mapping>
4.默认请求路径(少用!)
<!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/*</url-pattern> <!-- 修正为合法格式 -->
</servlet-mapping>
5.指定一些后缀或者前缀等等...
<!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>*.asdads</url-pattern> <!-- 修正为合法格式 -->
</servlet-mapping>
6.优先级问题
指定了固有映射路径优先级最高,如果找不到就会走默认的处理请求
<!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/hiservlet111</url-pattern> <!-- 修正为合法格式 -->
</servlet-mapping>
//这样子的优先级最高,因为指定了/hiservlet111这个路径
ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
- 共享数据:我在这个Servlet中保存的数据,可以在另一个Servlet中拿到
1.共享数据
HelloServlet
package com.lyj.servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = "我的名字";
context.setAttribute("username", username);
}
}
GetServlet
package com.lyj.servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().print("名字"+username);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<display-name>Welcome to Tomcat</display-name>
<description>Welcome to Tomcat</description>
<servlet>
<servlet-name>hiservlet</servlet-name>
<servlet-class>com.lyj.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/hiservlet02</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getservlet</servlet-name>
<servlet-class>com.lyj.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getservlet</servlet-name>
<url-pattern>/getservlet01</url-pattern>
</servlet-mapping>
</web-app>
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>
<parent>
<groupId>org.example</groupId>
<artifactId>MavenClear</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>MavenWebapp02</artifactId>
<packaging>war</packaging>
<name>MavenWebapp02 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 测试依赖:仅在测试时生效 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Servlet API 依赖:由 Tomcat 提供,编译时需要 -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>MavenWebapp02</finalName>
</build>
</project>
2.获取初始化参数
ServletDemo03
package com.lyj.servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
// 1. 定义要获取的初始化参数的名称(例如 "url",需与 web.xml 中配置一致)
String paramName = "url";
// 2. 通过参数名称获取对应的初始化参数值
String paramValue = context.getInitParameter(paramName);
// 3. 将结果输出到响应
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().print("初始化参数 [" + paramName + "] 的值为:" + paramValue);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// POST 请求可调用 doGet 处理,保持逻辑一致
doGet(req, resp);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<display-name>Welcome to Tomcat</display-name>
<description>Welcome to Tomcat</description>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mmyyssqqll</param-value>
</context-param>
<servlet>
<servlet-name>geturl</servlet-name>
<servlet-class>com.lyj.servlet.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>geturl</servlet-name>
<url-pattern>/geturl1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hiservlet</servlet-name>
<servlet-class>com.lyj.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hiservlet</servlet-name>
<url-pattern>/hiservlet02</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getservlet</servlet-name>
<servlet-class>com.lyj.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getservlet</servlet-name>
<url-pattern>/getservlet01</url-pattern>
</servlet-mapping>
</web-app>
3.请求转发
ServletDemo04
package com.lyj.servlet;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了 ServletDemo04.doGet");
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/geturl1");//转发的请求路径
requestDispatcher.forward(req,resp);//调用forward实现请求转发
//context.getRequestDispatcher("/geturl2").include(req,resp);//一段代码版
}
}

4.读取资源文件
Properties
-
在Java目录下新建properties
-
在resources目录下新建properties
发现:都被打包到了同一个路径下:classes,我们俗称这个路径为class path
思路:需要一个文件流
package com.lyj.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应编码,避免中文乱码
resp.setContentType("text/html;charset=UTF-8");
// 获取配置文件输入流
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
// 直接使用属性名获取值
String username = prop.getProperty("username");
String password = prop.getProperty("password");
resp.getWriter().print(username + ":" + password);
}
}