您现在的位置是:网站首页>博客详情博客详情

JavaWeb获取表单数据的三种方式(属性封装,表达式封装,模型驱动封装)

边小丰2019年01月30日 JavaEE 26人已围观


摘要: 在JavaWeb中,常常会遇到用户注册、提交表单数据等等,这个时候使用Struts2框架怎么获取页面的数据呢?传统的有通过域对象的方法来挨个使用getParameter方法来获取表单数据再进行操作(比如封装到一个JavaBean等等),本文主要使用Struts2框架来获取表单数据。


前言

在JavaWeb中,常常会遇到用户注册、提交表单数据等等,这个时候使用Struts2框架怎么获取页面的数据呢?传统的有通过域对象的方法来挨个使用getParameter方法来获取表单数据再进行操作(比如封装到一个JavaBean等等),本文主要使用Struts2框架来获取表单数据。

在首先会通过最传统的方法通过Servlet来获取表单数据,接着会介绍三种获取表单数据的方式,最后会对这几种方式来进行比较。

本文各类环境如下:

Struts2版本:struts-2.5.16-all
IDE:Intellij IDEA 2018.1

此外关于添加Struts2 jar包不再叙述。

Servlet域对象获取表单数据

此处使用的是最原始的方式获取表单数据,主要是操作request域来获取数据的。

方法步骤

  • 编写一个JavaBean(User),属性值为username、password。
  • 新建一个JSP页面。
  • 在action中通过ServletActionContext来获取request对象,通过request的getParameter方法来获取数据。
  • 将属性值封装到JavaBean中。

具体实现

1、编写JavaBean User
新建一个包:com.dimple.entity,然后新建一个Class,名为User。

public class User {
    private String username;
    private String password;
    /**
    * 省略部分get和set方法。
    */
}

2、新建一个JSP页面,名为login
导入标签库:

<%@ taglib prefix="s" uri="/struts-tags" %>

新建一个form表单,body内容如下:

<body>
<s:form label="登陆" action="login">
    <tr>
        <td>
            账号:
        </td>
        <td>
            <input type="text" name="username"/>
        </td>
    </tr>
    <tr>
        <td>
            密码:
        </td>
        <td>
            <input type="text" name="password"/>
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="登陆"/>
        </td>
    </tr>
</s:form>
</body>
</html>

3、新建一个包名为:com.dimple.actin,新建一个LoginAction类。

public class LoginAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        //获取Request对象
        HttpServletRequest request = ServletActionContext.getRequest();
        //获取表单属性
        String password = request.getParameter("password");
        String username = request.getParameter("username");
        //将表单数据封装到JavaBean中
        User user = new User();
        user.setPassword(password);
        user.setUsername(username);
        //输出获取到的内容
        System.out.println(user.toString());
        return NONE;
    }
}

4、配置struts.xml

<struts>
    <package name="login" extends="struts-default" namespace="/">
        <action name="login" class="com.dimple.action.LoginAction">
            <!--因为设置的返回值为none,所以不需要配置result标签-->
        </action>
    </package>
</struts>

PS:别忘了还有web.xml的filter标签哦。

结果如下:
输入账号密码后:



output页面显示:


属性封装

属性封装是一种比原始方式好一点的一种做法,但是在实际工作中的使用和原始方式一样,用的不是特别多。是一种直接将表单属性封装到action属性的一种方法。

实现步骤

  • 在action类中定义属性变量(注意:必须和jsp页面的属性值保持一致)
  • 生成get和set方法

具体实现

PS:直接在上一个示例上修改。

修改loginAction代码如下:

public class LoginAction extends ActionSupport {
    //定义变量
    private String username;
    private String password;
    //生成对应的get和set方法
/**
* 省略get和set方法
*/
    @Override
    public String execute() throws Exception {
        //将变量值封装到对象中
        User user=new User();
        user.setUsername(getUsername());
        user.setPassword(getPassword());
        System.out.println(user.toString());
        return NONE;
    }
}

结果如下:



框架实现原理分析

只能是最简单的白话文的分析:
在action类中通过request域对象来获取变量名称和值,然后与action类中的成员变量名称进行比对,如果属性名一样,那么就调用set方法将值写入。

模型驱动封装

模型驱动封装是要实现Model Driven接口。

实现步骤

  • 让action类继承Model Driven接口
  • 实现接口中的方法getModel();
  • 在action中创建JavaBean类对象

具体实现

action中代码如下:

public class LoginAction extends ActionSupport implements ModelDriven<User> {
    //创建实体类对象
    User user=new User();

    @Override
    public String execute() throws Exception {
        System.out.println(user.toString());
        return NONE;
    }
    //实现接口中的方法,返回user
    @Override
    public User getModel() {
        return user;
    }
}

实现截图



表达式封装

表达式封装是用的比较多的,具体的原因后面的比较会说到。

实现步骤

  • 在action类中声明JavaBean【注意只是声明,没有实现】
  • 生成实体类的get和set方法
  • 在JSP页面的form表单中使用表达式形式

具体实现

action类代码如下:

public class LoginAction extends ActionSupport  {
    //只是声明并不实现
    User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(user.toString());
        return NONE;
    }

}

Jsp页面中的body部分(注意和前面的进行比较):

<s:form label="登陆" action="login">
    <tr>
        <td>
            账号:
        </td>
        <td>
            <input type="text" name="user.username"/>
        </td>
    </tr>
    <tr>
        <td>
            密码:
        </td>
        <td>
            <input type="text" name="user.password"/>
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="登陆"/>
        </td>
    </tr>
</s:form>
</body>

实现截图



模型封装和表达式封装比较

共同点:这两种方式都能够将数据直接封装到实体类中去。

不同点:
- 使用模型驱动封装的方式,由于在实现接口的时候,就指明了泛型为user,这样就只能够将数据封装到一个实体类中。
- 使用表达式封装,在JSP页面就已经设置了该数据传入的对象,所以是可以将数据封装到多个实体类中的,只不过是在action方法中再多生成几个get和set方法而已。

总结

获取表单数据,这样就能与用户进行数据交互。同时,表达式封装还可以封装List、Map等等。其实方法都一样,生成对应的额get和set方法,区别主要是在JSP页面中的写法,比如封装到List中,那么JSp页面可能就要这样写了

<input type="text" name="list[0].password"/>

同理,封装到Map呢?map是键值对的结构,那么肯定是不能按照list(类似于数组)的方式来。通过使用键来获得值:

<input type="text" name="map['key'].password"/>

__EOF__

作  者Dimple
出  处/view/20
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击下方的鼓掌一下。您的鼓励是博主的最大动力!如有疑问请留言!


文章评论

我的名片

网名:Dimple | 裤兜有怪兽

职业:Java开发工程师

现居:四川省-成都市

Email:bianxiaofeng@sohu.com

每日一句

最近更新

点击排行

猜你喜欢