java servlet 路径_JavaServlet 路径书写总结
在寫javaweb項目的時候,總會遇到路徑書寫的問題,現在將其作個總結。
在javaweb中需要書寫路徑的地方主要有這四大類:
客服端路徑
超鏈接
表單
重定向
服務器端路徑
轉發
包含
資源獲取路徑
servletContext獲取資源
ClassLoader獲取資源
Class獲取資源
路徑
現分別作介紹
其構建的javaweb如下:
1客服端路徑
A超鏈接
pageEncoding="UTF-8"%>
html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">
頁面A這是絕對地址超鏈接
這是以"/"開頭的相對地址超鏈接
這是不以"/"開頭的相對地址超鏈接
B表單
pageEncoding="UTF-8"%>
html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">
Insert?title?hereusername:
username:
username:
username:
username:
username:
C重定向
package?cn.ccnu.path;
import?java.io.IOException;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
/*
*?重定向有三種路徑書寫方式
*??????1.絕對路徑
*??????2.以"/"開頭的相對路徑
*??????3.不以"/"開頭的相對路徑
*/
public?class?RedirectServlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
response.sendRedirect("http://localhost:8080/javaee/jsp/b.jsp");
/*
*?2.以"/"開頭的相對路徑
*??????此時,/代表整個web工程的路徑,即http://localhost:8080/
*/
//??????response.sendRedirect("/javaee/jsp/b.jsp");
/*
*?3.不以"/"開頭的相對路徑
*??????此時是相對于當前資源的相對路徑
*??????當前資源路徑為:http://localhost:8080/javaee/RedirectServlet
*??????即表示:RedirectServlet在路徑http://localhost:8080/javaee之下
*??????而b.jsp在http://localhost:8080/javaee/jsp/b.jsp
*??????所以最終地址寫為:jsp/b.jsp
*/
//??????response.sendRedirect("jsp/b.jsp");
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
}
2服務器端路徑
A請求轉發
package?cn.ccnu.path;
import?java.io.IOException;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
/*
*?服務器端的路徑不能是絕對路徑,只能是相對路徑,也分為以/開頭和不以/開頭兩種
*??????1.以"/"開頭的相對路徑
*??????2.不以"/"開頭的相對路徑
*/
public?class?DispatcherServlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
/*
*?1.以"/"開頭的相對路徑
*??????此時,/代表當前web項目,即:http://localhost:8080/javaee
*/
//??????request.getRequestDispatcher("/jsp/b.jsp").forward(request,?response);
/*
*?2.不以"/"開頭的相對路徑
*??????相對于當前資源的相對路徑
*??此時,當前資源的路徑為:http://localhost:8080/javaee/DispatcherServlet
*??所以要轉發去的資源的路徑以:http://localhost:8080/javaee開頭
*/
request.getRequestDispatcher("jsp/b.jsp").forward(request,?response);
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
}
B請求包含
package?cn.ccnu.path;
import?java.io.IOException;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
/*
*?請求包含不能書寫絕對地址,只能書寫相對地址
*??????1.以"/"開頭的相對路徑
*??????2.不以"/"開頭的相對路徑
*
*/
public?class?IncludeServlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
/*
*?1.以"/"開頭的相對路徑
*??????此時,/代表當前web項目,即:http://localhost:8080/javaee
*/
//??????request.getRequestDispatcher("/jsp/b.jsp").include(request,?response);
/*
*?2.不以"/"開頭的相對路徑
*??????相對于當前資源的相對路徑
*??此時,當前資源的路徑為:http://localhost:8080/javaee/IncludeServlet
*??所以要轉發去的資源的路徑以:http://localhost:8080/javaee開頭
*/
request.getRequestDispatcher("jsp/b.jsp").include(request,?response);
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
}
3資源獲取路徑
AServletContext獲取資源
package?cn.ccnu.path;
import?java.io.IOException;
import?java.io.InputStream;
import?java.util.Properties;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
/*
*?ServletContext獲取資源必須是相對路徑,不能是絕對路徑,但不管是以/開頭,還是不以/開頭,
*?都是相對于當前資源的相對路徑
*
*/
public?class?ServletContextServlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
String?path1?=?this.getServletContext().getRealPath("/a.properties");
String?path2?=?this.getServletContext().getRealPath("a.properties");
System.out.println(path1);
System.out.println(path2);
//輸出的地址一樣
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
}
BClassLoader獲取資源
package?cn.ccnu.classloaderpath;
import?java.io.IOException;
import?java.io.InputStream;
import?java.util.Properties;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
/*
*?ClassLoader類加載器不能通過絕對地址來加載資源,只能通過相對地址來加載資源
*?但相對地址不管前面加不加/都是相當于類路徑的相對地址
*
*/
public?class?ClassLoaderServlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
/*
*?加了/,其地址是相對于類路徑的相對地址
*/
//??????InputStream?in?=?this.getClass().getClassLoader().getResourceAsStream("/cn/ccnu/classloaderpath/c.properties");
//??????Properties?prop?=?new?Properties();
//??????prop.load(in);
//??????System.out.println(prop.getProperty("url"));
/*
*?不加/,其地址是相對于類路徑的相對地址
*/
InputStream?in?=?this.getClass().getClassLoader().getResourceAsStream("cn/ccnu/classloaderpath/c.properties");
Properties?prop?=?new?Properties();
prop.load(in);
System.out.println(prop.getProperty("url"));
/*
*?總結:不能使用絕對地址,而只能只用相對地址
*?且不管加不加/的相對地址,都是相對于類路徑的相對地址
*
*/
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
}
CClass獲取資源
package?cn.ccnu.classpath;
import?java.io.IOException;
import?java.io.InputStream;
import?java.util.Properties;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
/*
*?Class讀取資源不能是絕對路徑,只能是相對路徑,又分為以/開頭或者是不以/開頭
*??????1.以/開頭的相對路徑
*??????2.不以/開頭的相對路徑
*/
public?class?ClassServlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
/*
*?1.以/開頭的相對路徑
*??????此時的/代表類路徑,即:/javaee/WEB-INF/classes
*/
//??????InputStream?in?=?ClassServlet.class.getResourceAsStream("/cn/ccnu/classpath/b.properties");
//??????Properties?porp?=?new?Properties();
//??????porp.load(in);
//??????System.out.println(porp.getProperty("url"));
/*
*?2.不以/開頭的相對路徑
*??????此時相對的是:類ClassServlet.class的路徑,即:\javaee\WEB-INF\classes\cn\ccnu\classpath
*??????即:/javaee/WEB-INF/classes/cn/ccnu/classpath
*/
InputStream?in?=?ClassServlet.class.getResourceAsStream("b.properties");
Properties?porp?=?new?Properties();
porp.load(in);
System.out.println(porp.getProperty("url"));
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
}
4路徑
要么以“*”開關,要么為“/”開頭,當通常情況看下,我們都會以"/"開頭。
Servlet的路徑跳轉
一、JSP跳轉到Servlet
1、相對路徑,如href="servlet/TestServlet"
如果寫成"/servlet/TestServlet"會報錯,因為第一個“/”表示的是【服務器根目錄】
2、絕對路徑,通過內置成員變量path實現,如href="/servlet/TestServlet"
path得到的是項目根目錄,如【http://localhost:8080/ServletDemo】
二、Servlet跳轉JSP1、請求重定向:response.sendRedirect(request.getContextPath()+"/xxx.jsp");
request.getContextPath()獲得項目根目錄,或者通過"../xxx.jsp"取得上層路徑得到
2、服務器內部轉發:
request.getRequestDispatcher("../xxx.jsp").forward(req,resp);
request.getRequestDispatcher("/test.jsp").forward(request, response); //斜線表示項目的根目錄
小結:Servlet都可以通過../xxx.jsp獲取路徑
三、web.xml的路徑
web.xml的必須以“/”開頭,“/”表示項目的根目錄
在JSP頁面上使用相對路徑和絕對路徑調用servlet
web.xml的必須以“/”開頭,“/”表示項目的根目錄
如果在Servlet中使用請求重定向方式跳轉到其他jsp頁面,則需要:
response.sendRedirect(request.getContextPath()+"/test.jsp");
服務器內部跳轉路徑:
request.getRequestDispatcher("/test.jsp").forward(request,response);//這里的斜線表示項目的根目錄
或者request.getRequestDispatcher("../test.jsp").forward(request,response);//“..”表示回到上層目錄也就是根目錄;
PS:如果帶一層路徑 如:/servlet/loginServlet,則內部轉發的時會從WebRoot/servlet/路徑下找jsp頁面,如果要轉發的頁面不在WebRoot/servlet/路徑下,則需要“..”回到上層或根目錄再定位到jsp頁面,如下:request.getRequestDispatcher("../test.jsp").forward(request,response);
如果要轉發的頁面在WebRoot/servlet/路徑下,則如下:request.getRequestDispatcher("/test.jsp").forward(request,response);
總結
以上是生活随笔為你收集整理的java servlet 路径_JavaServlet 路径书写总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有事说事下一句是什么呢?
- 下一篇: java ee有哪些工具_JavaEE开