一、创建一个 Servlet 简单实现类

1、创建一个 HelloServlet 类(测试 Servlet 接口方法)

  1. 1 //创建一个 HelloServlet 类并实现 Servlet 接口
  2. 2 public class HelloServlet implements Servlet {
  3. 3
  4. 4 // Tomcat 停止服务时 Servlet 的销毁方法
  5. 5 @Override
  6. 6 public void destroy() {
  7. 7 System.out.println("destroy.....");
  8. 8 }
  9. 9
  10. 10 @Override
  11. 11 public ServletConfig getServletConfig() {
  12. 12 System.out.println("getServletConfig");
  13. 13 return null;
  14. 14 }
  15. 15
  16. 16 @Override
  17. 17 public String getServletInfo() {
  18. 18 System.out.println("getServletInfo");
  19. 19 return null;
  20. 20 }
  21. 21
  22. 22 // Servlet 加载时 初始化方法
  23. 23 @Override
  24. 24 public void init(ServletConfig servletConfig) throws ServletException {
  25. 25 System.out.println("init");
  26. 26 }
  27. 27
  28. 28 // servlet 运行时的方法 每次请求调用
  29. 29 @Override
  30. 30 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
  31. 31 System.out.println("service");
  32. 32 }
  33. 33
  34. 34 // HelloServlet 实现类的构造方法 加载时调用
  35. 35 public HelloServlet() {
  36. 36 System.out.println("HelloServlet's constructor");
  37. 37 }
  38. 38
  39. 39 }

2、配置和映射 Servlet

  1. 1 <?xml version="1.0" encoding="UTF-8"?>
  2. 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. 3 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  4. 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. 5 id="WebApp_ID" version="3.1">
  6. 6
  7. 7 <!-- 配置和映射 Servlet -->
  8. 8 <servlet>
  9. 9 <!-- Servlet 注册的名字 -->
  10. 10 <servlet-name>HelloServlet_java</servlet-name>
  11. 11 <!-- Servlet 的全类名 -->
  12. 12 <servlet-class>com.panku.javaWeb1.HelloServlet</servlet-class>
  13. 13 <!-- 可以指定 Servlet 被创建的时机 -->
  14. 14 <load-on-startup>1</load-on-startup>
  15. 15 </servlet>
  16. 16
  17. 17 <servlet-mapping>
  18. 18 <!-- 需要和某一个 Servlet 节点的 servlet-name 子节点的文本节点一致 -->
  19. 19 <servlet-name>HelloServlet_java</servlet-name>
  20. 20 <!-- 映射的具体访问路径: / 代表当前 Web 应用的根目录. -->
  21. 21 <url-pattern>/hello</url-pattern>
  22. 22 </servlet-mapping>
  23. 23
  24. 24 </web-app>

二、Servlet 生命周期

Servlet 生命周期的方法: 以下方法都是由 Serlvet 容器负责调用.

1). 构造器: 只被调用一次. 只有第一次请求 Servlet 时, 创建 Servlet 的实例. 调用构造器. 这说明 Serlvet 的单实例的!

2). init 方法: 只被调用一次. 在创建好实例后立即被调用. 用于初始化当前 Servlet.

3). service: 被多次调用. 每次请求都会调用 service 方法. 实际用于响应请求的.

4). destroy: 只被调用一次. 在当前 Servlet 所在的 WEB 应用被卸载前调用. 用于释放当前 Servlet 所占用的资源.

三、ServletConfig 对象(getInitParameterNames、getInitParameter、getServletName(不常用)、getServletContext四个接口方法)

1、在 web.xml 文件中配置 servlet 的初始化参数(init-param 节点)

  1. 1 <?xml version="1.0" encoding="UTF-8"?>
  2. 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. 3 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  4. 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. 5 id="WebApp_ID" version="3.1">
  6. 6
  7. 7 <!-- 配置和映射 Servlet -->
  8. 8 <servlet>
  9. 9 <!-- Servlet 注册的名字 -->
  10. 10 <servlet-name>HelloServlet_java</servlet-name>
  11. 11 <!-- Servlet 的全类名 -->
  12. 12 <servlet-class>com.panku.javaWeb1.HelloServlet</servlet-class>
  13. 13
  14. 14 <!-- 配置 Servlet 的初始化参数 -->
  15. 15 <init-param>
  16. 16 <!-- 参数名 -->
  17. 17 <param-name>user</param-name>
  18. 18 <!-- 参数值 -->
  19. 19 <param-value>root</param-value>
  20. 20 </init-param>
  21. 21
  22. 22 <init-param>
  23. 23 <param-name>password</param-name>
  24. 24 <param-value>123456</param-value>
  25. 25 </init-param>
  26. 26
  27. 27 <!-- 可以指定 Servlet 被创建的时机 -->
  28. 28 <load-on-startup>1</load-on-startup>
  29. 29 </servlet>
  30. 30
  31. 31 <servlet-mapping>
  32. 32 <!-- 需要和某一个 Servlet 节点的 servlet-name 子节点的文本节点一致 -->
  33. 33 <servlet-name>HelloServlet_java</servlet-name>
  34. 34 <!-- 映射的具体访问路径: / 代表当前 Web 应用的根目录. -->
  35. 35 <url-pattern>/hello</url-pattern>
  36. 36 </servlet-mapping>
  37. 37
  38. 38 </web-app>

2、servlet实现类的 init()方法中 ServletConfig 对象实例(ServletConfig的getInitParameterNames、getInitParameter、getServletName(不常用)方法实例)

  1. 1 // Servlet 加载时 初始化方法
  2. 2 @Override
  3. 3 public void init(ServletConfig servletConfig) throws ServletException {
  4. 4 System.out.println("init");
  5. 5
  6. 6 // 获取初始化参数值
  7. 7 String user = servletConfig.getInitParameter("user");
  8. 8 System.out.println("user:" + user);
  9. 9
  10. 10 // 获取初始化参数名和值
  11. 11 Enumeration<String> names = servletConfig.getInitParameterNames();
  12. 12 while (names.hasMoreElements()) {
  13. 13 String name = names.nextElement();
  14. 14 String value = servletConfig.getInitParameter(name);
  15. 15 System.out.println("^^name:" + name + ":" + value);
  16. 16 }
  17. 17
  18. 18 // 获取 Servlet 注册名称
  19. 19 String servletName = servletConfig.getServletName();
  20. 20 System.out.println(servletName);
  21. 21 }

3、在 servlet 实现类的 init()方法中 通过 ServletConfig 对象得到 ServletContext 对象

ServletContext的常见方法: getInitParameter()、getInitParameterNames()、getRealPath()、getContextPath()、getResourceAsStream()

  1. 1 // Servlet 加载时 初始化方法
  2. 2 @Override
  3. 3 public void init(ServletConfig servletConfig) throws ServletException {
  4. 4 System.out.println("init");
  5. 5
  6. 6 // WEB初始化参数: 可以为所有的 Servlet 所获取, 而 Servlet 的初始化参数只用那个 Serlvet 可以获取.
  7. 7 // 获取 ServletContext 对象
  8. 8 ServletContext servletContext = servletConfig.getServletContext();
  9. 9
  10. 10 // 获取当前 WEB 初始化参数值
  11. 11 String driver = servletContext.getInitParameter("driver");
  12. 12 System.out.println("driver:" + driver);
  13. 13
  14. 14 // 获取当前 WEB 初始化参数名和值
  15. 15 Enumeration<String> name2 = servletContext.getInitParameterNames();
  16. 16 while (name2.hasMoreElements()) {
  17. 17 String name = name2.nextElement();
  18. 18 String value = servletContext.getInitParameter(name);
  19. 19 System.out.println("-->" + name + ":" + value);
  20. 20 }
  21. 21
  22. 22 // 获取当前 WEB 应用的某一个文件在服务器上的绝对路径, 而不是不部署前的路径
  23. 23 String realPath = servletContext.getRealPath("/111.txt");
  24. 24 // 不是 E:\eclipse\workspace\JavaWeb\WebContent\111.txt
  25. 25 System.out.println(realPath);
  26. 26
  27. 27 // 获取当前 WEB 应用的名称
  28. 28 String contextPath = servletContext.getContextPath();
  29. 29 System.out.println(contextPath);
  30. 30
  31. 31 // 获取一个文件的输入流(部署前的路径)
  32. 32 try {
  33. 33 ClassLoader classLoader = getClass().getClassLoader();
  34. 34 InputStream is = classLoader.getResourceAsStream("jdbc.properties");
  35. 35 System.out.println("1." + is);
  36. 36 } catch (Exception e) {
  37. 37 e.printStackTrace();
  38. 38 }
  39. 39
  40. 40 // 获取一个文件的输入流(服务器上的路径)
  41. 41 try {
  42. 42 InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
  43. 43 System.out.println("2." + is2);
  44. 44 } catch (Exception e) {
  45. 45 e.printStackTrace();
  46. 46 }
  47. 47 }

四、servlet 实现类的 service()方法中的 Request 对象

1、Request 的常用方法: getParameter(String name)、getParameterValues(String name)、getParameterNames()、getParameterMap()

  1. 1 // 用于应答请求: 因为每次请求都会调用 service() 方法
  2. 2 // ServletRequest: 封装了请求信息, 可以从中获取到任何的请求信息
  3. 3 // ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现
  4. 4 @Override
  5. 5 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  6. 6 System.out.println("请求成功.......");
  7. 7 System.out.println(request);
  8. 8
  9. 9 // String getParameter(String name): 根据请求参数的名字, 返回参数值.
  10. 10 String user = request.getParameter("user");
  11. 11 String password = request.getParameter("password");
  12. 12 System.out.println(user + "," + password);
  13. 13
  14. 14 // getParameter()方法只能获取一个参数值
  15. 15 String interesting = request.getParameter("interesting");
  16. 16 System.out.println(interesting);
  17. 17
  18. 18 // String[] getParameterValues(String name): 根据请求参数的名字, 返回请求参数对应的字符串数组
  19. 19 String[] interestings = request.getParameterValues("interesting");
  20. 20 for (String string : interestings) {
  21. 21 System.out.println("-->" + string);
  22. 22 }
  23. 23
  24. 24 // Enumeration getParameterNames(): 返回参数名对应的 Enumeration 对象,类似于
  25. 25 // ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法.
  26. 26 Enumeration<String> names = request.getParameterNames();
  27. 27 while (names.hasMoreElements()) {
  28. 28 String name = names.nextElement();
  29. 29 String valuee = request.getParameter(name);
  30. 30 System.out.println("==>" + name + ", " + valuee);
  31. 31 }
  32. 32
  33. 33 // Map getParameterMap(): 返回请求参数的键值对: key: 参数名, value: 参数值, String 数组类型.
  34. 34 Map<String, String[]> map = request.getParameterMap();
  35. 35 for (Map.Entry<String, String[]> entry : map.entrySet()) {
  36. 36 System.out.println("**" + entry.getKey() + ":" + Arrays.asList(entry.getValue()));
  37. 37 }
  38. 38 }

2、httpServletRequest 的常用方法:getRequestURI()、getMethod()、getQueryString()、getServletPath()

  1. 1 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  2. 2 System.out.println("请求成功.......");
  3. 3 System.out.println(request);
  4. 4 // 获取请求的 URI
  5. 5 HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  6. 6 String requestURI = httpServletRequest.getRequestURI();
  7. 7 System.out.println(requestURI);
  8. 8
  9. 9 // 获取请求方式
  10. 10 String method = httpServletRequest.getMethod();
  11. 11 System.out.println(method);
  12. 12
  13. 13 // 若是一个 GET 请求, 获取请求参数对应的那个字符串, 即 ? 后的那个字符串.
  14. 14 String queryString = httpServletRequest.getQueryString();
  15. 15 System.out.println(queryString);
  16. 16
  17. 17 // 获取请求的 Serlvet 的映射路径
  18. 18 String servletPath = httpServletRequest.getServletPath();
  19. 19 System.out.println(servletPath);
  20. 20 }

五、servlet 实现类的 service()方法中的 Response 对象

Response 目前常用方法:setContentType()、getWriter()

  1. 1 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  2. 2 System.out.println("请求成功.......");
  3. 3 System.out.println(request);
  4. 4 // 设置响应方式
  5. 5 response.setContentType("application/msword");
  6. 6
  7. 7 // 在页面响应一个内容
  8. 8 PrintWriter out = response.getWriter();
  9. 9 out.println("HelloWorld...");
  10. 10 }

六、GenericServlet 实现 Servelt、ServletConfig接口

  1. public abstract class MyGenericServlet implements Servlet, ServletConfig {
  2.  
  3. // 以下方法为 Servlet 接口的方法
  4. @Override
  5. public void destroy() {
  6. }
  7.  
  8. @Override
  9. public ServletConfig getServletConfig() {
  10. return servletconfig;
  11. }
  12.  
  13. @Override
  14. public String getServletInfo() {
  15. return null;
  16. }
  17.  
  18. private ServletConfig servletconfig;
  19.  
  20. @Override
  21. public void init(ServletConfig arg0) throws ServletException {
  22. this.servletconfig = arg0;
  23. init();
  24. }
  25.  
  26. public void init() throws ServletException {
  27. }
  28.  
  29. @Override
  30. public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;
  31.  
  32. // 以下方法为 ServletConfig 接口的方法
  33. @Override
  34. public String getInitParameter(String arg0) {
  35. return servletconfig.getInitParameter(arg0);
  36. }
  37.  
  38. @Override
  39. public Enumeration<String> getInitParameterNames() {
  40. return servletconfig.getInitParameterNames();
  41. }
  42.  
  43. @Override
  44. public ServletContext getServletContext() {
  45. return servletconfig.getServletContext();
  46. }
  47.  
  48. @Override
  49. public String getServletName() {
  50. return servletconfig.getServletName();
  51. }
  52.  
  53. }

七、HttpServlet 继承 GenericServlet类

  1. public class MyHttpServlet extends MyGenericServlet {
  2.  
  3. @Override
  4. public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
  5.  
  6. if (arg0 instanceof HttpServletRequest) {
  7. HttpServletRequest request = (HttpServletRequest) arg0;
  8.  
  9. if (arg1 instanceof HttpServletResponse) {
  10. HttpServletResponse response = (HttpServletResponse) arg1;
  11.  
  12. service(request, response);
  13. }
  14. }
  15. }
  16.  
  17. public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18.  
  19. // 1.获取请求方式
  20. String method = request.getMethod();
  21.  
  22. // 2.根据请求方式再调用对应的处理方法
  23. if ("get".equalsIgnoreCase(method)) {
  24. doGet(request, response);
  25. } else if ("set".equalsIgnoreCase(method)) {
  26. doPost(request, response);
  27. }
  28. }
  29.  
  30. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31.  
  32. }
  33.  
  34. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  35.  
  36. }
  37.  
  38. }

JavaWeb笔记一、Servlet 详解的更多相关文章

  1. Servlet详解

    原文出处:http://blog.csdn.net/q547550831/article/details/50458456 Servlet详解 基本概述 Session在计算机中,尤其是在网络应用中, ...

  2. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...

  3. Java Servlet详解(体系结构+注解配置+生命周期)

    Java Servlet详解(注解配置+生命周期) 什么是Servlet : (Server applet)? 顾名思义:服务端的小程序 Servlet只是一个接口,定义了Java被浏览器访问到(To ...

  4. Hive笔记--sql语法详解及JavaAPI

    Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...

  5. Java Web(一) Servlet详解!!

    这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...

  6. Struts2学习笔记(二)——配置详解

    1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...

  7. (转)Java Web(一) Servlet详解!!

    https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...

  8. javaweb web.xml文件详解

    web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程.web.xml主要用来配置Filter.Listener.Servlet等 ...

  9. 算法笔记--sg函数详解及其模板

    算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...

  10. web开发(一)-Servlet详解

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6399262.html>,在此仅供学习参考之用. 一.什么 ...

随机推荐

  1. 剑指offer(纪念版)读书笔记【实时更新】

    C++ 1.STL的vector每次扩充容量,新容量是前一次的两倍. 2.32位机指针大小为4个字节,64位机指针大小为8个字节. 3.当数组作为函数参数传递时,数组会自动退化成同类型指针. 4. & ...

  2. 不可不知的socket和TCP连接过程

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  3. 【POJ】3090 Visible Lattice Points(欧拉函数)

    Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7705   Accepted: ...

  4. P3377

    题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆 ...

  5. An Introduction to Variational Methods (5.3)

    从之前的文章中,我们已经得到了所有需要求解的参数的优化分布的形式,分别为: ‍ 但是,我们从这些分布的表达式中(参见之前的文章),可以发现这些式子并不能够直接求解.这是因为各个参数之间相互耦合,从而导 ...

  6. js-注释代码习惯

    功能块代码 /** * xxxx */ 定义的函数或方法 /* xxxx */ 调用了某个函数或方法 // <--xxx

  7. IDL 字符串

    1.创建字符串 字符串和字符串数组通过赋值或函数方式来创建.在IDL字符串用" "或' '括起来表示. IDL> s1="abcdef" IDL> ...

  8. 使用beanstalkd实现定制化持续集成过程中pipeline

    持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中, ...

  9. 逆波兰表达式(RPN)算法简单实现

    算法分析: 一.预处理 给定任意四则运算的字符串表达式(中缀表达式),preDeal预先转化为对应的字符串数组,其目的在于将操作数和运算符分离. 例如给定四则运算内的中缀表达式: String inf ...

  10. DevOps之域名

    唠叨话 关于德语噢屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. 域名系统DNS(Domain Name System) 关于域名,知识与技能的层次(知道.理解.运用) ...