struts2的参数的封装形式
背景:经常要求获得视图层传过来的很多数据,一般都是一个实体类的n多属性,很多时候实体类的属性特别多,
这时候如果还是按以前的方式在action里面一个个的定义出这些属性的私有变量,然后在提供set、get方法的话,
这样就会使整个action太臃肿,严重妨碍了代码的可阅读性,并且也违背了代码的可复用性,
这时我们就需要对这些请求参数进行封装,提高代码的可复用性
页面数据和Action有两种基本对应方式:属性驱动和模型驱动
属性驱动分两种:基本数据类型的属性对应(属性驱动)和 javaBean风格的属性对应(直接使用域对象)
1.利用实体类封装参数(直接使用域对象)
①创建实体类User(包括用户名和密码属性)
②创建action,从表单提交的数据会根据User实体类的属性进行封装
public class LoginAction extends ActionSupport { private User user; public User getUser() { returnuser; } publicvoid setUser(User user) { this.user = user; } public String execute(){ if(user.getUsername().equals("admin")&&user.getPassword().equals("123456")) return"success"; return"fail"; } }
③定义表单,注意:表单里面的控件的name属性定义有一定的要求,定义name时我们应该定义为:对象.属性的形式
示例代码(在相应的name属性上,添加一个域对象的前缀,指明这个值到底对应打哪一个域对象里面去)
<s:form action="LoginAction"> <s:actionerror/> <s:textfield name="user.username"></s:textfield> <s:password name="user.password"></s:password> <s:submit value="提交" ></s:submit> </s:form>
2.模型驱动封装请求参数
模型驱动是指使用JavaBean来封装来回请求的参数.这种方式的好处就是减少了action的压力。
既用于封装来回请求的参数,也保护了控制逻辑,使它的结构清晰.这就是模型驱动的优势.模型驱动的实现主要在Action上
①.首先建立一个实体。
②、建立action类,继承自ActionSupport,实现ModelDriven接口,这个接口定义一个getModel()方法,
用于返回定义的Model,然后调用set方法,进行赋值
publicclass LoginAction3 extends ActionSupport implements ModelDriven<User> { private User user=new User();//这里记住要实例化 private LoginService loginService=new LoginServiceImpl();//这里是调用登录的业务处理逻辑 Override public User getModel() { return user; ·} public String execute() { System.out.println(user.getUsername()); System.out.println(user.getPassword()); if(loginService.isLogin(user.getUsername(),user.getPassword())) { return SUCCESS; } return INPUT; }
ModelDrivenAction类的执行流程是:首先调用getModel()方法得到User对象,接着根据
JavaBean的原则将客户端传过来的属性,一个一个的set到User对象的属性中,将属性全部set完之后,
再执行execute()方法。对于模型驱动页面name属性不需要前缀
3.属性驱动接收参数(属性驱动)
页面控件的name属性和Action的属性或者与属性对应的getter/setter相对应
①jsp页面:
<form action="sys/login.action" method="post"> <input type="text" name="username"> <input type="submit" value="submit"> </form>
②Action:直接通过get、set方法获取。
public class sysAction extends ActionSupport{ private String username; public String login() throws Exception { System.out.println(username); return SUCCESS; } public String getUsername() { return username; } public void setUsername(String username) { this.username= username; } }
总结:
①属性驱动(基本数据类型的属性对应):
优点:简单,页面那么和属性直接对应
缺点:导致Action类看上去比较零乱,功能单一
②属性驱动(直接使用域对象)
优点:把模型数据从Action中分离出来
缺点:页面必须添加前缀
③模型驱动
优点:把模型数据从Action中分离出来
缺点:Action实现特殊接口
最后三种方式可以混合使用!!!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥