在JavaWeb中,常常会遇到用户注册、提交表单数据等等,这个时候使用Struts2框架怎么获取页面的数据呢?传统的有通过域对象的方法来挨个使用getParameter方法来获取表单数据再进行操作(比如封装到一个JavaBean等等),本文主要使用Struts2框架来获取表单数据。
在首先会通过最传统的方法通过Servlet来获取表单数据,接着会介绍三种获取表单数据的方式,最后会对这几种方式来进行比较。
本文各类环境如下:
Struts2版本:struts-2.5.16-all
IDE:Intellij IDEA 2018.1
此外关于添加Struts2 jar包不再叙述。
此处使用的是最原始的方式获取表单数据,主要是操作request域来获取数据的。
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">
action>
package>
struts>
PS:别忘了还有web.xml的filter标签哦。
结果如下:
输入账号密码后:
output页面显示:
属性封装是一种比原始方式好一点的一种做法,但是在实际工作中的使用和原始方式一样,用的不是特别多。是一种直接将表单属性封装到action属性的一种方法。
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中代码如下:
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类代码如下:
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页面可能就要这样写了
type="text" name="list[0].password"/>
同理,封装到Map呢?map是键值对的结构,那么肯定是不能按照list(类似于数组)的方式来。通过使用键来获得值:
`