JavaWeb笔记Servlet 详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb笔记Servlet 详解相关的知识,希望对你有一定的参考价值。

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

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

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

2、配置和映射 Servlet

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

 

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

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

 

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

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

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

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

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

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

 

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

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

 

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

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

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

 六、GenericServlet 实现 Servelt、ServletConfig接口

技术分享View Code

 

 七、HttpServlet 继承 GenericServlet类

技术分享View Code

 

以上是关于JavaWeb笔记Servlet 详解的主要内容,如果未能解决你的问题,请参考以下文章

JAVAWEB学习笔记13_servlet

JavaWeb项目——基于Servlet实现的在线OJ平台 (项目问答+代码详解)

JavaWeb学习笔记-05初识servlet

javaweb笔记五

JavaWeb详解(第一篇)之Servlet基础简介

JavaWeb学习笔记之Servlet