Java 否则,将根据用户选择不工作

Java 否则,将根据用户选择不工作,java,servlets,forms,Java,Servlets,Forms,我正在处理HTML表格。为此,我从Java代码返回JSON。我有一个UI作为HTML页面,其中有一个表单具有“从日期到日期”和一个select标记,该标记有4个类似的选项 <form id="formId" method="get"> <div class="container"> <h4>Start Date:</h4> <input type="text" id="star

我正在处理HTML表格。为此,我从Java代码返回JSON。我有一个UI作为HTML页面,其中有一个表单具有“从日期到日期”和一个select标记,该标记有4个类似的选项

 <form id="formId" method="get">
        <div class="container">
            <h4>Start Date:</h4>
            <input type="text" id="startdate" name="fromdate" width="276"
                placeholder="dd/mm/yyyy" required />

            <h4>End Date:</h4>
            <input type="text" id="enddate" name="todate" width="276"
                placeholder="dd/mm/yyyy" required />


            <h4>Outlets:</h4>
            <select name="outlet" id="all">
                <option>ALL</option>
                <c:forEach var="item" items="${obj.outlet}">
                    <option>${item}</option>
                </c:forEach>
            </select>

            <br>

            <br>
            <div>

                <button id="button" class="btn btn-default" type="submit">Search</button>
            </div>

        </div>
</form>

开始日期:
结束日期:
经销店:
全部的
${item}


搜寻
我从表单中获取该输入,并在servlet的doget方法中获取值,如下所示:

    String fromdate=request.getParameter("fromdate");
        String todate=request.getParameter("todate");
        String outlet=request.getParameter("outlet");

//      System.out.println(String.format("fromdate: %s, todate: %s, outlet: %s", new Object[]{fromdate, todate, outlet}));
        List<String> outletList = Arrays.asList(outlet.split("\\s*,\\s*"));
        try {
            String json = HourlySalesDateOutlet.createJson(outletList, fromdate, todate);
            response.getWriter().write(json);
//          System.out.println("dheeraj"+json);
        }
        catch (Exception e) {

            e.printStackTrace();
        }


    }
String fromdate=request.getParameter(“fromdate”);
字符串todate=request.getParameter(“todate”);
字符串出口=request.getParameter(“出口”);
//System.out.println(String.format(“fromdate:%s,todate:%s,outlet:%s”,新对象[]{fromdate,todate,outlet});
List-outletList=Arrays.asList(outlet.split(“\\s*,\\s*”);
试一试{
字符串json=HourlySalesDateOutlet.createJson(outletList、fromdate、todate);
response.getWriter().write(json);
//System.out.println(“dheeraj”+json);
}
捕获(例外e){
e、 printStackTrace();
}
}
现在是我的Java类,我在其中编写了两个查询,一个查询用户是否选择all,另一个查询用户是否选择specific outlet。我的问题是if语句没有执行,而else语句正在执行,如果用户从表单中选择了一个出口,那么如果用户选择了ALL,那么它就不工作了

下面是我的代码:

   public static String createJson(List<String> outletList, String startDate, String endDate) throws Exception {
        Connection con = null;
        String query1;
        List<Map<String, String>> mapList = new LinkedList<Map<String, String>>();
        String outletStr = outletList.stream().collect(Collectors.joining("','", "('", "')"));
        if (outletList.equals("ALL")) {
            query1 = "SELECT a.OUTLET,b.CUSTOMERDESCRIPTOR,a.BILLDATE,HOUR(a.BILLTIME) AS HOURS, SUM(a.NETAMOUNT) AS AMOUNT FROM SYNCBILL a,ecustomer b WHERE a.OUTLET=b.CUSTOMERIDENTIFIER AND a.CANCELLED<>'Y' AND a.BILLDATE BETWEEN STR_TO_DATE(REPLACE('"
                    + startDate + "','/','.'),GET_FORMAT(DATE,'EUR')) AND STR_TO_DATE(REPLACE('" + endDate
                    + "','/','.'),GET_FORMAT(DATE,'EUR')) GROUP BY OUTLET,BILLDATE,HOUR(BILLTIME)";
            System.out.println("all"+query1);

        } else {

            query1 = "SELECT a.OUTLET,b.CUSTOMERDESCRIPTOR,a.BILLDATE,HOUR(a.BILLTIME) AS HOURS, SUM(a.NETAMOUNT) AS AMOUNT FROM SYNCBILL a,ecustomer b WHERE a.OUTLET=b.CUSTOMERIDENTIFIER AND b.CUSTOMERDESCRIPTOR in "
                    + outletStr + " AND a.CANCELLED<>'Y' AND a.BILLDATE BETWEEN STR_TO_DATE(REPLACE('" + startDate
                    + "','/','.'),GET_FORMAT(DATE,'EUR')) AND STR_TO_DATE(REPLACE('" + endDate
                    + "','/','.'),GET_FORMAT(DATE,'EUR')) GROUP BY OUTLET,BILLDATE,HOUR(BILLTIME)";
            System.out.println("2"+query1);
        }

        try {


            con = DBConnection.createConnection();


            PreparedStatement ps = con.prepareStatement(query1);
            ResultSet rs = ps.executeQuery();
            Map<RecordKey, Long> mapData = getMapList(rs);
        }
publicstaticstringcreatejson(List-outletList、stringstartdate、stringenddate)抛出异常{
连接con=null;
字符串查询1;
List mapList=新建LinkedList();
字符串outletStr=outletList.stream().collect(collector.joining(“,”,“(“,”)”));
if(outletList.equals(“全部”)){
query1=“选择a.OUTLET、b.CUSTOMERDESCRIPTOR、a.BILLDATE、HOUR(a.BILLTIME)作为小时、SUM(a.NETAMOUNT)作为SYNCBILL a、ecustomer b中的金额,其中a.OUTLET=b.CUSTOMERIDENTIFIER和a.CANCELLED'Y'和a.BILLDATE在STR_到_日期之间(替换(')”
+startDate+“,”/“,”。”),GET_格式(日期,'EUR')和STR_TO_日期(替换(“+endDate
+“,”、“/”、“.”),按门店、账单日期、小时(账单时间)获取_格式(日期,'EUR'))分组;
System.out.println(“全部”+查询1);
}否则{
query1=“选择a.OUTLE、b.CUSTOMERDESCRIPTOR、a.BILLDATE、小时(a.BILLTIME)作为小时、总和(a.NETAMOUNT)作为来自SYNCBILL a、ecustomer b的金额,其中a.OUTLE=b.CUSTOMERIDENTIFIER和b.CUSTOMERDESCRIPTOR in”
+outletStr+”和a.CANCELLED'Y'和a.BILLDATE之间的STR_到_日期(替换(“+startDate
+“,”/“,”。”),获取格式(日期,'EUR')和STR_TO_日期(替换(“+endDate
+“,”、“/”、“.”),按门店、账单日期、小时(账单时间)获取_格式(日期,'EUR'))分组;
系统输出打印项次(“2”+查询1);
}
试一试{
con=DBConnection.createConnection();
准备好的报表ps=con.准备好的报表(查询1);
结果集rs=ps.executeQuery();
Map mapData=getMapList(rs);
}
我没有发布完整的Java代码。我想要的是,如果用户选择all,那么if语句应该执行,其中的查询应该执行。如果用户选择else,那么其他应该工作,在我的代码中,只有else在不执行时工作


如何调试此问题?

我为您的问题提供了一个简单的解决方案。当用户选择“全部”时,则在这种情况下传递空列表,并在进行查询时仅输入此条件

if (outletList.size()==0) {
// case for all
} else {
// do regular stuff
}

正如评论中所指出的,您没有比较可比较的类型。
outletList
是一个
列表
,它不能等同于一个
字符串
,即使该列表可能只包含一个碰巧是
字符串的元素。因此,
outletList.equals(“ALL”)
并没有做您认为它做的事情

但这引出了一个有趣的问题。你有一个选择列表,它不是多个,那么为什么要返回一个总是单个值的列表呢?为什么要在选择了所有值后返回一个空列表呢?这是没有意义的;按预期做了一个选择。这增加了不必要的混乱锡安

尝试将单个值作为
字符串发回
,并让该值确定逻辑,这样您就有了灵活性。如果无法避免列表,则只接受单个值(
list[0]
),并在而不是
list
上调用equals

if(outletList[0].equals(“All”){…}

如果您以后发现自己需要多个
If-else
对,您可以切换到
开关,如下所示:

switch(outletList[0]) { // or the single value...
    case "ALL":
        ...
    ...
    default:
        ... 
}

您需要在if语句中为选项标记
ALL
指定值,以便将字符串列表与字符串进行比较:
outletList.equals(“ALL”)
。这永远不会返回真值。@MWB OK..那么我需要做什么?@manishthakur首先从列表中获取字符串。@MWB您能帮我处理代码吗?事实上,我是新手,所以请。先生,在这两种情况下,它的大小都是1..正如我在控制台outletList上打印的。size()…因为在控制台上选择所有outletStrr打印“ALL”时,您需要更改代码,同时将值放入列表中。如果您从html表单中接收ALL,则不要将任何内容放入列表中,仅当接收到的值不为ALL时才将其放入。如果/否则,随着代码的增长和更改,您最终会得到未知数量的p必须保持的潜在if/if-else/else对使其成为一种风险和责任。对逻辑结构最明显的误用,或缺乏使用,是当您编码d时