【问题标题】:<sj:select> not calling action<sj:select> 不调用动作
【发布时间】:2012-07-05 23:16:15
【问题描述】:

我觉得这是一个非常容易解决的问题,但我很难过。我整天都在寻找,但我的代码似乎与工作示例的代码相匹配。 我正在使用 Struts+SpringMVC+Hibernate,并且正在用 jQuery 标记替换我所有的 dojo 标记。 jQuery 下拉菜单未调用相关操作。

以下是相关代码:

Struts.xml

<action name="getListOfCities" class="cityActions">
        <result type="json">
            <param name="root">cities</param>
        </result>
</action>   

Page.jsp

<s:url id="cityList" action="getListOfCities"/>
     <sj:autocompleter name="cities" href="%{cityList}" list="cities" selectBox="true"/>

CityAction.java

public class CityActions implements ModelDriven<CityVO> {

CityService cityService;
private Map<String, String> cities = new HashMap<String, String>();
CityVO city = new CityVO();

public void setCityService(CityService cityService) {
    this.cityService = cityService;
}

public CityVO getModel(){
    return city;
}

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

public String addCity(){
    try{
        cityService.addCity(city);
        return "SUCCESS";}
    catch(Exception e){
        return "ERROR";
    }catch(Throwable t){
        return "ERROR";
    }
}

public Map<String, String> getCities() {
    List<CityVO> cityList = cityService.listCities();

    Iterator<CityVO> iterator = cityList.iterator();
    while (iterator.hasNext()) {
        CityVO fac = iterator.next();
        cities.put(fac.getCityName(), Integer.toString(fac.getCityId()));
    }
    return cities;
}   

下拉菜单显示但未填充。这是我之前的工作正常:

<s:url id="cityList" action="getListOfCities" />
<sx:autocompleter href="%{cityList}" name="cities" keyValue="0" value="---- SELECT ONE-----"/>

有没有人可以解决这个问题?我确定要添加

<%@ taglib prefix="sj" uri="/struts-jquery-tags"%> 

和里面的脑袋:

<sj:head jqueryui="true"/>

谢谢。

【问题讨论】:

  • 嗨,我刚刚阅读了两个 href 的 api,它们有不同的含义。检查一下:sj(code.google.com/p/struts2-jquery/wiki/AutocompleterTag),sx(struts.apache.org/2.0.12/docs/autocompleter.html)。所以我认为你应该在需要之前填充你的收藏..
  • 我不明白,这个例子和我一样。问题不在于未填充下拉列表的操作;问题是根本没有调用该操作。我将 system.out.println 语句放在动作类的所有方法中,但我什么也没看到。
  • 什么版本的 S2? (我还是很困惑,你是认真地在同一个项目中使用了两个完全不同的 MVC 框架吗?) JavaScript 控制台中有什么东西吗?服务器日志?
  • 我正在使用 struts 2.3.3 和 struts-jquery-plugin 3.3.1。据我了解,使用 Spring 和 Struts 是相当普遍的,尽管我当然对它们了解得不够多,无法评论集成它们是否是一个好主意。我已经深入到这个项目中,尽管现在删除任何一个都为时已晚。我已经安装了 firebug 来帮助我解决这个问题,但它没有显示来自 sj:select 的任何 JSON 输出。控制台也没有从操作类中获取任何 System.out.println 语句。
  • 使用 Spring 和 Struts,是的;使用 Spring MVC 和 Struts,不。我建议创建一个最小的失败示例项目(即,重现 jquery 失败所需的一切,而不是您的应用程序的域)并将其放在 github 上。跟进评论(请使用@davenewton,否则我不会收到通知),我会看看;我还不能重现这个问题。

标签: jquery drop-down-menu struts2


【解决方案1】:

(评论太长了。拼凑了一个类似于你的 sn-ps 的部分版本。)

主要问题是您的结果将root 设置为cities,这意味着返回的JSON 没有cities 键,因此自动完成的list 属性不知道从哪里获取其数据。

也就是说: 这个版本中的selectBox 功能有些时髦;当我删除该属性时,我在键入时看到数据,并将其设置为 true,我什么也得不到。

然而,我没有看到选择过滤,这意味着即使它正确突出显示匹配的字符,不匹配的条目也不会被删除;我相信他们应该是。

不相关,但是为什么要从 VO 中创建地图呢?除非我有正当理由(例如,CityVO 太大或包含敏感信息),否则只需使用 listKeylistValue 属性并使用服务已经返回的内容。

【讨论】:

  • 非常感谢您的帮助。您提到 JSON 没有正确的密钥,但我什至没有达到这一点,因为我的操作没有被调用。我正在创建一个准系统版本,只是为了显示上传到 github 的失败。我用一个部分工作的示例继承了这个项目(从非依赖下拉列表中获取值、查询数据库、返回匹配列表),并且我已经从那里构建了。它使用了 sx:select。我浏览了 dojo 文档,它适用于地图。地图也很方便,因为我们可以使用公钥作为地图值。
  • 嗯.. 现在似乎正在调用该操作。我可以看到使用 firebug 返回了正确的 JSON。我将解决您提到的主要问题,如果我有任何问题,请告诉您。如果不是,我会接受答案。
  • 根据您的建议,我已尝试仅返回服务提供的 VO 列表。在萤火虫中,我可以看到 JSON 结果正常工作,但是下拉列表没有填充。即使我删除 selectBox 它仍然是空的,而且它的宽度太小而无法输入。新代码: 其中 cityList2 是返回的 List,cityName/cityId 是在 VO 中具有正确 get/set 方法的变量。
  • 设法在萤火虫中追踪问题,将发布一个新问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2013-05-25
  • 2014-10-04
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多