Servlet中的屬性(attribute)和參數(parameter)的區別


1.引子

        初學者對屬性(attribute)和參數(parameter)容易搞混。沒搞清他們的區別,項目中就可能出現一此莫名其妙的問題。

2.兩者的區別

1) 屬性(attribute)

      屬性是在后台servlet中設置並獲取的 , 用方法setAttribute(name, o) 和 getAttribute(name)實現;

1     //JDK源碼
2      public void setAttribute(String name, Object o);
3      public Object getAttribute(String name);

      從源碼也可以看出,屬性的類型是任意類型的Object,在java后台代碼中處理的業務千差成別,傳遞的數據類型一定要適應各種場景、條件,而Object這個所有類型的父類就可以滿足這個要求。在獲取屬性時需要強制類型轉換(為了獲得該對象傳遞過來的數據),轉換為它真實的類型,如果將其類型轉換為其他非真實類型,將會導致類型轉換失敗,並拋出異常。

      EmpAttend attend = getQueryCondition(request);
         //可以設置任意類型的屬性
          request.setAttribute("attendOfQuery", attend);
          request.setAttribute("greet", "hello");
          
          //必須轉換為其真實的數據數據
          EmpAttend empAttend=(EmpAttend)request.getAttribute("attendOfQuery");
          String greet=(String)request.getAttribute("greet");

 

2) 參數(parameter)

       參數主要是將前端頁面標簽攜帶的信息(標簽的name作為參數名,標簽的value作為參數值)作為參數(可以類似地看成在前端頁面設置參數)往后台傳遞數據。一般地,只能在后台獲取參數或繼續接力傳遞參數,而絕不能在后台設置參數,那么也就不存在后台往前台傳參數這種可能了。另外還有一種情況,將參數拼接在URL中,可以變相地將實現“在后台設置參數”、“后台往前台傳遞參數”,但這並不是真正意義上的打破了原有的規則,因為URL還算是前端的內容。

    //JDK源碼
    public String getParameter(String name);

 

      從源碼也可以看出,參數的類型只有String這唯一確定的數據類型。這也與現實相符,前端頁面,諸如表單等標簽攜帶的數據只能是文本類型的數據,它很難攜帶其他復雜類型的數據。

      從IDE工具的代碼提示功能可以看出,只能設置屬性setAttribute(String,Object),而沒有設置參數setParameter(String,String)的方法。

 

3. 變相打破規則

1)“后台往前台傳遞參數”(在后台設置參數)

    //后台servlet中的方法
    public String modify(HttpServletRequest request, HttpServletResponse response)
    {
        EmpAttend modifyAttend=getModifyData(request);
        System.out.println("修改的考勤信息是" + modifyAttend);
      int modifyRows=  adi.update(modifyAttend);
        System.out.println("修改考勤的記錄行數是" + modifyRows);
return "forward:attendServlet?action=getAll&flag=修改信息方法中的url傳遞參數測試";
    }

 

//前端查詢結果展示頁面
<p>
        <a href="save.jsp">添加</a>
    </p>
<label>${param.flag }</label>
    <table width="60%" align="center" class="table">

 

 頁面顯示

 

      可以看到,前台頁面將servlet類中方法返回的url所包含的參數正確的顯示出來了。

2) “前台往前台傳遞參數”

//查詢結果頁面的table >td標簽中的超鏈接URL中拼接參數
 <a href="modify.jsp?id=${attend.id}&eno=${attend.eno}
 &ename=${attend.ename}&deptno=${attend.deptno }&daydate=${attend.dayDate}"
  >修改</a>

 

        //修改頁面獲取前一個前台頁面傳遞過來的參數
      考勤編號:<label>${param.id}</label> <br/>&nbsp;&nbsp;號:<label>${param.eno}</label> <br/>&nbsp;&nbsp;名:<label>${param.ename}</label>  <br/>
        部門編號:<label>${param.deptno}</label>  <br/>&nbsp;&nbsp;期:<label>${param.daydate}</label>  <br/>
    

 

 

 

       從以上兩圖可看出,修改頁面已經成功獲取另一個前台頁面傳遞過來的參數。這說明了通過URL拼接參數,可以在不同前台頁面間傳遞參數(Paramater),但是要注意在使用EL表達式是應該用"${param.name}“的格式,而不是”${name}";前者是獲取參數(Paramater),而后者是在請求(request)中獲取屬性(Attribute),如果EL表達式用錯了,將不能獲得對應的參數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM