Struts自定义类型转换器实战

本文介绍如何在Struts框架中实现局部类型转换器,通过自定义转换器将请求参数转换为特定对象,如User类。文章详细展示了输入页面、配置文件、领域模型、自定义类型转换器、Action类及测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 视图

1 input.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>局部类型转换器</title>
</head>
<body>
<h3>局部类型转换器</h3>
<s:form action="login">
    <s:textfield name="user" label="用户"/>
    <tr>
        <td colspan="2"><s:submit value="转换" theme="simple"/>
        <s:reset value="重填" theme="simple"/></td>
    </tr>
</s:form>
</body>
</html>

2 welcome.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>转换结果</title>
</head>
<body>
    <s:actionmessage/>
    用户名为:<s:property value="user.name"/><br/>
    密码为:<s:property value="user.pass"/><br/>
</body>
</html>

二 配置文件

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="lee" extends="struts-default">
        <action name="login" class="org.crazyit.app.action.LoginAction">
            <result>/WEB-INF/content/welcome.jsp</result>
            <result name="error">/WEB-INF/content/welcome.jsp</result>
        </action>
        <action name="*">
            <result>/WEB-INF/content/{1}.jsp</result>        
        </action>
    </package>
</struts>

三 领域模型

package org.crazyit.app.domain;


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

}

四 自定义类型转换器

package org.crazyit.app.converter;

import java.util.Map;
import ognl.DefaultTypeConverter;

import org.crazyit.app.domain.*;

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

五 action

package org.crazyit.app.action;

import com.opensymphony.xwork2.ActionSupport;

import org.crazyit.app.domain.*;

public class LoginAction extends ActionSupport
{
    private User user;

    // user的setter和getter方法
    public void setUser(User user)
    {
        this.user = user;
    }
    public User getUser()
    {
        return this.user;
    }
    public String execute() throws Exception
    {
        if (getUser().getName().equals("crazyit.org")
            && getUser().getPass().equals("leegang") )
        {
            addActionMessage("登录成功!");
            return SUCCESS;
        }
        addActionMessage("登录失败!!");
        return ERROR;
    }
}

对应的转换属性文件

#指定Action的user属性需要使用UserConverter类来完成类型转换
user=org.crazyit.app.converter.UserConverter

六 测试

 

资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在网页设计中,为图片添加文字是一种常见的需求,用于增强视觉效果或传达更多信息。本文将介绍两种常用的方法:一种是将图片设置为背景并添加文字;另一种是利用<span>标签结合CSS定位来实现。 这种方法通过CSS实现,将图片设置为一个容器(通常是<div>)的背景,然后在容器中添加文字。具体步骤如下: 创建一个包含文字的<div>元素: 使用CSS设置<div>的背景图片,并调整其尺寸以匹配图片大小: 如有需要,可使用background-position属性调整图片位置,确保文字显示在合适位置。这样,文字就会显示在图片之上。 另一种方法是将文字放在<span>标签内,并通过CSS绝对定位将其放置在图片上。步骤如下: 创建一个包含图片和<span>标签的<div>: 设置<div>为相对定位,以便内部元素可以相对于它进行绝对定位: 设置<span>为绝对定位,并通过调整top和left属性来确定文字在图片上的位置: 这种方法的优点是可以精确控制文字的位置,并且可以灵活调整文字的样式,如颜色和字体大小。 两种方法各有优势,可根据实际需求选择。在实际开发中,还可以结合JavaScript或jQuery动态添加文字,实现更复杂的交互效果。通过合理运用HTML和CSS,我们可以在图片上添加文字,创造出更具吸引力的视觉效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值