Servlet学习笔记(二)之Servlet路径映射配置、Servlet接口、ServletConfig、ServletContext
2016-11-16 20:34
633 查看
Servlet路径映射配置
要使Servlet对象正常的运行,需要进行适当的配置,以告诉Web容器哪个请求调用哪个Servlet对象处理,对Servlet起到一个注册的作用。Servlet的配置信息包含在web.xml文件中,主要通过两步进行配置:
(1)声明Servlet对象
通过< servlet>标签声明一个Servlet对象,在此标签下包含两个主要子元素,为别为< servlet-name>与< servlet-class>,其中< servlet-name>用于指定Servlet的名称,该名称可以是自定义的名称,< servlet-class>用于指定Servlet对象的完整位置,包含Servlet对象的包名和类名。
(2)映射Servlet
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把Servlet程序映射到一个URL地址上,在web.xml文件中声明Servlet对象后,需要映射Servlet的URL。该操作是使用< servlet-mapping>标签进行配置。< servlet-mapping>标签包含两个子元素,分别为< servlet-name>与< url-pattern>。·,其中< servlet-name>元素与< servlet>标签中的< servlet-name>元素相对应,不可以随意命名。< url-pattern>用于映射访问URL。
例如:
其中访问URL的相对路径为“/servlet/MyServlet”
(3)同一个Servlet可以被映射到多个URL上,即多个 < servlet-mapping>元素的< servlet-name>子元素的设置值可以是同一个Servlet的注册名,如下修改就为一个Servlet指定了两个url-pattern,通过这两个URL都可以访问同一个Servlet程序。
URL 配置格式
完全路径匹配 (以/开始 ) 例如:/hello、 /init (注意:如果没有“/”,会发生404,当前工程没有被正确发布,访问该工程所有静态资源、动态资源 发生404 —– 工程启动时出错了)
目录匹配 (以/开始) 例如:/* 、/abc/* (代表abc目录下的所有资源,即“/adc/hjhsdfkj”也可以访问)
/ 代表网站根目录
扩展名 (不能以/开始) 例如:* .do(即“dhjhs/dsajh/dsjkdn.do”,只要是以.do结尾的即可访问) 、* .action
典型错误 /*.do
优先级:完全匹配>目录匹配 > 扩展名匹配
路径问题
相对路径:相对当前网页地址
绝对路径 解决相对路径,会根据当前地址改变问题。
Servlet接口
init方法
在Servlet的配置文件中,可以使用一个或者多个< init-param>标签为servlet配置一些初始化参数。
ServletConfig
在Servlet程序中通过ServletConfig对象*(ServletConfig接口位于javax.servlet包中,它封装了Servlet的配置信息,在Servlet初始化期间被传递) 获得cast对应数据
ServletConfig对象定义了4个方法:
getInitParameter —— 通过name获得value
getInitParameterNames —– 获得所有name
思考 :如何在doGet 或 doPost 方法中 获得 Servlet初始化参数
将ServletConfig对象保存实例成员变量
GenericServlet 已经将ServletConfig 保存成员变量 —– 在子类中通过 getServletConfig方法 获得 初始化参数
结论:子类Servlet不需要覆盖 init(ServletConfig) , 只需要通过GenericServlet中 getServletConfig() 获得ServletConfig对象
因此,假如在doGet方法中获得Servlet初始化参数,可以:
应用:在init-param 指定配置文件位置和名称,配置Servlet随服务器启动创建 load-on-startup
ServletConfig 配置初始化数据,只能在配置Servlet获得(当前的),其它Servlet无法获得 —– 每个Servlet程序都对应一个ServletConfig对象,并且是独立的,不可以互相使用(其获得自己已配置的初始化参数)
ServletContext
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象维护了ServletContext对象的引用,在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
一个WEB应用中的所有servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象 。
应用:
1、 获得整个web应用初始化参数
2、 实现全局数据共享(例如统计访问次数)
3、 实现服务器端转发功能
4、 读取web工程资源文件
1、获取WEB应用的初始化参数 和 ServletConfig 对象不同
* ServletConfig对象 配置参数,只对配置Servlet有效,如果配置参数,所有Servlet都可以访问 通过ServletContext,通过标签< context-param>(注意:不同于初始化参数配置,标签不嵌套在< servlet>标签中)实现
ServletConfig与ServletContext的区别:
2、通过ServletContext 在多个Servlet间 共享数据
在ServletContext中 保存站点访问次数 ,每当一个用户访问站点,将访问次数+1
在CountServlet 初始化过程中,向ServletContext 保存访问次数 —- 0 ————–> ServletContext setAttribute
每次访问次数 +1 — 数据存放ServletContext中 —- 所有Servlet都可以获得该数据
在ServletContext中保存数据,所有Servlet都可以访问
3、通过ServletContext 完成服务器程序转发
什么是转发? 转发和重定向区别 ?
使用转发还是重定向? —- 转发性能好于重定向,请求次数少
4.缺省Servlet
缺省Servlet 功能:处理其他Servlet都不处理请求
tomcat/conf/web.xml org.apache.catalina.servlets.DefaultServlet 作为缺省Servlet
当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet
要使Servlet对象正常的运行,需要进行适当的配置,以告诉Web容器哪个请求调用哪个Servlet对象处理,对Servlet起到一个注册的作用。Servlet的配置信息包含在web.xml文件中,主要通过两步进行配置:
(1)声明Servlet对象
通过< servlet>标签声明一个Servlet对象,在此标签下包含两个主要子元素,为别为< servlet-name>与< servlet-class>,其中< servlet-name>用于指定Servlet的名称,该名称可以是自定义的名称,< servlet-class>用于指定Servlet对象的完整位置,包含Servlet对象的包名和类名。
(2)映射Servlet
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把Servlet程序映射到一个URL地址上,在web.xml文件中声明Servlet对象后,需要映射Servlet的URL。该操作是使用< servlet-mapping>标签进行配置。< servlet-mapping>标签包含两个子元素,分别为< servlet-name>与< url-pattern>。·,其中< servlet-name>元素与< servlet>标签中的< servlet-name>元素相对应,不可以随意命名。< url-pattern>用于映射访问URL。
例如:
public class MyServlet extends HttpServlet { private static final long serialVersionUID = 3563565034243126713L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("GBK"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println(" <HEAD><TITLE>Servlet实例</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" Servlet实例: "); out.print(this.getClass()); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } }
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/servlet/MyServlet</url-pattern> </servlet-mapping>
其中访问URL的相对路径为“/servlet/MyServlet”
(3)同一个Servlet可以被映射到多个URL上,即多个 < servlet-mapping>元素的< servlet-name>子元素的设置值可以是同一个Servlet的注册名,如下修改就为一个Servlet指定了两个url-pattern,通过这两个URL都可以访问同一个Servlet程序。
<servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/servlet/MyServlet</url-pattern> <url-pattern>/servlet/MyServlet2</url-pattern> </servlet-mapping>
URL 配置格式
完全路径匹配 (以/开始 ) 例如:/hello、 /init (注意:如果没有“/”,会发生404,当前工程没有被正确发布,访问该工程所有静态资源、动态资源 发生404 —– 工程启动时出错了)
目录匹配 (以/开始) 例如:/* 、/abc/* (代表abc目录下的所有资源,即“/adc/hjhsdfkj”也可以访问)
/ 代表网站根目录
扩展名 (不能以/开始) 例如:* .do(即“dhjhs/dsajh/dsjkdn.do”,只要是以.do结尾的即可访问) 、* .action
典型错误 /*.do
优先级:完全匹配>目录匹配 > 扩展名匹配
路径问题
相对路径:相对当前网页地址
绝对路径 解决相对路径,会根据当前地址改变问题。
Servlet接口
public void init(ServletConfig config);//Servlet实例化后,Servlet容器调用该方法来完成初始化 public void service(ServletRequest request,ServletResponse response);//用于处理客户端请求 public void destory();//当Servlet对象从容器移除时,容器调用该方法,释放资源 public ServletConfig getServletConfig();//获取Servlet对象的配置参数,返回ServletConfig对象 public String getServletInfo();//返回Servlet的信息,是纯文本的字符串,如作者、版本
init方法
在Servlet的配置文件中,可以使用一个或者多个< init-param>标签为servlet配置一些初始化参数。
<servlet> <servlet-name>ConfigServlet</servlet-name> <servlet-class>cn.servlet.ConfigServlet</servlet-class> <!-- 通过 init-param --> <init-param> <param-name>cast</param-name> <param-value>something</param-value> </init-param> <init-param> <param-name>address</param-name> <param-value>软件园</param-value> </init-param> </servlet>
ServletConfig
在Servlet程序中通过ServletConfig对象*(ServletConfig接口位于javax.servlet包中,它封装了Servlet的配置信息,在Servlet初始化期间被传递) 获得cast对应数据
ServletConfig对象定义了4个方法:
public String getInitParameter(String name);//返回名称为name的初始化参数列表 public Enumeration getInitParameterNames();//获得所有初始化参数名的枚举集合 public ServletContext getServletContext();//获取Servlet上下文对象 public String getServletName();//返回Servlet对象名
getInitParameter —— 通过name获得value
System.out.println(config.getInitParameter("cast"));
getInitParameterNames —– 获得所有name
Enumeration<String> names = config.getInitParameterNames();
思考 :如何在doGet 或 doPost 方法中 获得 Servlet初始化参数
将ServletConfig对象保存实例成员变量
GenericServlet 已经将ServletConfig 保存成员变量 —– 在子类中通过 getServletConfig方法 获得 初始化参数
结论:子类Servlet不需要覆盖 init(ServletConfig) , 只需要通过GenericServlet中 getServletConfig() 获得ServletConfig对象
因此,假如在doGet方法中获得Servlet初始化参数,可以:
System.out.println(getServletConfig().getInitParameter("cast"));
应用:在init-param 指定配置文件位置和名称,配置Servlet随服务器启动创建 load-on-startup
ServletConfig 配置初始化数据,只能在配置Servlet获得(当前的),其它Servlet无法获得 —– 每个Servlet程序都对应一个ServletConfig对象,并且是独立的,不可以互相使用(其获得自己已配置的初始化参数)
ServletContext
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象维护了ServletContext对象的引用,在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
一个WEB应用中的所有servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象 。
应用:
1、 获得整个web应用初始化参数
2、 实现全局数据共享(例如统计访问次数)
3、 实现服务器端转发功能
4、 读取web工程资源文件
1、获取WEB应用的初始化参数 和 ServletConfig 对象不同
* ServletConfig对象 配置参数,只对配置Servlet有效,如果配置参数,所有Servlet都可以访问 通过ServletContext,通过标签< context-param>(注意:不同于初始化参数配置,标签不嵌套在< servlet>标签中)实现
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置全局初始化参数,所有Servlet都可以 访问 --> <context-param> <param-name>hobby</param-name> <param-value>唱儿歌</param-value> </context-param> ... </web-app>
/** * 访问全局初始化参数 * * @author Megustas * */ public class ContextServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获得 hobby 全局参数 // 通过ServletConfig 获得 ServletContext // ServletContext context = getServletConfig().getServletContext(); // 上面写法可以简化一下 ServletContext context = getServletContext(); // 读取全局初始化参数 System.out.println(context.getInitParameter("hobby")); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
ServletConfig与ServletContext的区别:
2、通过ServletContext 在多个Servlet间 共享数据
在ServletContext中 保存站点访问次数 ,每当一个用户访问站点,将访问次数+1
在CountServlet 初始化过程中,向ServletContext 保存访问次数 —- 0 ————–> ServletContext setAttribute
每次访问次数 +1 — 数据存放ServletContext中 —- 所有Servlet都可以获得该数据
在ServletContext中保存数据,所有Servlet都可以访问
public void setAttribute(java.lang.String name,java.lang.Object object);//在servlet容器内绑定一个指定对象给一个指定的名字。如果该名字已经绑定到一个对象,则用该对象覆盖之。
/** * 用户访问 countservlet 访问次数 +1 * * @author Megustas * */ public class CountServlet extends HttpServlet { @Override public void init() throws ServletException { // 向ServletContext 保存访问次数 0 // 获得ServletContext对象 ServletContext context = getServletContext(); // 保存数据 setAttribute context.setAttribute("visittimes", 0); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 每次访问 执行 doGet --- 将visittimes 次数 +1 // 1 从ServletContext中获得 访问次数 ServletContext context = getServletContext(); int times = (Integer) context.getAttribute("visittimes");//因为getAttribute默认返回Object对象 // 2、访问次数 +1 times++; // 3、将访问次数更新回去 ServletContext context.setAttribute("visittimes", times); System.out.println("网站被访问了一次!"); // 输出访问次数 到浏览器 response.getWriter().println( "web site has been visitted:" + times + " times!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3、通过ServletContext 完成服务器程序转发
什么是转发? 转发和重定向区别 ?
使用转发还是重定向? —- 转发性能好于重定向,请求次数少
4.缺省Servlet
缺省Servlet 功能:处理其他Servlet都不处理请求
tomcat/conf/web.xml org.apache.catalina.servlets.DefaultServlet 作为缺省Servlet
当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet
相关文章推荐
- Servlet接口的实现类,路径配置映射,ServletConfig对象,ServletContext对象及web工程中文件的读取
- JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用(转)
- Servlet知识详解(一)ServletContext对象 和 ServletConfig对象学习笔记
- JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用
- JavaWeb学习笔记:ServletConfig()和ServletContext()
- 第10天(就业班) servlet的映射路径、生命周期、自动加载+init方法+线程并发安全、servletconfig对象+servletcontext对象入门、servletcontext对象的使
- (转)JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用
- JavaWeb学习笔记----Servlet的ServletConfig对象和ServletContext对象的使用
- Servlet学习笔记—ServletConfig参数配置与获取
- 学习笔记--【转】Parameter与Attribute的区别&servletContext与ServletConfig区别
- JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用
- servlet在web.xml中的路径配置的映射
- ThinkPHP学习笔记(8)在网页中配置Config文件内容
- [.Net学习笔记]webconfig的自定义配置
- java_web学习第二天(ServletConfig和ServletContext对象的作用和使用)
- Hibernate学习笔记 2 - 关系映射配置
- servlet映射,线程安全,servletconfig对象,servletcontext对象
- 【学习笔记】Servlet的配置
- Servlet技术之Servlet接口(学习笔记)
- play framework学习笔记之 conf/routes file 路径配置文件