实现本身的控制层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;
    }
}
相关文章
相关标签/搜索