이전글에서 NoticeService 클래스의 메소드에 필요한 SQL문을 작성했었다.
https://myblog1128.tistory.com/110
Service 클래스와 메소드 생성하기위한 SQL문 작성
공지 목록 조회 1. getNoticeList() 사용자는 공지사항의 링크를 클릭하는 것과 같이 페이지 요청을 통해 공지를 볼 수 있다. 공지사항의 목록을 default로 정해진 갯수만큼 보여준다. 2. getNoticeList(int pa
myblog1128.tistory.com
이제 메소드의 JDBC 코드와 같이 나머지 부분을 작성해보도록 하자.
아래의 코드에서 SQL 부분을 보면 field를 ?로 값을 준다면 'field'의 형식과 같이 문자열로 들어가기 때문에
setXXX() 메소드를 사용하지 않고 field 값을 그대로 주었다.
첫 번째 ?는 'query'가 들어가는 것을 다 포함해야하기 때문에 앞뒤로 %를 포함해주도록 한다.
두 번째 ?는 10개씩 끊어져야하므로 1, 11, 21, 31, ... 과 같이 나타내기 위해 아래와 같은 식을 사용하고
세 번째 ?는 10, 20, 30, ...과 같이 나타나야하므로 page * 10 과 같은 식을 사용했다.
1. getNoticeList(String field, String query, int page)
public List<Notice> getNoticeList(String field, String query, int page){
List<Notice> list = new ArrayList<>();
String sql = "SELECT * FROM (" +
"SELECT ROWNUM NUM, N.* " +
"FROM(SELECT * FROM NOTICE WHERE " +field+" LIKE ? ORDER BY REGDATE DESC) N " +
")" +
"WHERE NUM BETWEEN ? AND ?";
String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:xe";
String USER = "system";
String PASSWORD = "oracle";
try {
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, "%" + query + "%");
st.setInt(2, 1 + (page-1)*10);
st.setInt(3, page*10);
ResultSet rs = st.executeQuery();
while(rs.next()){
int id = rs.getInt("ID");
String title = rs.getString("TITLE");
Date regDate = rs.getDate("REGDATE");
String writerId = rs.getString("WRITER_ID");
Integer hit = rs.getInt("HIT") ;
String files = rs.getString("FILES");
String content = rs.getString("CONTENT");
Notice notice = new Notice(
id, title, regDate, writerId, hit, files, content
);
list.add(notice);
}
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException se) {
// TODO Auto-generated catch block
se.printStackTrace();
}
return list;
}
나머지 메소드들도 같은 맥락으로 이해하면 된다.
2. getNoticeCount(String field, String querry)
public int getNoticeCount(String field, String query) {
int count = 0;
String sql = "SELECT COUNT(ID) COUNT FROM (" +
"SELECT ROWNUM NUM, N.* " +
"FROM(SELECT * FROM NOTICE WHERE " +field+" LIKE ? ORDER BY REGDATE DESC) N " +
")";
String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:xe";
String USER = "system";
String PASSWORD = "oracle";
try {
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, "%" + query + "%");
ResultSet rs = st.executeQuery();
if(rs.next()){
count = rs.getInt("count");
}
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException se) {
// TODO Auto-generated catch block
se.printStackTrace();
}
return count;
}
3. getNotice(int id)
public Notice getNotice(int id) {
Notice notice = null;
String sql = "SELECT * FROM NOTICE WHERE ID=?";
String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:xe";
String USER = "system";
String PASSWORD = "oracle";
try {
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
PreparedStatement st = conn.prepareStatement(sql);
st.setInt(1, id);
ResultSet rs = st.executeQuery();
if(rs.next()){
int nid = rs.getInt("ID");
String title = rs.getString("TITLE");
Date regDate = rs.getDate("REGDATE");
String writerId = rs.getString("WRITER_ID");
Integer hit = rs.getInt("HIT") ;
String files = rs.getString("FILES");
String content = rs.getString("CONTENT");
notice = new Notice(
nid, title, regDate, writerId, hit, files, content
);
}
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException se) {
// TODO Auto-generated catch block
se.printStackTrace();
}
return notice;
}
4. getNextNotice(int id)
public Notice getNextNotice(int id) {
Notice notice = null;
String sql = "SELECT * FROM NOTICE "
+ "WHERE ID = ( "
+ "SELECT ID FROM NOTICE "
+ "WHERE REGDATE>(SELECT REGDATE FROM NOTICE WHERE ID = ?) "
+ "AND ROWNUM=1"
+ ")";
String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:xe";
String USER = "system";
String PASSWORD = "oracle";
try {
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
PreparedStatement st = conn.prepareStatement(sql);
st.setInt(1, id);
ResultSet rs = st.executeQuery();
if(rs.next()){
int nid = rs.getInt("ID");
String title = rs.getString("TITLE");
Date regDate = rs.getDate("REGDATE");
String writerId = rs.getString("WRITER_ID");
Integer hit = rs.getInt("HIT") ;
String files = rs.getString("FILES");
String content = rs.getString("CONTENT");
notice = new Notice(
nid, title, regDate, writerId, hit, files, content
);
}
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException se) {
// TODO Auto-generated catch block
se.printStackTrace();
}
return notice;
}
5. getPrevNotice(int id)
public Notice getPrevNotice(int id) {
Notice notice = null;
String sql = "SELECT * FROM NOTICE "
+ "WHERE ID = ( "
+ "SELECT ID FROM (SELECT * FROM NOTICE ORDER BY REGDATE DESC) "
+ "WHERE REGDATE<(SELECT REGDATE FROM NOTICE WHERE ID = ?) "
+ "AND ROWNUM=1 "
+ ")";
String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:xe";
String USER = "system";
String PASSWORD = "oracle";
try {
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
PreparedStatement st = conn.prepareStatement(sql);
st.setInt(1, id);
ResultSet rs = st.executeQuery();
if(rs.next()){
int nid = rs.getInt("ID");
String title = rs.getString("TITLE");
Date regDate = rs.getDate("REGDATE");
String writerId = rs.getString("WRITER_ID");
Integer hit = rs.getInt("HIT") ;
String files = rs.getString("FILES");
String content = rs.getString("CONTENT");
notice = new Notice(
nid, title, regDate, writerId, hit, files, content
);
}
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException se) {
// TODO Auto-generated catch block
se.printStackTrace();
}
return notice;
}
서비스 클래스를 작성했다면 컨트롤러를 살펴보도록 하자.
list.jsp를 살펴보면 검색분류가 f 파라미터로 되어있고 검색어는 p 파라미터로 되어있는 것을 확인할 수 있다.
그리고 검색이라는 것은 필수가 아니고 옵션이기 때문에 null일 수도 있다.
따라서 임시변수를 사용하도록 했다.
NoticeListController.java
package com.web.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.web.entity.Notice;
import com.web.service.NoticeService;
@WebServlet("/notice/list")
public class NoticeListController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 임시변수
String field_ = req.getParameter("f");
String query_ = req.getParameter("q");
String field = "title";
// 사용자가 전달한 값이 있다면
if(field_ != null) {
field = field_;
}
String query = "";
if(query_ != null) {
query = query_;
}
NoticeService service = new NoticeService();
List<Notice> list = service.getNoticeList(field, query, 1);
req.setAttribute("list", list);
req.getRequestDispatcher("/WEB-INF/view/notice/list.jsp").forward(req, resp);
}
}
다음은 아래의 사진과 같이 작성자 옵션으로 선택해서 검색한다면 작성자 옵션으로 남아있고
검색어도 검색 버튼을 누흔 후 사라지지 않게 하기 위한 list.jsp 코드이다.
list.jsp
<fieldset>
<legend class="hidden">공지사항 검색 필드</legend>
<label class="hidden">검색분류</label>
<select name="f">
<option ${(param.f == "title")? "selected": "" } value="title">제목</option>
<option ${(param.f == "writer_id")? "selected": "" } value="writer_id">작성자</option>
</select>
<label class="hidden">검색어</label>
<input type="text" name="q" value="${param.q }"/>
<input class="btn btn-search" type="submit" value="검색" />
</fieldset>
검색 분류의 파라미터가 title이라면 title을 선택하게 하고 wirter_id라면 writer_id를 선택하게 했다.
그리고 EL 연산자를 통해서 text 박스에 그 값을 남길 수 있도록 했다.
결과는 아래의 사진과 같다.
하지만 검색을 할 수 있게 적용하고 난 후에 페이징이 적용되지 않는 문제가 발생한다.
이는 다음 게시글에서 해결해보도록 하자.
'강의 정리하기 > JSP와 Servlet' 카테고리의 다른 글
댓글 수 포함하기 및 index 페이지 추가하기 (0) | 2023.08.17 |
---|---|
페이지 처리하기 및 detail을 Service를 이용하여 구현하기 (0) | 2023.08.15 |
Service 클래스와 메소드 생성하기위한 SQL문 작성 (0) | 2023.08.03 |
기업형으로 만든다는 것은? (0) | 2023.08.02 |
JSTL의 function 이용하기 (0) | 2023.07.31 |