Servlet
1. Servlet 配置方式
1.1 web.xml XML文件方式
web.xml
整个项目的配置文件,可以配置项目启动参数,Servlet 配置参数,过滤器 Filter ,监听器 Listener
<servlet >
<servlet-name > WebXmlConfigServlet</servlet-name >
<servlet-class > com.qfedu.a_conf.WebXmlConfigServlet</servlet-class >
</servlet >
<servlet-mapping >
<servlet-name > WebXmlConfigServlet</servlet-name >
<url-pattern > /webXmlConfig</url-pattern >
</servlet-mapping >
package com.qfedu.a_conf;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class WebXmlConfigServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append("<h1>Web.xml Config Servlet</h1>" );
}
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
1.2 @WebServlet 注解方式
package com.qfedu.a_conf;
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;
@WebServlet("/annotationConfig")
public class AnnotationConfigServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append("<h1>Annotation Config Servlet</h1>" );
}
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
1.3 xml文件方式和注解方式对比
web.xml
1. 适用于任意 Servlet 版本
2. 配置较为繁琐,阅读性一般
3. 【优势】可以避免资源冲突,xml 中有资源冲突直接报错
@WebServlet 注解方式
1. 适用于 3.0 以上版本 Servlet
2. 配置方便,操作简单
3. 【劣势】如果出现资源冲突问题,Tomcat 启动阶段提示
1.4 注解资源冲突导致Tomcat启动失败【仅讲一次,后期出现自行解决】
注解导致 Tomcat 启动失败
Caused by: java.lang.IllegalArgumentException:
因为:
java.lang.IllegalArgumentException 非法参数异常
The servlets named [com .qfedu.a_conf.AnnotationConfigServlet] and
Servlet 程序名称 com .qfedu.a_conf.AnnotationConfigServlet 和
[com .qfedu.a_conf.TestServlet] are both mapped to the url-pattern
Servlet 程序名称 com .qfedu.a_conf.TestServlet 同时映射资源匹配规则
[/annotationConfig] which is not permitted
/annotationConfig 这样操作是不被允许的
2. Servlet 到底是怎么运行的
2.1 Tomcat 容器概念
2.2 web.xml 流程分析
2.3 注解方式分析
3. Servlet 配置参数
3.1 涉及到 Servlet 相关方法
1. 通过 Request 请求对象 或者 this 获取 servletConfig 对象
ServletConfig getServletConfig () ;
2. 可以通过该 ServletConfig 获取 配置参数
String getParameter (String name ) ;
3.2 web.xml 配置参数
<servlet >
<servlet-name > WebXmlConfigOptionServlet</servlet-name >
<servlet-class > com.qfedu.b_configOption.WebXmlConfigOptionServlet</servlet-class >
<init-param >
<param-name > logFilePath</param-name >
<param-value > ./log/application.log</param-value >
</init-param >
<init-param >
<param-name > imgPath</param-name >
<param-value > ./img/</param-value >
</init-param >
<load-on-startup > 1</load-on-startup >
</servlet >
<servlet-mapping >
<servlet-name > WebXmlConfigOptionServlet</servlet-name >
<url-pattern > /webXmlConfigOption</url-pattern >
</servlet-mapping >
<servlet-mapping >
<servlet-name > WebXmlConfigOptionServlet</servlet-name >
<url-pattern > /webXmlco</url-pattern >
</servlet-mapping >
package com.qfedu.b_configOption;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class WebXmlConfigOptionServlet extends HttpServlet {
public WebXmlConfigOptionServlet () {
System.out.println("WebXmlConfigOptionServlet Constructor called....." );
}
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig servletConfig = this .getServletConfig();
System.out.println(servletConfig);
System.out.println("logFilePath : " + servletConfig.getInitParameter("logFilePath" ));
System. out.println("imgPath : " + servletConfig.getInitParameter("imgPath" ));
}
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.3 注解方式配置参数
package com.qfedu.b_configOption;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(
value = {"/annotationConfigOption", "/annotationCO"},
loadOnStartup = 1,
initParams = {
@WebInitParam(name = "logFilePath", value = "./log/application.log"),
@WebInitParam(name = "imgPath", value = "./img/"),
}
)
public class AnnotationConfigOptionServlet extends HttpServlet {
public AnnotationConfigOptionServlet () {
System.out.println("AnnotationConfigOptionServlet Constructor Called" );
}
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig servletConfig = this .getServletConfig();
System.out.println("logFilePath : " + servletConfig.getInitParameter("logFilePath" ));
System.out.println("imgPath : " + servletConfig.getInitParameter("imgPath" ));
}
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super .doPost(req, resp);
}
}
4. Servlet 资源匹配规则
4.1 精准匹配
package com.qfedu.c_urlpattern;
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;
@WebServlet(urlPatterns = {"/url1", "/urlPattern", "/up1"})
public class UrlPatternOneServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append("<h1>" + req.getRequestURI() + "</h1>" );
}
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.2 拓展名匹配
package com.qfedu.c_urlpattern;
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.lang.reflect.InvocationTargetException;
@WebServlet(value = {"*.action", "*.do"})
public class UrlPatternTwoServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri = req.getRequestURI();
String methodName = uri.substring(uri.lastIndexOf("/" ) + 1 , uri.lastIndexOf("." ));
System.out.println(methodName);
try {
this .getClass().getMethod(methodName).invoke(this );
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
resp.getWriter().append("<h1>" ).append(uri).append("</h1>" );
}
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
public void addStudent () {
System.out.println("Add Student Method running..." );
}
public void updateStudent () {
System.out.println("Update Student Method running..." );
}
public void removeStudent () {
System.out.println("Remove Student Method running..." );
}
public void findStudent () {
System.out.println("Find Student Method running..." );
}
}
4.3 路径匹配
package com.qfedu.c_urlpattern;
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;
@WebServlet("/user/test")
public class UrlPatternThreeServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append("<h1>" ).append(req.getRequestURI()).append("</h1>" );
}
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5. 小案例
5.1 用户发送参数到 Servlet 程序
<!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > 注册</title >
</head >
<body >
<form action ="register" method ="post" >
<span > 名字</span > <input type ="text" name ="name" > <br >
<span > 年龄</span > <input type ="text" name ="age" > <br >
<span > 性别</span > <input type ="radio" name ="gender" value ="0" > 男 <input type ="radio" name ="gender" value ="1" > 女 <br >
<input type ="submit" value ="提交" >
</form >
</body >
</html >
package com.qfedu.d_userData;
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;
@WebServlet("/register")
public class RegisterUserServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8" );
String name = req.getParameter("name" );
String age = req.getParameter("age" );
String gender = req.getParameter("gender" );
System.out.println("Name : " + name);
System.out.println("Age : " + age);
System.out.println("Gender : " + ("0" .equals(gender) ? "男" : "女" ));
}
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理