絕對路徑:是從盤符開始的路徑,形如 // 多用在后台中
C:\windows\system32\cmd.exe
相對路徑:是從當前路徑開始的路徑 //多用在前端
/開頭的通常表示絕對路徑:
/表示站點路徑的場景如下(其他情況是在服務器上跳轉 / 表示項目的根)
(1) 重定向
(2) 超鏈接
(3) action表單
在web項目中,為了安全,可能需要把jsp文件放在WEB-INF目錄下,這樣如果我們的頁面中出現超鏈接a標簽或者js的location.href去直接轉向到WEB-INF下的某一個jsp頁面,那么就會引用不到,因為這樣的請求方式是客戶端的請求,而WEB-INF頁面只對服務端開放,對客戶端是不可見的。(只能通過轉發的方式進入)
1 超鏈接
<body> <a href="/tiaozhuan/views/index.jsp">超鏈接jsp跳轉</a> //進入jsp頁面 <a href="/tiaozhuan/servletA">超鏈接跳服務器(注解)</a> <a href="/tiaozhuan/servletB">超鏈接跳服務器(web.xml)</a> </body> (1) 方式1 通過注解進入servlet @WebServlet("/servletA") public class ChaoLianJieServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"+Thread.currentThread().getName()); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost"+Thread.currentThread().getName()); //doGet(req, resp); } (2) 方式2 通過web.xml配置進入servlet public class ChaoLianjieServlet1 extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("ChaoLianjieServlet1 +doPost"); doGet(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doPost(req, resp); } } web.xml <servlet> <servlet-name>servletB</servlet-name> <servlet-class>com.rl.chaolianjie.ChaoLianjieServlet1</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletB</servlet-name> <url-pattern>/servletB</url-pattern> </servlet-mapping>
action :
<form method="post" action="/tiaozhuan/servletB"> <input type="submit" value="submit"/> </form> <servlet> <servlet-name>servletB</servlet-name> <servlet-class>com.rl.chaolianjie.ChaoLianjieServlet1</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletB</servlet-name> <url-pattern>/servletB</url-pattern> </servlet-mapping> public class ChaoLianjieServlet1 extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("ChaoLianjieServlet1 +doPost"); //doGet(req, resp); } }
重定向和轉發:
<form method="post" action="/tiaozhuan/servletA"> <input type="submit" value="submit1"/> </form> <form method="get" action="/tiaozhuan/servletA"> <input type="submit" value="submit2"/> </form> @WebServlet("/servletA") public class ChaoLianJieServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.sendRedirect("/tiaozhuan/views/index.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher("/views/index.jsp").forward(req, resp); }
讀取文件/獲取初始化參數:
1 配置
<servlet> <servlet-name>servletB</servlet-name> <servlet-class>com.rl.chaolianjie.ChaoLianjieServlet1</servlet-class> <init-param> <param-name>name</param-name> <param-value>zhang</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
2 獲取
String path=getServletContext().getRealPath("/file/web.xml"); System.out.println(path); BufferedReader br=new BufferedReader( new FileReader(new File(path))); System.out.println(br.readLine()); //獲取初始化參數 String name=getServletContext().getInitParameter("name"); String nameconf=getServletConfig().getInitParameter("name"); resp.getWriter().print(name+"getServletContext");//null resp.getWriter().print(nameconf+"getServletConfig");//有值
1.FileTest.class.getResource("")
得到的是當前類FileTest.class文件的URI目錄。不包括自己!
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/
2.FileTest.class.getResource("/")
得到的是當前的classpath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
3.Thread.currentThread().getContextClassLoader().getResource("")
得到的也是當前ClassPath的絕對URI路徑。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
4.FileTest.class.getClassLoader().getResource("")
得到的也是當前ClassPath的絕對URI路徑。
服務器上:沒加 /
System.out.println("bb"+Thread.currentThread().getContextClassLoader().getResource(""));
System.out.println("cc"+ChaoLianJieServlet.class.getResource(""));
bbfile:/D:/work/eclipse/workspaceOne/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/tiaozhuan/WEB-INF/classes/
ccfile:/D:/work/eclipse/workspaceOne/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/tiaozhuan/WEB-INF/classes/com/rl/chaolianjie/
服務器上 : 加 了/
System.out.println("aa"+Thread.currentThread().getContextClassLoader().getResource("/"));
System.out.println("dd"+ChaoLianJieServlet.class.getResource("/"));
aafile:/D:/work/eclipse/workspaceOne/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/tiaozhuan/WEB-INF/classes/
ddfile:/D:/work/eclipse/workspaceOne/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/tiaozhuan/WEB-INF/classes/
本地:
URL path=FileResourse.class.getResource("/");
System.out.println(path); // file:/D:/work/eclipse/workspaceOne/tiaozhuan/build/classes/
URL path1=FileResourse.class.getResource("");
System.out.println(path1); //file:/D:/work/eclipse/workspaceOne/tiaozhuan/build/classes/com/rl/chaolianjie/
URL a=Thread.currentThread().getContextClassLoader().getResource("");
System.out.println(a); //file:/D:/work/eclipse/workspaceOne/tiaozhuan/build/classes/
URL b= Thread.currentThread().getContextClassLoader().getResource("/");
System.out.println(b); null
URL c=Thread.currentThread().getClass().getResource("");
System.out.println(c); null
URL path2 = Thread.currentThread().getContextClassLoader().getResource("/");
URL path3 = Thread.currentThread().getContextClassLoader().getResource("");
System.out.println(path2); null
System.out.println(path3); file:/D:/work/eclipse/workspaceOne/tiaozhuan/build/classes/
服務器上:加了/ Thread.currentThread().getContextClassLoader().getResource("/")和當前類.class.getResource("/")的值都是classpath的絕對URI路徑
不加/ Thread.currentThread().getContextClassLoader().getResource("")得到的是classpath的絕對URI路徑 而當前類.class.getResource("")的值是包結構下
本地 加了/ 當前類.class.getResource("/") 是classpath 下絕對URI , Thread.currentThread().getContextClassLoader().getResource("/")是null
不加/ 當前類.class.getResource("")是當前孢結構下 T hread.currentThread().getContextClassLoader().getResource("") 是 classpath 下 絕對URI 路徑