java if语句不一致

时间:2011-06-23 18:03:09

标签: java jsp jstl javabeans

我在一个bean中有一个if语句,当我创建一个测试java类时,它似乎处理得很好,但是当jsp调用bean时它没有正常工作。

我的代码,让我告诉你:

首先,测试类:

package com.serco.inquire;
import java.util.*;
import java.text.*;

public class TestCollection {
    public static void main(String[] args) {
        IrCollection myCollection = new IrCollection();
        myCollection.setSort("none");
        myCollection.setMgrid("none");
        int endpoint = myCollection.getSize();
        for (int i=0;i<endpoint;i++) {
            InquireRecord curRec = myCollection.getCurRecords(i);
            Long milis = new Long(curRec.getSubmitDate());
            Date theDate = new Date(milis);
            Format formatter = new SimpleDateFormat("dd MMM yyyy");
            String s = formatter.format(theDate);
            System.out.println("ID: " + curRec.getID() + " | Subject: " + curRec.getSubject());
        }
    }
}

来自它调用的IrCollection类的snippit:

private void processSort(String datum) {
    int LastChar = datum.length()-1;
    String colName = datum.substring(0, LastChar);
    if (datum=="none") {
        this.fullSort  = " ORDER BY lastUpdated DESC";
    } else {
        if (datum.endsWith("2")) {
            this.fullSort = " ORDER BY " + colName + " ASC";
        } else {
            this.fullSort = " ORDER BY " + colName + " DESC";
        }
    }
}

在另一个使用以下方法调用此特定方法的方法中有更多代码:

this.processSort(this.sort);

但问题是第二个代码示例中的if (datum=="none")部分。假设第一个类的第10行将成员变量排序设置为"none",则processSort()方法应将成员变量fullSort设置为" ORDER BY lastUpdated DESC"

如果我在第一个样本中使用该类,它就会这样做。

无论其

我有这个自定义标记:

<%@ tag body-content="scriptless" import="com.serco.inquire.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="mgr" required="true" %>
<%@ attribute name="mkind" required="false" %>
<%@ attribute name="sort" required="false" %>
<c:if test="${empty mkind}">
    <c:set var="mkind" value="manager" />
</c:if>
<c:if test="${empty sort}">
    <c:set var="sort" value="none" />
</c:if>
<jsp:useBean id="irc" scope="page" class="com.serco.inquire.IrCollection">
    <jsp:setProperty name="irc" property="mgrtype" value="${mkind}" />
    <jsp:setProperty name="irc" property="sort" value="${sort}" />
    <jsp:setProperty name="irc" property="mgrid" value="${mgr}" />
</jsp:useBean>
${irc.fullsort}

.jsp文件用以下方法调用:

<c:set var="user" value="none" />    
<c:set var="sort" value="none" />
<inq:displayCollection>
    <jsp:attribute name="mgr">${user}</jsp:attribute>
    <jsp:attribute name="mkind">cotr</jsp:attribute>
    <jsp:attribute name="sort">${sort}</jsp:attribute>
</inq:displayCollection>

换句话说,完全相同的数据被馈送到IrCollection bean。所以我应该得到相同的数据,对吧?

除非我明白这一点:

  

WHERE cotr ='none'ORDER BY DES DES

所以当Java调用它时,它会认为"none" == "none",但是当jsp调用它时,它会认为"none" != "none"

5 个答案:

答案 0 :(得分:2)

您必须使用equals代替==

datum.equals("none")

请参阅whats the difference between “.equals and ==”

答案 1 :(得分:0)

datum ==“none”是错误的。你想要

datum.equals("none");

string ==运算符仅比较指针位置,而不是String的实际值。所以它在某些情况下会起作用(如果数据是用常量字符串设置的),而不是在动态创建时。

答案 2 :(得分:0)

使用equals进行字符串比较

答案 3 :(得分:0)

我更愿意使用equals()方法,而不是比较引用变量,它可能在相同的情况下给出正确的结果,但是应该检查字符串是否在逻辑上相等。

答案 4 :(得分:0)

我认为您的问题在于Java中的Object equality。像其他人提到的那样,你应该使用equals()。您的类的编译器可能为文字的每个实例创建一个共享字符串(如“none”)。这将导致==,它检查两个变量是否指向同一个对象,如果该字符串是从类中分配的。然后,当您使用JSP页面时,外部类提供“none”字符串,使其成为不同的对象。

故事的寓意是使用'equals()'来比较字符串。