實現本身的控制層do-c (仿Struts2和SpringMVC)(三)

接下來咱們看一直Struts2是如何傳值的。程序員

使用Struts2接值

仍是上個jsp頁面,不過表單的action的值改變了,input標籤的name值也做了相應的修改。框架

<form id="form0" name="form0" method="post"   action="/user/save.action">
    <input type="text" name="user.username" />
    <input type="text" name="user.gender" />
    <input type="text" name="user.age" />
    <input type="text" name="user.height" />
    <input type="submit" value="提交" />
</form>

用過Struts2的同窗都知道如上正是普通的Struts提交表單的方式,用戶點擊提交,表單裏的以下值:jsp

  • user.username
  • user.gender
  • user.age
  • user.height

會被髮送到名稱爲user(下稱爲UserAction)的save方法裏(此處按正常約定,相應不會有人會將該Action的配置路徑寫成/book),在UserAction這個類中有一個名爲user的實體對象(下稱UserEntity),該對象中在UserAction中有對應的set/get方法,這樣Struts2在處理後,UserAction類的user對象的值會被相應填充。接着在要使用該對象的地方(即此處的save方法)就能夠直接用以下方式取值:模塊化

  • user.getUsername()
  • user.getGender()
  • user.getAge()
  • user.getHeight()

值得一提的是,在沒有任何業務邏輯的save()方法裏就兩句代碼,方法以下:post

public String save() {
    new UserService().save(user);
    return SUCCESS;
}

注意:如上代碼並未使用Spring的ioc功能,因此就建立了一個UserService對象用於保存實體。code

因而可知Struts2框架在普通servlet的基礎上進行了封裝,固然,Struts2框架的功能遠遠超過這些,仍是那句話,咱們只關注於接值傳值。orm

其實,UserAction的save()方法能夠讀取到user對象的值,別的其它方法也能接收到的,由於Struts2在接值的時候是面向Action類的。對象

多說一句,有不少公司(或程序員)不注重模塊化,致使代碼中一個Action類的代碼達到4000~1w行,其中有大量的私有屬性+set/get,ognl在將數據從頁面賦值給Action裏會使得程序變慢,由於我在調用save()方法時,UserAction這個類中的其它屬性(即非user屬性)都會進行封裝(更氣人的是,當Action類中的屬性對象爲空時,Strut2會爲咱們建立一個對象,當Action類中的屬性過多時問題就出現了,更更氣人的是,大多數企業使用Struts2+Hibernate進行開發,UserEntity中還會有一個部門實體對象DeptEntity,更會手慢程序)。開發

最後附上UserAction僞代碼(代碼純手寫,不必定能運行):get

public class UserAction {
    public String save() {
        new UserService().save(user);
    return SUCCESS;
    }
}
相關文章
相關標籤/搜索