【Java EE (Struts2 + Spring + Hibernate)开发】: Struts2(二)之【类型转换】 ​

1 详解 Struts 2 的类型转换

【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【类型转换】_java

【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【类型转换】_hibernate_02

1-1 Struts 2 内建的类型转换器

【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【类型转换】_spring_03

1-2 基于 OGNL 的类型转换

public class LoginAction implements Action
//User类型属性封装请求参数
private User user;
private String tip;

//user属性的setter和getter方法
public void setUser(User user)
{
this.user = user;
}
public User getUser()
{
return this.user;
}

//tip属性的setter和getter方法
public void setTip(String tip)
{
this.tip = tip;
}
public String getTip()
{
return this.tip;
}

public String execute() throws Exception
{
//通过user属性的name属性和pass属性来判断控制逻辑
if (getUser().getName().equals("crazyit.org")
&& getUser().getPass().equals("leegang") )
{
setTip("登录成功");
return SUCCESS;
}
else
{
setTip("登录失败!!");
return
<s:form action="login">
<!-- 该表单域封装的请求参数名为user.name -->
<s:textfield name="user.name" label="用户名"/>
<!-- 该表单域封装的请求参数名为user.pass -->
<s:textfield name="user.pass" label="密码"/>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>

【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【类型转换】_spring_04

直接封装成Map

public class LoginAction implements Action
//Action类里包含一个Map类型的参数
//Map的value类型为User类型
private Map<String , User> users;
private String tip;

//users属性的setter和getter方法
public void setUsers(Map<String , User> users)
{
this.users = users;
}
public Map<String , User> getUsers()
{
return this.users;
}

//tip属性的setter和getter方法
public void setTip(String tip)
{
this.tip = tip;
}
public String getTip()
{
return this.tip;
}

public String execute() throws Exception
{
//在控制台输出Struts 2封装产生的List对象
System.out.println(getUsers());
//根据Map集合中key为one的User实例来决定控制逻辑
if (getUsers().get("one").getName().equals("crazyit.org")
&& getUsers().get("one").getPass().equals("leegang") )
{
setTip("登录成功!");
return SUCCESS;
}
else
{
setTip("登录失败!!");
return
<s:form action="login">
<s:textfield name="users['one'].name" label="第one个用户名"/>
<s:textfield name="users['one'].pass" label="第one个密码"/>
<s:textfield name="users['two'].name" label="第two个用户名"/>
<s:textfield name="users['two'].pass" label="第two个密码"/>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>

直接封装成List

<s:form action="login">
<s:textfield name="users[0].name" label="第一个用户名"/>
<s:textfield name="users[0].pass" label="第一个密码"/>
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].pass" label="第二个密码"/>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>

1-3 指定集合元素的类型

Struts 2 允许开发者通过局部类型文件来指定集合元素的类型。类型转换文件就是一个普通的 Properties (*.properties) 文件,里面包含了类型转换的相关配置信息。

public class LoginAction implements Action
//Action类里包含一个List类型的参数
//List集合元素为User类型
private List users;
private String tip;

//users属性的setter和getter方法
public void setUsers(List users)
{
this.users = users;
}
public List getUsers()
{
return this.users;
}

//tip属性的setter和getter方法
public void setTip(String tip)
{
this.tip = tip;
}
public String getTip()
{
return this.tip;
}

public String execute() throws Exception
{
//在控制台输出Struts 2封装产生的List对象
System.out.println(getUsers());
//因为没有使用泛型,所以要进行强制类型转换
User firstUser = (User)getUsers().get(0);
//users属性的第一个User实例来决定控制逻辑
if (firstUser.getName().equals("crazyit.org")
&& firstUser.getPass().equals("leegang") )
{
setTip("登录成功!");
return SUCCESS;
}
else
{
setTip("登录失败!!");
return

局部类型转换文件 LoginAction-conversion.properties

Element_users=org.crazyit.app.domain.User

局部类型转换文件文件名应该为 ActionName-conversion.properties。

List 类型

Element_<ListPropName>=<ElementType>

Map 类型

Key_<MapPropName>=<KeyType>
Element_<MapPropName>=<ValueType>

【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【类型转换】_struts_05

1-4 自定义类型转换器

public class LoginAction implements Action
private User user;
private String tip;

//user属性的setter和getter方法
public void setUser(User user)
{
this.user = user;
}
public User getUser()
{
return this.user;
}

//tip属性的setter和getter方法
public void setTip(String tip)
{
this.tip = tip;
}
public String getTip()
{
return this.tip;
}

public String execute() throws Exception
{
if (getUser().getName().equals("crazyit.org")
&& getUser().getPass().equals("leegang") )
{
setTip("登录成功!");
return SUCCESS;
}
else
{
setTip("登录失败!!");
return

【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【类型转换】_类型转换_06

public class UserConverter extends DefaultTypeConverter
//类型转换器必须重写convertValue方法,该方法需要完成双向转换
public Object convertValue(Map context
, Object value, Class toType)
{
//当需要将字符串向User类型转换时
if (toType == User.class )
{
//系统的请求参数是一个字符串数组
String[] params = (String[])value;
//创建一个User实例
User user = new User();
//只处理请求参数数组第一个数组元素,
//并将该字符串以英文逗号分割成两个字符串
String[] userValues = params[0].split(",");
//为User实例赋值
user.setName(userValues[0]);
user.setPass(userValues[1]);
//返回转换来的User实例
return user;
}
else if (toType == String.class )
{
//将需要转换的值强制类型转换为User实例
User user = (User) value;
return "<" + user.getName() + ","
+ user.getPass() + ">";
}
return null

【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【类型转换】_类型转换_07

1-5 注册类型转换器

1-6 基于 Struts 2 的自定义类型转换器

public class UserConverter extends StrutsTypeConverter
//实现将字符串类型转换成复合类型的方法
public Object convertFromString(Map context
, String[] values , Class toClass)
{
//创建一个User实例
User user = new User();
//只处理请求参数数组第一个数组元素,
//并将该字符串以英文逗号分割成两个字符串
String[] userValues = values[0].split(",");
//为User实例赋值
user.setName(userValues[0]);
user.setPass(userValues[1]);
//返回转换来的User实例
return user;
}
//实现将复合类型转换成字符串类型的方法
public String convertToString(Map context, Object o)
{
//将需要转换的值强制类型转换为User实例
User user = (User) o;
return "<" + user.getName() + ","
+ user.getPass() + ">";
}
}

1-7 处理 Set 集合

public class LoginAction extends ActionSupport
private Set users;
private Date birth;
//user属性的setter和getter方法
public void setUsers(Set users)
{
this.users = users;
}
public Set getUsers()
{
return this.users;
}
//birth属性的setter和getter方法
public void setBirth(Date birth)
{
this.birth = birth;
}
public Date getBirth()
{
return this.birth;
}
//没有提供execute()方法,
//将直接使用ActionSupport的execute()方法
public class UserConverter extends StrutsTypeConverter
public Object convertFromString(Map context
, String[] values, Class toClass)
{
Set result = new HashSet();
for (int i = 0; i < values.length ; i++ )
{
//创建一个User实例
User user = new User();
//只处理请求参数数组第一个数组元素,
//并将该字符串以英文逗号分割成两个字符串
String[] userValues = values[i].split(",");
//为User实例的属性赋值
user.setName(userValues[0]);
user.setPass(userValues[1]);
//将User实例添加到Set集合中
result.add(user);
}
return result;
}

public String convertToString(Map context, Object o)
{
//如果待转换对象的类型是Set
if (o.getClass() == Set.class)
{
Set users = (Set)o;
String result = "[";
for (Object obj : users )
{
User user = (User)obj;
result += "<" + user.getName()
+ "," + user.getPass() + ">";
}
return result + "]";
}
else
{
return "";
}
}
}
public class User
{
private String name;
private String pass;

//name属性的setter和getter方法
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}

//pass属性的setter和getter方法
public void setPass(String pass)
{
this.pass = pass;
}
public String getPass()
{
return this.pass;
}

public boolean equals(Object obj)
{
//待比较的两个对象是同一个对象,直接返回true
if(this == obj)
{
return true;
}
//只有当obj是User对象
if (obj != null && obj.getClass() == User.class)
{
User user = (User)obj;
//两个对象的name属性相等即认为二者相等。
if (this.getName().equals(user.getName()))
{
return true;
}
}
return false;
}
//根据name属性来计算hashCode。
public int hashCode()
{
return

1-8 类型转换中的错误处理

public class LoginAction
extends ActionSupport
private User user;
private String tip;

//user属性的setter和getter方法
public void setUser(User user)
{
this.user = user;
}
public User getUser()
{
return this.user;
}

//tip属性的setter和getter方法
public void setTip(String tip)
{
this.tip = tip;
}
public String getTip()
{
return this.tip;
}

public String execute() throws Exception
{
if (getUser().getName().equals("crazyit.org")
&& getUser().getPass().equals("leegang") )
{
setTip("登录成功!");
return SUCCESS;
}
else
{
setTip("登录失败!!");
return
<struts>
<!-- 配置国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="mess"/>
<package name="lee" extends="struts-default">
<action name="login" class="org.crazyit.app.action.LoginAction">
<!-- 配置名为input的逻辑视图,
当转换失败后转入该逻辑视图 -->
<result name="input">/input.jsp</result>
<result name="success">/welcome.jsp</result>
<result name="error">/welcome.jsp</result>
</action>
<action name="">
<result>.</result>
</action>
</package>
</struts>
public class LoginAction extends ActionSupport
private User user;

//user属性的setter和getter方法
public void setUser(User user)
{
this.user = user;
}
public User getUser()
{
return user;
}
//没有execute方法,直接使用ActionSupport的execute方法
public class LoginAction extends ActionSupport
private List<User> users;

//users属性的setter和getter方法
public void setUsers(List<User> users)
{
this.users = users;
}
public List<User> getUsers()
{
return
<s:fielderror
<h3>类型转换的错误处理</h3>
<s:form action="login">
<s:iterator value="{0, 1, 2}" status="stat">
<!-- 将会依次生成多个请求参数 -->
<s:textfield name="users[%{#stat.index}]"
label="第%{#stat.index}个用户信息"/>
</s:iterator>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>

2 使用 Struts 2 的输入校验

2-1 编写校验规则文件

2-2 国际化提示信息

2-3 使用客户端校验

2-4 字段校验器配置风格

2-5 非字段校验器配置风格

2-6 短路校验器

2-7 校验文件的搜索规则

2-8 校验顺序和短路

2-9 内建校验器

2-10 基于 Annotation 的输入校验

2-11 手动完成输入校验

3 使用 Struts 2 控制文件上传

3-1 Struts 2 的文件上传

3-2 实现文件上传的 Action

3-3 配置文件上传的 Action

3-4 手动实现文件过滤

3-5 拦截器实现文件过滤

3-6 输出错误提示

3-7 文件上传的常量配置

4 使用 Struts 2 控制文件下载

4-1 实现文件下载的 Action

4-2 配置 Action

4-3 下载前的授权控制

5 详解 Struts 2 的拦截器机制

5-1 拦截器在 Struts 2 中的作用

5-2 Struts 2 内建的拦截器

5-3 配置拦截器

5-4 使用拦截器

5-5 配置默认拦截器

5-6 实现拦截器类

5-7 使用拦截器

5-8 拦截方法的拦截器

5-9 拦截器的执行顺序

5-10 拦截结果的监听器

5-11 覆盖拦截器栈里特定拦截器的参数

5-12 使用拦截器完成权限控制

6 使用 Struts 2 的 Ajax 支持

6-1 使用 stream 类型的 Result 实现 Ajax

6-2 JSON 的基础知识

6-3 实现 Action 逻辑

6-4 JSON 插件与 json 类型的 Result

6-5 实现 JSP 页面