Srevlet是什么?
Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容。Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能。Servlet与客户端通过Servlet容器实现的请求/响应模型进行交互。
Servlet的作用:
当我们在使用一个交互式 的Web站点的时候,我们所浏览到的所有内容都应该是在浏览器中显示的。在这些场景背后,都会有一个Web服务器接收会话中来自于我们的请求,其中可能要切换到其他代码来处理该请求和访问数据,并生成在浏览器中显示的结果。
Servlet生命周期:
请求的分发处理:
在通过浏览器访问服务器的时候,会有两种请求方式,Get和Post,不同的请求方式会有不同的处理动作,这就需要我们对于两种请求有对应的处理请求的方法。如果是实现的Servlet接口,我们就需要对发来的请求进行判断。
实际上,在我们实际的开发过程中,经常是继承HttpServlet,然后重写HttpServlet中的doGet或者doPost方法来处理不同的请求。
Servlet类的继承体系是什么
这里附上一张图来表示Servlet类的继承体系
Servlet中的ServletConfig类
ServletConfig:Servlet程序的配置信息表,每个ServletConfig中的数据是不共享的,就是说你在第一个Servlet程序中ServletConfig中的数据,不能在第二个程序中的ServletConfig中获取。
-
可以获取servlet-name:
-
获取初始化参数init-param(键值对) : servletConfig.getInitParameter(key),返回一个value
-
获取servletContext对象: servletConfig.getServletContext()
servletContext类
servletContext是一个接口,表示servlet上下文对象,一个web工程只有一个servletContext对象实例,是一个域对象
具体使用:
请求与响应
请求是客户端向服务器发送访问请求,响应是服务器向客户端反馈信息。
HttpServletRequest类:
这里只写上几个常用的方法:
请求转发 请求重定向 请求包含的特点与区别
请求转发:外包出去,做中间商
@WebServlet("/forward01")
public class RequestForward_01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("第一个程序返回的话会不会在浏览器上显示");
req.getRequestDispatcher("/forward02").forward(req,resp);
}
}
@WebServlet("/forward02")
public class RequsetForward_02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("第二个程序返回的话会不会在浏览器上显示,或者说任务已经完成");
}
}
很明显,只有第二个程序返回的内容显示在页面上了,并且地址栏不会发生改变
请求重定向:自己不做,交给别人做
@WebServlet("/redirect01")
public class ServletRedirect01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("第一个程序返回的话会不会在浏览器上显示");
//请求重定向要给客户端响应一个状态和新的地址,setStatue(),setHeader(),或者setRedirect();
resp.sendRedirect("./redirect02");
}
}
@WebServlet("/redirect02")
public class ServletRedirect02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置服务器与客户端的字符集
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().write("第二个程序返回的话会不会在浏览器上显示,或者说任务已经完成");
resp.getWriter().write("欢迎访问次页面");
}
}
地址栏会发生改变
请求包含:一个人做一部分,另一个人做另一部分,合力完成
@WebServlet("/forward01")
public class RequestForward_01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().println("第一个程序返回的话会不会在浏览器上显示");
req.getRequestDispatcher("/forward02").include(req,resp);
}
}
@WebServlet("/forward02")
public class RequsetForward_02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("第二个程序返回的话会不会在浏览器上显示,或者说任务已经完成");
}
}
这里两个程序的内容都显示在了页面上,但是地址栏没有发生改变
总结:(这里直接附上从网上找的图)
请求重定向:
请求转发:
请求包含:
到这里就是我对Servlet过程的学习,后面应该还会进行补充吧。