我正在处理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语句,那么应该执行其中的查询。如果用户选择了其他选项,则其他选项应该起作用,并且在我的代码中,只有其他选项在不执行时才起作用。
我该如何调试呢?
答案 0 :(得分:0)
对于您的问题,我有一个简单的解决方案。当用户选择全部时,则在这种情况下传递空列表,并在进行查询时仅放置此条件。
if (outletList.size()==0) {
// case for all
} else {
// do regular stuff
}
答案 1 :(得分:0)
正如评论中指出的那样,您没有比较可比较的类型。 outletList
是List
,即使列表可能只包含一个碰巧是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:
...
}