그 동안은 동일한 name속성을 가진 input태그 값들을 하나씩 받았다.
checkbox의 경우 동일한 name속성으로 여러개의 값들을 보낼 수 있는데, 이를 받는 방법을 연습하였다.
String배열
로 값을 받는다null
로 들어온다는 점을 유념하자(유효성검사를 하는 이유!)<form action="#" method="get">
<input type="checkbox" name="fruit" value="apple">사과
<input type="checkbox" name="fruit" value="orange">오렌지
<button type="submit">검색</button>
</form>
if(request.getParameterValues("fruit") != null) {
for(String s : request.getParameterValues("fruit")) {
System.out.println(s);
}
}
//check박스의 값들이 잘 들어오는지 확인한다
System.out.println(request.getParameterValues("ckMonth"));
// String배열 변수 ckMonth에 파라미터값들을 담는다
String[] ckMonth = request.getParameterValues("ckMonth");
// 추후 where절에서 DB의 월과 비교할 때 DB의 값은 숫자이기 때문에 숫자 배열로 형변환한다
int[] intCkMonth = null; // int[] 대신에 ArrayList<Integer>를 사용할 수 있다
if(ckMonth != null) {
intCkMonth = new int[ckMonth.length]; // ckMonth길이이 같은 수
for(int i=0; i<intCkMonth.length; i+=1) {
intCkMonth[i] = Integer.parseInt(ckMonth[i]);
}
}
String sql = null;
PreparedStatement stmt = null;
if(intCkMonth == null) { // 선택된 월이 없으면 전체 데이터를 보여준다
sql = "SELECT * FROM employees LIMIT ?, ?";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, startRow);
stmt.setInt(2, rowPerPage);
} else { // 선택된 월이 1개 이상일 때
sql = "SELECT * FROM employees WHERE MONTH(hire_date) IN (?";
// 쿼리에 ?의 개수를 셋팅
for(int i=1; i<intCkMonth.length; i+=1) {
sql += ",?";
}
sql += ") LIMIT ?, ?";
stmt = conn.prepareStatement(sql);
// 쿼리에 ?값을 셋팅
for(int i=0; i<intCkMonth.length; i+=1) {
stmt.setInt(i+1, intCkMonth[i]);
}
stmt.setInt(intCkMonth.length+1, startRow);
stmt.setInt(intCkMonth.length+2, rowPerPage);
}
System.out.println(stmt); // 쿼리 디버깅