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/> 工 號:<label>${param.eno}</label> <br/> 姓 名:<label>${param.ename}</label> <br/> 部門編號:<label>${param.deptno}</label> <br/> 日 期:<label>${param.daydate}</label> <br/>
從以上兩圖可看出,修改頁面已經成功獲取另一個前台頁面傳遞過來的參數。這說明了通過URL拼接參數,可以在不同前台頁面間傳遞參數(Paramater),但是要注意在使用EL表達式是應該用"${param.name}“的格式,而不是”${name}";前者是獲取參數(Paramater),而后者是在請求(request)中獲取屬性(Attribute),如果EL表達式用錯了,將不能獲得對應的參數。