【SSH】——使用ModelDriven的利与弊

青旅半醒 2022-08-05 11:15 261阅读 0赞
  1. 在以往的web开发中,如果要在表单显示什么内容,我们就需要在Action中提前定义好表单显示的所有属性,以及一系列的getset方法。如果实体类的属性非常多,那么Action中也要定义相同的属性。在Struts2中,ModelDriven模型驱动就提供了另一种方式,减少了重复性的代码。
  2. 下面我们就来具体看看在项目中如何使用:
  3. 以用户管理为例,除jsp页面外,四个包actiondaoservicevo
  4. 调用关系:action——>service——>dao

Center

首先,无论是哪种方法,vo包中的User类都是一样的。

  1. public class User {
  2. //用户id
  3. private Integer uid;
  4. //用户名
  5. private String username;
  6. //密码
  7. private String password;
  8. public Integer getUid() {
  9. return uid;
  10. }
  11. public void setUid(Integer uid) {
  12. this.uid = uid;
  13. }
  14. public String getUsername() {
  15. return username;
  16. }
  17. public void setUsername(String username) {
  18. this.username = username;
  19. }
  20. public String getPassword() {
  21. return password;
  22. }
  23. public void setPassword(String password) {
  24. this.password = password;
  25. }
  26. }

在Action中,如果不使用模型驱动,我们需要一一构造User对象的属性,作为参数传入调用。

使用模型驱动,就要实现ModelDriven这个接口,内部方法也很简单。

  1. public abstract interface com.opensymphony.xwork2.ModelDriven {
  2. public abstract java.lang.Object getModel();
  3. }
  4. public class UserAction {
  5. private int uid;
  6. private String username;
  7. private String password;
  8. public String login(){
  9. //构造user对象
  10. User user = new User();
  11. user.setUId(id);
  12. user.setUsername(username);
  13. user.setPassword(password);
  14. User exitUser=userService.login(user);
  15. if(exitUser==null){
  16. this.addActionError("登录失败");
  17. return "login";
  18. }else{
  19. //用户信息存入session、
  20. ServletActionContext.getRequest().getSession().setAttribute("exitUser",exitUser);
  21. return "loginSuccess";
  22. }
  23. }
  24. public int getUId() {
  25. return uid;
  26. }
  27. public void setId(int uid) {
  28. this.uid = uid;
  29. }
  30. //剩下的get和set方法省去
  31. ......
  32. ......
  33. }

而如果使用模型驱动,我们只需要让Action类去实现ModelDriven接口。

  1. public class UserAction extends ActionSupport implements ModelDriven<User> {
  2. //模型驱动使用的对象
  3. private User user=new User();
  4. //MdoelDriven中的方法
  5. public User getModel(){
  6. return user;
  7. }
  8. //注入userservice
  9. private UserService userService;
  10. public void setUserService(UserService userService) {
  11. this.userService = userService;
  12. }
  13. /**
  14. * 登录
  15. */
  16. public String login(){
  17. User exitUser=userService.login(user);
  18. if(exitUser==null){
  19. this.addActionError("登录失败");
  20. return "login";
  21. }else{
  22. //用户信息存入session、
  23. ServletActionContext.getRequest().getSession().setAttribute("exitUser",exitUser);
  24. return "loginSuccess";
  25. }
  26. }
  27. }
  28. 另外,模型驱动的好处还体现在**数据回显**时的应用。
  29. Action中,模型驱动的实体是CategorySecond,因而在回显jsp页面数据的时候,不需要保存到ValueStack值栈中,而一级分类集合cList需要保存到值栈中,前台才可以获取到值。
  30. public class AdminCategorySecondAction extends ActionSupport implements ModelDriven<CategorySecond>{
  31. //
  32. //
  33. //其余代码省去
  34. //编辑二级分类
  35. public String edit(){
  36. //查询二级分类
  37. categorySecond=categorySecondService.findByCid(categorySecond.getCsid());
  38. //查询一级分类
  39. List<Category> cList=categoryService.findAll();
  40. //保存到值栈中
  41. ActionContext.getContext().getValueStack().set("cList", cList);
  42. return "editSuccess";
  43. }
  44. }

前台的部分显示如下:

  1. <tr>
  2. <td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
  3. 二级分类名称:
  4. </td>
  5. <td class="ta_01" bgColor="#ffffff" >
  6. <input type="text" name="csname" value="<s:property value="model.csname"/>" id="userAction_save_do_logonName" class="bg"/>
  7. </td>
  8. <td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
  9. 所属的一级分类:
  10. </td>
  11. <td class="ta_01" bgColor="#ffffff" >
  12. <select name="category.cid">
  13. <s:iterator var="c" value="cList">
  14. <option value="<s:property value="#c.cid"/>" <s:if test="#c.cid==model.category.cid">selected</s:if>><s:property value="#c.cname"/></option>
  15. </s:iterator>
  16. </select>
  17. </td>
  18. </tr>

二级分类信息使用model来显示数据,而一级分类信息接收action中传来的cList。两种方法都可以实现数据显示,但模型驱动更为简单方便。

小结:

  1. Struts2提供的两种方式:属性驱动和模型驱动。模型驱动可以提高代码的重用性,使得操作简便。但在小型项目中,表单比较少时,并不提倡使用模型驱动。还有一点,在上面的例子中也能看出,模型驱动只能对应一个对象,当表单数据来源比较复杂时,使用模型驱动也无法起到十分明显的作用。

发表评论

表情:
评论列表 (有 0 条评论,261人围观)

还没有评论,来说两句吧...

相关阅读

    相关 微服务

    什么是微服务架构,为什么使用微服务架构\* ***一、传统系统架构和微服务架构*** 传统的系统架构是单一架构模式。这种架构模式就是把应用整体打包部署,具体的样式依...

    相关 使用JAVA反射

    在Java的20周年的纪念日的日子里,让我们来重新温习下Java里面的高级知识,Java肯定希望大家了解她,要不然你跟她天天相濡以沫了这么长时间,让她知道你竟然不了解她,不在乎

    相关 人工智能

    随着现代科学技术的飞速发展,先进的技术在各个领域都得到了广泛的应用,使得生产力获得了大幅度的提高,为改善人民生活水平作出了巨大贡献。下一次生产力飞跃的突破口在哪里?目前越来越多