6 模型驱动

如何获取前台页面提交的数据(一般来说是表单)?Struts提供了模型驱动和属性驱动两种方法,让我们快速的获取提交上来的数据。本章将带大家了解Struts2中的模型驱动和属性驱动,以及比较Struts中属性驱动和模型驱动适用范围。

0 说明

本章以及后面章节将结合前端框架EasyUI构建权限管理系统,读者可自行在EasyUI官网学习。将下载的EasyUI解压,放置在webapp/jslib文件夹下,目录结构如下图所示。




1 登录界面

我们可以在webapp目录下新建webpage文件夹,专门存放前台显示页面。在webpage目录下创建一个login文件夹,专门放置登录界面login.jsp,目录结构如下图所示。





login界面主要包含一个登陆对话框,对话框里面有一个表单,表单由两个静态标签、两个输入框和两个按钮组成,界面如下图所示。





对应的代码片段如下:


<!-- 登录框 -->
<div id="login_loginDialog">
<form id="login_loginForm" method="post">
  <table>
    <tr>
    <th>用户</th>
    <td><input class="easyui-validatebox" name="username"
    data-options="required:true" />
    </td>
    </tr>
    <tr>
    <th>密码</th>
    <td><input class="easyui-validatebox" name="password"
    type="password" data-options="required:true" />
    </td>
    </tr>
  </table>
</form>
</div>


在上面代码中,我们没有看到表单提交给谁处理,而且也没有【登录】和【重置】按钮,我们可以通过javascript进行设置:


<script type="text/javascript">
$(function(){
    //初始化表单
    $("#login_loginForm").form({
        url:"${pageContext.request.contextPath}/userAction!login.action",
        success:function(data){
            var obj = eval("(" + data + ")");
            if(obj.success){
                //用户密码正确,跳转主页面
                 window.location.href = "index.jsp";
            }else{
                //提示错误信息
                $.messager.alert("提示", obj.msg, "warning");
            }
        }
    });
    //初始化登录对话框
    $("#login_loginDialog").dialog({
        title: "登录",
        closable:false,
        draggable:false,
        modal: false,
        buttons:[{
            text:"登录",
            handler:function(){
                $("#login_loginForm").submit();
            }
        },{
            text:"重置",
            handler:function(){
                $("#login_loginForm").form("clear");
            }
        }]
    });
});
</script>


在使用上述js之前,需要在页面引入easyui相关文件:


<!-- 导入EasyUI -->
<script type="text/javascript"
    src="jslib/jquery-easyui-1.4/jquery.min.js"></script>
<script type="text/javascript"
    src="jslib/jquery-easyui-1.4/jquery.easyui.min.js"></script>
<script type="text/javascript"
    src="jslib/jquery-easyui-1.4/locale/easyui-lang-zh_CN.js"></script>
<link rel="stylesheet"
    href="jslib/jquery-easyui-1.4/themes/default/easyui.css"
    type="text/css"></link>
<link rel="stylesheet" href="jslib/jquery-easyui-1.4/themes/icon.css"
    type="text/css"></link>
<!-- 导入EasyUI结束 -->

并点击登录的时候将数据提交到指定的Action类中即UserAction.java类中的login方法。完整代码如代码清单1所示。

代码清单1:login.jsp


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>ILV权限管理系统登录界面</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="ILV,权限管理,登录">
<meta http-equiv="description" content="ILV权限管理登录界面">
<!-- 导入EasyUI -->
<script type="text/javascript"
    src="jslib/jquery-easyui-1.4/jquery.min.js"></script>
<script type="text/javascript"
    src="jslib/jquery-easyui-1.4/jquery.easyui.min.js"></script>
<script type="text/javascript"
    src="jslib/jquery-easyui-1.4/locale/easyui-lang-zh_CN.js"></script>
<link rel="stylesheet"
    href="jslib/jquery-easyui-1.4/themes/default/easyui.css"
    type="text/css"></link>
<link rel="stylesheet" href="jslib/jquery-easyui-1.4/themes/icon.css"
    type="text/css"></link>
<!-- 导入EasyUI结束 -->
<script type="text/javascript">
$(function(){
    //初始化表单
    $("#login_loginForm").form({
        url:"${pageContext.request.contextPath}/userAction!login.action",
        success:function(data){
            var obj = eval("(" + data + ")");
            if(obj.success){
                //用户密码正确,跳转主页面
                 window.location.href = "index.jsp";
            }else{
                //提示错误信息
                $.messager.alert("提示", obj.msg, "warning");
            }
        }
    });
    //初始化登录对话框
    $("#login_loginDialog").dialog({
        title: "登录",
        closable:false,
        draggable:false,
        modal: false,
        buttons:[{
            text:"登录",
            handler:function(){
                $("#login_loginForm").submit();
            }
        },{
            text:"重置",
            handler:function(){
                $("#login_loginForm").form("clear");
            }
        }]
    });
});
</script>
</head>

<body class="easyui-layout">
    <!-- 登录框 -->
    <div id="login_loginDialog">
        <form id="login_loginForm" method="post">
            <table>
                <tr>
                <th>用户</th>
                <td><input class="easyui-validatebox" name="username"
                    data-options="required:true" />
                </td>
                </tr>
                <tr>
                <th>密码</th>
                <td><input class="easyui-validatebox" name="password"
                    type="password" data-options="required:true" />
                </td>
                </tr>
            </table>
        </form>
    </div>
</body>
</html>


此时运行Tomcat,在浏览器中访问:

http://localhost:8080/ilv_ic/

输入用户名和密码,FireBug将会提示如下错误:





表示在UserAction类中找不到login方法。因此,在UserAction中编写login方法如下:


public void login(){
    System.out.println("进入UserAction中的login方法");
}


重新关联项目(修改Action之后,重启可能看不到修改效果,建议重新关联项目),重启Tomcat,在登录界面输入用户名和密码,提交表单,如果在控制台看到输出语句,表示请求成功。




2 属性驱动获取表单数据

我们点击登录后,可以请求Action中制定的方法login。那么在login中如何获得提交的数据呢?按照传统的方法,可以使用HttpServletRequest对象获取参数,如下代码段:


public void login(){
    HttpServletRequest request =
                (HttpServletRequest)ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
        String username=request.getParameter("username");
    System.out.println("进入UserAction中的login方法");
    System.out.println("提交的用户名:" + username);
}


很明显,上面的代码很难阅读。因此Struts提供了属性驱动来获取页面提交的参数,给UserAction类添加和提交数据对应的名字属性username。


//属性驱动
private String username;
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}


然后,我们就可以使用属性username,Struts会自动将提交过来的数据与此属性名比对,如果提交过来的数据名一致,则将数据值赋值给username。这样,我们就可以在方法中使用这个属性变量。


public void login(){

    System.out.println("进入UserAction中的login方法");
    System.out.println("提交的用户名:" + username);
}


如果在控制台打印如下界面,表示属性驱动成功。





这种方法比传统的方法,代码简洁,且易于理解。但是如果参数很多,那么这种属性驱动方法的缺点就体现出来了,需要添加很多与页面提交数据对应的属性。要解决这个问题,需要用到模型驱动。

3 模型驱动

Struts支持将页面提交的所有数据组装成页面模型。即当一个Action请求发生的时候,拦截器会判断当前要调用的Action对象是否实现了ModelDriven接口,如果实现了这个接口,则调用getModel()方法,将提交的值 注入与页面模型属性名一致的 变量中,并把返回对象。

3.1 页面模型

要将页面数据组装成页面模型,我们需要创建一个用户页面模型,页面模型仅仅是一个简单的Java对象POJO。

代码清单2:User.java


package ilv.pageModel;
import ilv.model.IlvUser;
import java.sql.Timestamp;
public class User {
    private String id;
    private IlvUser ilvUser;
    private String username;
    private String realname;
    private String password;
    private Timestamp logintime;
    private String islock;
    private String status;
    private Timestamp createtime;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public IlvUser getIlvUser() {
        return ilvUser;
    }
    public void setIlvUser(IlvUser ilvUser) {
        this.ilvUser = ilvUser;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getRealname() {
        return realname;
    }
    public void setRealname(String realname) {
        this.realname = realname;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Timestamp getLogintime() {
        return logintime;
    }
    public void setLogintime(Timestamp logintime) {
        this.logintime = logintime;
    }
    public String getIslock() {
        return islock;
    }
    public void setIslock(String islock) {
        this.islock = islock;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public Timestamp getCreatetime() {
        return createtime;
    }
    public void setCreatetime(Timestamp createtime) {
        this.createtime = createtime;
    }
}

3.2 UserAction实现模型驱动

要Action实现模型驱动,Action 类需要实现 ModelDriven 接口,修改UserAction类。

代码清单3:UserAction.java


……
public class UserAction implements ModelDriven<User>{

    /**
     * Logger for this class
     */
    private static final Logger logger =
    Logger.getLogger(UserAction.class);

    //创建页面模型
    private User user = new User();
    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        return user;
    }
    ……
}


在上述代码中,我们让UserAction实现 ModelDriven < User > 接口,并创建页面模型user,实现ModelDriven 接口方法getModel( ),其返回组装好的页面模型user。通过user对象,我们就可以访问页面提交的数据。

修改login方法,如下代码段:


public void login(){
    System.out.println("进入UserAction中的login方法");
    System.out.println("提交的用户名:" +
    user.getUsername());
    System.out.println("提交的密码:" +
    user.getPassword());
}


重新依赖项目,启动Tomcat,提交表单,将会出现如下打印信息。




时间: 2024-11-10 00:39:41

6 模型驱动的相关文章

struts2 模型驱动

在servlet中获取页面传递过来的数据的方式是:request.getParameter("username");这个代码可以获取到页面的username的数据.在action中可以通过模型驱动的方式来获取页面的值. 例子: Jsp页面 <form action="propertydriver/propertyDriverAction_testPropertyDriver.action" method="post"> 用户名:<

模型驱动复习整理

1.模型驱动相关名词 MDPM (Model driving programming methodology) 模型驱动编程方法 MDA(Model deiven Architecture)模型驱动体系结构 OMG (Object  Management Group) 对象管理组织 UML (Unified Modeling Language) 统一建模语言 PIM (Platform Independent Model) 平台独立模型 ACSE (Abstract conceptual str

struts2 模型驱动封装

1 使用模型驱动方式,可以直接把表单数据封装到实体类对象里面 2 实现步骤 (1)action实现接口 ModelDriven User就是你创建的实体类 (2)实现接口里面的方法 getModel方法 - 把创建对象返回 (3)在action里面创建实体类对象 3 使用模型驱动和属性封装注意问题: (1)在一个action中,获取表单数据可以属性封装,使用模型驱动封装, 不能同时使用属性封装和模型驱动封装获取同一个表单数据 如果同时使用,之后执行模型驱动

模型驱动的登录系统(ModelDriven)

package model; public class UserLogin { private String username; private String password; private String result; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String get

模型驱动开发的小尝试有所收获,一起分享

现在互联网上太多这样所谓的快速开发平台,但怎么个快速法?什么样原理?普通开发者如何使用? 都太笼统了,大多我最后也弄不明白,没那么执着.我只能来讲讲自己的这个基于模型驱动开发的小程序. 正所谓无图无真相,我敢紧截了一个图上来.下图是很常见的组织.用户.角色.权限的管理界面.这界面里一共有六张数据库表,在这里可以对六张表进行增.删.改.查.在各种操作表单中有文本框,单选,选择,树型单选.多选,列表单选,多选.这些功能你需要多少时间来实现呢?再加上测试.BUG修复增加不少工作量吧? 以上所说还仅仅是

Struts2的属性驱动与模型驱动的区别

一.为什么要使用属性驱动和模型驱动? struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和 HttpServletResponse方法在获取客户端提交的数据信息的时候需要使用HttpServletRequest.getParameter()方法,并且还需要进行必要的数据类型转换.如何客户端提交的数据量大的时候,我们则需要写很多的getParameter方法.这样代码量就相应的增加不少.但是struts2为我们提供了属性驱动和模

Struts2属性驱动与模型驱动

原文地址:http://blog.csdn.net/wuwenxiang91322/article/details/11660207 为什么要使用属性驱动和模型驱动 struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获取客户端提交的数据信息的时候需要使用HttpServletRequest的getParameter()方法,并且还需要进行必要的数据类型转换.如何客户端提交的数据量大

struts2进阶【3】——模型驱动与属性驱动

一.为什么要使用属性驱动和模型驱动? struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获取客户端提交的数据信息的时候需要使用HttpServletRequest的getParameter()方法,并且还需要进行必要的数据类型转换.如何客户端提交的数据量大的时候,我们则需要写很多的getParameter方法.这样代码量就相应的增加不少.但是struts2为我们提供了属性驱动和模型

Struts2(四)属性驱动和模型驱动

一.概述 所谓模型驱动,就是使用单独的JavaBean实例贯穿整个MVC流程,与之相对应的属性驱动方式,则使用属性作为贯穿MVC流程的信息携带者.属性无法独立存下,它必须依附于一个对象,这个对象就是Action实例.简单来说,模型驱动使用单独的值对象来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 二.应用实例 以前文提到的LoginAction为例,在属性驱动中的action为: public class LoginAction extends ActionS

Struts模型驱动中文乱码!!

struts2模型驱动的中文乱码问题,只需要在tomcat的server.xml配置中修改<Connector connectionTimeout="20000" port="8088" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>就可以了.