Servlet
- 用Java编写的服务器端程序,用于处理Web请求。用户在浏览器中发送请求后,Servlet接收请求,并响应. 然后将生成的响应返回给客户端浏览器.
- servlet是一种规范(接口),没有main方法,由谁执行呢? servlet由tomcat创建, servlet方法由tomcat调用. servlet需要依赖 tomcat 才能运行.
Tomcat
- 轻量级Web服务器,用来运行Servlet和JSP。提供"网上信息浏览服务",程序员不用对协议进行操作.
Web根目录转发问题
1. Web 服务器的根目录
web
目录是 Web 应用的根目录,服务器(Tomcat)会将这个目录中的文件作为应用的静态资源和 JSP 文件根目录。也就是说,只有放在 web
目录下的文件才能通过 URL 或转发路径直接访问。
2. 转发路径的相对路径约定
在 Java Web 项目中,转发路径(RequestDispatcher.forward
)会从 web
目录的根目录开始寻找 JSP 文件。比如 req.getRequestDispatcher("/login.jsp")
会从 web
目录的根目录开始寻找 login.jsp
。
- 例如,如果 JSP 文件放在
src
目录或其他文件夹中,Web 容器将无法直接访问或转发到这些位置,因为src
是编译代码的位置,不会被打包到发布的应用中。
Servlet生命周期:
- 指的是servlet从创建到被销毁的整个过程. 四个阶段:加载和实例化( tomcat完成 ),初始化(只执行一次) ,请求处理(service方法), 服务终止(servlet销毁前调用destroy方法).
Servlet
接口:
public interface Servlet {
void init(ServletConfig config); // 初始化方法
void service(ServletRequest req, ServletResponse res); // 请求处理方法
void destroy(); // 销毁方法
ServletConfig getServletConfig(); // 获取 Servlet 配置
String getServletInfo(); // 获取 Servlet 信息
}
Servlet的继承关系:
- 继承关系:Servlet–>GennericServlrt–>HttpServlet(从左到右),
- 我们写的servlet 要继承 HttpServlet 并重写 doget 和 dopost 方法.
HttpServlet
类:
public abstract class HttpServlet extends GenericServlet {
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest hreq = (HttpServletRequest) req;
HttpServletResponse hres = (HttpServletResponse) res;
// 根据 HTTP 请求的方法类型(GET、POST等)调用相应的处理方法
if ("GET".equalsIgnoreCase(hreq.getMethod())) {
doGet(hreq, hres);
} else if ("POST".equalsIgnoreCase(hreq.getMethod())) {
doPost(hreq, hres);
} else {
// 处理其他请求类型
doOther(hreq, hres);
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理 GET 请求
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理 POST 请求
}
// 其他 HTTP 方法的处理方法(例如 doPut()、doDelete() 等)
}
服务器内部转发和客户端重定向
req.getRequestDispatcher("/index.jsp").forward(req,resp);//请求转发
resp.sendRedirect("/index.jsp");//请求重定向
-
转发:是把客户端请求交给另一个组件实现,然后由完成请求的组件响应.这个过程中,地址栏不变.这是一次请求响应的过程,对于客户端而言,内部经历了多少次转发,客户端并不知道.
-
转发:可以在请求内部共享数据.
-
重定向:一个组件接收到请求后立即响应客户端,告知客户端给另一个组件发请求,然后另一个组件接收并响应客户端的请求.地址栏有变化.这是两次请求响应的过程,客户端知道经历的转发.
-
302状态码通常表示“临时重定向”.
保存作用域
- 有四个:page(过时了),request(一次请求范围),session(一次会话范围),application(整个应用程序范围).
- request:在一个 HTTP 请求的生命周期内有效
// 设置数据到请求作用域
req.setAttribute("1", "warren");
// 转发请求到另一个 Servlet
req.getRequestDispatcher("servlet").forward(req, resp);
// 在转发后获取数据
Object attribute = req.getAttribute("1");
System.out.println(attribute); // 输出: warren
// 如果使用重定向,获取到的会是 null,因为重定向会创建一个新的请求
- session:数据在会话期间是共享的.
//使用getSession,只要会话没有过期,便可以获取到.
req.getSession().setAttribute("1","warren");
req.getRequestDispatcher("servlet").forward(req,resp);
Object attribute = req.getSession().getAttribute("1");
System.out.println(attribute);
- application:不同的浏览器也能访问,只要tomcat没有停止.
ServletContext application = req.getServletContext();//Servlet上下文,可以理解成web应用程序,所以只要tomcat没有停止就可以访问.
application.setAttribute("1","warren");
ServletContext application = req.getServletContext();
Object attribute = application.getAttribute("1");
System.out.println(attribute);