url匹配問題

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路徑參數和待返回的頁面所處文件一致,只要名字匹配且可以找到資源,就沒有問題。這種寫法無疑對命名和資源位置有了很大的限制,所以個人喜歡用絕對路徑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章