java if заявление о несостоятельности - PullRequest
0 голосов
/ 23 июня 2011

У меня есть if оператор в bean-компоненте, который, кажется, прекрасно обрабатывает, когда я создаю тестовый класс Java, но не работает нормально, когда bean-компонент вызывается jsp.

Мой код, позвольте мне показать вам это:

Во-первых, тестовый класс:

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, который он вызывает:

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 первого класса устанавливает переменную-член sort как "none", этот метод processSort() должен установить переменную-член fullSort в " ORDER BY lastUpdated DESC".

И если я использую класс вПервый пример, он делает это.

HOWEVER

У меня есть этот пользовательский тег:

<%@ 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>

Другими словами, те же самые данные передаются в bean-компонент IrCollection.поэтому я должен получить те же данные, верно?

За исключением того, что я получаю это:

ГДЕ cotr = 'none' ЗАКАЗАТЬ не DES

таккогда Java вызывает его, он думает "none" == "none", но когда jsp вызывает его, он думает "none" != "none".

Ответы [ 5 ]

2 голосов
/ 23 июня 2011

Вы должны использовать equals вместо ==:

datum.equals("none")

См. В чем разница между «.equals и ==»

0 голосов
/ 23 июня 2011

Я думаю, что ваша проблема связана с равенством объектов в Java. Как уже упоминали другие, вы должны использовать equals(). Вполне возможно, что компилятор для вашего класса создает общую строку для каждого экземпляра литерала (например, «none»). Это вызвало бы ==, который проверяет, указывают ли две переменные на один и тот же объект, если строка была назначена из класса. Затем, когда вы используете свою страницу JSP, строка «none» предоставляется внешним классом, в результате чего он становится другим объектом.

Мораль этой истории заключается в использовании 'equals ()' для сравнения строк.

0 голосов
/ 23 июня 2011

Я предпочитаю использовать метод equals(), вместо сравнения ссылочных переменных, он может дать правильный результат в тех же случаях, но нужно проверить, равна ли строка логически или нет.

0 голосов
/ 23 июня 2011

использовать равно для сравнения строк

0 голосов
/ 23 июня 2011

datum == "none" не так.Вы хотите

datum.equals("none");

Оператор string == сравнивает только местоположение указателя, а не фактическое значение String.Таким образом, он будет работать в некоторых ситуациях (если для датума была задана постоянная строка), но не при динамическом создании.

...