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

【Java EE (Struts2 + Spring + Hibernate)开发】: Struts2(二)之【类型转换】
本文地址:http://blog.csdn.net/shanglianlm/article/details/49975505

1 详解 Struts 2 的类型转换

这里写图片描述

这里写图片描述

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

这里写图片描述

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 ERROR;
        }
    }
}
<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>

这里写图片描述

直接封装成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 ERROR;
        }
    }
}
<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 ERROR;
        }
    }
}

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

Element_users=org.crazyit.app.domain.User

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

List 类型

Element_<ListPropName>=<ElementType>

Map 类型

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

这里写图片描述

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 ERROR;
        }
    }
}

这里写图片描述

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 ;
    } 
}

这里写图片描述

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 name.hashCode();
    }
}

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 ERROR;
        }
    }
}
<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 users;
    }
}
<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 页面

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值