使用相同的方法返回多个列表Spring MVC

时间:2017-10-29 22:47:04

标签: java spring list jsp model-view-controller

我遇到了一个似乎很容易解决的问题,但表现出了弹性。 也就是说,我正在制作一个具有模糊搜索功能的网络平台。现在,搜索应返回一个对象列表(在我的情况下都是模型),并在屏幕上以单独的选项卡显示它们。

BlurrySeach(适用于个人资料):

public List<Profile> blurrySearch(String keyword) {
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("select p from Profile p where p.username LIKE :keyword order by p.username");
    query.setParameter("keyword", "%" + keyword + "%");
    List<Profile> profileList = query.list();
    session.flush();
    return profileList;
}

此方法是来自界面的实现:

  List<Profile> blurrySearch(String title);

现在,我找不到重载此方法的方法,因为将List<Profile>更改为List<Photos>不会更改返回类型,也不会更改方法重载所需的参数列表。 将界面更改为List blurrySearch(String title)也不会改变任何内容。 将blurrySearchProfileblurrySearchPhotosblurrySearchBlogsblurrySearchShops等作为单独的方法制作是低效的。 如何重载此方法,返回5个列表,例如profileList将其传递给controller,然后在jsp上呈现?

这是JSP代码:

<div class="container-wrapper">
    <div class="container">
        <div class="page-header">
            <h1>Explore</h1>
            <p class="lead"> Search results! </p>
        </div>


        <!--

        <div style=" width: 75%; margin: 0 auto;">
            <div class="galleryImage">
                <c:forEach items="${profileList}" var="profile">
                    <div class="imageWrapper">

                        <a href="<spring:url value="/users/${profile.username}"/>"
                           style="max-height: 25%; max-width:25%; left: 50%;">

                            <img src="<c:url value="/resources/images/cosplay/profilePhotos/${profile.username}-prof.png"/>" alt="image"
                                 style="max-height: 90%; max-width:90%; display: block; margin-left: auto; margin-right: auto;">
                        </a>
                        <div style="text-align:center;">
                            <h3>${profile.username}</h3>
                        </div>
                        </a>
                        <hr>
                        <h3>${profile.description}</h3>
                    </div>
                </c:forEach>
            </div>

        </div> -->


        <div class="w3-bar w3-black">
            <button class="w3-bar-item w3-button" onclick="openTab('Photos')">Photos</button>
            <button class="w3-bar-item w3-button" onclick="openTab('Profiles')">Profiles</button>
            <button class="w3-bar-item w3-button" onclick="openTab('Tutorials')">Tutorials</button>
            <button class="w3-bar-item w3-button" onclick="openTab('Blogs')">Blogs</button>
            <button class="w3-bar-item w3-button" onclick="openTab('Shops')">Shops</button>
        </div>
        <!-- START PHOTOS -->
        <div id="Photos" class="tab">
            <h3>Photos</h3>
        </div>
        <!-- END PHOTOS -->

        <!-- START PROFILES -->
        <div id="Profiles" class="tab">
            <h3>Profiles</h3>
        </div>
        <!-- END PROFILES -->

        <!-- START TUTORIALS -->

        <div id="Tutorials" class="tab">
            <h3>Tutorials</h3>
        </div>

        <!-- END TUTORIALS -->

        <!-- START BLOGS -->
        <div id="Blogs" class="tab">
           <h3>Blogss</h3>
        </div>
        <!-- END BLOGS  -->

        <!-- START SHOPS -->
        <div id="Shops" class="tab">
            <h3>Shops</h3>
        </div>
        <!-- END SHOPS -->


    </div>
</div>

提前谢谢!

1 个答案:

答案 0 :(得分:2)

我们遇到了类似的问题。为了解决这个问题,我们在spring xml

中维护了2个地图
<util:map id="entityToTableMap">
        <entry key="Photos" value="tbl_photos"/>
        <entry key="Profiles" value="tbl_profiles"/>
        <entry key="Blogs" value="tbl_blogs"/>
</util:map>
<util:map id="entityToSearchFieldsMap">
       <entry key="Photos" value="field_name"/>
       <entry key="Profiles" value="username"/>
       <entry key="Blogs" value="field_name"/>
</util:map>

我们创建了像这样的存储库方法

@Value("#{entityToTableMap}")
private Map<String, String> entityToTableMap;    

@Value("#{entityToSearchFieldsMap}")
private Map<String, String> entityToSearchFieldsMap;

public List<T> blurrySearch(String keyword,String entityType) {
  String tableName = entityToTableMap.get(entityType);
  String searchField = entityToSearchFieldsMap.get(entityType);
  String sql ="select p from "+tableName+" p where p."+searchField+" LIKE :keyword order by p."+searchField
  ...
}

但是,在jsp上,我们无法弄清楚需要访问的字段。所以,我们使用jdbctemplate's queryForList方法如下

  @Autowired
    JdbcTemplate jdbcTemplate;

    public List<Map<String, Object>> blurrySearch(String keyword,String entityType) {
      String tableName = entityToTableMap.get(entityType);
      String searchField = entityToSearchFieldsMap.get(entityType);
      String sql ="select p from "+tableName+" p where p."+searchField+" LIKE ? order by p."+searchField
      return jdbcTemplate.queryForList(sql, new String[]{"%"+keyword+"%"});
    }

然后,在jsp上,我们使用类似的东西使其成为通用的

<c:forEach items="${entityList}" var="maps">
           <c:forEach items="${maps}" var="mapEntry">
              ${mapEntry['username']}
           </c:forEach>
</c:forEach>