【问题标题】:Struts2 <s:iterator> random duplicating valuesStruts2 <s:iterator> 随机重复值
【发布时间】:2013-08-16 03:16:06
【问题描述】:

使用的技术:Struts2、JPA (EclipseLink)、Apache Derby 数据库。

我的项目在 图像托管 上,我已将 UserEntity(父级)配置为包含对 ImageEntity 的引用。

我有一个名为userEntity 的会话变量,它是登录时获取的用户对象。 JSP 页面myUploads.jsp 使用用户对象中的列表并显示所有值。我使用了struts迭代器标签&lt;s:iterator&gt;来循环List

问题:

&lt;s:iterator&gt; 随机复制行。

注意:我查过数据库,没有重复,可以观察到重复的条目共享相同的图像ID。

JSP 代码:

<table border="1">
        <thead>
            <tr>
                <th>Name</th>
                <th>Comments</th>
                <th>Link</th>
                <th>Image</th>
                <th>Delete image</th>
                <th>Share details</th>
            </tr>
        </thead>
        <tbody>
            <s:iterator value="#session.userEntity.images" var="image">

                <s:url id="imageURL" action="myUploads" >
                    <s:param name="imageID" value="#image.id"></s:param>
                </s:url>

                <s:url id="deleteImageURL" action="deleteImage" method="deleteImage">
                    <s:param name="imageID" value="#image.id"></s:param>
                </s:url>
                 <tr>
                        <td><s:property value="#image.name"/></td>
                        <td><s:property value="#image.comments"/></td>
                        <td><s:a href="%{imageURL}" cssClass="linkStyle">
                                <s:property value="#image.imageName"/>
                            </s:a></td>
                        <td>
                           <s:a href="%{imageURL}" cssClass="linkStyle"> <img width="200" height="200" src="<s:url action='ImageAction'><s:param name='imageID' value="#image.id"></s:param></s:url>" /> </s:a></td>
                        <td>
                            <s:a href="%{deleteImageURL}" cssClass="linkStyle">
                                Delete
                            </s:a>   </td>
                        <td>
                           <s:if test="%{#image.shares != null}">
                               <ul> 
                               <s:iterator value="#image.shares" var="share">
                                   <li><s:property value="#share.fullName"/></li>
                               </s:iterator>
                               </ul>
                           </s:if>
                        </td>
                    </tr>

            </s:iterator>
        </tbody>
    </table>

生成的 HTML 代码(运行时查看源代码):

<table border="1">
        <thead>
            <tr>
                <th>Name</th>
                <th>Comments</th>
                <th>Link</th>
                <th>Image</th>
                <th>Delete image</th>
                <th>Share details</th>
            </tr>
        </thead>
        <tbody>

                ROW 1 : imageID=151
                    <tr>
                        <td>sun</td>
                        <td>sun set</td>
                        <td><a href="/ImageHosting5.7/myUploads.action?imageID=151" class="linkStyle">
                                Sunset.jpg
                            </a></td>
                        <td>
                           <a href="/ImageHosting5.7/myUploads.action?imageID=151" class="linkStyle"> <img width="200" height="200" src="/ImageHosting5.7/ImageAction.action?imageID=151" /> </a></td>
                        <td>
                            <a href="/ImageHosting5.7/deleteImage!deleteImage.action?imageID=151" class="linkStyle">
                                Delete
                            </a>   </td>
                        <td>

                               <ul> 

                                   <li>b</li>

                               </ul>

                        </td>
                    </tr>


             ROW 2 : imageID=151
                    <tr>
                        <td>sun</td>
                        <td>sun set</td>
                        <td><a href="/ImageHosting5.7/myUploads.action?imageID=151" class="linkStyle">
                                Sunset.jpg
                            </a></td>
                        <td>
                           <a href="/ImageHosting5.7/myUploads.action?imageID=151" class="linkStyle"> <img width="200" height="200" src="/ImageHosting5.7/ImageAction.action?imageID=151" /> </a></td>
                        <td>
                            <a href="/ImageHosting5.7/deleteImage!deleteImage.action?imageID=151" class="linkStyle">
                                Delete
                            </a>   </td>
                        <td>

                               <ul> 

                                   <li>b</li>

                               </ul>

                        </td>
                    </tr>


        </tbody>
    </table>

这对于任何图像都是随机发生的,但始终反映相同的重复, 也就是说,如果图像 A 重复一次,我上传不重复的图像 B,myUploads.jsp 将有图像 A 两次。

但是当我删除重复的图像 ONCE 另一个副本被窃听(无法下载,无法查看)时,这意味着列表不是冗余的,但名称和评论字段仍然存在,并且一个图像 A 存在

List.remove() API 引用: 如果指定元素存在,则从该列表中删除第一次出现的指定元素(可选操作)。

例如

再上传几张图片后的另一个视图源(其他图片不再重复)

<table border="1">
        <thead>
            <tr>
                <th>Name</th>
                <th>Comments</th>
                <th>Link</th>
                <th>Image</th>
                <th>Delete image</th>
                <th>Share details</th>
            </tr>
        </thead>
        <tbody>
      ROW 1 : imageID=151
                    <tr>
                        <td>sun</td>
                        <td>sun set</td>
                        <td><a href="/ImageHosting5.7/myUploads.action?imageID=151" class="linkStyle">
                                Sunset.jpg
                            </a></td>
                        <td>
                           <a href="/ImageHosting5.7/myUploads.action?imageID=151" class="linkStyle"> <img width="200" height="200" src="/ImageHosting5.7/ImageAction.action?imageID=151" /> </a></td>
                        <td>
                            <a href="/ImageHosting5.7/deleteImage!deleteImage.action?imageID=151" class="linkStyle">
                                Delete
                            </a>   </td>
                        <td>

                               <ul> 

                                   <li>b</li>

                               </ul>

                        </td>
                    </tr>
        ROW 2 : imageID=151
                    <tr>
                        <td>sun</td>
                        <td>sun set</td>
                        <td><a href="/ImageHosting5.7/myUploads.action?imageID=151" class="linkStyle">
                                Sunset.jpg
                            </a></td>
                        <td>
                           <a href="/ImageHosting5.7/myUploads.action?imageID=151" class="linkStyle"> <img width="200" height="200" src="/ImageHosting5.7/ImageAction.action?imageID=151" /> </a></td>
                        <td>
                            <a href="/ImageHosting5.7/deleteImage!deleteImage.action?imageID=151" class="linkStyle">
                                Delete
                            </a>   </td>
                        <td>

                               <ul> 

                                   <li>b</li>

                               </ul>

                        </td>
                    </tr>
           ROW 3 : imageID=152
                    <tr>
                        <td>abc</td>
                        <td>aaa</td>
                        <td><a href="/ImageHosting5.7/myUploads.action?imageID=152" class="linkStyle">
                                Blue hills.jpg
                            </a></td>
                        <td>
                           <a href="/ImageHosting5.7/myUploads.action?imageID=152" class="linkStyle"> <img width="200" height="200" src="/ImageHosting5.7/ImageAction.action?imageID=152" /> </a></td>
                        <td>
                            <a href="/ImageHosting5.7/deleteImage!deleteImage.action?imageID=152" class="linkStyle">
                                Delete
                            </a>   </td>
                        <td>

                               <ul> 

                               </ul>

                        </td>
                    </tr>



                ROW 4 : imageID=153
                    <tr>
                        <td>apng</td>
                        <td>aaa</td>
                        <td><a href="/ImageHosting5.7/myUploads.action?imageID=153" class="linkStyle">
                                A PNG IMAGE.PNG
                            </a></td>
                        <td>
                           <a href="/ImageHosting5.7/myUploads.action?imageID=153" class="linkStyle"> <img width="200" height="200" src="/ImageHosting5.7/ImageAction.action?imageID=153" /> </a></td>
                        <td>
                            <a href="/ImageHosting5.7/deleteImage!deleteImage.action?imageID=153" class="linkStyle">
                                Delete
                            </a>   </td>
                        <td>

                               <ul> 

                                   <li>b</li>

                               </ul>

                        </td>
                    </tr>


        </tbody>
    </table>

Image 的实体类:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id; --------> UNIQUE

private String name;
private String comments;

@ManyToOne
private UserEntity userEntity;

private String imagePath;    
private String imageName;

@ManyToMany(cascade = CascadeType.MERGE)
private List<UserEntity> shares; // list of owner IDs

private Boolean publicShare; // isShared 

方法的使用和添加到列表的方法

注意:该方法“仅使用一次”,如下图所示。所以,我没有得到可能添加的错误代码

addImage() 方法:

private boolean addImage()
{       
    DatabaseService db;       
    try {
        db = new DatabaseService();           

        // get userEntity from session
        Map sessionMap = ActionContext.getContext().getSession();
        userEntity = (UserEntity) sessionMap.get("userEntity");

        // save image to file system
        String filePath = servletRequest.getSession().getServletContext().getRealPath("/images");          
        File fileToCreate = new File(filePath, this.uploadFileFileName);
        FileUtils.copyFile(this.uploadFile, fileToCreate);

        // make imageEntity
        imageEntity = new ImageEntity();
        imageEntity.setName(name);
        imageEntity.setComments(comments);
        imageEntity.setUserEntity(userEntity);

        try {
            if(!userShare.isEmpty())
             imageEntity.setShares(new DatabaseService().findUserEntitysByUsernames(users));
        } catch (Exception e) {
          Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", e);
        }

        imageEntity.setImagePath(fileToCreate.getAbsolutePath());
        imageEntity.setImageName(fileToCreate.getName());           
        db.persist(imageEntity);           
        userEntity.addToImages(imageEntity);           

        // update userEntity                      
        userEntity = (UserEntity) db.merge(userEntity);

        // update sessionMap
        sessionMap.put("userEntity", userEntity);

        // notify share
        if( ! imageEntity.getShares().isEmpty())
        {               
            // init mail
            SendMailService sendMailService = new SendMailService();
            sendMailService.setBody("Image is shared with you");
            sendMailService.setSubject("DJVT IMAGE HOSTING");

            for (UserEntity ue : imageEntity.getShares()) {
                sendMailService.setTo(ue.getEmailid());
            }

            sendMailService.sendMail();
        }           
    } catch (Exception e) {
        throw new RuntimeException("img upload failed" + e.toString());
    }

    return true; // success
}

我该如何解决我的错误,顺便说一下,您对这个错误有什么看法(如果我犯了愚蠢的错误,或者错误)?

我注销并登录到我的应用程序,重复的内容消失了一次。

【问题讨论】:

  • 向我们展示操作、返回给客户端的对象以及您正在执行的测试,以证明在将数据发送到视图之前没有任何重复。
  • 我的会话变量中的一些问题..请正确检查并返回
  • 如果没有更多信息,将无法提供帮助。
  • 我注销并登录到我的应用程序,重复一次消失了..我很困惑:(
  • 如果你使用join,可能是数据库查询的问题,这样会有重复的条目

标签: java jpa struts2 eclipselink derby


【解决方案1】:

我如何解决我的错误,顺便说一下,您对 这个错误(或错误,如果我犯了愚蠢的错误)

您正在共享您在会话中迭代的集合的问题。因此,其他操作可能会在结果执行之前更新这个集合。要检查这一点,您可以将BeforeResult annotation 放在可以检查重复项的方法上。确保您有 annotationWorkflow interceptor 替换堆栈上的 workflow 拦截器。

如果您将默认主题更改为其他可能性,则可能是

<constant name="struts.ui.theme" value="simple"/>

struts.xml 或使用css_xhtml 主题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-10
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2012-01-16
    • 2023-03-19
    • 2019-06-15
    相关资源
    最近更新 更多