JavaWeb笔记一、Servlet 详解

时间:2022-10-24 19:01:09

一、创建一个 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接口

 public abstract class MyGenericServlet implements Servlet, ServletConfig {

     // 以下方法为 Servlet 接口的方法
@Override
public void destroy() {
} @Override
public ServletConfig getServletConfig() {
return servletconfig;
} @Override
public String getServletInfo() {
return null;
} private ServletConfig servletconfig; @Override
public void init(ServletConfig arg0) throws ServletException {
this.servletconfig = arg0;
init();
} public void init() throws ServletException {
} @Override
public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException; // 以下方法为 ServletConfig 接口的方法
@Override
public String getInitParameter(String arg0) {
return servletconfig.getInitParameter(arg0);
} @Override
public Enumeration<String> getInitParameterNames() {
return servletconfig.getInitParameterNames();
} @Override
public ServletContext getServletContext() {
return servletconfig.getServletContext();
} @Override
public String getServletName() {
return servletconfig.getServletName();
} }

七、HttpServlet 继承 GenericServlet类

 public class MyHttpServlet extends MyGenericServlet {

     @Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { if (arg0 instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest) arg0; if (arg1 instanceof HttpServletResponse) {
HttpServletResponse response = (HttpServletResponse) arg1; service(request, response);
}
}
} public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取请求方式
String method = request.getMethod(); // 2.根据请求方式再调用对应的处理方法
if ("get".equalsIgnoreCase(method)) {
doGet(request, response);
} else if ("set".equalsIgnoreCase(method)) {
doPost(request, response);
}
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }

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详解(体系结构&plus;注解配置&plus;生命周期)

    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&lpar;一&rpar; Servlet详解!!

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

  6. Struts2学习笔记&lpar;二&rpar;——配置详解

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

  7. (转)Java Web&lpar;一&rpar; Servlet详解!!

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

  8. javaweb web&period;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开发&lpar;一&rpar;-Servlet详解

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

随机推荐

  1. 18&period;有一个网页地址&comma; 比如PHP开发资源网主页&colon; http&colon;&sol;&sol;www&period;phpres&period;com&sol;index&period;html&comma;如何得到它的内容&quest;

    方法1(对于PHP5及更高版本): $readcontents = fopen("http://www.phpres.com/index.html", "rb" ...

  2. BZOJ 3176 Sort

    先一遍reverse+逆序对个数. 要开long long啊. #include<iostream> #include<cstdio> #include<cstring& ...

  3. IOS 开发一些常用的地址

    1.开发者中心 https://developer.apple.com/membercenter/index.action 2.itunesconnect https://itunesconnect. ...

  4. (算法)N皇后问题

    题目: 八皇后问题:在8 X 8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处于同一行,同一列或者同意对角线上,求出所有符合条件的摆法. 思路: 1.回溯法 数据结构: 由于8个皇后 ...

  5. 做电子商务的七个SEO技巧

    随着电子商务网站的迅速增加,为了适应不断增长的网络客户多样化需求.越来越多的人注意到,从网站上购买既节省了时间和金钱,因此电子商务社区越来越激烈.网站需要具有独特的设计风格和功能,而不是网站内容的不断 ...

  6. IdentityServer4授权类型&lpar;GrantType&rpar;对应的返回类型&lpar;ResponseType&rpar;

    授权类型(GrantyType) 返回类型(ResponseType) authorization_code code implicit token implicit id_token implici ...

  7. git安装,windows下git bash默认目录更改

    最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...

  8. 【BZOJ4820】&lbrack;SDOI2017&rsqb;硬币游戏(高斯消元)

    [BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...

  9. Mysql&lowbar;游标

    MySQL中的游标是一个十分重要的概念.游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.MySQL中的游标的语法 ...

  10. Javascript原型继承原理

    对于面向对象的基础语法在此我就不重复了,对面向对象不熟悉的朋友可以参看<使用面向对象的技术创建高级 Web 应用程序>一文. prototype与[[prototype]] 在有面象对象基 ...