Properties对象和转发与重定向
用一段代码来展示Properties 类和ServletContext的使用 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取代表当前 web 应用的 ServletContext 对象,注意它的获取方法 ServletContext servletContext = getServletContext(); //需求: 在该 Servlet 中把 db.properties 文件中的内容读出来. Properties props = new Properties(); //根据给定的相对于当前 web 应用的地址, 返回其绝对路径 String filePath = servletContext.getRealPath("/WEB-INF/db.properties"); System.out.println("filePath: " + filePath); InputStream fis = null; //new FileInputStream(filePath); //根据给定的相对于当前 web 应用的地址, 返回其对应的输入流 fis = servletContext.getResourceAsStream("/WEB-INF/db.properties"); //Properties 对象装载当前输入的property文件 props.load(fis); //获取当前 web 应用的初始化参数 String contextParam = servletContext.getInitParameter("contextParam"); //获取property文件中配置的各个参数的值 String name = props.getProperty("name"); String password = props.getProperty("password"); String url = props.getProperty("url"); String driver = props.getProperty("driver"); //下面的代码和前面功能相同,只是展示servletContext直接读取于当前 web 应用根路径的相对路径下的文件的流对象 fis = servletContext.getResourceAsStream("/WEB-INF/classes/db12345.properties"); props.load(fis); name = props.getProperty("name"); password = props.getProperty("password"); url = props.getProperty("url"); driver = props.getProperty("driver"); //如果这个文件在src目录下,则就处于当前类的classLoader控制,可以使用类加载器来获得其流对象。 fis = TestServletContext.class.getClassLoader().getResourceAsStream("cn/itcast/servlet/db12345.properties"); props.load(fis); name = props.getProperty("name"); password = props.getProperty("password"); url = props.getProperty("url"); driver = props.getProperty("driver"); } 请求转发和重定向 首先明确两个概念 当前 web 应用的根路径:就是WEB-INF目录的父目录。 当前站点根路径:就是服务器的ip。如果是本机就是localhost 页面在一定条件下需要转到别的页面这个时候我们需要使用请求转发器或者重定向 先演示请求转发 //1.1 获取请求转发器 RequestDispatcher dispatcher = null; dispatcher = req.getRequestDispatcher("test.jsp"); //1.2 转发页面 dispatcher.forward(req, resp); 使用重定向 resp.sendRedirect("test.jsp"); 两者的区别 转发和重定向的共同点 1. 都可以实现页面的跳转 * 转发和重定向的区别 1. 转发浏览器地址栏地址不发生变化, 重定向发生变化 2. “/” 的含义: 转发 --> 当前 web 应用的根路径 重定向 --> web 站点的根路径 对于上面的例子,当请求的页面是类似"test.jsp"的时候,系统默认在当前web应用的根路径下去寻找相关页面, 但是如果是"/test.jsp" 对于请求转发器,还是在当前web 应用的根路径下寻找 对于重定向则是在服务器或者localhost为根目录寻找相关页面。特别的是,对于重定向,如果这个地址写成了“http://--”的话,系统就会去网络连接相应的网站。 同样这样的“http://--”如果是在转发器中,就会在"WEB-INF的父目录下"这样去找一定是什么都找不到。 3. 可以连接的资源: 转发 --> 只能链接到当前 web 应用的相关资源 重定向 --> 可以链接到当前 web 应用以外的网页 4. 是否可以访问 WEB-INF 下的资源: 转发 --> yes, 重定向 --> no 5. 向服务器发了多少个请求: 转发 --> 1 次, 可以共享页面请求的 request 对象,以为尽管实际上页面发生了变化,可是两次请求的页面对象共享相同的第一次请求的request 对象。在这种情况下,转发到的页面也可以获得第一个页面中传递的参数; 重定向 --> 2 次, 不可以共享页面请求的 request 对象。两次请求之间的request对象间没有关系,第二次请求的页面也无法获得自己转发过来前的第一个页面的任何参数数据。 关于ServletConfig的补充 Servlet在有些情况下可能需要访问Servlet容器或借助Servlet容器访问外部的资源,所以,Serlvet引擎需要将表示Servlet容器的对象传递给Servlet。另外,在web.xml文件中为某个Servlet设置的友好名称和初始化参数等信息也需要传递给该Servlet。 Servlet引擎将代表Servlet容器的对象(ServletContext)和Servlet的配置参数信息一并封装到一个称为ServletConfig的对象中,并在初始化Servlet实例对象时传递给该Servlet。ServletConfig接口则用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关信息。 这个ServletConfig的对象就是在如下的init方法中由引擎生成并且传递到Servlet程序中去的。 public void init(ServletConfig config) throws ServletException Servlet引擎调用Servlet的实例对象的init(ServletConfig config)方法将ServletConfig对象传递给Servlet。Servlet.getServletConfig()方法必须返回init(ServletConfig config)方法传递进来的这个ServletConfig对象的引用。 |