Struts2的类型转换

使用标签

注意:Struts2使用标签库找不到URI:[struts-tags]的taglib[s]问题解决

新建 login2.jsp​ 文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts2.3 Login2</title>
</head>
<body>
<s:form action="login">
<s:textfield name="username" label="username"></s:textfield>
<s:textfield name="password" label="password"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
</body>
</html>

查看结果:

在 Action 中使用 ActionSupport

新增页面

login3.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts2.3 Login3</title>
</head>
<body>
<s:form action="login3">
<s:textfield name="username" label="username"></s:textfield>
<s:textfield name="password" label="password"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
</body>
</html>

LoginAction3.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package space.terwer;

import org.apache.commons.lang3.StringUtils;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction3 extends ActionSupport{
private String username;
private String password;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public void validate() {
if(StringUtils.isBlank(this.getUsername())) {
this.addFieldError("username", "username required");
}
if(StringUtils.isBlank(this.getPassword())) {
this.addFieldError("password", "password required");
}
}

public String execute() {
return "success";
}
}

修改 struts.xml 添加校验跳转 input

struts.xml

1
2
3
4
5
<!-- 使用ActionSupport -->
<action name="login3" class="space.terwer.LoginAction3">
<result name="success">/result.jsp</result>
<result name="input">/login3.jsp</result>
</action>

效果

业务验证

LoginAction2.java​ 的 execute()​ 方法添加验证逻辑

1
2
3
4
5
6
7
8
public String execute() {
if("hello".equals(this.getUsername().trim()) && "world".equals(this.getPassword().trim())){
return "success";
}

this.addFieldError("username", "username or password error");
return "failer";
}

struts.xml​ 加入跳转逻辑

1
2
3
4
5
6
<!-- 使用ActionSupport -->
<action name="login3" class="space.terwer.LoginAction3">
<result name="success">/result.jsp</result>
<result name="input">/login3.jsp</result>
<result name="failer">/login3.jsp</result>
</action>

效果

注意:result.jsp​ 里面的两种写法等价。

1
2
username:${requestScope.username}<br /> 
password:${requestScope.password }
1
2
username:<%=request.getParameter("username") %><br /> 
password:<%=request.getParameter("password") %>

类型转换深入

新建一个 input.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts2.3 convert test</title>
</head>
<body>

<h3 style="color:red;">使用逗号将点的两个坐标分隔开</h3>
<s:form action="pointConverter">
<s:textfield name="point" label="point"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:textfield name="username" label="username"></s:textfield>
<s:textfield name="date" label="birthday"></s:textfield>

<s:submit value="Submit"></s:submit>
</s:form>
</body>
</html>

Point 对象

新建一个 bean​ 为 Point.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package space.terwer.bean;

public class Point {
private Integer x;
private Integer y;

public Integer getX() {
return x;
}

public void setX(Integer x) {
this.x = x;
}

public Integer getY() {
return y;
}

public void setY(Integer y) {
this.y = y;
}
}

OGNL 官网

https://commons.apache.org/proper/commons-ognl/

新的官网

https://github.com/apache/commons-ognl

新建一个类型转换器类 PointConverter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package space.terwer.converter;

import java.util.Map;

import ognl.DefaultTypeConverter;
import space.terwer.bean.Point;

public class PointConverter extends DefaultTypeConverter {

@Override
public Object convertValue(Map context, Object value, Class toType) {
if (Point.class == toType) {
Point point = new Point();

String[] str = (String[]) value;
String[] paramValues = str[0].split(",");

Integer x = new Integer(paramValues[0]);
Integer y = new Integer(paramValues[1]);

point.setX(x);
point.setY(y);

return point;
}

if (String.class == toType) {
Point point = (Point) value;

int x = point.getX();
int y = point.getY();

String result = "[x=" + x + ", y=" + y + "]";

return result;
}

return null;
}

}

新建一个 PointAction 处理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package space.terwer.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

import space.terwer.bean.Point;

public class PointAction extends ActionSupport {
private Point point;
private Integer age;
private String username;
private Date date;

public Point getPoint() {
return point;
}

public void setPoint(Point point) {
this.point = point;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

@Override
public String execute() throws Exception {
return SUCCESS;
}
}

struts.xml 添加处理流程配置:

1
2
3
<action name="pointConverter" class="space.terwer.action.PointAction">
<result name="success">/output.jsp</result>
</action>

新增转换器配置

必须在当前 Action 同级目录新建 Action类名-conversion.properties​ ,例如:

1
PointAction-conversion.properties

内容为 需要转换的属性名称​ 和 转换器全路径​ ,例如本例子内容如下:

1
point=space.terwer.converter.PointConverter

重启服务器。

特别指出:转换器文件前面必须是Action类名,后缀必须是:

1
-conversion.properties

output.jsp 显示页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Point result</title>
</head>
<body>

point:<s:property value="point" /><br/>
age:<s:property value="age" /><br/>
username:<s:property value="username" /><br/>
date:<s:property value="date" />

</body>
</html>

查看效果

作者

Terwer

发布于

2022-10-30

更新于

2022-10-30

许可协议

评论