Servlet 学习(七)
ServletConfig
1、定义
- ServletConfig接口:servlet容器在初始化期间将信息传递给servlet的servlet配置对象
- 代表当前Servlet在web.xml中的配置信息,用于描述一个Servlet 的配置信息
2、常用方法
- 获得当前Servlet 实例的名称
String getServletName()
- 获得当前Servlet 实例的初始化参数
String getInitParameter(String name)根据name 获取指定的初始化参数的值,如果name 对应的初始化参数不存在,返回null
Enumeration getInitParameterNames()返回当前Servlet 实例的所有的初始化参数的名称,注意返回类型是java.util.Enumeration
- 获得当前Servlet 实例所依赖的应用
ServletContext getServletContext()
3、优点
- 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
- 如果将数据库信息、编码方式等配置信息放在web.xml中,如果以后数据库的用户名、密码改变了,则直接很方便地修改web.xml就行了,避免了直接修改源代码的麻烦。
4、配置Servlet 的初始化参数
- 在servlet 标签中使用init-param 子标签配置
其中<param-name> 子标签用于设置初始化参数的名称
<param-value> 子标签用于设置指定参数的值
- 同一个servlet 中可以使用多个init-param 标签配置多个初始化参数
使用config.getInitParameter( name ) 可以获取指定名称的参数对应的值
使用config.getInitParameterNames() 可以获取所有的参数的名称
测试案例:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1"> <!-- 注册 -->
<servlet>
<servlet-name>ConfigurationServlet</servlet-name>
<servlet-class>ecut.lifecycle.ConfigurationServlet</servlet-class>
<!-- 指定初始化参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>content-type</param-name>
<param-value>text/html</param-value>
</init-param>
</servlet> <!-- 映射(发布) -->
<servlet-mapping>
<servlet-name>ConfigurationServlet</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping> </web-app>
package ecut.lifecycle; import java.io.IOException;
import java.io.PrintWriter;
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 ConfigurationServlet implements Servlet { @Override
public String getServletInfo() {
return this.config.getServletName() ;
} @Override
public ServletConfig getServletConfig() {
return this.config ;
} private ServletConfig config ; @Override
public void init( ServletConfig config ) throws ServletException {
this.config = config ;
System.out.println( "初始化" );
System.out.println( config );
System.out.println( "ServletName : " + config.getServletName() );//web.xm配置文件中的servlet名称
/*
String encoding = config.getInitParameter( "encoding" );
System.out.println( "encoding : " + encoding );
*/
Enumeration<String> initParamNames = config.getInitParameterNames();
while( initParamNames.hasMoreElements() ){
String name = initParamNames.nextElement() ;
String value = config.getInitParameter( name );
System.out.println( name + " : " + value );
}
} @Override
public void service( ServletRequest req , ServletResponse resp ) throws ServletException, IOException {
System.out.println( "对外提供服务" ); String ct = config.getInitParameter( "content-type" ) ;
String en = config.getInitParameter( "encoding" ) ;
String contentType = ct + ";charset=" + en ; // "text/html;charset=UTF-8"
resp.setContentType( contentType );
PrintWriter w = resp.getWriter();
w.println( "<h1 style='text-align:center;color:blue;'>欢迎 !</h1>" );
} @Override
public void destroy() {
System.out.println( "销毁" );
} }
运行结果如下:
初始化
org.apache.catalina.core.StandardWrapperFacade@4c12c6a
ServletName : ConfigurationServlet
content-type : text/html
encoding : UTF-8
对外提供服务
ServletContext
1、定义
- Servlet容器的上下文环境对象,其类型是javax.servlet.ServletContext
- Servlet 容器启动时会加载每个web 应用,并为每个web 应用创建一个惟一的ServletContext 对象
- 可以理解成是一个web 应用的服务器端组件的共享内存,服务器端的所有组件都可以从该对象中获取或设置数据
- 使用该对象可以实现跨Session 的数据共享
- ServletContext对象通常也被称之为context域对象。
- 域对象:在一个可以被看见的范围内共享数据用到对象
- 作用范围:整个web应用范围内共享数据
- 生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移除出容器或服务器关闭,随着web应用的销毁域销毁。
2、常用方法
- 用于操纵数据的方法包括:
Object getAttribute(String name)
Enumeration getAttributeNames()
void removeAttribute(String name)
void setAttribute(String name, Object object)
- 获得当前的ServletContext 对象
GenericServlet.getServletContext() (HttpServlet继承了GenericServlet)
HttpSession.getServletContext()
ServletConfig.getServletContext()
- 获得指定uripath 对应的ServletContext 对象
ServletContext getContext(String uripath)
- 与路径有关的
String getContextPath()
String getRealPath(String path)
- 获得RequestDispatcher 对象
RequestDispatcher getNamedDispatcher(String name)
RequestDispatcher getRequestDispatcher(String path)
- 获得Servlet 的相关信息
String getServerInfo()
String getServletContextName()
- 获得输入流
InputStream getResourceAsStream(String path)Class 类的getResourceAsStream 需要用到类加载器,而该方法不需要
3、被ServletContext 管理的数据
- 可以被整个web 应用所使用
- 可以实现跨会话的数据共享
- 对应JSP 中的application 内置对象
4、配置ServletContext
- 配置ServletContext 初始化参数
在web-app 标签中使用<context-param> 子标签来设置
<param-name> 指定初始化参数的名称
<param-value> 指定初始化参数的值
可以使用设置多个初始化参数
- 获得初始化参数
String getInitParameter(String name)
Enumeration getInitParameterNames()
ServletContext测试案例一:
package ecut.context.servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; @WebServlet( "/web/counter" )
public class CounterServlet extends HttpServlet { private static final long serialVersionUID = 1963063933334411177L; @Override
protected void service( HttpServletRequest request , HttpServletResponse response )
throws ServletException, IOException {
request.setCharacterEncoding( "UTF-8" );
response.setCharacterEncoding( "UTF-8" );
response.setContentType( "text/html;charset=UTF-8" ); PrintWriter w = response.getWriter(); HttpSession session = request.getSession(); // 1、先尝试从 session 中获取一个名称是 counter 的属性值
Integer sessionCounter = (Integer)session.getAttribute( "counter" );
// 2、判断 sessionCounter 是否是不存在的
if( sessionCounter == null ){
sessionCounter = Integer.valueOf( 0 );
}
// 3、将数值增加后重新放回到 session 中,以备下次继续累加
sessionCounter++ ;
session.setAttribute( "counter" , sessionCounter ); w.println( "<h3 align='center'>SessionCounter : " + sessionCounter + "</h3>" ); ServletContext application = this.getServletContext() ; // 1、先尝试从 application 中获取一个名称是 counter 的属性值
Integer applicationCounter = (Integer)application.getAttribute( "counter" );
// 2、判断 applicationCounter 是否是不存在的
if( applicationCounter == null ){
applicationCounter = Integer.valueOf( 0 );
}
// 3、将数值增加后重新放回到 application 中,以备下次继续累加
applicationCounter++ ;
application.setAttribute( "counter" , applicationCounter ); w.println( "<h3 align='center'>ApplicationCounter : " + applicationCounter + "</h3>" ); } }
运行结果如下:
火狐浏览器
谷歌浏览器
ServletContext测试案例二:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 为 ServletContext 指定的 初始化参数 -->
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param> <servlet>
<servlet-name>WebApplicationServlet</servlet-name>
<servlet-class>ecut.context.servlet.WebApplicationServlet</servlet-class>
<!-- 这里的初始化参数是为 当前的 Servlet 提供的 (通过当前Servlet对应的 ServletConfig 可以获取这些参数值)
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
-->
</servlet> <servlet-mapping>
<servlet-name>WebApplicationServlet</servlet-name>
<url-pattern>/web/application</url-pattern>
</servlet-mapping>
</web-app>
package ecut.context.servlet; import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class WebApplicationServlet extends HttpServlet { private static final long serialVersionUID = 312349126067371625L; @Override
protected void service( HttpServletRequest request , HttpServletResponse response )
throws ServletException, IOException { request.setCharacterEncoding( "UTF-8" );
response.setCharacterEncoding( "UTF-8" );
response.setContentType( "text/html;charset=UTF-8" ); // WebApplicationServlet 继承了 HttpServlet ,HttpServlet 继承了 GenericServlet ,
// GenericServlet 实现了 ServletConfig , ServletConfig 接口中提供了 getServletContext()
ServletContext application = this.getServletContext(); // request.getServletContext(); // 从 Servlet 3.0 开始 可以通过 请求对象 获取 ServletContext // request.getSession().getServletContext(); // 从 Servlet 2.3 开始就支持用 session 来获取 ServletContext PrintWriter w = response.getWriter(); w.println( "<h2>当前WEB应用的路径</h2>" );
w.println( "<div>" );
w.println( "context path : " + application.getContextPath() );
w.println( "</div>" ); Enumeration<String> paramNames = application.getInitParameterNames();
w.println( "<h2>初始化参数</h2>" );
while( paramNames.hasMoreElements() ){
String name = paramNames.nextElement();
String value = application.getInitParameter( name );
w.println( "<div>" );
w.println( "init parameter : " + name + " : " + value );
w.println( "</div>" );
} w.println( "<h2>获得真实路径 ( getRealPath )</h2>" ); String realPath = application.getRealPath( "/WEB-INF" );
w.println( "<div>" );
w.println( realPath );
w.println( "</div>" ); w.println( "<h2>获得指定的 path 对应的 ServletContext 对象</h2>" ); } }
运行结果如下:
转载请于明显处标明出处
http://www.cnblogs.com/AmyZheng/p/9008353.html
Servlet 学习(七)的更多相关文章
- Servlet学习(七)——cookie
一.会话技术简介 1.存储客户端的状态 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术 ...
- JSP&Servlet学习手册
JSP&Servlet学习手册 沙琪玛 书 目录 JSP 指令... 3 书写方式... 3 指令列表... 3 JSP 内置对象... 3 内置对象特点... 3 常用内置对象... 3 o ...
- Servlet 学习笔记
Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...
- MyBatis学习七:spring和MyBatis整合
<\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...
- Servlet学习:(三)Servlet3.0 上传文件
转: Servlet学习:(三)Servlet3.0 上传文件 2018年08月03日 11:57:58 iDark_CSDN 阅读数:362 一.注意事项 客户端(浏览器) 表单的提交方法必须是 ...
- SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- day 85 Vue学习七之vue-cookie
Vue学习七之vue-cookie 通过vue如何操作cookie呢 参考链接:https://www.jianshu.com/p/535b53989b39 第一步:安装vue-cookies ...
- (转)MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码
http://blog.csdn.net/yerenyuan_pku/article/details/71909325 什么是逆向工程 MyBatis的一个主要的特点就是需要程序员自己编写sql,那么 ...
- Servlet学习(九)——request
request运行流程在Servlet学习(四)——response已介绍,不再赘述 1.通过抓包工具获取Http请求 因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行, ...
- # jsp及servlet学习笔记
目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...
随机推荐
- Qt 解析命令行参数
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQuickView> ...
- dbGet net trace instant pin
proc rn { net_name } {puts " "puts "Net name : $net_name : "set name_rule [dbget ...
- C语言进行csv文件数据的读取
C语言进行csv文件数据的读取: #include <stdio.h> #include <string.h> #include <malloc.h> #inclu ...
- sublime不支持ascill编码办法
1.按下组合键ctrl+shift+p,输入:install package,回车 2.在弹出的安装包框中搜索:ConvertToUTF8或者GBK Encoding Support,选择点击安装: ...
- vnpy源码阅读学习(5):关于MainEngine的代码阅读
关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...
- mvc 上传文件 HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。 maxRequestLength与 maxReceivedMessageSize 和 maxAllowedContentL区别
具体的错误信息如下: 在线上遇到了文件上传问题,在测试环境试了好久都没有发现问题到底出在哪里,以为是服务器做了各种限制,然后一点思绪都没有.最后,尝试将线上的代码包拷贝一份,在测试环境运行,刚开始的时 ...
- Ubuntu16.04+Ros+Usb_Cam ORB SLAM2
转载自:https://www.jianshu.com/p/dbf39b9e4617亲测可用 1.其中编译ORB_SLAM2的 ./build.sh 和 ./build_ros.sh之前需要修改文 ...
- centOs安装出现No package git available的解决办法
来源地址 [http://chinacheng.iteye.com/blog/1825538 ] centos安装git 下载源代码安装后,git clone出现“fatal unable to fi ...
- 【转】Docker网络模式--默认模式bridge模式
一 引言 当 Docker 启动时,会自动在主机上创建一个名为 docker0 虚拟网桥,这实际上就是 Linux 的一个 bridge,可以理解为一个软件交换机.它会在挂载到它的网口之间进行转发.系 ...
- IoT生态不完善、与智能电视区别不大,荣耀智慧屏概念大于实际
编辑 | 于斌 出品 | 于见(mpyujian) 前两天,华为荣耀略显"低调"地在北京召开了一场小型的媒体沟通会.在这场沟通会上,荣耀却颇为"重磅"地推出了坊 ...