Servlet的API(一)
Servlet的API有很多,这里只谈谈两个Servlet对象:ServletConfig对象和ServletContext对象。
1. ServletConfig对象
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数,当Servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些参数封装到ServletConfig对象中,并在调用Servlet的init方法时,将ServletConfig对象传递给Servlet。进而,程序员通过ServletConfig对象就可以得到当前Servlet的初始化参数信息。该对象的getInitParameter(String name)用来获得指定参数名的参数值,getInitParameterNames()用来获得所有参数名,我们测试一下:
在test工程的src下新建一个包servletConfig,然后新建一个ServletConfigDemo1类,在配置文件里进行如下配置:
<servlet>
<servlet-name>ServletConfigDemo1</servlet-name>
<servlet-class>servletConfig.ServletConfigDemo1</servlet-class>
<init-param>
<param-name>category</param-name>
<param-value>book</param-value>
</init-param>
<init-param>
<param-name>school</param-name>
<param-value>tongji</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>java</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfigDemo1</servlet-name>
<url-pattern>/ServletConfigDemo1</url-pattern>
</servlet-mapping>
在ServletConfigDemo1.java中的代码如下:
public class ServletConfigDemo1 extends HttpServlet {
ServletConfig config = null;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String value = config.getInitParameter("category");//获取指定的初始化参数
resp.getOutputStream().write((value + "<br/>").getBytes());
Enumeration e = config.getInitParameterNames();//获取所有参数名
while(e.hasMoreElements()){
String name = (String) e.nextElement();
value = config.getInitParameter(name);
resp.getOutputStream().write((name + "=" + value + "<br/>").getBytes());
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config; //初始化时会将ServletConfig对象传进来
}
}
在浏览器中输入:http://localhost:8080/test/ServletConfigDemo1,即可在浏览器中显示读取参数的结果。
注:实际开发中,并不需要重写init方法,以上代码中重写init方法是为了说明config对象的传递过程。其实在父类的init方法中已经实现了该config的传递了,我们只要直接调用getServletConfig()就可以得到config对象,即在doGet方法中直接通过下面的调用方式获得ServletConfig对象:
ServletConfig config = this.getServletConfig();
那么ServletConfig对象有什么作用呢?一般主要用于以下情况:
1)获得字符集编码;
2)获得数据库连接信息;
3)获得配置文件,查看struts案例的web.xml文件等。
2. ServletContext对象
web容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象,它代表当前web应用(web工程)。在ServletConfig接口中有个getServletContext方法用来获得ServletContext对象;ServletContext对象中维护了ServletContext对象的引用,也可以直接获得ServletContext对象。所以开发人员在编写Servlet时,可以通过下面两种方式获得ServletContext对象:
this.getServletConfig().getServletContext();
this.getServletContext();
一般直接获得即可。
由于一个web应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯,ServletContext对象通常也被称为context域对象。有如下主要方法:
getResource(String path); //方法获得工程里的某个资源
getResourceAsStream(String path); //通过路径获得跟资源相关联的流
setAttribute(Sring name, Object obj); //方法往ServletContext里存对象,通过MAP集合来保存。
getAttribute(String name); //方法从MAP中取对象
getInitParameter(String name); //获得整个web应用的初始化参数,
//这个跟ServletConfig获取参数不同,这是在<context-param></context-param>中定义的,config对象里的getInitParameter方法获得的是具体某个servlet的初始化参数。
getNamedeDispatcher(String name); //方法用于将请求转给另一个servlet处理,参数表示要转向的servlet。
//调用该方法后,要紧接着调用forward(ServletRequest request, ServletResponse response)方法
getServletContextName(); // 获得web应用的名称。
ServletContext应用有哪些呢?
1)多个Servlet通过ServletContext对象实现数据共享(见下面的Demo1和Demo2)
2)获取web应用的初始化参数(见Demo3)
3)实现Servlet的转发(见Demo4和Demo5)
4)利用ServletContext对象读取资源文件(xml或者properties)(见Demo6)
下面对ServletContext对象写几个Demo测试一下:
Demo1:往context域中存入数据
public class ServletContextDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String data = "adddfdf";
ServletContext context = this.getServletConfig().getServletContext();
context.setAttribute("data", data);//将数据写到ServletContext
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
Demo2:从context域中读取数据
public class ServletContextDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
String data = (String) context.getAttribute("data");//通过键值从ServletContext中获取刚才存入的数据
resp.getOutputStream().write(data.getBytes());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
Demo3:获取整个web应用的初始化参数
public class ServletContextDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");//获取整个web应用的初始化参数,参数是在<context-param></context-param>中定义的
resp.getOutputStream().write(url.getBytes());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
Demo4:实现转发
public class ServletContextDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
RequestDispatcher rd = context.getRequestDispatcher("/ServletContextDemo5");
rd.forward(req, resp);//将请求转发给ServletContextDemo5.java处理
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
Demo5:
public class ServletContextDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getOutputStream().write("ServletDemo5".getBytes());//处理ServletDemo4传过来的请求
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
Demo6:读取资源文件
public class ServletContextDemo6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//test1(resp);
//test2(resp);
//test3(resp);
//test4();
}
//读取文件,并将文件拷贝到e:\根目录,如果文件太大,只能用servletContext,不能用类装载器
private void test4() throws FileNotFoundException, IOException {
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
String filename = path.substring(path.lastIndexOf("\\")+1);
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
byte buffer[] = new byte[1024];
int len = 0;
FileOutputStream out = new FileOutputStream("e:\\" + filename);
while((len = in.read(buffer)) > 0){
out.write(buffer, 0, len);
}
}
//使用类装载器读取源文件(不适合装载大文件)
private void test3(HttpServletResponse resp) throws IOException {
ClassLoader loader = ServletContextDemo6.class.getClassLoader();
InputStream in = loader.getResourceAsStream("db.properties");
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
resp.getOutputStream().write(driver.getBytes());
}
private void test2(HttpServletResponse resp) throws FileNotFoundException,
IOException {
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");//获取绝对路径
FileInputStream in = new FileInputStream(path);//传统方法,参数为绝对路径
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
resp.getOutputStream().write(driver.getBytes());
}
//读取web工程中资源文件的模板代码(源文件在工程的src目录下)
private void test1(HttpServletResponse resp) throws IOException {
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
////注:源文件若在工程的WebRoot目录下,则上面参数路径直接为"/db.properties",因为WebRoot即代表web应用
Properties prop = new Properties();
prop.load(in);//先装载流
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
resp.getOutputStream().write(driver.getBytes());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
ServletConfig对象和ServletContext对象就介绍这么多吧,如有错误之处,欢迎留言指正~
Servlet的API(一)的更多相关文章
- 注解 @RequestParam,@RequestHeader,@CookieValue,Pojo,servlet原生API
1.@RequestParam 我们的超链接:<a href="springMvc/testRequestParam">testRequestParam</a&g ...
- springmvc使用pojo和servlet原生api作为参数
一.Pojo作为参数: 实体: package com.hy.springmvc.entities; public class User { private String username; priv ...
- Struts2(七) Struts2访问Servlet的API
当接受表单参数,向页面保持数据时.要用到Struts访问Servlet 的API .下面只做参考,有错误或不同意见可以发送邮箱2440867831@qq.com .建议大家看struts文档,源代码 ...
- Struts2框架中使用Servlet的API示例
1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的 ...
- 在Struts2框架中使用Servlet的API
1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的 ...
- struts2:在Action中使用Servlet的API,设置、读取各种内置对象的属性
有两种方式可以实现在Action中使用Servlet的API.一种是使用org.apache.struts2.ServletActionContext类,另一种是使用com.opensymphony. ...
- struts2訪问servlet的API
1.struts作为控制器,正常非常多时候要訪问到servlet的API.经常使用功能: (1).获取请求參数,控制界面跳转 (2).把共享数据存储于request,session,servl ...
- Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动
一.Result结果配置 1.全局和局部结果 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里 ...
- Struts2获取Servlet的api的两种方式,解决ParameterAware过时的问题
servlet API通过ActionContext进行获取 Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,构造了3个Map对象 ...
- Struts2学习第2天--Struts2的Servlet的API的访问 Struts2的结果页面的配置 Struts2的数据的封装(包括复杂类型)
启动后访问jsp 输入姓名密码: 提交后跳转打action 打印: 修改类: 配置同上 结果同上. 实现这俩接口 就得到了 以上代码附上: struts.xml: <?xml version=& ...
随机推荐
- VC2010编译libwebsockets
1. 安装cmake: https://cmake.org/files/v3.6/cmake-3.6.0-win64-x64.msi 2. 下载libwebsocket源码: git clone ht ...
- centos 搭建ntp
str=$(printf "%-25s" "*") echo -e "${str// /*}" echo -e "*\t\t\t* ...
- springMVC多图片压缩上传的实现
首先需要在配置文件中添加配置: <!--配置文件的视图解析器,用于文件上传,其中ID是固定的:multipartResolver--> <bean id="multipar ...
- 使用windos电脑模拟搭建集群(四)web环境 linux+nginx+jdk+tomcat
1.使用ansible的playbook自动安装两台web主机的nginx 1.配置模块 主机清单 2.创建 playbook目录并编写安装nginx的playbook mkdir -p playbo ...
- 解决Windows下网络原因Composer安装失败问题的方法
由于Composer镜像都在国外,所以直接在官网下载Windows Installer后安装很多情况下是无法成功安装的. 解决办法: 1,将php添加到系统环境变量,并开启openssl扩展. 2,点 ...
- 初入IT行業,走出自我
细细算下来,我已经有半年的工作经验了... 本人毕业于武汉一所普通的一本院校,大学期间普普通通,大三一年自学了PS和Flash和静态网站制作,那时的我就是兴趣所在,但是水平一般. 大四上学期用了大半年 ...
- Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例
sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...
- 左偏树自己的一点理解【hdu1512】【Monkey King】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=34693563 向大(hei)佬(e)势力学(di ...
- MySQL索引,如何正确创建MySQL索引?
索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本.排序分组操作主要消耗的就是CPU资源和内存,所以能够在排序分组操作中好好的利用索引将会极大地降低CPU资源的 ...
- 了解RxJava以及如何在Android应用中使用它
如果你在阅读这篇文章,相信你一定很想了解RxJava以及如何在Android应用中使用它.可能你已经见过RxJava的代码了,但仍然有些疑惑,愿你能在这篇文章里找到答案. 当我第一次使用RxJava的 ...