• ServletServletConfig和ServletContext


    1.ServletConfig

      web容器启动后,会读取web.xml,根据其中每个servlet的设置,加载servlet类并实例化,并为每个servlet生成一个ServletConfig对象,而后调用Servlet接口的init()方法,将产生的ServletConfig对象当做参数传入。

      ServletConfig定义了getInitParameter()和getInitParameterNames()方法,可以取得设置Servlet时的初始参数。

      public class AddMessage extends HttpServlet {

        private String PARAM1;

        private String PARAM2;

     

        public void init() throws ServletException {

          super.init();

          PARAM1 = getServletConfig().getInitParameter("PARAM1");

          PARAM2 = getServletConfig().getInitParameter("PARAM2");

        }

        ...

      }

      GenericServlet类也定义了同样地方法,所以上例可改成:

      

      public class AddMessage extends HttpServlet {

        private String PARAM1;

        private String PARAM2;

     

        public void init() throws ServletException {

          super.init();

          PARAM1 = getInitParameter("PARAM1");

          PARAM2 = getInitParameter("PARAM2");

        }

        ...

      }

     

    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 LoginServlet extends HttpServlet {
    private String SUCCESS_VIEW;
    private String ERROR_VIEW;

    @Override
    public void init() throws ServletException {
    super.init();
    SUCCESS_VIEW = this.getInitParameter("SUCCESS");
    ERROR_VIEW = this.getInitParameter("ERROR");
    }

    protected void doPost(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    String name = request.getParameter("name");
    String passwd = request.getParameter("passwd");
    if("caterpillar".equals(name) && "123456".equals(passwd)) {
    request.getRequestDispatcher(SUCCESS_VIEW)
    .forward(request, response);
    }
    else {
    request.getRequestDispatcher(ERROR_VIEW)
    .forward(request, response);
    }
    }

    }

     

    2.ServletContext

      ServletContext是整个web应用运行后的代表对象,可以通过ServletConfig的getServletContext()方法来取得。

      getRequestDispatcher()方法可以取得RequestDispatcher对象,使用时路径参数的指定必须以“/”开头,表示应用的根目录(context root)。

      getResourceAsStream()方法读取应用中某个文件,指定路径时必须以“/”开头。

      getResourcePaths()列出某个目录下的文件。指定路径时必须以“/”开头。

      针对整个web应用的初始化参数可以在web.xml中设置为<context-param>。读取这些参数要通过ServletContextListener。如果想知道web应用何时初始化何时结束销毁,可以实现ServletContextListener,并在web.xml中设置<listener>,调用实现类的contextInitialized()或contextDestroyed()方法。当容器调用contextInitialized()或contextDestroyed()方法时,会传入ServletContextEvent,其封装了ServletContext,可以通过getServletContext()取得,之后可以进行初始参数的读取了。

      在整个web应用生命周期内,servlet所需共享的数据可以设置为ServletContext属性。

      

        <context-param>
    <param-name>AVATAR</param-name>
    <param-value>/avatars</param-value>
    </context-param>
    <listener>
    <listener-class>AvatarInitializer</listener-class>
    </listener>

     

    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;

    public class AvatarInitializer implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
    ServletContext context = sce.getServletContext();
    String avatars = context.getInitParameter("AVATAR");
    context.setAttribute("avatars", avatars);
    }

    public void contextDestroyed(ServletContextEvent sce) {
    }
    }

    package cc.openhome;

    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class AvatarServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Servlet AvatorServlet</title>");
    out.println("</head>");
    out.println("<body>");
    String avatarDir = (String) getServletContext().getAttribute("avatars");
    Iterator<String> avatars = getServletContext()
    .getResourcePaths(avatarDir).iterator();
    while (avatars.hasNext()) {
    String avatar = avatars.next().replaceFirst("/", "");
    out.println("<img src=\"" + avatar + "\">");
    }
    out.println("</body>");
    out.println("</html>");
    out.close();
    }
    }



     

  • 相关阅读:
    类例程_java战斗程序
    "类"的讲稿
    象棋中“车”的攻击范围_C#
    面向对象_方法_例题
    入门例子
    MyBatis
    MyBatis
    MyBatis
    Spring
    Hibernate学习
  • 原文地址:https://www.cnblogs.com/liuping/p/2221890.html
Copyright © 2020-2023  润新知