---恢复内容开始---

ServletConfig

配置Servlet初始化参数

在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。

<servlet>
<servlet-name>servletDemo</servlet-name>
<servlet-class>com.fpc.servletDemo</servlet-class>
<!-- 配置servletDemo的初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>fpc</param-value>
</init-param> <init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param> <init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param> </servlet>

通过ServletConfig获取Servlet的初始化参数

当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet,进而我们通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

package com.fpc;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration; import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class servletDemo extends HttpServlet {
int i = 1;
private ServletConfig config; @Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
this.config = config;
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//获取在web.xml中配置的初始化参数
String paramVal = this.config.getInitParameter("name");//获取指定的初始化参数
response.getWriter().write(paramVal); response.getWriter().write("<br/>");
//获取所有的初始化参数
Enumeration<String> e = config.getInitParameterNames();
while ( e.hasMoreElements() ) {
String name = e.nextElement();
String value = config.getInitParameter(name);
response.getWriter().write(name + " = " + value + "<br/>");
} } @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
} }

当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时将ServletConfig对象传递给servlet,进而程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

运行结果:

ServletContext

web容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写Servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。

由于一个web应用中的所有Servlet共享一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也称之为context域对象。

多个Servlet通过ServletContext对象实现数据共享

例:ServletContextDemo1和ServletContextDemo2通过ServletContext对象实现数据共享ServletContextDemo1

package com.fpc;

import java.io.IOException;

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 ServletContextDemo1 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
String data = "fpc_20171206"; /*
* ServletConfig对象维护了ServletContext对象的引用,开发人员在编写servlet时
* 可以通过ServletConfig.getServletContext()方法获得ServletContext对象
*
* */ //获取ServletContext对象
ServletContext servletContext = this.getServletConfig().getServletContext();
//将数据存储到ServletContext对象中
servletContext.setAttribute("name_date", data);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
} }

ServletContextDemo2

package com.fpc;

import java.io.IOException;

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 ServletContextDemo2 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
ServletContext servletContext = this.getServletConfig().getServletContext();
String data = (String) servletContext.getAttribute("name_date");
resp.getWriter().write("context : " + data ); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
} }

先运行ServletContextDemo1,将数据data存储到ServletContext对象中,然后再运行ServletContextDemo2即㐓从ServletContext对象中取出数据了,这样就实现了数据共享,如下图所示:

获取web应用的初始化参数

在web.xml文件中使用<context-param>标签配置web应用的初始化参数:

<!-- 配置web应用的初始化参数 -->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://10.0.20.252:306/test</param-value>
</context-param>

获取web应用的初始化参数,代码如下:

String contextInitParam = servletContext.getInitParameter("url");
resp.getWriter().write("url : " + contextInitParam);

运行结果:

用ServletContext实现请求转发

ServletContextDemod1

package com.fpc;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 ServletContextDemo1 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
String data = "<h1><font color='blue'>fpc_20171206</font></h1>";
resp.getOutputStream().write(data.getBytes());
ServletContext context = this.getServletContext();//获取ServletContext对象
RequestDispatcher rd = context.getRequestDispatcher("/servletContext/servletContextDemo2");//获取请求转发对象
rd.forward(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
} }

ServletContextDemo2

package com.fpc;

import java.io.IOException;

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 ServletContextDemo2 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getOutputStream().write("ServletContextDemo2".getBytes());
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
} }

运行结果:

访问的是ServletContextDemo1,浏览器显示的却是ServletContextDemo2的内容,这就是使用了ServletContext实现了请求转发。

利用ServletContext对象读取资源文件

目录结构

package com.fpc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; 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 ServletContextDemo2 extends HttpServlet {
private void readFile(HttpServletResponse response) throws IOException {
//通过ServletContext获取文件的绝对路径
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db.properties");
InputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
String driver = prop.getProperty("driver");
String url= prop.getProperty("url");
String username = prop.getProperty("name");
String password = prop.getProperty("password");
response.getWriter().write("dirver : " + driver + " url : " + url + " username : " + username + " password : " + password);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.getOutputStream().write("ServletContextDemo2".getBytes());
//目的是控制浏览器用UTF-8进行编码;这样不会出现中文乱码
resp.setContentType("text/html;charset=UTF-8");
resp.setHeader("content-type", "text/html;charset=UTF-8");
readFile(resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
} }

运行结果:

访问路径为:/WEB-INF/classes/db/config/db.properties

在客户端缓存Servlet的输出

对于不经常变化的数据,在servlet中可以设置合理的缓存时间值,以避免浏览器频繁向服务器发送请求,提升服务器性能。

ServletContextDemo1

package com.fpc;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 ServletContextDemo1 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
// String data = "<h1><font color='blue'>fpc_20171206</font></h1>";
// resp.getOutputStream().write(data.getBytes());
// ServletContext context = this.getServletContext();//获取ServletContext对象
// RequestDispatcher rd = context.getRequestDispatcher("/servletContext/servletContextDemo2");//获取请求转发对象
// rd.forward(req, resp);
String data = "fpc_2017/12/06 14:07";
/*
* 设置合理的缓存时间值,以避免浏览器向服务器发送请求,提升服务器的性能
* 这里是将数据的缓存时间设置为1天
* */
resp.setDateHeader("expires", System.currentTimeMillis() + 24 *3600*1000);
resp.getOutputStream().write(data.getBytes());
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
} }

JavaWeb-Servlet开发2的更多相关文章

  1. 【Java123】JavaWeb Servlet开发

    http://www.runoob.com/servlet/servlet-intro.html https://www.cnblogs.com/xdp-gacl/tag/JavaWeb学习总结/de ...

  2. JavaWeb——Servlet开发

    什么是Servlet? Servlet运行的过程 Servlet的生命周期 生命周期的各个阶段 Servlet的配置 使用Web.xml配置 使用注解配置 Servlet相关接口 ServletCon ...

  3. JavaWeb——Servlet开发3

    1.使用初始化参数配置应用程序 初始化参数的方式有两种 在Web.xml文件中使用<context-param>标签声明上下文初始化参数 <context-param> < ...

  4. JavaWeb——Servlet开发2

    1.HttpServletRequest的使用 获取Request的参数的方法. 方法getParameter将返回参数的单个值 方法getParameterValues将返回参数的值的数组 方法ge ...

  5. JavaWeb——Servlet开发1

    Java Servlet是运行在服务器端上的程序,Servlet是Java Servlet包中的一个接口,能够直接处理和相应客户端的请求,也可以将工作委托给应用的其他类. public interfa ...

  6. javaweb学习之Servlet开发(二)

    javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个< ...

  7. JavaWeb学习总结第四篇--Servlet开发

    Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...

  8. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  9. javaweb学习总结(五)——Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  10. javaWeb中servlet开发(5)——WEB开发模式:Mode I与Mode II

    1.servlet开发 2.model I模式 客户端通过访问JSP,调用里面的javabean,而通过javabean调用处理数据库的操作,javabean中有专门处理数据库的操作,数据库主要以DA ...

随机推荐

  1. Linux下C语言编程中库的使用

    零.问题 1. 为什么要用到库? 2. 我要用一个库,但是,尼玛命令行上该怎么写呢?或者说库文件如何使用? 3. Linux的库在那些地方? 4. 什么是静态库,什么是动态库,二者有啥区别? 5. 常 ...

  2. boa 服务的启动

    使用 buildroot 添加 boa 服务后,通过命令 boa 不能启动该服务,就研究了一下boa.conf的配置. etc/boa/boa.conf # 更改user 和Group 为root. ...

  3. RabbitMQ之主题(Topic)【译】

    在上一节中,我们改进了我们的日志系统,替换使用fanout exchange仅仅能广播消息,使得选择性的接收日志成为可能. 虽然使用direct exchange改进了我们的系统,但是它仍然由他的局限 ...

  4. [转]第2台Tomcat端口变更失败解决办法

    原文链接:http://blog.csdn.net/preterhuman_peak/article/details/41803361 今天在服务器上部署了两个Tomcat.于是将其中一个的serve ...

  5. CRC16

    http://www.stmcu.org/chudonganjin/blog/12-08/230184_515e6.html 1.循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特 ...

  6. 第二百六十一节,Tornado框架模板引擎本质

    Tornado框架模板引擎本质 只需要了解一下即可 本篇就来详细的剖析模板处理的整个过程. 上图是返回给用户一个html文件的整个流程,较之前的Demo多了绿色流线的步骤,其实就是把[self.wri ...

  7. php -- 魔术方法 之 判断属性是否存在或为空:__isset()

    属性重载:当访问一个不存在或者权限不够的属性的时候,能够触发一系列的魔术方法,就叫做属性重载 __isset($name):当使用 isset()函数或者empty()函数 判断属性是否存在或者是否为 ...

  8. 【UVa】Jump(dp)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  9. LoadRunner学习---脚本编写(4)(比较重要)

    今天接着来翻译http://www.wilsonmar.com/中关于LoadRunner脚本编写部分,下面该翻译脚本编写中一些比较重要的部分了. Web用户Action 在VuGen中,脚本产生的默 ...

  10. (转)python中的参数:*args和**kwargs

    def foo(*args, **kwargs):print 'args = ', argsprint 'kwargs = ', kwargsprint '---------------------- ...