如果不是,则无法根据用户选择进行操作

时间:2018-10-23 05:23:07

标签: java servlets html-form

我正在处理HTML表。为此,我要从Java代码返回JSON。我有一个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>

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

    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();
        }


    }

现在这是我的Java类,在这里我编写了两个查询,一个查询用户是否选择全部,另一个查询用户选择特定的插座。我的问题是,如果用户从FORM中选择了一个出口(如果用户选择ALL),则if语句未在执行,否则正在执行。

下面是我的代码:

   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);
        }

我没有发布完整的Java代码。我想要的是,如果用户选择了所有if语句,那么应该执行其中的查询。如果用户选择了其他选项,则其他选项应该起作用,并且在我的代码中,只有其他选项在不执行时才起作用。

我该如何调试呢?

2 个答案:

答案 0 :(得分:0)

对于您的问题,我有一个简单的解决方案。当用户选择全部时,则在这种情况下传递空列表,并在进行查询时仅放置此条件。

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

答案 1 :(得分:0)

正如评论中指出的那样,您没有比较可比较的类型。 outletListList,即使列表可能只包含一个碰巧是String的元素,也不能将其等同于String。因此,outletList.equals("ALL")并没有您认为的那样。

但这提出了一个有趣的观点。您有一个不是multiple的选择列表,那么为什么要返回总是 值的列表?为什么选择ALL时切换回空列表呢?那没有道理;按预期进行了一次选择。这会增加不必要的混乱。

请尝试将单个值作为String发送回去,并让该值确定逻辑,以便您具有灵活性。如果无法避免该列表,则仅接受一个值(例如list[0]),然后在 that not 上调用equals List

if(outletList[0].equals("All")) {...}

如果以后发现自己需要一对以上的if-else,则可以像这样切换到switch

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