2010-01-04 38 views
1

我使用jQuery自动完成我的Struts2应用程序。Struts2 + jQuery自动完成

实际上,我的动作制作了一个jQuery使用的字符串列表。这是脚本:

$().ready(function() { 
     $("#tag").autocomplete("/myAction/Action", { 
      multiple : true, 
       autoFill : true, 
        minChars:1 
       }); 
      }); 

在输入过程中出现与建议的框。问题在于该框呈现另一个值, 准确地呈现我的JSP代码(链接到自动完成插件的CSS)。

我该如何解决这个问题?

这是我的JSP:

<html> 
<head> 
    <script src="<%=request.getContextPath()%>/scripts/jquery-latest.js"></script> 
    <link rel="stylesheet" href="<%=request.getContextPath()%>/scripts/main.css" type="text/css" /> 
    <link rel="stylesheet" href="<%=request.getContextPath()%>/scripts/jquery.autocomplete.css" type="text/css" /> 
    <script type="text/javascript" src="<%=request.getContextPath()%>scripts/jquery.bgiframe.min.js"></script> 
    <script type="text/javascript" src="/<%=request.getContextPath()%>/query.dimensions.js"></script> 
    <script type="text/javascript" src="<%=request.getContextPath()%>/scripts/jquery.autocomplete.js"></script> 
    <script type="text/javascript"> 
    $().ready(function() { 
     $("#tag").autocomplete("/myAction/Action", { 
      multiple : true, 
       autoFill : true, 
        minChars:1 
       }); 
      }); 
</script> 
</head> 
<body> 
    <s:form action="Action" theme="simple"> 
     <s:iterator value="elencoMateriali" var="asd"> 
      <s:property value="#asd" escape="false"/> 
        </s:iterator> 
     <s:textfield id="tag" name="tagField" label="tag" /> 
    </s:form> 
</body> 

+2

在找到问题的解决方案时,我找到了自动补全的另一种方法。 Struts2和Dojo。 http://www.benmccann.com/dev-blog/struts-2-ajax-tutorial-dojo-autocompleter-example/ –

回答

0
<%@ taglib prefix="s" uri="/struts-tags" %> 
    <%@ taglib prefix="sx" uri="/struts-dojo-tags" %> 

<s:form action="ActionJson" theme="simple"> 
    <s:url id="elencoFuffa" action="ActionJSON"/> 
    <sx:autocompleter id="autocompleter" name="materiale" loadOnTextChange="true" preload="false" href="%{elencoFuffa}" size="24" loadMinimumCount="1" showDownArrow="false" cssClass="dropDown" onchange="submit();"/> 

     <s:submit value="Prosegui"/> 
     <s:property value="luoghiSmaltimento"/> 
    </s:form> 

现在,行动:

public class Action extends ActionSupport { 

private String materiale; 
private String luoghi; 
private List<String> elencoMateriali; 
private Map<String, String> json; 

public String execute() throws Exception { 

    System.out.println("------------------" + materiale); 

    return SUCCESS; 
} 

public String getMateriali() throws Exception { 
    MaterialiDAO dao = new MaterialiDAO(); 
    List<Materiali> toResult = new ArrayList<Materiali>(); 
    toResult = dao.findAll(); 
    elencoMateriali = new ArrayList<String>(); 
    Iterator i = toResult.iterator(); 

    while (i.hasNext()) { 
     Materiali m = (Materiali) i.next(); 
     elencoMateriali.add(m.getValueNomemateriale()); 
    } 

    return SUCCESS; 

} 

public String getJson() throws Exception { 
    json = new HashMap<String, String>(); 

    if (materiale != null && materiale.length() > 0) { 
     MaterialiDAO dao = new MaterialiDAO(); 
     List<Materiali> materiali = dao.findByLikeValue(materiale); 
     for (Materiali m : materiali) { 
      json.put(m.getValueNomemateriale(), "" + m.getIdMateriali()); 
     } 
    } 

    return SUCCESS; 
} 

public String trovaLuogo() throws Exception { 
    LuoghismalDAO daoL = new LuoghismalDAO(); 
    MaterialiDAO daoM = new MaterialiDAO(); 
    Materiali m = daoM.findByMaterialiName(materiale); 

    if (m != null) { 
     luoghi = m.getLuoghismal().getValueDescrluogo(); 

     return SUCCESS; 

    } else { 
     luoghi = "-- Scegliere un materiale --"; 
     return SUCCESS; 
    } 
} 

/* Getters and setters */ 

在结束时的struts.xml

 <action name="ActionJSON" class="it.action.Action" 
     method="getJson"> 
     <result type="json"> 
      <param name="root">json</param> 
     </result> 
    </action> 
1

我认为答案已经太晚了,但问题仍然存在于Struts2中。我已经做了一些修改以解决此类问题:

  1. 将jquery.struts2.js文件复制到您的js路径中。

  2. 编辑jquery.struts2.js FIL和寻找的成功:功能(数据)“在Autocompleter控件的句柄,并更换为下一个功能:

    success: function(data) { 
    var x = 0; 
    if (data[o.list] !== null) { 
        var isMap = false; 
        if (!$.isArray(data[o.list])) { 
         isMap = true; 
        }         
        var result = []; 
        $.each(data[o.list], function(j, val) { 
         if (isMap) { 
          result.push({ 
           label: val.replace(
             new RegExp(
               "(?![^&;]+;)(?!<[^<>]*)(" + 
               $.ui.autocomplete.escapeRegex(request.term) + 
               ")(?![^<>]*>)(?![^&;]+;)", "gi" 
              ), "<strong>$1</strong>"), 
           value: val, 
           id: j 
          }); 
         } 
         else { 
          if (o.listkey !== undefined && o.listvalue !== undefined) { 
           result.push({ 
            label: val[o.listvalue].replace(
              new RegExp(
                "(?![^&;]+;)(?!<[^<>]*)(" + 
                $.ui.autocomplete.escapeRegex(request.term) + 
                ")(?![^<>]*>)(?![^&;]+;)", "gi" 
               ), "<strong>$1</strong>"), 
            value: val[o.listvalue], 
            id: val[o.listkey] 
           }); 
          } 
          else { 
           result.push({ 
            label: data[o.list][x].replace(
              new RegExp(
                "(?![^&;]+;)(?!<[^<>]*)(" + 
                $.ui.autocomplete.escapeRegex(request.term) + 
                ")(?![^<>]*>)(?![^&;]+;)", "gi" 
               ), "<strong>$1</strong>"), 
            value: data[o.list][x], 
            id: data[o.list][x] 
           }); 
          } 
         } 
         x++; 
        }); 
        response(result); 
    } 
    

    }

  3. 现在,如果您在您的jsp代码中订阅了onSelectTopics方法,您将有一个新的item.id元素可用,因此您可以将id值设置为隐藏的任何内容。现在

,你autocompleter显示用强字的列表,填充与选择的输入,与维护一个的ID在你能赶上一个变量。

请记住在包含标题部分添加已修改的js。

+0

哇!很多东西..但recentely我用这个http://code.google.com/p/struts2-jquery/。比道场好得多 –