JavaWeb学习心得之Servlet(二)

来源:互联网 发布:云计算logo 编辑:程序博客网 时间:2024/05/16 19:57

一、ServletConfig说明

1.配置Servlet初始化参数

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

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <display-name>ServletDemo</display-name>  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list>  <servlet>      <servlet-name>ServletDemo02</servlet-name>      <servlet-class>com.hanxin.ServletDemo02</servlet-class>      <!-- 初始化参数 -->      <init-param>          <param-name>username</param-name>          <param-value>hanxin</param-value>      </init-param>      <init-param>          <param-name>password</param-name>          <param-value>123456</param-value>      </init-param>  </servlet>  <servlet-mapping>      <servlet-name>ServletDemo02</servlet-name>      <url-pattern>/servletDemo02.do</url-pattern>  </servlet-mapping></web-app>

2.获取Servlet初始化参数

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 ServletDemo02 extends HttpServlet{private ServletConfig config;/* * 当servlet配置了初始化参数后,web容器在创建servlet实例对象时, * 会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时, * 将ServletConfig对象传递给servlet。进而,通过ServletConfig对象就可以 * 得到当前servlet的初始化参数信息。 * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) */@Overridepublic void init(ServletConfig config) throws ServletException {this.config = config;}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取所有初始化参数Enumeration<String> e =  config.getInitParameterNames();//获取输出流PrintWriter pw = response.getWriter();//输出所有参数到浏览器while(e.hasMoreElements()){String name = e.nextElement();//获取ServletConfig对象中的初始化参数String value = config.getInitParameter(name);pw.print(name+"="+value+"\r");}pw.flush();pw.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}
访问结果:


二、ServletContext对象

       web容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象,它代表当前web应用。由于web应用的所有servlet共享一个ServletContext对象,因此可以通过ServletContext对象来实现通讯,ServletContext也叫做context域对象。


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

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 ServletDemo01 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取ServletContext对象ServletContext context = this.getServletContext();//保存变量到ServletContext中context.setAttribute("data", "hanxin");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}

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 ServletDemo02 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取ServletContext对象ServletContext context = this.getServletContext();//获取ServletContext中的变量String data = String.valueOf(context.getAttribute("data"));response.getWriter().println(data);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}

配置web.xml(可以同时配置多个Servlet),参考文章。

先后访问ServletDemo01和ServletDemo02,访问结果。



2.获取web应用的初始化数据

       web.xml中<web-app>根标签,使用标签<context-param>来配置初始化参数。

  <!-- 配置web应用初始化参数 -->  <context-param>      <param-name>webAppName</param-name>      <param-value>ServletDemo</param-value>  </context-param>

       获取web应用初始化参数

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 ServletDemo03 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取ServletContext对象ServletContext context = this.getServletContext();//获取ServletContext初始参数String data = context.getInitParameter("webAppName");response.getWriter().println(data);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}
访问结果



3.实现请求转发

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 ServletDemo04 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext context = getServletContext();//获取转发对象RequestDispatcher rd = context.getRequestDispatcher("/servletDemo05.do");rd.forward(request, response);//调用forward方法实现请求转发}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}
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 ServletDemo05 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext context = getServletContext();response.getWriter().print("this is demo05");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}
访问结果:


4.利用ServletContext对象读取资源文件

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 ServletDemo06 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目录下的com.hanxin包中的db4.properties配置文件     * @param response     * @throws IOException     */    private void readPropCfgFile2(HttpServletResponse response)            throws IOException {        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/hanxin/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目录下的com.hanxin包中的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);    }}


5.利用类加载器读取资源文件

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;/** * 用类装载器读取资源文件 * 通过类装载器读取资源文件的注意事项:不适合装载大文件,否则会导致jvm内存溢出 * @author gacl * */public class ServletDemo07 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);            }        /**     * 读取类路径下的资源文件     * @param response     * @throws IOException     */    private void test1(HttpServletResponse response) throws IOException {        //获取到装载当前类的类装载器        ClassLoader loader = ServletDemo07.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 = ServletDemo07.class.getClassLoader();        //用类装载器读取src目录下的com.hanxin包中的db4.properties配置文件        InputStream in = loader.getResourceAsStream("com/hanxin/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目录下的com.hanxin包中的db4.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);    }}



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

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 ServletDemo08 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String data = "hello world";        /**         * 设置数据合理的缓存时间值,以避免浏览器频繁向服务器发送请求,提升服务器的性能         * 这里是将数据的缓存时间设置为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);    }}



原创粉丝点击