Servlet
Servlet是一种用Java编写的服务器端组件,用于处理客户端(通常是Web浏览器)发来的请求并生成动态内容。
Tomcat服务器
1.什么是Tomact
Tomcat 是一个开源的软件,用于运行和管理使用 Java 编程语言创建的网站和网络应用程序。它充当了一个服务器,可以理解和执行这些应用程序,然后将它们提供给用户通过网页浏览器访问。实际上,它是一个能够处理网站的“机器”,使开发人员能够在互联网上展示和运行他们的 Java 程序。
2.MAC安装Tomcat
1.进入Tomcat官网 Apache Tomcat® - Welcome!
2下载Tomcat10 解压到桌面 给权限
sudo chmod 755 /Users/likedx/Desktop/tomcat10/bin/*.sh
3.启动
sh /Users/likedx/Desktop/tomcat10/bin/startup.sh
4.访问 http://127.0.0.1:8080/ 或者本机ip加上端口
5.停止服务
sh /Users/likedx/Desktop/tomcat10/bin/shutdown.sh
MAC IDEA配置Tomcat
1.MAC打开IDEA创建新的工程按照如下勾选
2.继续下一步
Servlet实现方式
1.在java包下创建一个新的包名
2. 创建一个新的类名并设置注解
package com.demo.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
//设置注解并指定访问路径
@WebServlet("/ser01")
public class servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Hello Servlet!!");
}
}
3.修改路径
在IDEA中选择Run - Editconfigurations..
1 可修改路径
2 打勾为在启动Tomcat时默认打开谷歌浏览器 也可以选其他
Servlet创建方式
1.继承HttpServlet类
package com.demo.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* 实现servlet
* 1. 创建普通java类
* 2. 实现servlet的规范,继承HttpServlet类
* 3. 重写service方法,用来处理请求
* 4. 设置注解,指定访问路径
* */
@WebServlet(name = "ser01", value = "/ser01")
public class servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Hello Servlet");
resp.getWriter().write("Hello Servlet!!! ");
}
}
2.继承GenericServlet类
package com.demo.servlet;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/ser03")
public class servlet03 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("继承GenericServlet类");
}
}
3.实现Servlet接口
package com.demo.servlet;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/ser02")
public class servlet02 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("实现servlet接口");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
HttpServletRequest对象
主要用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是HttpServletRequest接口实例化对象,表示该对象主要应用在Http协议上,该对象是由Tomcat封装好传递过来。
1.常用方法
属性 | 说明 |
---|---|
getRequestUrl() | 获取客户端发出请求的完整url |
getRequestUrl() | 获取请求中的资源名称部分 |
getQueryString() | 获取请求中的参数部分 |
getMethod() | 获取客户端请求方式 |
GetProtocol | 获取http版本号 |
getcontextPath() | 获取webapp名字 |
package com.demo.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ser04")
public class ServletQuest extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取客户端请求的完整url
String url = req.getRequestURL().toString();
System.out.println("获取客户端请求的完整url是:" + "\t" +url);
//获取客户端请求的部分url
String uri = req.getRequestURI();
System.out.println("获取客户端请求的部分url:" + "\t" +uri);
//获取请求中的参数部分
String querystring = req.getQueryString();
System.out.println("获取请求中的参数部分是" + "\t" + querystring);
//获取客户端的请求方式
String method = req.getMethod();
System.out.println("获取客户端的请求方式" + "\t" + method);
//获取http版本号
String protocol = req.getProtocol();
System.out.println("http的版本号是:" + "\t" + protocol);
//获取指定名称的参数值 返回字符串
//http://localhost:8080/demo/ser04?name=likedx&passwd=123
String username = req.getParameter("name");
String passwd = req.getParameter("passwd");
System.out.println(username + "\t" + passwd); // 取账号为likedx 密码为123
//获取指定名称的参数所有参数值 返回字符串数组 (用于复选框传值)
//
String[] hobbys = req.getParameterValues("hobby");
//判断数组是否为空
if (hobbys != null && hobbys.length > 0) {
for (String hobby : hobbys) {
System.out.println("爱好: " + hobby); // 爱好:rap 爱好:跳舞
}
}
}
}
2.解决乱码
servlet类
package com.demo.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class Servlet04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//req.setCharacterEncoding("UTF-8"); Tomcat8 post会乱码
// 获取前端url的用户名和密码
String username = req.getParameter("name");
String passwd = req.getParameter("passwd");
System.out.println("账号: " + username);
System.out.println("密码: " + passwd);
}
}
Login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form method="get" action="login">
姓名:<input type="text" name="name"> <br>
密码:<input type="password" name="passwd"> <br>
<button>登录</button>
</form>
</body>
</html>
在Tomcat8版本 post请求输入中文会乱码 则需添加指定格式
在Tomcat7版本 get请求乱码 也需添加指定编码格式
3.请求转发
用于将一个HTTP请求从一个Servlet发送到另一个Servlet进行处理。这种转发机制允许不同的Servlet协同工作来处理同一个请求,从而实现更复杂的业务逻辑和功能。
新建一个Servlet05和Servlet06类
package com.demo.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ser05")
public class Servlet05 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("name");
System.out.println("Servlet05 username : " + username);
//请求转发到06
//req.getRequestDispatcher("ser06").forward(req,resp);
req.getRequestDispatcher("login.jsp").forward(req,resp);
// 除了请求路径还可以是jsp和html
//地址栏不变 结果改变
}
}
package com.demo.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ser06")
public class Servlet06 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("name");
System.out.println("Servlet06 username : " + username);
}
}
4.作用域
Servlet作用域可以在以下多种情况下发生:
- 请求转发(Request Forwarding): 当一个Servlet通过请求转发将请求传递给另一个Servlet时,作用域可以用于在两个Servlet之间共享数据。
- 会话管理(Session Management): 在用户会话期间,通过会话作用域可以共享数据,无论是在同一个Servlet中还是在不同的Servlet之间。
- 全局应用程序范围(Application Scope): 上下文作用域(Application Scope)在整个应用程序生命周期内有效,允许不同的Servlet和请求之间共享数据。
- 请求响应周期中的不同阶段: 请求作用域可用于在同一次请求的不同阶段传递数据,而会话作用域可以在整个用户会话期间保持数据。
- 跨不同用户的请求: 通过会话作用域,不同用户之间可以在不同请求之间共享数据。
属性 | 说明 |
---|---|
request.setAttribute("key", "value"); | 设置域对象内容 |
request.getAttribute("key"); | 获取域对象内容 |
request.removeAttribute("key"); | 删除域对象内容 |
假设某一个购物功能 有一个购物车用来存商品信息 用户在浏览不同的页面需要保持购物车的商品信息 此时需要用到作用域来进行数据共享 保证数据不会丢失
新建一个servlet07和servlet08类 07设置作用域 08负责获取作用域的数据 通过一次性转发来实现
package com.demo.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/ser07")
public class Servlet07 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet07!!!");
//设置对象域内容
req.setAttribute("name","admin");
req.setAttribute("age",18);
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbbb");
req.setAttribute("list",list);
req.getRequestDispatcher("ser08").forward(req,resp);
}
}
package com.demo.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/ser08")
public class Servlet08 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet08 !!");
//获取对象域内容
String name = (String) req.getAttribute("name");
System.out.println("name :" + name);
Integer age = (Integer) req.getAttribute("age");
System.out.println("age :" + age);
List<String> list = (List<String>) req.getAttribute("list");
System.out.println(list.get(0));
}
}
HttpServletResponse对象
是 Java Servlet API 中的一个类,它代表了一个HTTP响应。在Servlet中,当服务器接收到客户端(通常是Web浏览器)发送的HTTP请求后,它会生成一个相应的HttpServletResponse
对象,用于构建和发送HTTP响应给客户端
1.解决响应乱码问题
package com.demo2.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo")
public class ServletTest extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 字符流
// PrintWriter pw = resp.getWriter();
// pw.write("Hello");
// pw.close();
//设置客户端和服务端的编码格式
resp.setContentType("text/html;charset=UTF-8");
//字节流
ServletOutputStream sos = resp.getOutputStream();
//输出数据 指定编码
sos.write("你好".getBytes("UTF-8"));
//关闭流
sos.close();
}
}
2.重定向
重定向可以分为两种类型:客户端重定向和服务器端重定向。
1.客户端重定向: 客户端重定向是通过发送特定的HTTP响应状态码和Location头来实现的。在Servlet中,你可以通过设置响应的状态码为"302 Found"或者其他重定向相关的状态码,并在响应头中设置Location字段来指定要重定向到的URL。客户端收到这个响应后,会自动向新的URL发起请求,从而实现重定向。
response.setStatus(HttpServletResponse.SC_FOUND; // 302状态码
response.setHeader("Location", "new_page.jsp"); // 要重定向的URL
2.服务器端重定向: 服务器端重定向是通过将请求转发给另一个URL来实现的。在Servlet中,你可以使用RequestDispatcher的forward方法将请求转发给另一个Servlet或JSP页面,然后由另一个页面处理请求并生成响应。
RequestDispatcher dispatcher = request.getRequestDispatcher("new_page.jsp");
dispatcher.forward(request, response); // 转发请求给新的页面
重定向的一个主要应用是在用户提交表单后进行页面跳转,以避免用户重新提交表单数据。此外,重定向还可以用于实现页面的简单跳转和URL的美化。
ServletTest02重定向ServletTest03类 02会执行完毕后在跳转到03 地址栏会发生变化
package com.demo2.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo2")
public class ServletTest02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo2.....");
resp.sendRedirect("demo3");
}
}
package com.demo2.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo3")
public class ServletTest03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3...");
}
}
3.请求转发和重定向的区别
请求转发:
- 地址不变
- 请求转发只有一次请求
- 请求转发时request对象可以共享
- 请求转发是服务端行为
- 请求转发时地址只能是当前站点下的资源
重定向:
- 地址会变
- 重定向有两次请求
- 重定向时request对象不可以共享
- 重定向是客户端行为
- 重定向时地址可以是任何地址
Cookie对象
Servlet中的Cookie对象是一种用于在Web应用程序中存储少量数据的机制。它允许服务器向客户端的浏览器发送一小段数据,并要求浏览器在随后的请求中将该数据带回服务器。这样,服务器可以在不同的HTTP请求之间保持一些状态信息,或者在客户端存储一些临时数据。
1.Cookie的创建和发送
package com.demo.cookie;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookie")
public class cookie extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie
Cookie cookie = new Cookie("name","admin");
//发送cookie
resp.addCookie(cookie);
}
}
2.Cookie的获取
package com.demo.cookie;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookie02")
public class cookie2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Cookie的获取 需要创建cookie数组
Cookie[] cookies = req.getCookies();
//判断cookie是否为空
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies){
//获取cookie的名称和值
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("获取到的name :" + name + "获取到的value : " + value);
}
}
}
}
3.Cookie设置到期时间
package com.demo.cookie;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookie3")
public class cookie3 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("name","zhangsan");
Cookie cookie2 = new Cookie("name","lisi");
cookie.setMaxAge(30); //存活30秒
cookie2.setMaxAge(-1); //关闭浏览器失效
cookie2.setMaxAge(0); //删除cookie
//发送cookie
resp.addCookie(cookie);
resp.addCookie(cookie2);
}
}
5.Cookie的路径
当前服务器下任何项目的任意资源都可以获取Cookie对象
Cookie cookie = new Cookie("xxx","xxx");
cookie.serPath("/");
resp.addCookie(cookie);
指定项目下的资源可获取Cookie对象
Cookie cookie = new Cookie("xxx","xxx");
cookie.serPath("/ser02");
resp.addCookie(cookie);
指定目录下的资源可获取Cookie对象
Cookie cookie = new Cookie("xxx","xxx");
cookie.serPath("/ser02/aaa");
resp.addCookie(cookie);
HttpSession对象
HttpSession
允许你在用户访问你的网站时创建一个会话,并将一些数据存储在这个会话中。这些数据可以是用户的登录状态、购物车内容、用户首选项等等。每当用户发送新的HTTP请求时,服务器可以从会话中获取存储的数据,而不需要用户在每个请求中都提供这些数据。
1.标识符 JSESSION
package com.demo.session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
/*
* session 对象获取
* request.getSession()
* 当获取session对象时会判断session对象是否存在 如果存在则获取session对象 不存在会创建session对象
* */
@WebServlet("/session")
public class Session01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//获取session会话标识
String id = session.getId();
System.out.println(id);
//获取session的创建时间 时间戳
System.out.println(session.getCreationTime());
//获取最后一次访问时间
System.out.println(session.getLastAccessedTime());
//判断是否是新的session对象
System.out.println(session.isNew());
}
}
2.Session域对象
Session域对象就是一个存储在服务器端的容器,用于存放和管理与用户会话相关的数据。与其他域对象(如请求域和应用域)相比,Session域对象中存储的数据在整个会话过程中都是可用的。
当用户第一次访问你的网站时,服务器会为该用户创建一个唯一的会话,并为该会话创建一个Session域对象。随后,你可以将数据存储在这个Session域对象中,这些数据将在用户会话期间一直存在,直到用户退出或会话超时。
package com.demo.session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
/*
* session域对象
* setAttribute() 设置域对象
* getAttribute() 获取域对象
* removeAttribute() 移除域对象
* 请求转发
* 一次请求
* request作用域有效
* session作用域有效
* 重定向
* 二次请求
* session作用域有效
* */
@WebServlet("/session02")
public class Session02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//设置域对象
session.setAttribute("name","admin");
session.setAttribute("pwd","666666");
//移除域对象
session.removeAttribute("pwd");
//request域对象
req.setAttribute("username","zhangsan");
// 请求转发到index.jsp页面
//req.getRequestDispatcher("index.jsp").forward(req,resp);
// name: null pwd: null username: null
// name: null pwd: null username: null
// name: admin pwd: null username: zhangsan
//重定向跳转到jsp页面
resp.sendRedirect("index.jsp");
// name: admin pwd: null username: null
}
}
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>获取域对象</title>
</head>
<body>
<%
//获取session域对象
String name = (String) request.getSession().getAttribute("name");
String pwd = (String) request.getSession().getAttribute("pwd");
//获取request对象
String username = (String) request.getAttribute("username");
System.out.println("name: " + name + " pwd: " + pwd + " username: " + username);
%>
</body>
</html>
3.Session对象的销毁
Session域对象销毁指的是在用户会话结束或会话过期时,Session域对象中存储的数据被清除并且Session本身被关闭的过程。这意味着会话中存储的数据不再可用,而且后续的HTTP请求将无法访问之前存储在Session域中的数据。
手动设置到期时间
//获取session对象 HttpSession session = req.getSession(); //设置session的最大不活动时间 session.setMaxInactiveInterval(15); //15秒 //查看session的最大不活动时间 int time = session.getMaxInactiveInterval(); System.out.println(time); //1800 30分钟
立即失效
//立即销毁 session.invalidate();
- 服务器重启
package com.demo.session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/session03")
public class Session03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象
HttpSession session = req.getSession();
//设置session域对象
session.setAttribute("name","admin");
//设置session的最大不活动时间
session.setMaxInactiveInterval(15); //15秒
//查看session的最大不活动时间
int time = session.getMaxInactiveInterval();
System.out.println(time); //1800 30分钟
//立即销毁
//session.invalidate();
}
}
ServletContext对象
ServletContext
对象是在Java Web应用程序中表示整个Web应用程序环境的一个重要对象。它提供了访问应用程序范围内的配置信息、资源和功能的方式,可以在整个Web应用程序中共享数据和状态。
1.通过request对象获取
ServletContext servletContext = req.getServletContext();
2.通过session对象获取
ServletContext servletContext1 = req.getSession().getServletContext();
3.通过servletConfig对象获取
ServletContext servletContext2 = getServletConfig().getServletContext();
package com.demo.ServletContext;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* 获取ServletContext对象
*
* */
@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过request获取
ServletContext servletContext = req.getServletContext();
//通过session对象获取
ServletContext servletContext1 = req.getSession().getServletContext();
//通过ServletConfig对象获取
ServletContext servletContext2 = getServletConfig().getServletContext();
//直接获取
ServletContext servletContext3 = getServletContext();
// 常用方法
// 1.获取当前服务器版本信息
String serverinfo = req.getServletContext().getServerInfo();
System.out.println(serverinfo); //Apache Tomcat/10.1.11
//2.获取项目真实路径
String realPath = req.getServletContext().getRealPath("/");
System.out.println(realPath); // /Users/likedx/Desktop/ideaProject/target/ideaProject-1.0-SNAPSHOT/
}
}
ServletContext域对象
Application(ServletContext)域是一种在整个 Web 应用程序范围内存储数据的机制。在整个应用程序生命周期内,不同的 Servlet 可以通过 Application 域共享数据。这种数据共享适合于应用程序级别的配置信息、全局数据等。
//获取ServletContext对象
ServletContext servletContext = req.getServletContext();
//设置域对象
servletContext.setAttribute("name","zhangsan");
//获取域对象
String name = (String) servletContext.getAttribute("name");
//移除域对象
servletContext.removeAttribute("name");
Servlet三大域对象
1.Request 域: 在一次请求中有效。请求转发有效,重定向失效。
2.Session 域:在一会话中有效。请求转发和重定向都有效,session销毁后失效。
3.Application(ServletContext)域:在整个应用程序中有效。Application 域中的数据在应用程序关闭时失效。
文件上传
1.前台页面
upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<!--
文件上传
1.准备表单
2.设置表单类型 method="post"
3.设置表单类型为文件上传表单
4.设置文件提交的地址
5.准备表单元素
1.普通的表单项
2.文件项
6.设置表单元素的name属性值
-->
<form method="post" enctype="multipart/form-data" action="uploadServlet">
姓名<input type="text" name="uname"> <br>
文件<input type="file" name="myfile"> <br>
<!-- button默认提交表单是 "submit" -->
<button>提交</button>
</form>
</body>
</html>
2.后台实现
package com.xxx.demo;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;
import java.io.IOException;
@WebServlet("/uploadServlet")
@MultipartConfig //如果是文件上传 必须要设置该注解
public class uoloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("文件上传");
//设置请求的编码格式
req.setCharacterEncoding("UTF-8");
String uname = req.getParameter("uname"); //这个uname是表单中表单元素的值
System.out.println("uname: " + uname);
//获取Part对象
Part part = req.getPart("myfile"); //表单中文件域的属性值
//通过Part对象得到上传的文件名
String fileName = part.getSubmittedFileName();
System.out.println("上传文件名: " + fileName);
//得到文件存放的路径
String filePath = req.getServletContext().getRealPath("/");
System.out.println("文件存放的路径: " + filePath);
part.write(filePath + "/" + fileName);
}
}