动态 WEB 开发核心-Servlet
官方文档
1 地址: https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html
2 离线文档: JAVA_EE_api_中英文对照版.chm
3 Servlet 和 Tomcat 的关系: 一句话, Tomcat 支持 Servlet
对Java Web 技术体系的流程图改造说明(细化).[整体的概念]
什么是 Servlet
Servlet 在开发动态 WEB 工程中,得到广泛的应用,掌握好 Servlet 非常重要了, Servlet(基石)是 SpringMVC 的基础
Servlet(java 服务器小程序),它的特点:
1. 他是由服务器端调用和执行的(一句话:是Tomcat解析和执行)
2. 他是用java语言编写的, 本质就是Java类
3. 他是按照Servlet规范开发的(除了tomcat->Servlet weblogic->Servlet)
4. 功能强大,可以完成几乎所有的网站功能(在以前,老程员,使用Servlet开发网站) 技术栈要求高
Servlet 在 JavaWeb 项目位置
Servlet 基本使用
Servlet 开发方式说明
1. servlet3.0 前使用 web.xml , servlet3.0 版本以后(包括 3.0)支持注解,同时支持 web.xml配置
2. 如何查看 servlet 版本[如
编写类HelloServlet去实现 Servlet 接口
1. import javax.servlet.*; 2. import javax.servlet.http.HttpServletRequest; 3. import java.io.IOException; 4. public class HelloServlet implements Servlet { 5. @Override 6. public void init(ServletConfig servletConfig) throws ServletException { 7. //System.out.println("init...~~~"); 8. } 9. 10. @Override 11. public ServletConfig getServletConfig() { 12. return null; 13. } 14. 15. /** 16. * service 方法是专门用来处理请求和响应的 17. * 18. * @param servletRequest 19. * @param servletResponse 20. * @throws ServletException 21. * @throws IOException 22. */ 23. @Override 24. public void service(ServletRequest servletRequest, ServletResponse servletResponse) 25. throws ServletException, IOException { 26. //System.out.println("HelloServlet 被访问" + servletRequest.getClass()); 27. // 类型转换(因为它有 getMethod()方法) 28. HttpServletRequest httpServletRequest = (HttpServletRequest) 29. servletRequest; 30. // 获取请求的方式 31. String method = httpServletRequest.getMethod(); 32. if ("GET".equals(method)) { 33. doGet(); 34. } else if ("POST".equals(method)) { 35. doPost(); 36. } 37. } 38. 39. /** 40. * 处理浏览器 get 请求 41. */ 42. public void doGet() { 43. System.out.println("处理 get 请求"); 44. } 45. 46. /** 47. * 处理浏览器 post 请求 48. */ 49. public void doPost() { 50. System.out.println("处理 post 请求"); 51. } 52. 53. @Override 54. public String getServletInfo() { 55. return null; 56. } 57. 58. @Override 59. public void destroy() { 60. System.out.println("destroy 被调用..."); 61. } 62. }
在web.xml配置HelloServlet,
即:给HelloServlet 提供对外访问地址
通过浏览器访问HelloServlet ,看是否正确(记住要redeploy[快] 或者 restar[慢])
浏览器调用 Servlet 流程分析
通过继承 HttpServlet 开发 Servlet
● HttpServlet 介绍
在实际项目中,都是使用继承 HttpServlet 类开发 Servlet 程序,更加方便
代码演示
1. import javax.servlet.ServletException; 2. import javax.servlet.http.HttpServlet; 3. import javax.servlet.http.HttpServletRequest; 4. import javax.servlet.http.HttpServletResponse; 5. import java.io.IOException; 6. 7. public class HiServlet extends HttpServlet { 8. //重写 HttpServlet 的 doGet 和 doPost 9. //alt +insert 10. /** 11. * 处理 doGet 请求 12. * @param req 13. * @param resp 14. * @throws ServletException 15. * @throws IOException 16. */ 17. @Override 18. protected void doGet(HttpServletRequest req, HttpServletResponse resp) 19. throws ServletException, IOException { 20. System.out.println("HiServlet doGet()..."); 21. } 22. /** 23. * 处理 doPost 24. * @param req 25. * @param resp 26. * @throws ServletException 27. * @throws IOException 28. */ 29. @Override 30. protected void doPost(HttpServletRequest req, HttpServletResponse resp) 31. throws ServletException, IOException { 32. System.out.println("HiServlet doPost()..."); 33. } 34. }
配置 web.xml
1. <servlet> 2. <servlet-name>HiServlet</servlet-name> 3. <servlet-class>com.servlet.HiServlet</servlet-class> 4. </servlet> 5. <servlet-mapping> 6. <servlet-name>HiServlet</servlet-name> 7. <url-pattern>/hiServlet</url-pattern> 8. </servlet-mapping>
Servlet 注意事项和细节
1. Servlet 是一个供其他 Java 程序(Servlet 引擎)调用的 Java 类,不能独立运行
2. 针对浏览器的多次 Servlet 请求,通常情况下,服务器只会创建一个 Servlet 实例对象,也就是说 Servlet 实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web 容器退出/或者 redeploy 该 web 应用,servlet 实例对象才会销毁 【示意图】
3. 在 Servlet 的整个生命周期内,init方法只被调用一次。而对每次请求都导致 Servlet 引擎调用一次 servlet 的 service 方法
4. 对于每次访问请求,Servlet 引擎都会创建一个新的 HttpServletRequest 请求对象和一个新的 HttpServletResponse 响应对象,然后将这两个对象作为参数传递给它调用的 Servlet的 service()方法,service 方法再根据请求方式分别调用 doXXX 方法
5. 如果在<servlet>元素中配置了一个<load-on-startup>元素,那么 WEB 应用程序在启动时,就会装载并创建 Servlet 的实例对象、以及调用 Servlet 实例对象的 init()方法