url匹配問題
·servel.xml
·web.xml
·前端action
·後端的轉發或重定向
url的解析分爲
前端解析(html中action,後端的重定向)
後端解析(web.xml,後端轉發)。
在後端解析中,/ 代表應用的上下文,即name+port+path
在前端解析中,/ 代表name+port
後端解析url需要考慮應用的上下文。
以簡單的example爲例
index.html
<form action="user/logon">
U:<input name="username"></input>
P:<input name="password"></input>
<input type="submit"></input>
web.xml
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>user.login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/user/logon</url-pattern>
</servlet-mapping>
user.login
public class login extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
String url=request.getRequestURI();
System.out.println(url);
//String contentPath=request.getContextPath();
//System.out.println(contentPath);
//if(lastcontentString.equals("zero")) {
//PrintWriter write=response.getWriter();
//write.write(lastcontentString);//}
if(username.equals("root")&&password.equals("dota6.78b")) {
//success();
try {
request.getRequestDispatcher("/user/success.html").forward(request, response);
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
//error();
response.sendRedirect("/test/user/error.html");
return;
}
}
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {
doGet(request, response);
}
在web.xml中,url匹配路徑爲/user/logon。即當請求爲name+port+path+/user/logon,該動作可以被識別轉發到相應處理類上。
在index.xml中,不帶/的寫法爲相對路徑,即頁面當前路徑爲name+port+path時,該動作可以被識別。完整補充爲name+port+path+/user/logon。
帶/的寫法應該爲/test/user/logon。即name+port保持不變,完全替換url部分。
還可以將請求提交給外部服務器,寫法爲以http/https開頭。
在user.login中,可以看到轉發與重定向寫法是不同的,
轉發爲服務器內部動作,url解析由服務器執行,/代表了name+port+path
而重定向是將參數傳遞給客戶端,由客戶端解析url,所以傳遞的參數應該爲包含應用上下文的url即path+路徑。
那麼在user.login中是否可以使用不帶/的相對路徑呢,如果可以,則該url又是如何拼裝匹配的呢
1.將重定向和轉發統一修改爲user/success.html和user/error.html
The requested resource (/test/user/user/success.html) is not available
可以看到該url拼接的規則統一爲 當前應用目錄+參數
2.將重定向和轉發統一修改爲success.html和error.html。
測試完全沒問題
神奇的事情發生了,後端並不知道前端頁面所在文件夾,經僅僅因爲前端請求的url路徑參數和待返回的頁面所處文件一致,只要名字匹配且可以找到資源,就沒有問題。這種寫法無疑對命名和資源位置有了很大的限制,所以個人喜歡用絕對路徑。