본문 바로가기

회고록(TIL&WIL)

TIL 2023.01.18 Java Web3 (pagination search)

클라이언트 -> WAS 컨테이너 -> DB접속 -> 문자열생성...끝! -> DB접속 해제 -> 클라이언트 화면 출력
문자열 생성동안 계속해서 DB에 연결되어 있기 때문에 불리한 점이 있게 된다.
또한 중간단계에서 예외, 문제가 발생할 경우 사용자의 입장에선 데이터가 정확한지 확신 할 수 없게 된다.

그렇기 때문에 DB에서 데이터만 받고 접속을 끊고 받은 데이터로 문자열을 만드는 방식이 좋다.
가공작업이 필요할 경우 해당하는 데이터타입으로 Int, Date 등으로 받아 정제한 후 출력할 때는 어차피 문자열이기 때문에 toString이든 + "" 이든해서 문자열로 출력하게된다.

ArrayList<String[]> list = new ArrayList<String[]>();
try{
  Class.forName(driver);
  conn = DriverManager.getConnection(url, user, password);
  stmt = conn.createStatement();
  rs = stmt.executeQuery(sql);
  while(rs.next()){
    String[] arr = new String[4];
    arr[0] = rs.getInt("num")+"";
    arr[1] = rs.getString("sub");
    arr[2] = rs.getString("id");
    arr[3] = rs.getDate("nalja").toString();
    list.add(arr);
  }
} finally {
  if(rs!=null) rs.close();
  if(stmt!=null) stmt.close();
  if(conn!=null) conn.close();
}
  for(int i = 0; i < list.size(); i++){
    String[] obj = list.get(i);
    %>
    <tr>
    <td><%=obj[0] %></td>
    <td><%=obj[1] %></td>
    <td><%=obj[2] %></td>
    <td><%=obj[3] %></td>
    </tr>
  <%
  }
  %>

한글깨질 시 tomcat 설정


tomcat\conf\server.xml 에서 해당 라인에 URIEncoding="utf-8" 추가

<Connector connectionTimeout="20000" URIEncoding="utf-8" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

페이징 + 검색

<h1>페이징 된 게시판</h1>
		<table border="1" cellspacing="0" align="center" width="700">
			
			<tr>
				<th width="100">글번호</th>
				<th>제목</th>
				<th width="100">글쓴이</th>
				<th width="100">날짜</th>
			</tr>
			<%@ page import="java.sql.*, java.util.*" %>
			<%
			String strLimit = request.getParameter("limit");
			int limit = 10;
			if(strLimit!=null) limit = Integer.parseInt(strLimit);  
			
			String word = request.getParameter("word");
			if(word==null) word = "";
			String key = request.getParameter("key");
			if(key==null) key = "sub";
			
			int maxCnt = 0;
			
			String msgPage = (request.getParameter("page"));
			int p = 1;
			if(msgPage!=null) p = Integer.parseInt(msgPage);
// 			String sql = "select num, sub, id, nalja from bbs01 " 
// 					+ "where num>=(select max(num)-10* from bbs01)-10 and num<=(select max(num) from bbs01)-10 " 
// 					+ "order by num desc";
			
// 			String sql = "select num, id, sub, nalja "
// 					+ "from (select num,sub,id,nalja,@rownum:=@rownum+1 as rn "
// 					+ "from bbs01, (select @rownum:=0 from dual)R order by num desc)R2 "
// 					+ "where rn>=1+"+((p-1)*10)+" and rn<=10+"+((p-1)*10)+"";

			String sql = "select num, id, sub, nalja from bbs01 where "+key+" like '%"+word+"%' order by num desc limit "+limit+" offset "+(limit*(p-1));			
	
			String sql2 = "select CEILING(COUNT(*)/"+limit+") from bbs01 where "+key+" like '%"+word+"%'";
			
			String driver = "com.mysql.jdbc.Driver";
			String url = "jdbc:mysql://localhost:3306/lecture";
			String user = System.getenv("local.mysql.user");
			String password = System.getenv("local.mysql.password");
			
			Connection conn = null;
			Statement stmt = null;
			ResultSet rs = null;
			try {
				Class.forName(driver);
				conn = DriverManager.getConnection(url, user, password);
				
				stmt = conn.createStatement();
				rs = stmt.executeQuery(sql2);
				if(rs.next()) maxCnt=rs.getInt(1);
				rs.close();
				stmt.close();
				
				stmt = conn.createStatement();
				rs = stmt.executeQuery(sql);
				while(rs.next()){
			%>
			<tr>
				<td><%=rs.getInt("num") %></td>
				<td><%=rs.getString("sub") %></td>
				<td><%=rs.getString("id") %></td>
				<td><%=rs.getDate("nalja") %></td>
			</tr>
			<%
				}
			} finally {
				if(rs!=null) rs.close();
				if(stmt!=null)stmt.close();
				if(conn!=null)conn.close();
				
			}
			%>
			<tr align="center">
				<td colspan="4">
				<form>
					<select name="key">
						<option value="sub">제목</option>
						<option value="id">글쓴이</option>
						<option value="content">내용</option>
					</select>
					<input type="text" name="word">
					<input type="submit" value="검색">
				</form>
				<%
				int start = 0 + 5 * ((p-1)/5);
				int end = start + 5;
				if(end > maxCnt) end = maxCnt;
				if(start!=0){
				%>
				<a href="list.jsp?limit=<%=limit %>&page=<%=start-1%>&key=<%=key%>&word=<%=word%>">◀</a>
				<%
				}
				for(int i = start; i < end; i++){
				%>
					<a href="list.jsp?limit=<%=limit %>&page=<%=i+1%>&key=<%=key%>&word=<%=word%>">[<%=i+1%>]</a>
				<%
				} 
				if(end < maxCnt){
				%>
				<a href="list.jsp?limit=<%=limit %>&page=<%=end+1%>&key=<%=key%>&word=<%=word%>">▶</a>
				<%
				}
				%>
				</td>
			</tr>
			<tr>
				<td colspan="4" align="right">
				<a href="list.jsp?limit=5&page=<%=p%>&key=<%=key%>&word=<%=word%>">[5개씩 보기]</a>
				<a href="list.jsp?limit=10&page=<%=p%>&key=<%=key%>&word=<%=word%>">[10개씩 보기]</a>
				</td>
			</tr>
		</table>

'회고록(TIL&WIL)' 카테고리의 다른 글

TIL 2023.01.30 Git 명령어 정리  (0) 2023.01.30
WIL 2023.01.25 ~ 2023.01.27 java JSP, vagrant  (0) 2023.01.30
TIL 2023.01.17 Java Web 2  (0) 2023.01.18
TIL 2023.01.16 Java Web  (0) 2023.01.18
TIL 2023.01.12 mongoDB, JDBC - mongoDB  (0) 2023.01.16