Tomcat&Http&Serlvet

Tomcat&Http&Servlet&ServletConfig

Web开发简述

什么是JavaWeb开发

使用Java语言进行WEB的开发

软件架构

  • CS结构的软件

    • C/S架构:Client/Server 客户端/服务器。要求客户端电脑安装一个客户端程序。
    • 常见应用:QQ,迅雷,360,旺旺 等
      • 优点:
        • 用户体验好,效果炫
        • 对信息安全的控制较强
        • 应用服务器运行数据负荷较轻,部分计算功能在客户端完成。
      • 缺点:
        • 占用硬盘空间
        • 维护麻烦
        • 安装使用依赖其他条件
  • BS结构的软件

    • 常见应用:网银系统,淘宝,京东 12306 等
      • 优点:
        • 维护和升级简单,无缝升级。
        • 不用必须安装程序,操作系统内置了浏览器。
      • 缺点:
        • 动画效果受浏览器限制
        • 对信息安装控制较差。例如:网银就需要使用U盾,在浏览器端加密。
        • 应用服务器运行数据负荷较重。大部分计算都在服务器端,增加服务器压力。使用Ajax可以改善部分用户体验。

WEB通信

WEB采用B/S通信模式,通过超文本传送协议(HTTP, Hypertext transport protocol)进行通信。通过浏览器地址栏编写URL,向服务器发送一个请求,服务器端根据请求进行相应的处理,处理完成之后,会向浏览器作出一个响应,及将服务器端资源发送给浏览器。

WEB服务器

  • 服务器:
    • 硬件:其实就是一台电脑(这台电脑配置要求很高)。
    • 软件:需要在这台电脑上安装web服务器的软件。

常见的Web服务器

J2EE 企业级开发Java规范(13个)。标准规范包括:servlet、jsp、jdbc、xml、jta、javamail等。在java中规范就是接口。J2EE又称为JavaEE。
WEB服务器对JavaEE规范部分或全部支持(实现),也就是WEB服务器实现部分或全部接口。

常见的WEB服务器:

  • Tomcat:Apache组织提供的一个开源的免费的web服务器。满足EE的Servlet和JSP的规范。
  • WebSphere :IBM公司开发的一个收费的大型web服务器。满足了EE开发的所有规范。
  • WebLogic:BEA公司开发的一个收费的大型web服务器。满足了EE开发的所有规范。
  • IIS:应用在.NET平台上。
  • Apache :应用在PHP平台上。

Web开发中的资源

静态资源:指web页面中供人们浏览的数据始终是不变。比如:HTML、CSS、JS、图片、多媒体。
动态资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。比如:JSP/Servlet、ASP、PHP

URL 请求路径

URL (Uniform Resource Locator) ,统一资源定位符是对互联网上资源位置的一种表示,互联网上的每个文件都有一个唯一的URL。

  • 完整格式如下
协议://域名:端口号/资源位置?参数=值

* 协议,http、https、ftp等
* 域名,域名或IP地址,都可以访问WEB资源
* 端口号,程序必须使用端口号,才可以让另一个计算机访问。http协议的默认端:80
* 资源位置,用于描述WEB资源再服务器上的位置。
* 参数=值,浏览器和服务器交互传递的数据
  • 例如:
常见路径
http://www.itcast.cn:80/subject/javaeezly/index.html
百度搜索“传智播客”
https://www.baidu.com/s?cl=3&wd=%B4%AB%D6%C7%B2%A5%BF%CD

HTTP

3.1 Http简介

什么是Http协议

HTTP协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。用于定义WEB浏览器与WEB服务器之间交换数据的过程。

Http协议的作用及特点

HTTP协议的作用

  • HTTP协议是学习JavaWEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。

HTTP协议的特点

  • 基于请求/响应模型的协议。
    • 请求和响应必须成对;
    • 先有请求后有响应。
  • 简单快捷
    • 因为发送请求的时候只需要发送请求方式和请求路径即可
  • HTTP协议默认的端口:80
    • 例如:http://www.itheima.com:80

Http协议的版本

  • HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。
  • HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开。

Http协议的组成

HTTP请求协议、HTTP响应协议。

  • HTTP请求包括:请求行、请求头、请求体
  • HTTP响应包括:响应行、响应头、响应体

3.2 Http协议入门

准备工作

  • 创建页面,编写“form.html”,并提供两个表单,分别设置表单的提交方式为:get和post。将表单提交位置设置成#,表示提交到当前表单。
<form action="#" method="get">
    用户名:<input type="text" name="username" value="jack"/> <br/>
    密码:<input type="text" name="password" value="1234"/> <br/>
    <input type="submit" value="get提交"/>
</form>

<form action="#" method="post">
    用户名:<input type="text" name="username" value="jack"/> <br/>
    密码:<input type="text" name="password" value="1234"/> <br/>
    <input type="submit" value="post提交"/>
</form>

3.2.1 Http请求详解

HTTP请求格式:请求行、请求头、请求体。

我们提供两种请求方式抓包结果:(Chrome浏览器)

  • GET请求抓包数据

  • POST请求抓包数据

请求行
例如:POST /bj-ee/day13-http-tomcat/web/01-http/form.html HTTP/1.1
请求行必须在HTTP请求格式的第一行。
请求行格式:请求方式 资源路径 协议/版本
	请求方式:协议规定7种,常用两种:GET和POST
		GET请求:
			将请求参数追加在URL后面,不安全。例如:form.html?username=jack&username=1234
			URL长度限制GET请求方式的数据大小。
			没有请求体
		POST请求
			请求参数显示请求体处,较安全。
			请求数据大小没有显示。
		只有表单设置为method=”post”才是post请求.其他的都是get请求。
			常见GET请求:地址栏直接访问、<a href=””>、<img src=””> 等
			
请求头
例如:Host: localhost:8080
请求头从第二行开始,到第一个空行结束。及请求头和请求体之间存在一个空行。
请求头通常以键值对(key:value)方式传递数据。
	key为规范规定的固定值
	value 为key对应的取值,通常是一个值,可能是一组。
	
常见请求头描述
Referer浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链
Cookie与会话有关技术,用于存放浏览器缓存的cookie信息。
User-Agent浏览器通知服务器,客户端浏览器与操作系统相关信息
请求体
通常情况下,只有post请求方式才会使用到请求体,请求体中都是用户表单提交的数据,每一项数据都使用键值对key=value,多组值使用&相连。
	例如;username=jack&password=1234

3.2.2 Http响应详解

HTTP响应格式:响应行、响应头、响应体
响应行
例如:HTTP/1.1 200 OK
格式:协议/版本 状态码  状态码描述
	状态码:服务器与浏览器用于确定状态的固定数字号码
		200 :请求成功。
		302 :请求重定向。
		304 :请求资源没有改变,访问本地缓存。
		404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
		500 :服务器内部错误。通常程序抛异常。
		
响应头
响应头也是用的键值对key:value
服务器通过响应头来控制浏览器的行为,不同的头浏览器操作不同。
常见请求头描述
Location指定响应的路径,需要与状态码302配合使用,完成跳转。
Content-Disposition文件下载的时候使用。通过浏览器以下载方式解析正文
Set-Cookie与会话相关技术。服务器向浏览器写入cookie
Refresh定时刷新
响应体

响应体,就是服务器发送给浏览器的正文。

Tomcat服务器

2.1 什么是Tomcat

  • Tomcat就是一个web的服务器,用来发布web项目。
  • tomcat 目前存在很多版本,希望大家了解tomcat的版本,从而知道自己的创建的项目使用的是几版本规范,不同版本的规范技术可能不同。我们学习的JavaEE 7.0,Servlet规范3.1,tomcat至少使用8.5版本。
  • 官网地址:http://tomcat.apache.org
Tomcat版本Servlet版本JavaEE版本JDK版本
9.0.x4.08.08
8.5.x3.18.07,8
8.0.x3.17.07
7.0.x3.06.06 (1.6)
6.0.x2.55.05 (1.5)

2.2 Tomcat安装

步骤一:下载一个tomcat服务器软件.

https://tomcat.apache.org/download-80.cgi

步骤二:解压下载好的zip文件.

将解压后的文件copy到一个没有中文和空格的路径下即可.
例如:D:\develop\apache-tomcat-8.5.28

2.3 Tomcat启动和访问

步骤一:tomcat解压目录/bin/startup.bat 双击运行启动tomcat

步骤二:访问路径:http://localhost:8080/

2.4 Tomcat常见问题

JAVA_HOME的环境变量配置

Tomcat运行需要依赖Java环境,也就是说需要在电脑上安装了JDK之后才可以安装和启动Tomcat。因为Tomcat启动的时候需要使用JRE的环境。必须要配置JAVA_HOME环境变量,如果没有配置JAVA_HOME环境变量,那么服务器在启动的时候就会一闪然后关闭。

Tomcat端口号冲突的问题

当同一台计算机启动两个tomcat时,第二个tomcat将会在控制台抛异常,摘要信息如下:

严重: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"]
java.net.BindException: Address already in use: JVM_Bind <null>:8080
...
Caused by: java.net.BindException: Address already in use: JVM_Bind
...

控制台将出现大量异常信息,描述的是3个端口被占用(8080、8009、8005 )

通过 tomcat/conf/server.xml 修改端口号。

2.5 Tomcat目录结构

bin:脚本目录
	启动脚本:startup.bat
	停止脚本:shutdown.bat
conf:配置文件目录 (config /configuration)
	核心配置文件:server.xml
	用户权限配置文件:tomcat-users.xml
	所有web项目默认配置文件:web.xml
lib:依赖库,tomcat和web项目中需要使用的jar包
logs:日志文件.
	localhost_access_log.*.txt tomcat记录用户访问信息,星*表示时间。
	例如:localhost_access_log.2018-07-07.txt
temp:临时文件目录,文件夹内内容可以任意删除。
webapps:默认情况下发布WEB项目所存放的目录。
work:tomcat处理JSP的工作目录。

2.6 web项目目录结构(重要)

在JavaEE规范中,WEB项目存在一定的目录结构,具体结构如下:

项目名称  (webapps 文件夹)
            |-----静态资源.HTML,CSS,JS
            |-----WEB-INF   (不能直接通过浏览器进行访问)
                       |----web.xml  当前WEB项目的核心配置,Servlet2.5必须有,3.0可省略。
                       |----lib		 当前WEB项目所需要的第三方的jar的存放位置。
                       |----classes  Java源码编译后生成class文件存放的位置。

2.7 Tomcat的项目发布方式

  • 直接将项目复制到tomcat/webapps下
  1. 将项目复制到tomcat/webapps中
  2. 启动服务器
  3. 访问项目
http://localhost:8080/aaa/index.html

2.8 IDEA 中集成 Tomcat

idea中配置Tomcat

  • 步骤1:首先打开idea开发工具,然后点击Run菜单,选择Edit Configurations...菜单,打开Run/Debug Configurations对话框
  • 步骤2:添加服务器,点击对话框左上角的加号,选择Tomcat Server,再选择Local子菜单,
    找到右上角Configure… 关联到Tomcat安装目录再按图操作

VM options填写内容:-Xms128m -Xmx256m -XX:PermSize=128m -XX:MaxPermSize=256m

idea中发布web项目

创建web项目

创建Module,选择JavaWeb应用程序,选择版本为JavaEE 7

  • 步骤1:在idea中New Module/Web Application

  • 步骤2:创建模块

发布web项目
  • 步骤1:配置应用访问路径

    首先打开idea开发工具,然后点击Run菜单,选择Edit Configurations...菜单,打开Run/Debug Configurations对话框

  • 步骤2 启动Tomcat

  • 步骤3:访问项目

http://localhost:8080/day01

Servlet

4.1 servlet的概述

什么是servlet

  • Servlet其实就一个运行在web服务器上的小的Java程序,用于处理从web客户端发送的请求,并且对请求作出响应。

使用Servlet

  • 编写一个Java类实现Servlet的接口
  • 配置Servlet

4.2 servlet的入门

步骤一:创建包和类

package com.itheima.servlet.demo1;

public class HelloServlet {
    
}

步骤二:实现servlet的接口

ackage com.itheima.servlet.demo1;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet的入门程序
 */
public class HelloServlet implements Servlet{
	@Override
	/**
	 * 用来处理客户的请求,并且对请求作出响应的方法
	 */
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		// 向页面输出一个HelloServlet字符串:
		resp.getWriter().println("Hello Servlet...");
	}
	
	//省略剩下方法,采用默认实现
	
}

步骤三:在web.xml中配置这个类

<servlet>
  <servlet-name>helloServlet</servlet-name>
  <servlet-class>com.itheima.web.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>helloServlet</servlet-name>
  <url-pattern>/hello</url-pattern>
</servlet-mapping>

步骤四:访问servlet

http://localhost:8080/day01/hello

4.3 servlet的执行流程详解

4.4 servlet生命周期

Servlet生命周期:Servlet对象从创建到销毁的过程。

  • Servlet何时被创建又是何时被销毁的?

Servlet中有init,service,destroy方法,这几个方法称为是Servlet生命周期相关的方法。

  • Servlet是在第一次被访问的时候会被实例化,只要Servlet一被实例化那么Servlet中的init方法就会执行(init只会执行一次)。
  • 任何一次从客户端发送来的请求,那么Servlet中的service方法就会执行(在service方法的内部根据请求的方式不同调用不同doXXX方法)。
  • 当Servlet从服务器中移除或者服务器关闭的时候Servlet对象被销毁,里面的destroy方法就会执行,然后垃圾回收就会将其回收掉。
public class ServletDemo1 implements Servlet{

    @Override
    /**
	 * Servlet对象被实例化的时候init方法就会执行,而且只执行一次。(Servlet是单例的)
	 */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("ServletDemo1初始化了......");
    }

    @Override
    /**
	 * service方法:任何一次请求都会执行service方法。可以执行多次。
	 */
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("ServletDemo1执行了......");
    }

    @Override
    /**
	 * Servlet从服务器中移除或者服务器关闭的时候销毁Servlet。执行一次。
	 */
    public void destroy() {
        System.out.println("ServletDemo1被销毁了.......");
    }
}

4.5 Servlet的启动时加载(了解)

为什么使用启动时加载

Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟)。第一个用户第一次访问这个Servlet的时候,需要等待3秒钟。如何使第一个用户在第一次访问的时候不需要花费这么长时间?

什么是启动时加载

Servlet默认是在第一次访问的时候创建的对象,现在通过一个配置将Servlet的实例化的过程放在服务器启动的时候(让服务器启动的时候创建Servlet的对象)。如果现在这样做那么之前花费的时间就会在服务器启动的时候一起花费掉了。对于用户来讲就不需要额外花费这个时间。

配置完成启动时加载

<servlet>
    <servlet-name>ServletDemo2</servlet-name>
    <servlet-class>com.itheima.servlet.demo1.ServletDemo2</servlet-class>
	<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo2</servlet-name>
    <url-pattern>/ServletDemo2</url-pattern>
</servlet-mapping>


4.6 serlvet的访问路径配置

url-pattern的配置

url-pattern配置方式共有三种:

  1. 完全路径匹配,也称精确匹配 :以 / 开始
    例如: /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
<servlet>
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>com.itheima.a_servlet.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <!-- 完全路径匹配 -->
    <url-pattern>/ServletDemo4</url-pattern>
</servlet-mapping>

  1. 目录匹配 :以 / 开始 需要以 * 结束.
    例如: /* (所有) ,/aaa/* (aaa目录下的所有) ,/aaa/bbb/*
<servlet>
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>com.itheima.a_servlet.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <!-- 完全路径匹配 -->
    <!-- <url-pattern>/ServletDemo4</url-pattern> -->
    <!-- 目录匹配 -->
    <url-pattern>/aaa/*</url-pattern>
</servlet-mapping>

  1. 扩展名匹配 :以 * 开始的,例如: *.do , *.action 、*.jsp 。

    错误的写法 :以 / 开始 , 例如,/*.do

<servlet>
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>com.itheima.a_servlet.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <!-- 完全路径匹配 -->
    <!-- <url-pattern>/ServletDemo4</url-pattern> -->
    <!-- 目录匹配 -->
    <!-- <url-pattern>/aaa/*</url-pattern> -->
    <!-- 扩展名匹配 -->
    <url-pattern>*.abc</url-pattern>
</servlet-mapping>

访问的优先级

tomcat获得匹配路径时,访问优先级顺序:完全路径匹配 > 目录匹配 > 扩展名匹配

注意:开发中servlet配置路径选择精确匹配

4.7 适用于处理HTTP协议的Servlet的实现关系

基本的实现关系

Servlet接口			
	|
	|
GenericServlet类		通用的Servlet,是一个与协议无关的Servlet
	|
	|
HttpServlet类		Http专用的Servlet

关系实现的概述

SUN设计之初,是有野心,以后的互联网不仅仅只使用http协议,可以通过GenericServlet实现。HttpServlet是一个与协议相关的Servlet是专门用来处理HTTP协议的请求。通常编写一个Servlet一般都会让这个Servlet继承HttpServlet重写service方法。

  • 在service方法内部根据请求方式不同执行不同的doXXX的方法(get请求执行doGet方法,如果是post请求就会执行doPost方法)。
  • 所以往往继承了HttpServlet之后不需要重写service方法,只需要重写doGet和doPost方法即可。往往请求要处理的内容的代码都是一致的,所以需要让doGet和doPost相互调用可以简化编程。

继承HttpServlet的代码实现

步骤1 :创建类,继承MyServlet,复写doGet方法

package com.itheima.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("get请求将执行");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req,resp);
    }
}


步骤2:编写配置文件

 <!--配置servlet-->
    <servlet>
        <!--配置servlet名称-->
        <servlet-name>myServlet</servlet-name>
        <!--配置servlet类的全路径-->
        <servlet-class>com.itheima.web.MyServlet</servlet-class>
    </servlet>
    <!--配置servlet映射关系-->
    <servlet-mapping>
        <!--配置关联的servlet名称-->
        <servlet-name>myServlet</servlet-name>
        <!--配置 访问路径-->
        <url-pattern>/my</url-pattern>
    </servlet-mapping>

步骤3:浏览器访问

在浏览器地址栏输入:http://localhost:8080/day13/hello

  • 浏览器显示空白页面

  • 控制打印信息

4.8 request接收请求参数

Request接收请求参数的概述

请求参数

方法名描述
String getParameter(String name)获得指定参数名对应的值。如果没有返回null,如果只有多个获得第一个。 例如:username=jack

Request接收请求参数入门

  1. 编写form.html表单,提供表单字段:username、password 以post方式提交
<form action="./demo01ParamServlet" method="post">
    用户名:<input type="text" name="username" value="jack" /> <br/>
    密码:<input type="text" name="password" value="1234" /> <br/>
    <input type="submit" value="post提交" />
</form>

  1. 编写Servlet实现类,使用对应方法获得请求参数
public class ParamServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //1 使用参数名获得一个值
        //1.1 获得用户名
        String username = request.getParameter("username");
        //1.2 获得密码
        String password = request.getParameter("password");
        System.out.println(username  + " : " + password);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /* 开发中我们发现,doPost和doGet两个方法编写的内容相同
         * 所以常使用一个调用另一个,此处我们使用doPost调用doGet
         * 所有的内容之后都编写doGet方法中
         */
        doGet(request, response);
    }
}

  1. 编写Servlet配置文件
<servlet>
    <servlet-name>paramServlet</servlet-name>
    <servlet-class>com.itheima.web.ParamServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>paramServlet</servlet-name>
    <url-pattern>/paramServlet</url-pattern>
</servlet-mapping>

  1. 测试,访问“http://localhost:8080/day01/form.html”,并提交表单。控制台显示

4.9 案例 使用servlet完成一个用户登录的案例

案例需求:

在网站的首页上,登录的链接,点击登录的链接,可以跳转到登录的页面.在登录的页面中输入用户名和密码点击登录的案例.完成登录的功能.

案例分析:

代码实现

  • html页面代码
<form action="./userServlet" method="post">
    用户名:<input type="text" name="username" value="jack" /> <br/>
    密码:<input type="text" name="password" value="123456" /> <br/>
    <input type="submit" value="提交" />
</form>

  • xml配置文件
<servlet>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>com.itheima.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/userServlet</url-pattern>
</servlet-mapping>

  • servlet代码
public class UserServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       {
        // 1.接收表单提交的参数.
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 2.调用业务层处理数据.
        UserService userService = new UserService();

       boolean isLogin = userService.login(username,password);
        // 4.根据处理结果显示信息(页面跳转).
        if(isLogin){
          // 登录成功
            response.getWriter().println("Login Success...");
            
        }else{
            // 登录失败
            response.getWriter().println("Login Fail...");
        }
    }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

  • service 代码
public boolean login(String username, String password) {
        // 调用DAO完成对数据库查询的操作:
        UserDao userDao = new UserDao();

        try {
            User user= userDao.login(username,password);

            System.out.println(user);
            if(user==null){
                return false;
            }else{
                return true;
            }
        } catch (SQLException e) {
            return false;
        }
    }

  • dao代码
public class UserDao {

    public User login(String username, String password) throws SQLException {

        QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

        String sql = "select * from user where username =? and password = ?";

        return qr.query(sql,new BeanHandler<>(User.class),username,password);

    }
}

第五章 ServletConfig对象

5.1 概述

ServletConfig用来获得Servlet的相关的配置的对象。

在Servlet 的配置文件中,可以用一个或多个标签为servlet配置一些初始化参数。

当servlet配置了初始化参数之后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给Servlet。进而,程序员通过Servlet对象得到当前servlet的初始化参数信息。

5.2 API

String getServletName()  -- 获取当前Servlet在web.xml中配置的名字
String getInitParameter(String name) -- 获取当前Servlet指定名称的初始化参数的值
Enumeration getInitParameterNames()  -- 获取当前Servlet所有初始化参数的名字组成的枚举
ServletContext getServletContext()  -- 获取代表当前web应用的ServletContext对象
  • 获得Servlet的初始化参数

  • 获得ServletContext对象

  • 获得Servlet的名称

5.3 演示API

  • 配置初始化参数

    新建一个名为ServletConfigTest的Servlet,然后在web.xml中的标签下,通过标签为这个servlet配置两个初始化参数:

      <servlet>
            <servlet-name>ServletConfigTest</servlet-name>
            <servlet-class>com.vae.servlet.ServletConfigTest</servlet-class>
            <init-param>
                <param-name>name1</param-name>
                <param-value>value1</param-value>
            </init-param>
            <init-param>
                <param-name>encode</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </servlet>
    

  • 然后在代码中获取上面的两个参数。代码实现如下:

package com.vae.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletConfigTest extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ServletConfig config = this.getServletConfig();  //拿到init方法中的ServletConfig对象

        // --获取当前Servlet 在web.xml中配置的名称(用的不多)
         String sName = config.getServletName();
         System.out.println("当前Servlet 在web.xml中配置的名称:"+sName);
         
        // --获取当前Servlet中配置的初始化参数(只能获取一个)经常用到
        // String value = config.getInitParameter("name2");
        // System.out.println(value);

        // --获取当前Servlet中配置的初始化参数(全部获取)经常用到
         Enumeration enumration = config.getInitParameterNames();
         while(enumration.hasMoreElements()){
         String name = (String) enumration.nextElement();
         String value = config.getInitParameter(name);
         System.out.println(name+":"+value);
         }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值