javaweb Servlet开发总结(二)

作者:孤傲苍狼 时间:2023-10-31 11:51:48 

一、ServletConfig讲解

1.1、配置Servlet初始化参数

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

例如:


<servlet>
<servlet-name>ServletConfigDemo1</servlet-name>
<servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class>
<!--配置ServletConfigDemo1的初始化参数 -->
<init-param>
 <param-name>name</param-name>
 <param-value>gacl</param-value>
</init-param>
 <init-param>
 <param-name>password</param-name>
 <param-value>123</param-value>
</init-param>
<init-param>
 <param-name>charset</param-name>
 <param-value>UTF-8</param-value>
</init-param>
</servlet>

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

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

例如:


package gacl.servlet.study;

import java.io.IOException;
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 ServletConfigDemo1 extends HttpServlet {

/**
 * 定义ServletConfig对象来接收配置的初始化参数
 */
private ServletConfig config;

/**
 * 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,
 * 会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,
 * 将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以
 * 得到当前servlet的初始化参数信息。
 */
@Override
public void init(ServletConfig config) throws ServletException {
 this.config = config;
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 //获取在web.xml中配置的初始化参数
 String paramVal = this.config.getInitParameter("name");//获取指定的初始化参数
 response.getWriter().print(paramVal);

response.getWriter().print("<hr/>");
 //获取所有的初始化参数
 Enumeration<String> e = config.getInitParameterNames();
 while(e.hasMoreElements()){
  String name = e.nextElement();
  String value = config.getInitParameter(name);
  response.getWriter().print(name + "=" + value + "<br/>");
 }
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 this.doGet(request, response);
}

}

运行结果如下:

javaweb Servlet开发总结(二)

二、ServletContext对象

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

三、ServletContext的应用

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

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



package gacl.servlet.study;

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 {

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 String data = "xdp_gacl";
 /**
  * ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,
  * 可以通过ServletConfig.getServletContext方法获得ServletContext对象。
  */
 ServletContext context = this.getServletConfig().getServletContext();//获得ServletContext对象
 context.setAttribute("data", data); //将data存储到ServletContext对象中
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 doGet(request, response);
}
}


package gacl.servlet.study;

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 {

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 ServletContext context = this.getServletContext();
 String data = (String) context.getAttribute("data");//从ServletContext对象中取出数据
 response.getWriter().print("data="+data);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 doGet(request, response);
}
}

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

javaweb Servlet开发总结(二)

3.2、获取WEB应用的初始化参数

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


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
<display-name></display-name>
<!-- 配置WEB应用的初始化参数 -->
<context-param>
 <param-name>url</param-name>
 <param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>

<welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

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


package gacl.servlet.study;

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 ServletContextDemo3 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {

ServletContext context = this.getServletContext();
 //获取整个web站点的初始化参数
 String contextInitParam = context.getInitParameter("url");
 response.getWriter().print(contextInitParam);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 doGet(request, response);
}

}

运行结果:

javaweb Servlet开发总结(二)

3.3、用servletContext实现请求转发

ServletContextDemo4


package gacl.servlet.study;

import java.io.IOException;
import java.io.PrintWriter;
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 ServletContextDemo4 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 String data = "<h1><font color='red'>abcdefghjkl</font></h1>";
 response.getOutputStream().write(data.getBytes());
 ServletContext context = this.getServletContext();//获取ServletContext对象
 RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");//获取请求转发对象(RequestDispatcher)
 rd.forward(request, response);//调用forward方法实现请求转发
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
}
}

ServletContextDemo5


package gacl.servlet.study;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletContextDemo5 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 response.getOutputStream().write("servletDemo5".getBytes());
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 this.doGet(request, response);
}

}

运行结果:

javaweb Servlet开发总结(二)

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

3.4、利用ServletContext对象读取资源文件

项目目录结构如下:

 javaweb Servlet开发总结(二)

代码范例:使用servletContext读取资源文件


package gacl.servlet.study;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* 使用servletContext读取资源文件
*
* @author gacl
*
*/
public class ServletContextDemo6 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 /**
  * response.setContentType("text/html;charset=UTF-8");目的是控制浏览器用UTF-8进行解码;
  * 这样就不会出现中文乱码了
  */
 response.setHeader("content-type","text/html;charset=UTF-8");
 readSrcDirPropCfgFile(response);//读取src目录下的properties配置文件
 response.getWriter().println("<hr/>");
 readWebRootDirPropCfgFile(response);//读取WebRoot目录下的properties配置文件
 response.getWriter().println("<hr/>");
 readPropCfgFile(response);//读取src目录下的db.config包中的db3.properties配置文件
 response.getWriter().println("<hr/>");
 readPropCfgFile2(response);//读取src目录下的gacl.servlet.study包中的db4.properties配置文件

}

/**
 * 读取src目录下的gacl.servlet.study包中的db4.properties配置文件
 * @param response
 * @throws IOException
 */
private void readPropCfgFile2(HttpServletResponse response)
  throws IOException {
 InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/gacl/servlet/study/db4.properties");
 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");
 response.getWriter().println("读取src目录下的gacl.servlet.study包中的db4.properties配置文件:");
 response.getWriter().println(
   MessageFormat.format(
     "driver={0},url={1},username={2},password={3}",
     driver,url, username, password));
}

/**
 * 读取src目录下的db.config包中的db3.properties配置文件
 * @param response
 * @throws FileNotFoundException
 * @throws IOException
 */
private void readPropCfgFile(HttpServletResponse response)
  throws FileNotFoundException, IOException {
 //通过ServletContext获取web资源的绝对路径
 String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db3.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("username");
 String password = prop.getProperty("password");
 response.getWriter().println("读取src目录下的db.config包中的db3.properties配置文件:");
 response.getWriter().println(
   MessageFormat.format(
     "driver={0},url={1},username={2},password={3}",
     driver,url, username, password));
}

/**
 * 通过ServletContext对象读取WebRoot目录下的properties配置文件
 * @param response
 * @throws IOException
 */
private void readWebRootDirPropCfgFile(HttpServletResponse response)
  throws IOException {
 /**
  * 通过ServletContext对象读取WebRoot目录下的properties配置文件
  * “/”代表的是项目根目录
  */
 InputStream in = this.getServletContext().getResourceAsStream("/db2.properties");
 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");
 response.getWriter().println("读取WebRoot目录下的db2.properties配置文件:");
 response.getWriter().print(
   MessageFormat.format(
     "driver={0},url={1},username={2},password={3}",
     driver,url, username, password));
}

/**
 * 通过ServletContext对象读取src目录下的properties配置文件
 * @param response
 * @throws IOException
 */
private void readSrcDirPropCfgFile(HttpServletResponse response) throws IOException {
 /**
  * 通过ServletContext对象读取src目录下的db1.properties配置文件
  */
 InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties");
 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");
 response.getWriter().println("读取src目录下的db1.properties配置文件:");
 response.getWriter().println(
   MessageFormat.format(
     "driver={0},url={1},username={2},password={3}",
     driver,url, username, password));
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 this.doGet(request, response);
}

}

运行结果如下:

javaweb Servlet开发总结(二)

代码范例:使用类装载器读取资源文件


package gacl.servlet.study;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* 用类装载器读取资源文件
* 通过类装载器读取资源文件的注意事项:不适合装载大文件,否则会导致jvm内存溢出
* @author gacl
*
*/
public class ServletContextDemo7 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 /**
  * response.setContentType("text/html;charset=UTF-8");目的是控制浏览器用UTF-8进行解码;
  * 这样就不会出现中文乱码了
  */
 response.setHeader("content-type","text/html;charset=UTF-8");
 test1(response);
 response.getWriter().println("<hr/>");
 test2(response);
 response.getWriter().println("<hr/>");
 //test3();
 test4();

}

/**
 * 读取类路径下的资源文件
 * @param response
 * @throws IOException
 */
private void test1(HttpServletResponse response) throws IOException {
 //获取到装载当前类的类装载器
 ClassLoader loader = ServletContextDemo7.class.getClassLoader();
 //用类装载器读取src目录下的db1.properties配置文件
 InputStream in = loader.getResourceAsStream("db1.properties");
 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");
 response.getWriter().println("用类装载器读取src目录下的db1.properties配置文件:");
 response.getWriter().println(
   MessageFormat.format(
     "driver={0},url={1},username={2},password={3}",
     driver,url, username, password));
}

/**
 * 读取类路径下面、包下面的资源文件
 * @param response
 * @throws IOException
 */
private void test2(HttpServletResponse response) throws IOException {
 //获取到装载当前类的类装载器
 ClassLoader loader = ServletContextDemo7.class.getClassLoader();
 //用类装载器读取src目录下的gacl.servlet.study包中的db4.properties配置文件
 InputStream in = loader.getResourceAsStream("gacl/servlet/study/db4.properties");
 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");
 response.getWriter().println("用类装载器读取src目录下的gacl.servlet.study包中的db4.properties配置文件:");
 response.getWriter().println(
   MessageFormat.format(
     "driver={0},url={1},username={2},password={3}",
     driver,url, username, password));
}

/**
 * 通过类装载器读取资源文件的注意事项:不适合装载大文件,否则会导致jvm内存溢出
 */
public void test3() {
 /**
  * 01.avi是一个150多M的文件,使用类加载器去读取这个大文件时会导致内存溢出:
  * java.lang.OutOfMemoryError: Java heap space
  */
 InputStream in = ServletContextDemo7.class.getClassLoader().getResourceAsStream("01.avi");
 System.out.println(in);
}

/**
 * 读取01.avi,并拷贝到e:\根目录下
 * 01.avi文件太大,只能用servletContext去读取
 * @throws IOException
 */
public void test4() throws IOException {
 // path=G:\Java学习视频\JavaWeb学习视频\JavaWeb\day05视频\01.avi
 // path=01.avi
 String path = this.getServletContext().getRealPath("/WEB-INF/classes/01.avi");
 /**
  * path.lastIndexOf("\\") + 1是一个非常绝妙的写法
  */
 String filename = path.substring(path.lastIndexOf("\\") + 1);//获取文件名
 InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/01.avi");
 byte buffer[] = new byte[1024];
 int len = 0;
 OutputStream out = new FileOutputStream("e:\\" + filename);
 while ((len = in.read(buffer)) > 0) {
  out.write(buffer, 0, len);
 }
 out.close();
 in.close();
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {

this.doGet(request, response);
}

}

运行结果如下:

javaweb Servlet开发总结(二)

四、在客户端缓存Servlet的输出

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



package gacl.servlet.study;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo5 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 String data = "abcddfwerwesfasfsadf";
 /**
  * 设置数据合理的缓存时间值,以避免浏览器频繁向服务器发送请求,提升服务器的性能
  * 这里是将数据的缓存时间设置为1天
  */
 response.setDateHeader("expires",System.currentTimeMillis() + 24 * 3600 * 1000);
 response.getOutputStream().write(data.getBytes());
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {

this.doGet(request, response);
}

}

javaweb Servlet开发总结(二)

标签:javaweb,Servlet,开发
0
投稿

猜你喜欢

  • java实战之飞机大战小游戏(源码加注释)

    2021-08-01 17:46:08
  • android中Activity横竖屏切换的那些事

    2023-04-02 22:32:33
  • Android应用启动另外一个apk应用的方法

    2023-12-23 08:53:26
  • Java MD5消息摘要算法原理及实现代码

    2022-10-22 17:48:03
  • SpringBoot JSON全局日期格式转换器实现方式

    2021-10-03 10:07:28
  • Java开发之Lombok指南

    2022-11-19 21:49:28
  • java图片验证码生成教程详解

    2021-11-04 13:22:14
  • 基于Java生成图片验证码的方法解析

    2022-01-22 06:00:37
  • Unity3d实现跑马灯广播效果

    2022-11-13 20:08:12
  • Java ArrayList源码深入分析

    2023-06-16 16:30:26
  • android shape实现阴影或模糊边效果

    2022-10-14 02:01:09
  • 简单实现Android绘图板

    2021-09-11 06:36:23
  • Android开发基础简化Toast调用方法详解

    2022-02-11 00:44:09
  • SpringBoot如何进行参数校验实例详解

    2022-10-24 03:39:33
  • Java ExecutorService四种线程池使用详解

    2023-05-17 07:12:56
  • 如何写好一个Spring组件的实现步骤

    2023-01-08 20:24:12
  • 详解java.lang.reflect.Modifier.isInterface()方法

    2023-07-27 18:25:25
  • Android自定义评分控件的完整实例

    2021-10-26 19:25:58
  • android实现文件读写功能

    2022-03-10 16:31:23
  • 浅谈Java由于不当的执行顺序导致的死锁

    2022-08-05 22:05:33
  • asp之家 软件编程 m.aspxhome.com