0、Servlet基本概念
Servlet是sun提供的一种动态web资源开发技术。本质上就是一段java小程序,可以将Servlet加入到Servlet容器中运行。
- Servlet容器:能够运行Servlet的环境就叫做Servlet容器. 比如——tomcat
- Web容器:能够运行web应用的环境就叫做web容器 比如——tomcat
Servlet的基本运行方式:
Servlet没有main()方法。它们受控于另一个Java应用(例如Tomcat),这个Java应用称为Sevlet容器,Tomcat就是这样一个容器。通常我们把Tomcat也叫做Servlet容器。
Servlet是一个java小程序,需要放在Servlet容器(即 Tomcat中)中才能被正确运行!!!
1、创建一个Servlet
第一步、继承Servlet接口
如下为创建servlet的简单步骤:
注意servlet是一个java接口,所以是写在src资源文件夹下的:
注意这里在src文件下要先创建一个包
创建完包之后再创建一个java类,在创建页面中选择继承自servlet接口,
- 其中service(···)是最关键的方法,在里面写服务器要处理的逻辑
第二步、配置web.xml
在项目文件中找到web.xml的路径,在里面进行如下配置:
映射Servlet:
- 这一步就是相当于把第一步继承接口的类的信息告诉这个配置文件web.xml
绑定路径:
第三步、测试
注意这里最后是 "/demo",即我们在绑定路径的时候写的:
![](http://img.e-com-net.com/image/info10/f82e91119f5b444cb95379f85af4b03f.jpg)
然后每一次我们访问这个地址,都会执行一次我们继承的service(···)
方法
运行逻辑分析:
在背后的运行逻辑:进入这个页面之后,先去web.xml的绑定路径配置中找有没有"/demo"这个路径,有,然后找跟绑定路径中的servlet-name标签相同值的映射Servlet步骤中出现的servlet-name,然后再找到我们实现Servlet接口的类,然后再执行service(···)
方法。
这整个过程访问的是servlet!!
2、Servlet背后原理分析
如上是我们访问Servlet的结果
1、快速创建Servlet
我们可以在项目文件的src下直接创建继承HttpServlet
的Servlet
- Tip:
HttpServlet
相当于是实现了一些基本操作的Servlet的实现类,我们在它基础上进行开发更加方便
- 注意这里创建页面2中他是可以直接对
url-mappings
进行配置的,免去了我们手动配置web.xml的麻烦
这里可以把继承自父类的创建方法前面的勾去掉,这里最重要的两个方法就是
doPost()
和
doGet()
,这两个方法实际调用的实际上也是Servlet的
service()
方法
- 前端向后台发送请求,最重要的两个方式就是Post和Get方法
这里创建成功之后,就会自动在WEB-INF下的web.xml中写入配置信息(如果之前自己在web.xml中手动配置过,新的配置信息是不会覆盖原来的配置信息系的)
2、Servlet接口与GenericServlet抽象类、HttpServlet抽象类之间的关系
Servlet接口介绍:
生命周期:
-
init(···)
:在Servlet第一次执行时(服务器被开启不会执行Servlet!只有访问准确路径才会)会被服务器调用 -
service(···)
:在Servlet每一次执行时都会被服务器调用 -
destroy(···)
:在服务器被正常关闭时或者项目被移除的时候被服务器调用 - 总结:Servlet是单实例对象,多线程(每一次访问都会新出一个线程(不是实例)然后执行
service()
)
如下是GenericServlet抽象类、HttpServlet抽象类与Servlet接口的简单描述:
-
GenericServlet
抽象类实现了Servlet接口,HttpServlet
抽象类继承自GenericServlet抽象类
Tip:
这里在url-pattern
中的值使用通配符是为了支持更多的路径,也就是说用户在浏览器地址栏中输入多种不同的路径, 只要满足这个通配符格式,那么执行的就是同一个Servlet程序
3、load-on-startup的配置
这个也是在web.xml中进行配置,主要作用是在服务器启动的时候就可以让servlet启动(正常情况是访问对应对应路径的时候才会启动servlet)
这里给值为正整数时(数字越小,优先级越高),当服务器启动的时候就会被自动启动
- 关于路径:在web项目中引用其他文件的时候(比如css文件),这个时候最好使用绝对路径(这个绝对路径不是说从C盘根目录开始写,而是从
路径
这个项目名day09的根目录开始写),这样我们在移动这个写代码的文件的时候,不会因为改了路径而找不到引用的文件。
4、ServletConfig
- 作用:
转自:https://www.cnblogs.com/smyhvae/p/4140877.html
ServletConfig:代表当前Servlet在web.xml中的配置信息
-
String getServletName()
:获取当前Servlet在web.xml中配置的名字 -
String getInitParameter(String name)
:获取当前Servlet指定名称的初始化参数的值 -
Enumeration getInitParameterNames()
:获取当前Servlet所有初始化参数的名字组成的枚举,是名字
,不是值 -
ServletContext getServletContext()
:获取代表当前web应用的ServletContext对象
在Servlet的配置文件中,可以使用一个或多个
标签为servlet配置一些初始化参数。
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig
对象中,并在调用servlet的init()
时,将ServletConfig
对象传递给servlet。进而,程序员通过ServletConfig
对象就可以得到当前servlet的初始化参数信息。
这样做的好处是:可以将数据库信息、编码方式等配置信息放在web.xml中,如果以后数据库的用户名、密码改变了,则直接很方便地修改web.xml就行了,避免了直接修改源代码的麻烦(不用修改源码的话,不需要重新编译)。
- 代码举例:
新建一个名为ServletConfigTest
的Servlet,然后在web.xml中的
标签下,通过
标签为这个servlet配置两个初始化参数(注意,一个
标签代表一个参数):
ServletConfigTest
com.vae.servlet.ServletConfigTest
name1
value1
encode
utf-8
然后在代码中获取上面的两个参数。代码实现如下:
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);
}
}
核心代码是第17行,通过this.getServletConfig()
方法拿到init方法中的ServletConfig
对象,然后获取配置信息。
运行程序,后台打印日志如下:
5、ServletContext
讲完ServletConfig,我们接着看ServletContext,ServletContext代表当前web应用。
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
通过this.getServletContext();
可以直接获得ServletContext对象
- 一个WEB应用中的所有Servlet共享同一个ServletContext对象
- ServletContext对象的作用:Servlet对象之间可以通过ServletContext对象来实现相互之间的通讯。
- ServletContext对象通常也被称之为context域对象。
下面开始正式讲ServletContext的应用:
应用一:在整个web应用中共享数据
- 作用范围:整个web应用范围内共享数据
- 生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移除出容器或服务器关闭,随着web应用的销毁域销毁。
代码举例 ServletTest01.java:
public class ServletTest01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.setAttribute("name", "smyhvae");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ServletTest02.java:
public class ServletTest02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
String myName = (String) context.getAttribute("name");
System.out.println(myName);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ServlryContext中常用的方法有:
void setAttribute(String,Object);
Object getAttribute(String);
void removeAttribute(String);
应用二:获取WEB应用的初始化参数
我们使用
标签来给一个servlet设置初始化配置信息的时候,注意这个配置信息是只对这个servlet生效的(这个
标签也是被包在某一个
标签中的),这里的参数的获取和ServletConfig的使用几乎相同,代码如下:
ServletConfigTest
com.vae.servlet.ServletConfigTest
name1
value1
encode
utf-8
这时如果我们使用
标签(与Servlet标签并列)为整个Web应用配置属性的话,那所有的Servlet就都能访问里面的参数了。
示例:在web.xml中加入初始化配置信息:
在代码中获取:
public class ServletTest03 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext(); // 得到上下文对象
// 获取单个的Context里面的初始化参数
String value1 = context.getInitParameter("username");
String value2 = context.getInitParameter("password");
System.out.println(value1 + ";" + value2);
System.out.println();
// 一次性获取Context里所有的初始化参数
Enumeration enumeration = context.getInitParameterNames();
while (enumeration.hasMoreElements()) {
String name = (String) enumeration.nextElement();
String value = context.getInitParameter(name);
System.out.println(name + ";" + value);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
通过context.getInitParameter()
方法获得初始化参数。
- 请求参数
parameter
--- 浏览器发送过来的请求中的参数信息 - 初始化参数
initparameter
--- 在web.xml中为Servlet或ServletContext配置的初始化时带有的基本参数 - 域属性
attribute
--- 四大作用域中存取的键值对