zoukankan      html  css  js  c++  java
  • JavaWeb-Servlet开发2

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

    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);
        }
        
    }

  • 相关阅读:
    Javascript、CSS和IMG之网页执行探索
    从零开始学习Node.js例子九 设置HTTP头
    从零开始学习Node.js例子八 使用SQLite3和MongoDB
    如何做到 jQuery-free?
    jQuery的deferred对象详解
    使用openxml读取xml数据
    Drupal commerce 性能优化
    DataTable数据进行排序、检索、合并、分页、统计
    jquery实现替代iframe的功能
    9_Jvn框架之实现ORM持久层save操作(第九讲)
  • 原文地址:https://www.cnblogs.com/fangpengchengbupter/p/7992488.html
Copyright © 2011-2022 走看看