0

尝试在 JSP 中循环遍历 HaspMap 时,我已经阅读了许多问题和答案,
大多数都指向使用 jstl taglib 并利用以下内容:

<c:forEach items="${myHashMap}" var="units">
    ...
</c:forEach>

但是,这在以下位置不起作用(请参阅 - ...???...):我想要做的是当输入文本字段失去焦点时,我想将该字段内的任何内容与 Hashmap 匹配我以前从我的控制器提供。

<script type="text/javascript">
    $(document).ready(function(){
        $("#someInput").blur(function(){
            ... ??? ... 
        });
    });
</script>

所以我有两个问题:

1: 我可以使用什么来遍历 JSP 函数中的 HashMap?

2: 我可以阅读什么来查看 jsp 区域内哪些功能可供我使用,记住我想避免使用 scriptlet。

非常感谢

肖恩

BAH ...:-可能的 解决方案-

所以我已经找到了解决方案(我认为)......

var csm = ${cs};
var keysArray = new Array();
for (var key in csm) {
    keysArray.push(key);
}  

然后我只需在while循环中循环遍历数组,如下所示:

var i = 0;
while (i < keysArray.length) {
    if ( (var1_toCheck === keysArray[i]) && (var2_toCheck === csm[keysArray[i]])) {
        alert("**WARNING**\n\nYou have found a match!");
        break;
    }
    i++;
}

比赛仍然无法进行,但我仍在努力……

任何改进我的解决方案的建议将不胜感激。

干杯肖恩

而且......我也修复了匹配

控制器正在发送一个 Hashmap,但我没有解析从输入字段接收到的值。

所以我改变了这个

var val1_toCheck = $("#val1").val();

对此

var val1_toCheck = parseInt($("#val1").val());

现在似乎工作得很好。

正如我之前提到的......如果有更好的方法来完成我想要做的事情,我会很感激这些指针......


将字段转换为 EditText

嗨,我确定这很简单,只是让我无法理解 :-)

我正在编写一个简单的帮助程序类,以便能够检查字段数组中提供的值,这些字段说它们是正确的 EditText 小部件,我想要做的是能够访问输入到 EditText 中的输入值场,请帮忙?

Field[] fields = clazz.getFields();

    for (Field field : fields) {
        if (field.isAnnotationPresent(Required.class)) {
            Log.d(TestClass.class.getName(), field.toString());
        }
    }

提前致谢

更新问题完整代码

package com.mobiqube.annotations;

import java.lang.reflect.Field;

import android.util.Log;
import android.widget.EditText;

public class EditTextValidator {

public EditTextValidator() {
}

public Boolean validate(Class clazz) throws IllegalArgumentException, IllegalAccessException{
    Boolean isValid = true;
    Field[] fields = clazz.getFields();

    for (Field field : fields) {
        if (field.isAnnotationPresent(Required.class)) {
            Log.d(EditTextValidator.class.getName(), field.toString());
            if(field instanceof EditText){      
                EditText editText = (EditText)field ;
                String txt=editText.getText().toString();
                Log.d(EditTextValidator.class.getName(), txt);
            }

        }
    }

    return isValid;
}

public String getMessage(){
    String returnStr = "";
    return returnStr;
}

}

现在的错误

if(field instanceof EditText){ //

和 EditText editText = (EditText)field ;

4

1 回答 1

1

JavaHashMap对象仅由服务器上的 JVM 定义和理解。您需要将组成它的数据放入用户浏览器中的 Javascript 可以使用的结构中。您可能的解决方案将起作用,但是您必须在服务器端进行工作以将每个键放入一个List对象并将其序列化为 JSON 字符串。相反,请尝试在控制器中序列化 Map 对象。听起来你的键是整数,所以:

Map<Integer, String> csm = new HashMap<Integer, String>();
csm.put(1, "valueone");
csm.put(2, "valuetwo");
csm.put(3, "valuethree");
String json = new Gson().toJson(csm, Map.class);
request.setAttribute("cs", json);

现在您在 jsp 中要做的编码要少得多,并且您可以通过处理对象来利用 Javascript 的 OO 特性,并且您无需循环遍历键。

var csm = ${cs};
var1_toCheck = '1'; // string values - no need for parseInt()
var2_toCheck = '2';

// check to see if key is a property of the csm object using typeof csm[var1_toCheck] != 'undefined'
// check equality of var1 and var2 values (not sure I understand your intent with this logic)
if (typeof csm[var1_toCheck] != 'undefined' && var1_toCheck == var2_toCheck)
    alert('Found a match');
else
    alert('No match');

因此,您使用typeof csm[varToCheck] != 'undefined'. 如果您需要访问地图中的值,请使用csm[keyVar]. 通过这种方式,您可以在服务器端和客户端对结构进行类似的处理,从而提高可维护性。

于 2013-10-04T15:15:37.933 回答