問題描述:
在webroot中有個index.jsp 在index.jsp中寫個表單。
現在在webroot中有個sub文件夾,sub文件夾中有個submit.jsp想得到index.jsp表單的數據
index.jsp
< form action="????這邊要怎么寫才才能指向submit.jsp" method="post">
數據
< /form>
問題解決:
HTML的相關路徑與絕對路徑的問題。
先看一下下面的URL:
http://192.168.1.1:8080/hello/index.html
一個URL由
服務器地址: http://192.168.1.1:8080
WEB應用上下文: /hello
網頁或請求: /index.html
三個部分組成。
WEB應用發布時,WEB應用上下文可以自行指定,如放在ROOT/下的話,WEB應用上下文就是空,如:
http://192.168.1.1:8080/index.html
它的WEB應用上下文就是空。
HTML協議中要求,form的action屬性,以“/”開頭是絕對路徑,不以“/”開頭的是相對路徑。
絕對路徑是相對於服務器地址而言的,相對路徑是相對於當前網頁或請求而言的。
舉一個例子,你的當前網頁位置是:
http://192.168.1.1:8080/hello/page/index.html
其中/hello是WEB應用上下文;/page/index.html是網頁。
在這個網頁上有一個請求需要指向
http://192.168.1.1:8080/hello/servlet/checkUser.cgi
index.html中的form應該怎么寫呢?
可以寫成絕對路徑(相對於http:/192.168.1.1:8080)
< form action="/hello/servlet/checkUser.cgi" >
...
< /form>
也可以寫成相對路徑(相對於http://192.168.1.1:8080/hello/page)
< form action="../servlet/checkUser.cgi" >
...
< /form>
當前如果你的WEB應用是基於JSP的話,有許多第三方的標簽庫如JSTL或基於Struts的標簽庫都可以在form中自動為你加上WEB應用上下文,如二樓東走西顧的例子。
如果你准備在JSP使用基本語句生成網頁的話,六樓honglei915提供了一個很好的例子,只不過“/”更規范一些,如:
< %!String basePath=request.getContextPath();%>
< form action="<%=basePath%>/sub/submit.jsp" method="post">
< /form>
在JSP中,腳本化語言如“<%=contextPath%>”可以從page,request,session及application中取值。
下面的代碼可以看到結果是因為contextPath被保存在page中:
< % String contextPath = request.getContextPath(); %>
< form action="<%=contextPath%>/sub/submit.jsp" method="post">
< /form>
EL表達式如“${contextPath}”只能從request,session及application中取值。
上述代碼修改一下就可以支持EL表達式:
< %
String contextPath = request.getContextPath();
// 將contextPath保存到request中
request.setAttribute("contextPath", contextPath);
%>
< form action="${contextPath}/sub/submit.jsp" method="post">
< /form>
另外還有兩個方法:
方法一:
< %!String basePath=request.getContextPath();%>
< form action="<%=basePath%>\sub\submit.jsp" method="post">
< /form>
basePath 是你項目的根路徑,推薦這樣做,不管以后你的sub 文件夾怎么移動,都是可以成功提交的。
使用這個方法需要理解"<%=basePath%>是什么
關於"<%=basePath%>的理解請參考:http://www.cnblogs.com/fifiyong/p/JSP.html
方法二:
<form action="${pageContext.request.contextPath}/sub/submit.jsp" method="post">
< /form>
${pageContext.request.contextPath}等價於<%=request.getContextPath()%> 或者可以說是<%=request.getContextPath()%>的EL版 意思就是取出部署的應用程序名或者是當前的項目名稱
比如項目名稱是ajax01 在瀏覽器中輸入為http://localhost:8080/ajax01/login.jsp ${pageContext.request.contextPath}或<%=request.getContextPath()%>取出來的就是/ajax01,而"/"代表的含義就是http://localhost:8080
所以我們項目中應該這樣寫${pageContext.request.contextPath}/login.jsp
