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); } }