java servlet是和平台无关的服务器端组件,它运行在servlet容器(Tomcat服务器)中。
servlet容器负责servlet和客户的通信以及调用servlet的方法,servlet和客户的通信采用“请求/响应”的模式。
servlet可完成如下功能:
1.创建并返回基于客户请求的动态html页面。
2.创建可嵌入到现有html页面中的部分html页面
3.与其他服务器资源(如数据库。基于java的应用程序)进行通信。
创建一个servlet:
package com.sa.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("constructor");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service");
}
}
配置XML:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置和映射servlet -->
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- servlet的全类名-->
<servlet-class>com.sa.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体 的访问路径: / 代表当前web应用的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
浏览器运行:http://localhost:8090/MyLab2/hello
控制台输出:
如果servlet构造器不加public是话 会报错:
Class org.apache.catalina.core.DefaultInstanceManager can not access a member of class com.sa.servlet.HelloServlet with modifiers ""
多次刷新页面:
关闭servlet容器tomcat:
整个映射过程:
现在修改XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置和映射servlet -->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.sa.servlet.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- <servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping> -->
</web-app>
浏览器再次执行http://localhost:8090/MyLab2/hello:
可以看到,这个servlet随着容器的启动也被实例化。
通过第一个Servlet实例,我们可以得出以下几个结论:
1.servlet容器可以创建servlet,并调用servlet生命周期方法。
2.JSP,Filter,Listener,Tag..都是运行在Servlet容器内。
3.servelt生命周期相关方法(以下方法都由servlet容器调用):
1)类的构造器:只被调用一次,第一次请求servlet时,创建servlet实例,调用构造器,说明servlet是单实例的
2)init():只被调用一次,在创建好实例后,立即被调用,用于初始化当前servelt.
3)service():被多次调用,用于响应请求,每次请求都会调用该方法。
4)destroy():只被调用一次,在当前servlet所在的WEB应用被关闭时调用,用于释放当前servlet所占用的资源。
4.load-on-startup:指定servelt被创建的时间。若为负数则在第一次被请求时创建;若为整数或0,则在当前WEB应用被容器加载时创建。
数值越小,越早被创建。
5.一个servlet可以有多个映射:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置和映射servlet -->
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- servlet的全类名-->
<servlet-class>com.sa.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体 的访问路径: / 代表当前web应用的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体 的访问路径: / 代表当前web应用的根目录 -->
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
</web-app>
6.关于servlet-mapping:映射的URL中可以使用*通配符,但是只能有两种格式:
1) *.扩展名
2) /*
7. servletConfig封装了servlet的配置信息,并且可以获取serveltContext对象.
1)获取配置参数信息:
1.1)初始化参数:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置和映射servlet -->
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- servlet的全类名-->
<servlet-class>com.sa.servlet.HelloServlet</servlet-class>
<!-- 配置servlet的初始化参数。并且节点必须在load-on-startup之前 -->
<init-param>
<!-- 参数名 -->
<param-name>name</param-name>
<!-- 参数值 -->
<param-value>sasa</param-value>
</init-param>
<init-param>
<!-- 参数名 -->
<param-name>pwd</param-name>
<!-- 参数值 -->
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体 的访问路径: / 代表当前web应用的根目录 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
1.2)获取初始化参数的值:
1.2.1)getInitParameter(String name) 获取指定name的值
1.2.2) getInitParameterNames() 获取参数名组成的Enumeration.
package com.sa.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("constructor");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init");
String user=arg0.getInitParameter("name");
System.out.println("name:"+user);
Enumeration<String> enums=arg0.getInitParameterNames();
while(enums.hasMoreElements()){
System.out.println(enums.nextElement());
}
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service");
}
}
输出结果:
2)获取servletName:
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
// System.out.println("init");
// String user=arg0.getInitParameter("name");
// System.out.println("name:"+user);
// Enumeration<String> enums=arg0.getInitParameterNames();
// while(enums.hasMoreElements()){
// System.out.println(enums.nextElement());
// }
String servletName=arg0.getServletName();
System.out.println("servletName:"+servletName);
}
输出结果为:
3)获取servletContext(获取servelt上下文):
servelt引擎为每个web应用创建了对应的servletContext对象(它实际代表的是当前的web应用),
servletContext对象被包含在servletConfig对象中,调用servletConfig.getServletContext(),返回servletContext的引用。
由于一个web应用程序中的所有servelt都共享同一个servletContext对象,所以,servletContext对象又被称为
application对象(web应用程序对象)。
3.1)获取当前WEB应用的初始化参数。
3.1.1)设置初始化参数:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置当前WEB应用的参数 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>jdbcUrl</param-name>
<param-value>jdbc:mysql://db2</param-value>
</context-param>
<!-- 配置和映射servlet -->
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>helloServlet</servlet-name>
<!-- servlet的全类名-->
<servlet-class>com.sa.servlet.HelloServlet</servlet-class>
<!-- 配置servlet的初始化参数。并且节点必须在load-on-startup之前 -->
<init-param>
<!-- 参数名 -->
<param-name>name</param-name>
<!-- 参数值 -->
<param-value>sasa</param-value>
</init-param>
<init-param>
<!-- 参数名 -->
<param-name>pwd</param-name>
<!-- 参数值 -->
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->
<servlet-name>helloServlet</servlet-name>
<!-- 映射具体 的访问路径: / 代表当前web应用的根目录 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.1.2)获取初始化参数:
package com.sa.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("constructor");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
ServletContext context= arg0.getServletContext();
String value1=context.getInitParameter("driver");
System.out.println(value1);
String value2=context.getInitParameter("jdbcUrl");
System.out.println(value2);
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service");
}
}
获取输出结果:
3.2)xml文件里的WEB应用的参数 (context-param),servlet的初始化参数(init-param)区别:
init-param 是局部的初始化参数,只能在某一个servlet内使用。
context-param 是全局的初始化参数,能在整个web应用中使用。
3.3)获取WebRoot下的文件绝对路径:
3.3.1)在WebRoot下新建一个文件:
3.3.2)查询绝对路径:
package com.sa.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("constructor");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method
ServletContext context= arg0.getServletContext();
String realPaht=context.getRealPath("/note.txt");
System.out.println(realPaht);
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service");
}
}
3.3.3)查看结果:
可以看到,获取的是是tomcat服务器里的绝对路径。
3.4)获取当前WEB应用的名称:
package com.sa.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("constructor");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
ServletContext context=arg0.getServletContext();
String contextPath=context.getContextPath();
System.out.println(contextPath);
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service");
}
}
输出结果:
3.5)获取当前WEB应用中某一文件对应的输入流。
3.5.1)新建文件:
3.5.2) 获取流:
package com.sa.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("constructor");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
ClassLoader classLoader=getClass().getClassLoader();
InputStream is=classLoader.getResourceAsStream("jdbc.properties");
System.out.println("is:"+is);
ServletContext context=arg0.getServletContext();
InputStream is2=context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
System.out.println("is2:"+is2);
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service");
}
}
3.5.3)查看结果: