1 JSP处理请求。
HttpServlet接口的三个方法:
init () 进行初始化。
service() 方法来处理客户端的请求。当执行get请求时执行doGet方法,执行post请求时执行doPost方法。service方法将从ServletRequest和ServletResponse对象强制转换成用于处理Http的HttpServletRequest和HttpServletResponse。
destroy() 方法终止(结束)。
通过http来发送请求,服务器端来处理请求。
创建连接-》请求过程-》应答过程-》关闭连接。
Tomcat处理请求过程如下:
核心为一个Servlet/JSP Container,对于每一个请求,过程如下:
获取连接
Servlet来分析连接
调用对应的Service方法来进行业务处理。
产生相应的响应。
关闭连接。
2 继承HttpServlet接口通过注解的方式来处理请求。
只需要添加一个注解即可,完全不用在web.xml中配置,我。。。
@WebServlet(urlPatterns = "/helloWorld.html")
public class HelloWorldServletT extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
// 获取输出打印对象
PrintWriter out = resp.getWriter();
out.println("Hello,Servlet/JSP World!");
}
}
说明:@WebServlet中的urlPatterns属性和value不能同时出现,当方法可处理不同的请求,方式如下:
@WebServlet(urlPatterns = { "/helloWorld01.html", "/helloWorld02.html" }
请求完整的过程如下:
— 从浏览器(Client)获取连接”/helloWorld.html”
— Tomcat Connector模块将请求(Request)传递给 Container模块
— Container 模块会做以下事情
—— 分析HTPP请求信息,组装成HttpServletRequest对象
—— 创建新的HttpServletResponse对象
—— 根据路由配置,搜索相应的Servlet,并创建一个线程用于处理本次请求。此时线程会将上面Request和Response对象的索引,传递给Servlet
— 新线程中的Servlet处理逻辑
— 线程结束后,通过HttpServletResponse对象的PrintWriter,返回浏览器一个信息。
图解如下:
蓝色线指向过程是请求,绿色线指向过程是响应过程,橙色线指向过程是内部处理过程。
问:Servlet是线程安全的吗?
答:不是,一个servlet实现类只会有一个实例对象,多个线程是可能会访问同一个servlet实例对象的,
因此,Servlet对象实例化是在以第一次请求此Servlet时,如果访问后,实例对象存在内存中,只会在服务器停止时,它才会消失。它不会随着各个线程结束而结束。因此下次访问Servlet时,Servlet Container会搜索相应的Servlet,如果不存在,Container新建相应的Servlet。这也是我们想要的结果
未完待续。。。