类型不匹配:无法将HashMap<Integer,Item>转换为HashMap<Integer,Item>。

3

我正在尝试在JSP中使用此代码片段循环遍历HashMap。当jsp加载时

    HashMap<Integer, Item> itemsMap = new HashMap<Integer, Item>();
    itemsMap = customer1.getItems();
      for(Map.Entry<Integer, Item> entry:itemsMap.entrySet()){
              Integer k=entry.getKey();
             Item item=entry.getValue();
      }

当我尝试加载jsp时,显示出以下错误:

    org.apache.jasper.JasperException: Unable to compile class for JSP: 
    An error occurred at line: 159 in the jsp file: /JSP/cart.jsp
    Type mismatch: cannot convert from HashMap<Integer,Item> to HashMap<Integer,Item>
    156: //   HashMap itemsMap = customer1.getItems();
    157: //          for(Iterator i = itemsMap.keySet().iterator();i.hasNext();){
    158:      HashMap<Integer, Item> itemsMap = new HashMap<Integer, Item>();
    159:      itemsMap = customer1.getItems();
    160:           for(Map.Entry<Integer, Item> entry:itemsMap.entrySet()){
    161:                   Integer k=entry.getKey();
    162:                   Item item=entry.getValue();

当我在servlet中使用相同的代码完成相同的目的时,它运行得很好。请问有人能告诉我我在这里做错了什么吗?谢谢。

下面是相关的类:

public class Customer {
    private String name;
    private String address;
    // private ArrayList<Item> items = new ArrayList<Item>();
    private HashMap<Integer,Item> items=new HashMap<Integer,Item>();
    public Customer() {

    }
    public HashMap<Integer,Item> getItems(){ return items;}
}

public static class Item {
    private String name;
    private String skew;
    private String amount;
    public Item(String name, String skew, String amount) {
        this.name=name; this.skew=skew; this.amount=amount;
    }
}

5
确保将 Item 类导入到 JSP 页面,并且它是正确的 Item 类。 - Zircon
1
请问您能否在您的帖子中更新customer1.getitems签名? - gati sahu
@gatisahu 这里有一些相关类的信息:public class Customer { private String name; private String address; // private ArrayList items = new ArrayList(); private HashMap items=new HashMap(); public Customer(){ } public HashMap getItems(){ return items;} }public class Item { private String name; private String skew; private String amount; public Item(String name, String skew, String amount){ this.name=name; this.skew=skew; this.amount=amount; }} - Praneeth
1个回答

0

根据您使用的应用服务器,您可以检查从JSP文件生成的Java文件。例如,在Tomcat中,它在“work”目录树的某个地方。一些IDE也可以在调试器会话中右键单击JSP文件并单击类似于“显示Servlet”的上下文菜单时为您打开它。请注意,当您不在调试器会话之外时,这没有任何机会可行。

一旦您打开了此文件,您可以检查导入和其他所有内容以及为什么无法编译。

用户Zircon关于类型“Item”是否是JSP中的导入之一的评论可能是正确的。我不担心缺少的导入,而是担心您的应用程序设计。在Web开发中,将业务逻辑和显示逻辑分离是非常重要的约定。 换句话说:在您的JSP中不应该有Java代码的任何情况。所有业务逻辑(这就是您的Java代码应该处理的内容)都应该封装在控制器和模型中,或者如果您愿意,可以在JSP中实例化的bean中。如果您想迭代某些内容,则使用<c:forEach>和类似条款。

如果您坚持在JSP中使用Java,那么请至少使用钻石操作符:HashMap<Integer, Item> itemsMap = new HashMap<>();

这样问题可能会产生更具启发性的编译器或运行时消息。

如果所有这些都没有帮助,那么请确实找到应用程序服务器从您的JSP创建的servlet文件(.java文件),并将导入部分复制到您的问题中,以便我们知道它正在尝试访问哪种类型的Item。


容器将JSP页面转换为Java Servlet(pageName_jsp.java),您可以直接检查该文件。例如,这是转换后的Java文件路径。apache-tomcat-7.0.68_eclipse/work/Catalina/localhost/<ApplicationName>/org/apache/jsp/WEB_XXX/pages - ranafeb14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接