一、Servlet转发
1、什么是转发
重定向:302+localhost
在服务器组件收到用户请求后。经过处理修改用户请求。在返回给用户。这样用户再次使用这个请求就会被动的使用新的请求了。 (重定向一般是为了防止用户提交完数据后点浏览器刷新或点后退之后产生重复提交
你来找我借钱,我说没有,让你找别人
请求转发:服务器内部资源流转
在服务器组件收到用户请求后。经过它的处理后有传递给了另一个组件。不修改用户的请求码。各组件处理完之后在返回给用户,例如主页面的框架你来找我借钱,我说没有,帮你找别人借钱
区别:请求转发是一次请求一次响应实现资源转换
重定向是两次请求两次响应实现资源转换
二。、加载资源文件
第一步:建一个properties文件在WEB-INF目录下
properties文件有什么用?
与XML差不多,作为配置文件,可以从中读取需要的文件。比如可以把多语言、安全检查字段==写在properties文件中
username=Tom
password=123
第二步:在classes文件中新建一个Demo7Servlet.java
package com.java;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
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 Demo7Servlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//为什么要new properties?这是一个属性集,可以操作properties文件
Properties properties=new Properties();
//获取properties文件的路径
String path=this.getServletContext().getRealPath("config.properties");
properties.load(new FileInputStream(path));
//获取properties的属性
String name=properties.getProperty("username");
String password=properties.getProperty("password");
System.out.println(name+"===="+password);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
}
第三步:在浏览器中输入“http://localhost/Day02/java/Demo7Servlet”
myeclipse便会输出:
Tom====123
思考:为什么Demo7Servlet.java是这种形式就不行?
package com.java;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
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 Demo7Servlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//为什么要new properties?这是一个属性集,可以操作properties文件
Properties properties=new Properties();
//获取properties文件的路径,为什么这个不行?
properties.load(new FileInputStream("config.properties"));
//获取properties的属性
String name=properties.getProperty("username");
String password=properties.getProperty("password");
System.out.println(name+"===="+password);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req,resp);
}
}
原因是:文件启动的时候,是在tomcat\bin目录,而不是tomcat\webapps\Day02(即不是在properties文件所在的目录)
总结:
如果写相对路径和绝对路径,由于路径将会相对于程序启动的目录--在web环境下,就是tomcat启动的目录即tomcat/bin--所有找不到资源
如果写硬盘路径,可以找到资源,但是只要一换发布环境,这个硬盘路径很可能是错误的,同样不行.
为了解决这样的问题ServletContext提供了getRealPath方法,在这个方法中传入一个路径,这个方法的底层会在传入的路径前拼接当前web应用的硬盘路径从而得到当前资源的硬盘路径,这种方式即使换了发布环境,方法的底层也能得到正确的web应用的路径从而永远都是正确的资源的路径
this.getServletContext().getRealPath("config.properties"