使用 JSP 时如何使用 Struts 2 ModelDriven 接口访问 POJO 中的属性?

2024-04-08

我有一个实现的动作类ModelDriven界面。这ModelDriven是一个常规 POJO,问题在于它的属性之一是另一个对象。

想象一下我的模型驱动is a object calledPersonand my person has an attribute calledAddressthat is another object.Addresshas regular properties such asString, 长`等

在 JSP 中,当我提交表单时,使用了所有常规属性,例如String, int, long in Person已正确映射,但所有应映射到地址的数据均未正确映射。

<s:textfield name="name" id="name" size="25" maxlength="15" />
<s:textfield name="address.zipcode" id="zipcode" size="25" maxlength="15" />

这就是我尝试映射属性的方式。名称属性我可以得到正确的结果,但是当涉及到映射该人的地址中的属性时,这种方法不起作用。

我究竟做错了什么?

及时,我的Address财产声明于Person实例化对象,所以它永远不会null.

EDIT:根据要求,这里是操作源和 DTO:

那个行动:

@Controller
@Scope("request")
public class AnAction extends BaseAction implements ModelDriven<FakeDTO> {

    private static final long serialVersionUID = 8238033889271514835L;

    @Autowired
    private FakeFacade facade;

    private FakeDTO fakeDTO = new FakeDTO();

    public String action01() {
        return Action.SUCCESS;
    }

    public String action02() {
        this.fakeDTO.setAnswer(this.fakeFacade.fakeFacadeMethod(this.fakeDTO.getComplexObject()));
        return Action.SUCCESS;
    }

    @Override
    public FakeDTO getModel() {
        return this.fakeDTO;
    }
}

主要班级FakeDTO:

public class FakeDTO implements BaseDTO {

    private static final long serialVersionUID = -2093038083351846003L;

    private FakeFilterDTO filter = new FakeFilterDTO();
    private String name;

    public FakeDTO() {
        super();
    }

    @Override
    public FakeFilterDTO getFilter() {
        return this.filter;
    }

    public void setFilter(final FakeFilterDTO filterParam) {
        this.filter = filterParam;
    }

    public String getName() {
        return this.name;
    }

    public String setName(final String nameParam) {
        this.name = nameParam;
    }
}

班上FakeFilterDTO:

public class FakeFilterDTO extends BaseFilterDTO {

    private static final long serialVersionUID = 4528040257605851210L;

    private Date aDate;
    private Long aLong;
    private Integer anInteger;
    private String aString;

    public Date getADate() {
        return this.aDate;
    }

    public void setDataInicial(final Date aDateParam) {
        this.aDate = aDateParam;
    }

    public Long getALong() {
        return this.aLong;
    }

    public void setALong(final Long aLongParam) {
        this.aLong = aLongParam;
    }

    public Integer getAnInteger() {
        return this.anInteger;
    }

    public void setAnInteger(final Integer anIntegerParam) {
        this.anInteger = anIntegerParam;
    }

    public String getAString() {
        return this.aString;
    }

    public void setAString(final String aStringParam) {
        this.aString = aStringParam;
    }
}

The struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <struts>

    <include file="META-INF/bsad/struts2/struts-config.xml" />

    <package name="reports" namespace="/reports" extends="project-default">
        <action name="anAction" class="anAction" method="action01">
            <result>/WEB-INF/pages/success.jsp</result>
            <result name="input">/WEB-INF/pages/input.jsp</result>
        </action>

    <action name="generateReport" class="anAction" method="action02">
            <result>/WEB-INF/pages/reportGenerated.jsp</result>
        </action>
    </package>
</struts>

The project-default被放置在包含struts-config.xml并延伸struts-default包包含ModelDrivenInterceptor。我可以保证这一点,因为我在这个拦截器中放置了一个断点,并且它从那里经过。

我之前用作示例的 JSP 将变为如下:

<s:textfield name="name" id="name" size="25" maxlength="15" />
<s:textfield name="filter.aString" id="zipcode" size="25" maxlength="15" />

对于公司政策,我不允许复制/粘贴实际的objects及其名称。但这就是这个想法。


In the fakeDTO那是你的模型,你应该有一个财产address它应该返回一个像这样的对象AddressDTO在这个对象中应该有一个属性zipcode.

public class FakeDTO implements BaseDTO {

  private AddressDTO address;

  public AddressDTO getAddress() {
    return address;
  }

  public void setAddress (AddressDTO address) {
    this.address = address;
  }
 ...
}

public class AddressDTO implements BaseDTO {

  private String zipcode;

  public String getZipcode() {
    return zipcode;
  }

  public void setZipcode(String zipcode) {
    this.zipcode = zipcode;

  }
 ...
}

因为你还没有发帖struts.xml你的动作配置应该包括modelDriven拦截器 https://struts.apache.org/core-developers/model-driven-interceptor.html其中包括在defaultStack扩展时默认使用struts-default包裹。看example http://www.mkyong.com/struts2/struts-2-modeldriven-example/使用的ModelDriven。模型被推送到top of the valueStack通过拦截器,所以对象就像address如果有的话应该可用默认构造函数它将由 OGNL 创建并且zipcode设置在那里。当您在 JSP 中显示字段时address.zipcode被评估为 OGNL 表达式并检索zipcode如果模型初始化了该 bean,则来自地址 bean 和邮政编码本身。 OGNL 表达式中引用的所有 bean 都应该初始化并具有 getter/setter 属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JSP 时如何使用 Struts 2 ModelDriven 接口访问 POJO 中的属性? 的相关文章

随机推荐

  • 用于生成唯一链接的 Rails 插件?

    我的应用程序中有很多地方需要生成带有唯一标记的链接 foo com g6Ce7sDygw 或其他 每个链接可能与一些会话数据相关联 并将用户带到一些特定的控制器 操作 有谁知道有一个 gem 插件可以做到这一点 它很容易实现 但会更干净 无
  • 无法通过 cloudformation yaml 创建 AWS::ECS::Service,模型验证失败

    在创建期间AWS ECS Service通过 cloudformation 我收到错误 Model validation failed 该错误与以下内容有关 HealthCheckGracePeriodSeconds和一些其他属性 错误详细
  • generateCertificate() 时出现证书异常

    我正在开发我的 Android 应用程序 我正在尝试生成X509证书来自我的证书文件流的实例 但是得到CertificateException 这是我的简单代码 import java security cert CertificateEx
  • withColumn() 中的 PySpark list() 只能工作一次,然后 AssertionError: col 应该是 Column

    我有一个 DataFrame 其中有 6 个字符串列 名为 Spclty1 Spclty6 另外 6 个字符串列名为 StartDt1 StartDt6 我想将它们压缩并折叠成如下所示的列 Spclty1 StartDt1 Spclty6
  • 究竟是什么在管理光束中的水印?

    Beam 的强大功能来自于它先进的窗口功能 但它也有点令人困惑 在本地测试中看到一些奇怪的情况 我使用rabbitmq作为输入源 其中消息并不总是得到ackd 并修复了不总是关闭的窗口 我开始挖掘 StackOverflow 和 Beam
  • C# 对带有换行符的文本字符串进行编码

    我有一个字符串正在写入响应的输出流 保存此文档并在 Notepad 或 WordPad 中打开它后 我会在预期的位置得到格式良好的换行符 但是当我使用常规的旧 Windows 记事本打开此文档时 我会得到一个带有 方形符号 的长文本字符串
  • Clearcase 中的派生对象

    我想问一下 ClearCase 中的派生对象到底是什么以及如何工作 另外我想问是否有其他程序具有相同的功能 因为在 Git MKS 或 IBM Rational Team Concert 中我找不到类似的东西 它是否已经过时了 这与动态视图
  • 如何在 JavaScript 中逐行循环换行符分隔的 json?

    我的项目中有一个 JSON 文件 如下所示 id 707860 name Hurzuf country UA coord lon 34 283333 lat 44 549999 id 519188 name Novinki country
  • SQL查询6度分离用于网络分析

    我正在使用 D3 js 构建网络分析 以在我的应用程序中显示连接的电话号码 分隔度可达六度 用于查找初始连接的 SQL postgres 如下 相当简单 然而 我对如何修改它以遍历六个级别的连接然后停止感到困惑 SELECT player
  • 更改输入焦点上的 div 颜色

    我正在尝试改变的颜色div带信s div class search container div
  • 将多个同名资源添加到 Xcode for iPhone

    是否可以在资源组中使用图像的双重名称 谢谢 您可以拥有多个同名资源 只要 1 它们不在同一目录中 并且 2 您已通过引用将资源添加到您的 Xcode 项目中 1 因为任何目录都不能包含两个同名的文件 2 因为 Xcode 尊重通过引用添加的
  • 如何检查数组中的所有元素是否为零? [复制]

    这个问题在这里已经有答案了 我想知道除了nil数组中的值 arr nil nil nil nil gt true arr nil 45 nil nil gt false 可以有任何类型的任何值 不仅45 Use the Enumerable
  • win-7 cmd 上的 GNU awk,不会将输出重定向到文件

    如果相关的话 我直接从sourceforge中的GNU指向源下载了GNU awk V 3 1 6 我正在使用 Windows 版 wget 获取 URL 页面 处理传入的文件后 我将其减少为单行 我必须从中提取一个键值 这是一个相当长的字符
  • 在起订量中重置模拟验证?

    设置如下 public interface IFoo void Fizz Test public void A var foo new Mock
  • C 字符串文字所需的转义字符

    我有一个以零结尾的字符串 char s 我正在生成 C 源代码 在运行时 并且我想输出一个表示 s 的字符串文字 它将在生成的 C 程序中生成与 s 相同的字符串 我使用的算法是 Output Foreach char c in s if
  • 使用 ASP.Net,是否有一种编程方式来截取浏览器内容的屏幕截图?

    我有一个 ASP Net 应用程序 根据需要的功能 用户希望能够截取屏幕截图 虽然我知道这可以模拟 但如果有一种方法可以获取 URL 或当前呈现的页面 并将其转换为可以存储在服务器上的图像 那就太好了 这疯了吗 有办法做到吗 如果有的话 有
  • 创建/渲染 scene2d 舞台后重置视口

    在我的游戏中 我正在绘制一个 scene2dStage使用自定义世界坐标系 然后 我想绘制一个调试 UI 上面包含一些文本 例如 FPS 但只需使用屏幕坐标 即文本位于屏幕右上角的位置 我的主要渲染方法如下所示 Override publi
  • 为什么在 Firefox 开发工具中传输的字节大于 size 字节?

    我正在衡量网站的性能 当查看 firefox developer tools 时 我注意到一个奇怪的行为 有一个特定的JS文件 传输的大小为2 831 54 KB 但实际大小为1280kb 根据 Mozilla 的说法 https deve
  • 设置 HTML 文本框的最大字数

    我想设置一个最大数量用户可以在文本框中输入的单词数 not字符数但是words 这个有可能 我做了一些挖掘 发现如何获取用户使用正则表达式输入的单词数 但我不确定如何阻止用户在达到最大值后输入更多字母 var jobValue docume
  • 使用 JSP 时如何使用 Struts 2 ModelDriven 接口访问 POJO 中的属性?

    我有一个实现的动作类ModelDriven界面 这ModelDriven是一个常规 POJO 问题在于它的属性之一是另一个对象 想象一下我的模型驱动is a object calledPersonand my person has an a