在建立Action的時候,從form角度去看有兩種可能,一種是帶form的Action,另一種是不帶form的Action,所以在使用這兩種Action的時候有幾種情況要注意:
1.比如做一個搜尋的功能,因為form裡需要提交的資料只有一個欄位,此種情況下也許為了簡單,你並不想為這一個欄位建一個form,所以你沒有建form,而是想在action裡通過request.getParameter("keyword")這種方式得到表單裡的值,因此你建了一個不帶form的action用來做Controller。在jsp頁面裡也許你會這樣寫:
<html:form action="/search">
<input type="text" name="keyword"/>
<input type="submit" value="搜尋"/>
</html:form>
運行一下,發現在訪問這個jsp頁面的時候報錯,為什麼呢?我的確有path="/search"的action啊,好下面我們來分析一下,當你使用struts的<html:form>標籤的時候,其實struts為你做了以下一些事情:
1.先看一下,web.xml裡配置struts中有以下程式碼片段:
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
這個struts-config.xml檔案在Tomcat容器啟動完畢後就已經載入了,此時struts架構就可以讀取裡面的內容了。
2.當你訪問jsp頁面,並且頁面載入到<html:form>標籤的時候,就會觸發struts架構的部分程式運行:
(1)struts會根據form裡的action路徑在struts-config.xml檔案裡進行匹配,如果匹配不到,直接報錯。
(2)如果匹配到了,繼續尋找此action所對應的form。
(3)找到後將form的名字填充到普通HTML標籤裡的form的name屬性裡。
(4)與此同時,struts會按照此form的名字在指定的範圍內找有沒有對應的formbean存在。
(5)如果沒有找到formbean,struts就會按照這個form名字利用java的反射機制建立出一個formbean執行個體來。
3.看完上面的第2點後,我們來想一想如果在struts-config.xml裡找到了action而沒有找到對應的form,會發生什麼情況?在執行上面的(4)的時候會有異常出現,原因如下:
form的名字=null;
request.getAttribute(null);
此時就引發了一個null 指標異常,顯而易見這是struts所不能容忍的,於是乎,struts在此之前就要判斷form的名字是不是null,是的話new一個自己的異常出來,大家也看的清楚些。
javax.servlet.ServletException: javax.servlet.jsp.JspException: Cannot retrieve definition for form bean null on action search.do
----------------------------------------------------------------------------------
如果把jsp裡的代碼改動如下:
<form action="search.do"> 《---這裡換成了普通的form標籤
<input type="text" name="keyword"/>
<input type="submit" value="搜尋"/>
</form>
此時能夠正常運行,因為此種寫法不會觸發struts架構執行上面的那麼多的流程,自然也就能夠正常運行了。