Tomcat
安装
- tomcat8.5地址 下载压缩包解压即可
- 安装时需要注意:tomcat版本与java版本要相对应
- JAVA_HOME 等路径要配置正确
tomcat目录结构
- bin 启动目录
- conf 配置目录
- webapps 工程目录
部署工程
- 直接放webapps,通过ip:端口/目录/文件 的形式访问(简化部署 打包war格式压缩包)
- conf/Catalina/项目.xml (这种方式是热加载,可以在不关闭Tomcat的情况下生效)
<Context docBase="项目路径" path="/虚拟目录"/>
- Root工程
默认访问Root文件夹下的项目;加载顺序为 index.html index.jsp
IDEA 与Servlet
- idea 需要在项目中 【Add Frameworks Support】选中【Web Application】,但是新版本是没有的,
因此需要
CTRL+alt+shift+/,选择registry,找到javaee.legacy.project.wizard**,勾选
退出后再【Add Frameworks Support】即可,IDEA会自动添加 WEB目录
Servlet

截屏2023-02-05 20.17.02.png
- Servlet 生命周期
- 首次访问时,构造函数
- init()
- service()
- 断开链接时,destroy()
- server applet 运行在服务器端的小程序, 位于 javax.servlet.*
- 单例, 多个用户同时访问, 会产生线程安全问题, 所以避免创建成员变量
- 简单的Servlet步骤
// 1. 创建项目
// 2. 定义类,实现javax.servlate.Servlet接口, 例如: Servlet
// 3. 配置web.xml
package com.it.web.servlet;
import javax.servlate.*;
// 有多个接口方法,这里只写一个
public class ServletDemo implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello Servlet");
}
}
// 文件web.xml web-app中添加
<!-- 配置Servlet -->
<servlet>
<servlet-name>服务名</servlet-name>
<servlet-class>com.it.web.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>服务名</servlet-name>
<url-pattern>访问url</url-pattern>
</servlet-mapping>
- 使用注解 代替简单的web.xml
@WebServlet(
urlPatterns = {"/request", "/servletContext"},
initParams = {
@WebInitParam(name = "key", value = "value"),
@WebInitParam(name = "testName", value = "testValue"),
}
)
public class ServletDemo implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("demo2");
}
}
-
urlPattern 路径设置
- "/xxx"
- @WebServlet({"/demo3", "/demo4"})
- "/xx/*" 正则匹配 优先级最低
GenericServlet 将Servlet接口中的方法做了空实现,只抽象了 service() 方法
HttpServlet 实现了web访问各种形式,Get\Post\Update\Delete\Option\Put等
转发路由
servletRequest.getRequestDispatcher("/demo3").forward(servletRequest, servletResponse);
ServletConfig
- 获取 ServletContext
- 每个Servlet不同的配置参数
- getServletName()
ServletContext
- 获取MINI类型: 文件数据类型, 格式 大类型/小类型 ,例如: text/html, bz/application/x-bzip
- 域对象 共享数据; 共享所有数据, 服务打开就会创建, 服务关闭才会销毁
- 获取文件的真实(服务器)路径
ServletContext servletContext = getServletContext();
servletContext.getRealPath("/WEB-INF/web.xml");
HttpServletRequest
获取请求头、请求体数据
StringBuilder result = new StringBuilder();
// 1. 获取所有参数
String contentType = req.getHeader("Content-Type");
result.append("ContentType = ").append(contentType).append("\n<br />");
if (Objects.nonNull(contentType) && (contentType.startsWith("multipart/form-data") || contentType.startsWith("application/json"))) {
result.append("contentType START").append("\n<br />");
// 通过 流 获取数据
BufferedReader reader = req.getReader();
String line = null;
while ((line = reader.readLine()) != null) {
result.append(line).append("\n<br />");
}
result.append("contentType END").append("\n<br />");
}
Map<String, String[]> parameterMap = req.getParameterMap();
parameterMap.forEach((k, v) -> {
result.append("key => ").append(k).append(", value => ");
for (String s : v) {
result.append(s).append(", ");
}
result.append("\n").append("<br>");
});
result.append("获取请求URL").append(req.getRequestURI()).append("\n<br />");
result.append("获取虚拟目录").append(req.getContextPath()).append("\n<br />");
result.append("获取get方式请求参数").append(req.getQueryString()).append("\n<br />");
result.append("获取客户机的IP地址").append(req.getRemoteAddr()).append("\n<br />");
ServletConfig servletConfig = getServletConfig();
result.append("初始化参数-key: ").append(servletConfig.getInitParameter("key")).append("\n<br />");
result.append("初始化参数-testName: ").append(servletConfig.getInitParameter("testName")).append("\n<br />");
resp.getWriter().write(result.toString());
请求转发
req.getRequestDispatcher("/dispatcher").forward(req, resp);
共享数据
// 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
获取cookie
Cookie[] cookies = request.getCookies();
response.setContentType("text/html;charset=UTF-8");
StringBuilder stringBuilder = new StringBuilder();
if (Objects.nonNull(cookies)) {
for (Cookie cookie : cookies) {
stringBuilder.append("<h3>").append("name:").append(cookie.getName()).append(", ").append("value:").append(cookie.getValue()).append(
"<h3/>");
}
}
response.getWriter().write(stringBuilder.toString());
获取Session
request.getSession();
HttpServletResponse
重定向
- 转发重定向时,不共享请求参数
规定响应内容
response.setStatus(302);
response.setContentType("text/html;charset=UTF-8");
response.getOutputStream().write(("ResponseServlet GET方法" + request.getParameter("name")).getBytes(StandardCharsets.UTF_8));
字符输出
输出文件流
发送cookie
Cookie cookie = new Cookie("name", "你好");
Cookie cookie2 = new Cookie("age", (count++) + "");
// 存活时间
// cookie 默认只能在当前工程下访问, 使用 / 则整个tomcat下使用
cookie2.setPath("/");
response.addCookie(cookie);
response.addCookie(cookie2);
Filter
实现接口Filter
@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1被执行了....");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
过滤器生命周期方法
- init() 只会执行一次
- doFilter() 每一次请求被拦截资源时,会执行。执行多次
- destroy() 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
Listener
- 事件监听机制
ServletContextListener
- void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
- void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
- 主要作用:初始化对象、初始化数据(如:加载驱动、创建数据库连接、连接池的初始化等)