Java7下JSP报表周数转起止日期及多选周选项修改技术问询
一、修正周起始日期多选UI
- 调整多选框参数命名以支持批量选中,优化选项显示文本让用户清晰对应周标识与起始日期
- 确保选项值为正确的1-52周数
修正后的report.jsp代码片段:
out.println("<div class='grid_3' id='hidden_div' style='display:none;'>"); out.println("<p>"); // 修改name为weekStart[],支持多选参数提交 out.println("<select name='weekStart[]' id= 'weekStart' style='width:150px;' multiple='multiple' >"); String weekDates[]={"01-02","01-09","01-16","01-23","01-30","02-06","02-13","02-20","02-27", "03-06","03-13","03-20","03-27","04-03","04-10","04-17","04-24","05-01","05-08", "05-15","05-22","05-29","06-05","06-12","06-19","06-26","07-03","07-10","07-17","07-24", "07-31","08-07","08-14","08-21","08-28","09-04","09-11","09-18","09-25","10-02","10-09","10-16", "10-23","10-30","11-06","11-13","11-20","11-27","12-04","12-11","12-18","12-25"}; String weekNum[]={"Jan1", "Jan2", "Jan3", "Jan4", "Jan5", "Feb6", "Feb7", "Feb8", "Feb9", "Mar10", "Mar11", "Mar12", "Mar13", "Apr14", "Apr15", "Apr16", "Apr17", "May18", "May19", "May20", "May21", "May22", "Jun23", "Jun24", "Jun25", "Jun26", "Jul27", "Jul28", "Jul29", "Jul30", "Aug31", "Aug32", "Aug33", "Aug34", "Aug35", "Sep36", "Sep37", "Sep38", "Sep39", "Oct40", "Oct41", "Oct42", "Oct43", "Oct44", "Nov45", "Nov46", "Nov47", "Nov48", "Dec49", "Dec50", "Dec51", "Dec52"}; // 循环覆盖全部52周,周数为索引+1 for (int k = 0; k < weekNum.length; k++){ int weekNumber = k + 1; // 显示格式:周标识(起始日期),提升用户体验 out.println("<option value='" + weekNumber + "'>" + weekNum[k] + " (" + weekDates[k] + ")</option>"); } out.println("</select>"); out.println("</p>"); out.println("<p>"); out.println("<label>Year</label>"); out.println("<select name='year' id='year' class='mediumSelect'>"); String currentYear = Dates.getTimeStamp("yyyy"); for(int years=2020;years<(Integer.parseInt(currentYear)+5);years++) { if(Integer.parseInt(currentYear) == years){ out.println("<option value='"+years+"' selected>"+ years +"</option>"); }else{ out.println("<option value='"+years+"'>"+ years +"</option>"); } } out.println("</select>"); out.println("</p>"); out.println("</div>");
二、Java7环境下周数转起止日期实现
1. 扩展Dates.java日期处理方法
新增周起始/结束日期计算方法,适配业务规则:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; public class Dates { // 根据年份和周数获取对应周的起始日期 public static String getWeekStartDate(int year, int weekNumber) { String weekDates[]={"01-02","01-09","01-16","01-23","01-30","02-06","02-13","02-20","02-27", "03-06","03-13","03-20","03-27","04-03","04-10","04-17","04-24","05-01","05-08", "05-15","05-22","05-29","06-05","06-12","06-19","06-26","07-03","07-10","07-17","07-24", "07-31","08-07","08-14","08-21","08-28","09-04","09-11","09-18","09-25","10-02","10-09","10-16", "10-23","10-30","11-06","11-13","11-20","11-27","12-04","12-11","12-18","12-25"}; // 校验周数合法性 if(weekNumber <1 || weekNumber >52){ return ""; } return year + "-" + weekDates[weekNumber-1]; } // 根据起始日期计算周结束日期(+6天) public static String getWeekEndDate(String startDate) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar cal = Calendar.getInstance(); try { cal.setTime(sdf.parse(startDate)); cal.add(Calendar.DAY_OF_MONTH, 6); return sdf.format(cal.getTime()); } catch (ParseException e) { LogFunction.loginfo("日期解析错误:" + e.getMessage()); return ""; } } // 保留原有getDayOfWeek方法(若不需要可移除) public static String getDayOfWeek(String dateString) { java.util.Date date=new java.util.Date(); SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); try{ date=df.parse(dateString); }catch(Exception e){ LogFunction.loginfo("getDayOfWeek解析错误:"+e.getMessage()); } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return Integer.toString(calendar.get(Calendar.DAY_OF_WEEK)); } }
2. 修正report_act.jsp多选周处理逻辑
处理用户选中的多个周数,转换为报表过滤所需的日期条件:
// report_act.jsp中的周处理逻辑 String[] selectedWeeks = request.getParameterValues("weekStart[]"); String year = request.getParameter("year"); if(selectedWeeks != null && selectedWeeks.length >0 && year != null && !year.isEmpty()){ // 拼接多周的日期过滤条件 StringBuilder dateFilter = new StringBuilder(); int targetYear = Integer.parseInt(year); for(String weekStr : selectedWeeks){ int weekNumber = Integer.parseInt(weekStr); String startDate = Dates.getWeekStartDate(targetYear, weekNumber); String endDate = Dates.getWeekEndDate(startDate); if(!startDate.isEmpty() && !endDate.isEmpty()){ if(dateFilter.length() >0){ dateFilter.append(" OR "); } dateFilter.append("date BETWEEN '").append(startDate).append("' AND '").append(endDate).append("'"); } } // 编码过滤条件避免URL乱码 String encodedFilter = java.net.URLEncoder.encode(dateFilter.toString(),"UTF-8"); response.sendRedirect(namePage+".jsp?millId="+millId+"&stationStatus="+stationStatus+"&inspectorId="+inspectorId+"&roundIdList="+roundIdList+"&reportType="+reportType+"&jobPosition="+jobPosition+"&scheduleId="+scheduleId+"&filterType="+filterType+"&dateFilter="+encodedFilter+"&year="+year+"&roundId="+roundId+"&stationId="+stationId+"&sequenceId="+sequenceId+"&pageNo="+pageNo); }else{ // 未选择周数时的跳转逻辑 response.sendRedirect(namePage+".jsp?error=请选择至少一个周数&millId="+millId+"&stationStatus="+stationStatus+"&inspectorId="+inspectorId+"&roundIdList="+roundIdList+"&reportType="+reportType+"&jobPosition="+jobPosition+"&scheduleId="+scheduleId+"&filterType="+filterType+"&roundId="+roundId+"&stationId="+stationId+"&sequenceId="+sequenceId+"&pageNo="+pageNo); }
三、关键问题说明
- 多选参数传递:必须将select的name设为
weekStart[],后台才能通过request.getParameterValues获取所有选中项 - 周数映射校验:添加周数范围校验,避免非法输入导致数组越界
- 编码处理:对拼接的日期过滤条件做URL编码,防止中文或特殊字符乱码
内容的提问来源于stack exchange,提问作者khairun aqilah
相关产品推荐
相关产品推荐

