ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MVC(Model View Control)1
    JAVA/웹 프로그래밍 - JSP 2020. 11. 11. 22:33

    아래의 내용을 살펴보자.

    designatedroom87.tistory.com/303?category=901206

     

    게시판 만들기

    우선, MultiInsert.jsp 파일부터 만드는데, MultiInsert이 하는 역할은 테이블에 데이터를 충분히 많이 저장하기 위해 만든 것이다. 반복문을 돌면서 데이터를 테이블에 저장하는 것을 아래에서 볼 수

    designatedroom87.tistory.com

     

    내용에 앞서, WebContent에 html 파이을 하나 만들고 이름을 XML이라고 하자.

    그리고 아래의 내용을 입력하고 실행해보자.

    아래의 문법에 Json이다. 이와 같은 예제를 제시하는 이유는 나중에 데이터를 여러 방법을 통해 저장할 수 있다는 것을

    보여주기 위함이다. 아래에서도 데이터의 저장에 대한 내용이 나온다.

    XML.html

    더보기
    <!DOCTYPE html>
    <html>
    <body>
    
    <h2>Create Object from JSON String</h2>
    
    <p id="demo"></p>
    
    <script>
    //	배열로 정의
    var text = '{"employees":[' +
    '{"firstName":"John","lastName":"Doe" },' +
    '{"firstName":"Anna","lastName":"Smith" },' +
    '{"firstName":"Peter","lastName":"Jones" }]}';
    
    obj = JSON.parse(text);
    document.getElementById("demo").innerHTML =
    obj.employees[1].firstName + " " + obj.employees[1].lastName;
    </script>
    
    </body>
    </html>

     

    Control은 URL 요청에 대한 처리 및 URL을 통제한다. ( Control가 url 주소를 해석해서 던져준다. )

    Control은 View를 만들어서 DB로부터 데이터를 가지고 와서 View를 만들 수 있다.

    View는 사용자 화면이다. 

    list.jsp에서는 DB에 접속을 하고 쿼리를 해서 테이블에 있는 데이터들을 모두 가지고 와서 게시판 형식으로 출력했다.

    페이지는 정적과 동적페이지로 나뉜다.(DB사용 유무로 나뉜다)

    service와 Dao(database access object) 라는 용어가 있는데, 일단 DB작업이라고 생각하자.

     

    mvc1은 하나의 jsp파일에 jsp문법이 위에 위치하고 html 문법은 아래에 나오도록 분리를 한다.

    우선, WebContent폴더의 하위에 mvc1message 폴더를 만든다.

     

    WebContent폴더의 message폴더의 list.jsp 하나를 복사해온다.

    그리고, 변수를 try ~catch문 위로 빼고 jsp 문법을 위로, html 문법을 아래로 분리하자.

    그리고 src폴더의 하위로 message라는 패키지를 생성하고

    이 패키지에 Message라는 class 파일을 만든다. 메인 함수는 필요없다.

    Message 객체가 Model이다.

    Message.java

    더보기
    package message;
    
    public class Message
    {
    	private int no;
    	private String name;
    	private String content;
    	
    	public Message()
    	{
    		
    	}
    	
    	public Message(int no, String name, String content)
    	{
    		this.no = no;
    		this.name = name;
    		this.content = content;
    	}
    
    	public int getNo() {return no;}
    	public void setNo(int no) {this.no = no;}
    	public String getName() {return name;}
    	public void setName(String name) {this.name = name;}
    	public String getContent() {return content;}
    	public void setContent(String content) {this.content = content;}
    }

     

    list.jsp파일에서 각 문법들이 분리가 되면, HTML에 변수를 전달해줘야 하는데, 딱히 방법이 없다.

    그래서 프레임 워크 중에 List를 활용을 해서 DB에 접속해서 테이터들을 List에 저장해서 필요한 데이터를 전달해준다.

    여기에서 테이블에 저장할 데이터는 no,name,content 이렇게 세 종류의 데이터이다.

    이를 클래스로 만든 것이 위의 Message 클래스이다.

    List에서는 이 Message 객체를 저장할 것이다.

    List를 쓴 이유는 테이터는 여러 개 일 수 있으므로 사용한 것이다.

     

    list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%@ page import="com.iot.web.ConnectionPool" %>
    
    <!-- 임포트를 추가한다. -->
    <%@ page import="message.Message" %>
    <%@ page import="java.util.ArrayList" %>
    <%@ page import="java.util.List" %>
    
    <%		
    		//	변수 선언은 try 블록 위에 선언
    		Connection conn;
    		int requestPage = 1;
    		String _requestPage;
    		String sql;
    		PreparedStatement pstmt;
    		ResultSet rs;
    		
    		int totalCount = 0;		//	전체 글의 갯수
    		int countPerPage = 10;	//	페이지당 글의 갯수
    		int firstRow;
    		int endRow;
    		int startPage = 1;
    		int endPage = 1;
    		int totalPageCount = 0;
    		List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		try{
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			conn=DriverManager.getConnection(
    			"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    	
    			if(conn==null) {System.out.println("DB접속에 실패");}
    			System.out.println("DB접속 성공");
    		//1.요청한 페이지번호
    		_requestPage=request.getParameter("requestPage");
    		//System.out.printf("requestPage:%s\n", _requestPage);
    		if(_requestPage!=null)
    		{requestPage=Integer.parseInt(_requestPage);}
    		System.out.printf("requestPage:%d\n", requestPage);
    		
    		//2.전체페이지 수를 구해야함.
    		sql="select * from message";
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		rs=pstmt.executeQuery();
    		
    		while(rs.next()) totalCount++;
    		
    		//전체페이지 수를 구해야 
    		//요청한 페이지의 시작 글번호와 끝 글번호가 나오기 때문
    		firstRow=(requestPage-1)*countPerPage+1; 
    		if(firstRow<1){firstRow=0;}
    
    		endRow=firstRow+countPerPage-1;
    		if(endRow>totalCount){
    			endRow=totalCount;
    		}
    				
    		//전체페이지수******
    		
    		if(totalCount%10==0){
    		totalPageCount=(totalCount/countPerPage);
    		}else{
    			totalPageCount=(totalCount/countPerPage)+1;
    		}
    		//시작페이지 구하기
    		if(startPage<1){startPage=1;}
    		//끝페이지 구하기
    		//int endPage=startPage+4;
    		
    		if((startPage+4)>totalPageCount){
    			endPage=totalPageCount;
    		}else{
    			endPage=startPage+4;
    		}
    		if(endPage>totalPageCount){endPage=totalPageCount;}
    		
    		//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    				
    		//sql="select * from message where no>=firstRow and no<=endRow";
    		//sql="select * from message where no>=? and no<=? order by no asc"; //desc(최근글), asc(이전글)
    		sql="select * from message where no>=? and no<=? order by no desc"; //desc(최근글), asc(이전글)
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		//pstmt.setInt(1, firstRow); //asc
    		//pstmt.setInt(2, endRow); //asc
    		pstmt.setInt(1, totalCount-endRow); //desc
    		pstmt.setInt(2, totalCount-firstRow ); //desc
    		rs=pstmt.executeQuery();
    		
    		//List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		while(rs.next()) 
    		{
    			Message msg = new Message();
    			
    			msg.setNo(rs.getInt("no"));
    			msg.setName(rs.getNString("name"));
    			msg.setContent(rs.getNString("content"));	
    			
    			list.add(msg);
    		}
    		
    		pstmt.close();
    		conn.close();
    		}
    		catch(Exception e){}
    		finally{}
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <title>Page Message List</title>
    </head>
    <body>
    <div class="container">
    <h2><button class="btn" onclick="location.href='index.jsp'"><i class="fa fa-home"></i></button>메시지 전체 리스트</h2>
     <form action="search_list.jsp" method=post>
     	<div class="form-group">
     	<select name=field>
     	<option value=name>이름</option>
     	<option value=content>메시지</option>
     	</select>
        <!-- <input type="text" name="name" placeholder="찾을 내용을 입력하세요"> -->
        <input type="text" name="search" placeholder="찾을 내용을 입력하세요">
        <button type="submit" class="btn btn-default">검색</button>
        </div>
     </form>
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    
    <% //반복문 시작 %>
    <% for(int i = 0; i < list.size(); i++){
    	Message msg = list.get(i);
    %>
    	
    
    <tr >
    <td><%=msg.getNo()%></td>
    <td><a href='printSearch_proc.jsp?name=<%=msg.getName()%>'><%=msg.getName()%></a></td>
    <td><%=msg.getContent()%></td>
    </tr>
    <%}%>
    <%//반복문의 끝 %>
    
    <tr>
    <td colspan=2 align=center valign="center">
    <ul class="pagination">
        <% if(requestPage!=1){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=requestPage-1%>">이전페이지</a></li>
        <%}%>
        <% for(int i=startPage;i<=endPage;i++){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=i%>"><%=i%></a></li>
        <% } %>
        <% if(totalPageCount!=requestPage){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=requestPage+1%>">다음페이지</a></li>
        <%} %>
      </ul>
    </td>
    <td>
    <button onclick="location.href='messageForm.jsp'">글쓰기</button>
    </td>
    </tr>
    </table>
    <%
    
    %>
    </div>
    </body>
    </html>

    위의 list.jsp에서 둘로 문법을 나눴다. 중간에 약간의 jsp문법이 들어가 있는 것을 볼 수 있다. (for loop)
    나중에는 이 부분을 태그 형식으로 바꿔서 없앨 수 있다.  지금은 일단 이렇게 사용하자.

     

    그리고, 여기서 우리는 유효성 체크를 자바스크립트 문법을 통해서 할 수 있다.

    유효성이라는 의미는 로그인 form이 있다고 가정해보자.

    로그인을 하려고 하면 아이디가 공백인지 패스워드가 공백인지를 확인하여야 한다.

    아이디를 입력하지 않으면 아이디를 입력하라는 메시지를 띄워주는 일을 하면 된다.

    위의 부분이 유효성을 체크하는 부분으로 특정한 단어를 검색할 때 이 함수를 호출해서

    유효성을 체크해서 공백이 아니면 현재의 정보를 보내주도록 한다.

    위에서 기존에는 button 태그의 type이 submit였는데 button으로 변경이 되었다.

    그 이유는 submit로 하게되면 바로 정보를 전송하기 때문에, button으로 타입을 변경하고 

    유효성 체크하는 함수에서 정보가 올바르게 기입되면 그 때 전송을 하도록 한다.

    그리고 form 태그에 name이 새롭게 추가 되었다.

    유효성 체크 함수에서 이 name을 통해 form에 접근하기 위해 필요하다.

    나머지 유효성 체크가 필요한 페이지에서도 이 함수의 이름과 동일하게 쓰이므로 숙지하도록 하자.

    list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%@ page import="com.iot.web.ConnectionPool" %>
    
    <!-- 임포트를 추가한다. -->
    <%@ page import="message.Message" %>
    <%@ page import="java.util.ArrayList" %>
    <%@ page import="java.util.List" %>
    
    <%		
    		//	변수 선언은 try 블록 위에 선언
    		Connection conn;
    		int requestPage = 1;
    		String _requestPage;
    		String sql;
    		PreparedStatement pstmt;
    		ResultSet rs;
    		
    		int totalCount = 0;		//	전체 글의 갯수
    		int countPerPage = 10;	//	페이지당 글의 갯수
    		int firstRow;
    		int endRow;
    		int startPage = 1;
    		int endPage = 1;
    		int totalPageCount = 0;
    		List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		try{
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			conn=DriverManager.getConnection(
    			"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    	
    			if(conn==null) {System.out.println("DB접속에 실패");}
    			System.out.println("DB접속 성공");
    		//1.요청한 페이지번호
    		_requestPage=request.getParameter("requestPage");
    		//System.out.printf("requestPage:%s\n", _requestPage);
    		if(_requestPage!=null)
    		{requestPage=Integer.parseInt(_requestPage);}
    		System.out.printf("requestPage:%d\n", requestPage);
    		
    		//2.전체페이지 수를 구해야함.
    		sql="select * from message";
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		rs=pstmt.executeQuery();
    		
    		while(rs.next()) totalCount++;
    		
    		//전체페이지 수를 구해야 
    		//요청한 페이지의 시작 글번호와 끝 글번호가 나오기 때문
    		firstRow=(requestPage-1)*countPerPage+1; 
    		if(firstRow<1){firstRow=0;}
    
    		endRow=firstRow+countPerPage-1;
    		if(endRow>totalCount){
    			endRow=totalCount;
    		}
    				
    		//전체페이지수******
    		
    		if(totalCount%10==0){
    		totalPageCount=(totalCount/countPerPage);
    		}else{
    			totalPageCount=(totalCount/countPerPage)+1;
    		}
    		//시작페이지 구하기
    		if(startPage<1){startPage=1;}
    		//끝페이지 구하기
    		//int endPage=startPage+4;
    		
    		if((startPage+4)>totalPageCount){
    			endPage=totalPageCount;
    		}else{
    			endPage=startPage+4;
    		}
    		if(endPage>totalPageCount){endPage=totalPageCount;}
    		
    		//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    				
    		//sql="select * from message where no>=firstRow and no<=endRow";
    		//sql="select * from message where no>=? and no<=? order by no asc"; //desc(최근글), asc(이전글)
    		sql="select * from message where no>=? and no<=? order by no desc"; //desc(최근글), asc(이전글)
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		//pstmt.setInt(1, firstRow); //asc
    		//pstmt.setInt(2, endRow); //asc
    		pstmt.setInt(1, totalCount-endRow); //desc
    		pstmt.setInt(2, totalCount-firstRow ); //desc
    		rs=pstmt.executeQuery();
    		
    		//List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		while(rs.next()) 
    		{
    			Message msg = new Message();
    			
    			msg.setNo(rs.getInt("no"));
    			msg.setName(rs.getNString("name"));
    			msg.setContent(rs.getNString("content"));	
    			
    			list.add(msg);
    		}
    		
    		pstmt.close();
    		conn.close();
    		}
    		catch(Exception e){}
    		finally{}
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <title>Page Message List</title>
    <script>
    function dataCheck()
    {
    	if (document.getElementById("search").value ==""){
    		alert('검색할 단어를 입력하세요')
    		document.getElementById("search").focus();	//	커서의 이동
    		return;
    	}
    	document.form.submit();	//	name이 "form" 정보를 전송
    }
    </script>
    </head>
    <body>
    <div class="container">
    <h2><button class="btn" onclick="location.href='index.jsp'"><i class="fa fa-home"></i></button>메시지 전체 리스트</h2>
     <form name=form action="search_list.jsp" method=post>
     	<div class="form-group">
     	<select name=where>
     	<option value=name>이름</option>
     	<option value=content>메시지</option>
     	</select>
        <!-- <input type="text" name="name" placeholder="찾을 내용을 입력하세요"> -->
        <input type="text" id="search" name="search" placeholder="찾을 내용을 입력하세요">
        <button type="button" onclick=dataCheck() class="btn btn-default">검색</button>
        </div>
     </form>
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    
    <% //반복문 시작 %>
    <% for(int i = 0; i < list.size(); i++){
    	Message msg = list.get(i);
    %>
    
    <tr onClick="location.href='printSearch_proc.jsp?name=<%=msg.getName()%>'" 
    onmouseover="this.style.backgroundColor='lightgray'" 
    onmouseout="this.style.backgroundColor='white'">
    <td><%=msg.getNo()%></td>
    <td><%=msg.getName()%></td>
    <td><%=msg.getContent()%></td>
    </tr>
    <%}%>
    <%//반복문의 끝 %>
    
    <tr>
    <td colspan=2 align=center>
    <ul class="pagination">
        <% if(requestPage!=1){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=requestPage-1%>">이전페이지</a></li>
        <%}%>
        <% for(int i=startPage;i<=endPage;i++){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=i%>"><%=i%></a></li>
        <% } %>
        <% if(totalPageCount!=requestPage){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=requestPage+1%>">다음페이지</a></li>
        <%} %>
      </ul>
    </td>
    <td>
    <button onclick="location.href='messageForm.jsp'">글쓰기</button>
    </td>
    </tr>
    </table>
    <%
    
    %>
    </div>
    </body>
    </html>

     

     

     

    아래는 에러에 대해 어떠한 에러인지를 확인하기 위해 만든 파일이다.

    에러 확인이 필요한 페이지에서 해당 페이지를 임포트해서 사용한다.

    error.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" isErrorPage="true" %>
        <!-- page 지시자의 예외처리 부분은 isErrorPAge속성을 사용한다고 정의를 해야 에러 발생하지 않음 -->
        
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>에러확인 페이지</title>
    </head>
    <body>
    	에러가 발생했다.<br>
    	<%=exception.getMessage() %>
    	<%=exception.getStackTrace() %>
    </body>
    </html>

     

     

    아래의 내용들은 모두 message 폴더에서 가지고 와서, 유효성 체크가 필요한 부분은 위와 같이 작업을 한다.

    messageForm.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <title>Insert title here</title>
    <script>
    function dataCheck(){
    	if(document.getElementById("name").value==""){
    		alert("이름을 입력해 주세요")
    		return;
    	}
    	if(document.getElementById("content").value==""){
    		alert("메시지를 입력해 주세요")
    		return;
    	}
    	document.form.submit();
    	
    }
    </script>
    </head>
    <body>
    <div class="container">
      <h2><button class="btn" onclick="location.href='index.jsp'"><i class="fa fa-home"></i></button>메시지 입력</h2>
      <form name=form action="messageForm_proc.jsp" method=post>
        
        <div class="form-group">
          <label for="no">번호:</label>
          <input disabled type="text" class="form-control" id="no" name="no" placeholder="번호를 입력 하세요">
        </div>
        
        <div class="form-group">
          <label for="name">이름:</label>
          <input type="text" class="form-control" id="name" name="name" placeholder="이름을 입력 하세요">
        </div>
        
        <div class="form-group">
          <label for="content">메모:</label>
          <input type="text" class="form-control" id="content" name="content" placeholder="메모를 입력 하세요">
        </div>
        
        <button type="button" onclick=dataCheck() class="btn btn-default">입력</button>
      </form>
    </div>
    </body>
    </html>

     

     

     

     

    messageForm_proc.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%@ page isErrorPage="true" %>
    <% 
    try{
    String name=request.getParameter("name");
    String content=request.getParameter("content");
    
    
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn=DriverManager.getConnection(
    "jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    
    if(conn==null) {System.out.println("DB접속에 실패");}
    System.out.println("DB접속 성공");
    	String sql="insert into message(no,name,content) values(message_seq_no.nextval,?,?)";
    		PreparedStatement pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		
    		pstmt.setString(1, name);
    		pstmt.setString(2, content);
    		int result=pstmt.executeUpdate();
    		System.out.println(result+"개가 입력되었습니다.");
    		
    		pstmt.close();
    		conn.close();
    		
    		response.sendRedirect("list.jsp");
    		
    }catch(Exception e){}
    finally{}
    %>

     

     

     

     

    printSearch_proc.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%
    		String name=null;
    		String content=null;
    		int no=0;
    		
    		try{
    		//no=Integer.parseInt(request.getParameter("no"));
    		//System.out.println(no);
    		
    		name = request.getParameter("name");
    		System.out.println("printSearch_proc.jsp : "+name);
    		
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		Connection conn=DriverManager.getConnection(
    		"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    		
    		if(conn==null) {System.out.println("DB접속에 실패");}
    		System.out.println("DB접속 성공");
    		
    		//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    				
    		//String sql="select * from message where no=?";
    		String sql="select * from message where name=?";
    		PreparedStatement pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		//pstmt.setInt(1, no);
    		pstmt.setNString(1, name);
    		ResultSet rs=pstmt.executeQuery();
    		
    		if(rs.next()) {	
    			no=rs.getInt("no");
    			content=rs.getString("content");	
    		}
    		pstmt.close();
    		conn.close();
    		}//try end
    		catch(Exception e){}
    		finally{}
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <meta charset="UTF-8">
    <title>Message Print</title>
    </head>
    <body>
    
    <div class="container">
      <h2><button class="btn" onclick="location.href='index.jsp'"><i class="fa fa-home"></i></button>검색 결과</h2>
         
        <div class="form-group">
          <label for="no">번호:</label>
          <input value=<%=no%> disabled type="text" class="form-control" id="no" name="no" >
        </div>
        
        <div class="form-group">
          <label for="name">이름:</label>
          <input value=<%=name%> disabled type="text" class="form-control" id="name" name="name">
        </div>
        
        <div class="form-group">
          <label for="content">메모:</label>
          <input value=<%=content%> disabled  type="text" class="form-control" id="content" name="content">
        </div>
        
        <div class="form-group">
    	<button onclick="location.href='updateSearch_view.jsp?no=<%=no%>'">수정</button>
    	<button onclick="location.href='delete_proc.jsp?no=<%=no%>'">삭제</button>
        </div>
     
    </div>
    </body>
    </html>

     

     

     

     

    updateSearch_view.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%
    		int no=0;
    		String name=null;
    		String content=null;
    		
    		try{
    		no=Integer.parseInt(request.getParameter("no"));
    		System.out.println(no);
    		
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		Connection conn=DriverManager.getConnection(
    		"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    		
    		if(conn==null) {System.out.println("DB접속에 실패");}
    		System.out.println("DB접속 성공");
    		
    		String sql="select * from message where no=?";
    		PreparedStatement pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		pstmt.setInt(1, no);
    		ResultSet rs=pstmt.executeQuery();
    		
    		if(rs.next()) { 
    			name=rs.getString("name");
    			content=rs.getString("content");			
    		}
    		pstmt.close();
    		conn.close();
    		}catch(Exception e){}
    		finally{}
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <script>
    function dataCheck(){
    	if(document.getElementById("name").value==""){
    		alert("이름을 입력해 주세요")
    		return;
    	}
    	if(document.getElementById("content").value==""){
    		alert("메시지를 입력해 주세요")
    		return;
    	}
    	document.form.submit();
    	
    }
    </script>
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <meta charset="UTF-8">
    <title>Message Update</title>
    </head>
    <body>
    
    
    <div class="container">
      <h2><button class="btn" onclick="location.href='index.jsp'"><i class="fa fa-home"></i></button>수정하기</h2>
      <form name=form action="update_proc.jsp" method=post>
        <div class="form-group">
          <label for="no">번호:</label>
          <input value=<%=no%> disabled type="text" class="form-control">
          <input value=<%=no%> type="hidden" id="no" name="no" >
        </div>
        
        <div class="form-group">
          <label for="name">이름:</label>
          <input value=<%=name%> type="text" class="form-control" id="name" name="name">
        </div>
        
        <div class="form-group">
          <label for="content">메모:</label>
          <input value=<%=content%> type="text" class="form-control" id="content" name="content">
        </div>
     	
     	<button type="button" onclick=dataCheck() class="btn btn-default">수정</button>
      </form>
    </div>
    
    </body>
    </html>

     

     

     

    update_proc.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%
    try{
    	//request.setCharacterEncoding("utf-8");
    int no=Integer.parseInt(request.getParameter("no")); 
    String name=request.getParameter("name");
    String content=request.getParameter("content");
    System.out.printf("%d,%s,%s\n",no,name,content);
    
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn=DriverManager.getConnection(
    "jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    //url,id,password
    
    if(conn==null) {System.out.println("DB접속에 실패");}
    System.out.println("DB접속 성공");
    
    String sql="update message set name=?,content=? where no=?";
    PreparedStatement pstmt=conn.prepareStatement(sql);
    pstmt.setString(1,name);
    pstmt.setString(2,content);
    pstmt.setInt(3,no);
    int result=pstmt.executeUpdate();
    System.out.println(result+"개가 수정되었습니다.");
    
    pstmt.close();
    conn.close();
    
    response.sendRedirect("list.jsp");
    
    }catch (Exception e){}
    finally{}
    
    %>

     

     

     

     

    delete_proc.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    
    <%
    try{
    	//request.setCharacterEncoding("utf-8");
    int no=Integer.parseInt(request.getParameter("no")); 
    System.out.printf("%d\n",no);
    
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn=DriverManager.getConnection(
    "jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    //url,id,password
    
    if(conn==null) {System.out.println("DB접속에 실패");}
    System.out.println("DB접속 성공");
    
    String sql="delete from message where no=?";
    PreparedStatement pstmt=conn.prepareStatement(sql);
    pstmt.setInt(1, no);
    int result=pstmt.executeUpdate();
    System.out.println(result+"개가 삭제되었습니다.");
    
    pstmt.close();
    conn.close();
    
    response.sendRedirect("list.jsp");
    
    }catch (Exception e){}
    finally{}
    
    %>

     

     

     

    가장 많은 수정이 일어난 파일이다.

    search_list.jsp파일은 이름 혹은 메시지에서 찾을 단어를 입력하고 검색버튼을 클릭했을 때 실행된다.

    찾으려는 단어가 이름에 있는지 메시지에 있는지를 확인해야 한다.

    search_list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%@ page import="com.iot.web.ConnectionPool" %>
    
    <!-- 임포트를 추가한다. -->
    <%@ page import="message.Message" %>
    <%@ page import="java.util.ArrayList" %>
    <%@ page import="java.util.List" %>
    
    <%		
    		//	변수 선언은 try 블록 위에 선언
    		Connection conn;
    		int requestPage = 1;
    		String _requestPage;
    		String sql;
    		PreparedStatement pstmt;
    		ResultSet rs;
    		
    		int totalCount = 0;		//	전체 글의 갯수
    		int countPerPage = 10;	//	페이지당 글의 갯수
    		int firstRow;
    		int endRow;
    		int startPage = 1;
    		int endPage = 1;
    		int totalPageCount = 0;
    		List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		String where=null;
    		String search=null;
    				
    		String name=request.getParameter("name");
    		//where=request.getParameter("where");
    		//search=request.getParameter("search");
    		System.out.printf("%s, %s\n",where, search);
    		System.out.println("name : " +name);	
    		try{
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			conn=DriverManager.getConnection(
    			"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    	
    			if(conn==null) {System.out.println("DB접속에 실패");}
    			System.out.println("DB접속 성공");
    		//1.요청한 페이지번호
    		_requestPage=request.getParameter("requestPage");
    		//System.out.printf("requestPage:%s\n", _requestPage);
    		if(_requestPage!=null)
    		{requestPage=Integer.parseInt(_requestPage);}
    		System.out.printf("requestPage:%d\n", requestPage);
    		
    		where = request.getParameter("where");
    		search = request.getParameter("search");
    		if (where == null || search == null){
    			
    		}
    		System.out.printf("%s, %s\n",where, search);
    		
    		//2.검색에 대한 전체 페이지 수를 구해야함.
    		sql="select * from message where ";
    		sql += where;
    		sql += " like ";
    		sql += "'%";
    		sql += search + "%'";
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		rs=pstmt.executeQuery();
    		
    		while(rs.next()) totalCount++;
    		
    		//전체페이지 수를 구해야 
    		//요청한 페이지의 시작 글번호와 끝 글번호가 나오기 때문
    		firstRow=(requestPage-1)*countPerPage+1; 
    		if(firstRow<1){firstRow=0;}
    
    		endRow=firstRow+countPerPage-1;
    		if(endRow>totalCount){
    			endRow=totalCount;
    		}
    				
    		//전체페이지수******
    		
    		if(totalCount%10==0){
    		totalPageCount=(totalCount/countPerPage);
    		}else{
    			totalPageCount=(totalCount/countPerPage)+1;
    		}
    		//시작페이지 구하기
    		if(startPage<1){startPage=1;}
    		//끝페이지 구하기
    		//int endPage=startPage+4;
    		
    		if((startPage+4)>totalPageCount){
    			endPage=totalPageCount;
    		}else{
    			endPage=startPage+4;
    		}
    		if(endPage>totalPageCount){endPage=totalPageCount;}
    		
    		//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    				
    		//sql="select * from message where no>=firstRow and no<=endRow";
    		//sql="select * from message where no>=? and no<=? order by no asc"; //desc(최근글), asc(이전글)
    		//sql="select * from message where no>=? and no<=? order by no desc"; //desc(최근글), asc(이전글)
    		/*
    		select * from 
    		(select * from MESSAGE where name like '%hong%') 
    		where no>=1 and no<=10 order by no desc;
    		*/
    		/*
    		sql = "select * from ";
    		sql += "(select * from MESSAGE where ";
    		sql += where;
    		sql += " like '%";
    		sql += search;
    		sql += "%') ";
    		sql += "where no>=? and no<=? order by no desc";
    		*
    		/*
    		새로운 번호를 부여하여 출력하기
    		select rownum,no,name,content from 
    		(select * from MESSAGE where name like '%hong%') 
    		where rownum>=1 and rownum<=10 order by rownum desc;
    		*/
    		//	새로운 번호를 부여하여 출력하기
    		sql = "select rownum,no,name,content from ";
    		sql += "(select * from MESSAGE where ";
    		sql += where;
    		sql += " like '%";
    		sql += search;
    		sql += "%') ";
    		sql += "where rownum>=? and rownum<=? order by rownum desc";
    		
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		//pstmt.setInt(1, firstRow); //asc
    		//pstmt.setInt(2, endRow); //asc
    		pstmt.setInt(1, totalCount-endRow); //desc
    		pstmt.setInt(2, totalCount-firstRow ); //desc
    		rs=pstmt.executeQuery();
    		
    		//List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		while(rs.next()) 
    		{
    			Message msg = new Message();
    			
    			msg.setNo(rs.getInt("no"));
    			msg.setName(rs.getNString("name"));
    			msg.setContent(rs.getNString("content"));	
    			
    			list.add(msg);
    		}
    		
    		pstmt.close();
    		conn.close();
    		}
    		catch(Exception e){}
    		finally{}
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <title>Page Message List</title>
    <script>
    function dataCheck()
    {
    	if (document.getElementById("search").value ==""){
    		alert('검색할 단어를 입력하세요')
    		document.getElementById("search").focus();	//	커서의 이동
    		return;
    	}
    	document.form.submit();	//	name이 "form" 정보를 전송
    }
    </script>
    </head>
    <body>
    <div class="container">
    <h2><button class="btn" onclick="location.href='index.jsp'"><i class="fa fa-home"></i></button>메시지 전체 리스트</h2>
     <form name=form action="search_list.jsp" method=post>
     	<div class="form-group">
     	<select name=field>
     	<option value=name>이름</option>
     	<option value=content>메시지</option>
     	</select>
        <!-- <input type="text" name="name" placeholder="찾을 내용을 입력하세요"> -->
        <input type="text" id="search" name="search" placeholder="찾을 내용을 입력하세요">
        <button type="button" onclick=dataCheck() class="btn btn-default">검색</button>
        </div>
     </form>
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    
    <% //반복문 시작 %>
    <% for(int i = 0; i < list.size(); i++){
    	Message msg = list.get(i);
    %>
    
    <tr onClick="location.href='printSearch_proc.jsp?name=<%=msg.getName()%>'" 
    onmouseover="this.style.backgroundColor='lightgray'" 
    onmouseout="this.style.backgroundColor='white'">
    <td><%=msg.getNo()%></td>
    <td><%=msg.getName()%></td>
    <td><%=msg.getContent()%></td>
    </tr>
    <%}%>
    <%//반복문의 끝 %>
    
    <tr>
    <td colspan=2 align=center>
    <ul class="pagination">
        <% if(requestPage!=1){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=requestPage-1%>">이전페이지</a></li>
        <%}%>
        <% for(int i=startPage;i<=endPage;i++){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=i%>"><%=i%></a></li>
        <% } %>
        <% if(totalPageCount!=requestPage){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=requestPage+1%>">다음페이지</a></li>
        <%} %>
      </ul>
    </td>
    <td>
    <button onclick="location.href='messageForm.jsp'">글쓰기</button>
    </td>
    </tr>
    </table>
    <%
    
    %>
    </div>
    </body>
    </html>

     

    위의 내용에는 버그가 존재한다. list.jsp파일을 실행해서 글쓰기 버튼을 선택하고 데이터를 저장하면

    저장한 데이터가 출력되지 않는다.

    그런데, DB에는 이 내용이 저장은 되어있다.

    그리고 이름 혹은 메시지에서 찾을 단어를 입력하고 검색버튼을 클릭했을 때

    해당 내용이 들어있는 데이터 출력이 되지 않는다. 원인 중 하나가 SQL문에서 검색 조건이 정확하지 않은 것 같다.

    나중에 더 수정해보도록 하자.

    DB에 데이터가 하나씩 안나오던 이유는 오름차순 내림차순에 의한 버그로 순서가 잘못되어서 그렇다.
    즉, 오름차순일 때는 문제가 없었지만, 내림차순일 때는 변경해야될 내용이 있다.

    list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%@ page import="com.iot.web.ConnectionPool" %>
    
    <!-- 임포트를 추가한다. -->
    <%@ page import="message.Message" %>
    <%@ page import="java.util.ArrayList" %>
    <%@ page import="java.util.List" %>
    
    <%		
    		//	변수 선언은 try 블록 위에 선언
    		Connection conn;
    		int requestPage = 1;
    		String _requestPage;
    		String sql;
    		PreparedStatement pstmt;
    		ResultSet rs;
    		
    		int totalCount = 0;		//	전체 글의 갯수
    		int countPerPage = 10;	//	페이지당 글의 갯수
    		int firstRow;
    		int endRow;
    		int startPage = 1;
    		int endPage = 1;
    		int totalPageCount = 0;
    		List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		try{
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			conn=DriverManager.getConnection(
    			"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    	
    			if(conn==null) {System.out.println("DB접속에 실패");}
    			
    			System.out.println("DB접속 성공");
    			
    		//1.요청한 페이지번호
    		_requestPage=request.getParameter("requestPage");
    		//System.out.printf("requestPage:%s\n", _requestPage);
    		if(_requestPage!=null)
    		{requestPage=Integer.parseInt(_requestPage);}
    		System.out.printf("requestPage:%d\n", requestPage);
    		
    		
    		//2. 전체 게시물 수를 구한다.
    		sql="select * from message";
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		rs=pstmt.executeQuery();
    		
    		while(rs.next()) totalCount++;
    		
    		//	3.전체페이지 수를 구해야함.
    		if(totalCount%10==0){
    			totalPageCount=(totalCount/countPerPage);
    			}else{
    				totalPageCount=(totalCount/countPerPage)+1;
    			}
    		
    		//	4. 시작페이지 구하기
    		if(startPage<1){startPage=1;}
    		//끝페이지 구하기
    		//int endPage=startPage+4;
    		
    		if((startPage+4)>totalPageCount){
    			endPage=totalPageCount;
    		}else{
    			endPage=startPage+4;
    		}
    		if(endPage>totalPageCount){endPage=totalPageCount;}
    		
    		//	5. 페이지에 대한 시작 글번호와 끝 글번호를 구하기(내림차순에 의해 수정필요)
    		firstRow = totalCount - (requestPage - 1) * countPerPage;
    		endRow = firstRow - countPerPage;
    		
    		//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    				
    		//sql="select * from message where no>=firstRow and no<=endRow";
    		//sql="select * from message where no>=? and no<=? order by no asc"; //desc(최근글), asc(이전글)
    		sql="select * from message where no>? and no<=? order by no desc"; //desc(최근글), asc(이전글)
    		
    		pstmt=conn.prepareStatement(sql);	//	위의 sql문을 처리하기 위해 객체 생성
    		
    		pstmt.setInt(1, endRow); 	//	desc
    		pstmt.setInt(2, firstRow ); //	desc
    		rs=pstmt.executeQuery();
    		
    		//List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		while(rs.next()) 
    		{
    			Message msg = new Message();
    			
    			msg.setNo(rs.getInt("no"));
    			msg.setName(rs.getNString("name"));
    			msg.setContent(rs.getNString("content"));	
    			
    			list.add(msg);
    		}
    		//rs.close();
    		pstmt.close();
    		conn.close();
    		}
    		catch(Exception e){}
    		finally{}
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <title>Page Message List</title>
    <script>
    function dataCheck()
    {
    	if (document.getElementById("search").value ==""){
    		alert('검색할 단어를 입력하세요')
    		document.getElementById("search").focus();	//	커서의 이동
    		return;
    	}
    	document.form.submit();	//	name이 "form" 정보를 전송
    }
    </script>
    </head>
    <body>
    <div class="container">
    <h2><button class="btn" onclick="location.href='index.jsp'"><i class="fa fa-home"></i></button>메시지 전체 리스트</h2>
     <form name=form action="search_list.jsp" method=post>
     	<div class="form-group">
     	<select name=where>
     	<option value=name>이름</option>
     	<option value=content>메시지</option>
     	</select>
        <!-- <input type="text" name="name" placeholder="찾을 내용을 입력하세요"> -->
        <input type="text" id="search" name="search" placeholder="찾을 내용을 입력하세요">
        <button type="button" onclick=dataCheck() class="btn btn-default">검색</button>
        </div>
     </form>
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    
    <% //반복문 시작 %>
    <% for(int i = 0; i < list.size(); i++){
    	Message msg = list.get(i);
    %>
    
    <tr onClick="location.href='printSearch_proc.jsp?name=<%=msg.getName()%>'" 
    onmouseover="this.style.backgroundColor='lightgray'" 
    onmouseout="this.style.backgroundColor='white'">
    <td><%=msg.getNo()%></td>
    <td><%=msg.getName()%></td>
    <td><%=msg.getContent()%></td>
    </tr>
    <%}%>
    <%//반복문의 끝 %>
    
    <tr>
    <td colspan=2 align=center valign="center">
    <ul class="pagination">
        <% if(requestPage!=1){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=requestPage-1%>">이전페이지</a></li>
        <%}%>
        <% for(int i=startPage;i<=endPage;i++){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=i%>"><%=i%></a></li>
        <% } %>
        <% if(totalPageCount!=requestPage){ %>
        <li class="page-item"><a class="page-link" href="list.jsp?requestPage=<%=requestPage+1%>">다음페이지</a></li>
        <%} %>
      </ul>
    </td>
    <td>
    <button onclick="location.href='messageForm.jsp'">글쓰기</button>
    </td>
    </tr>
    </table>
    <%
    
    %>
    </div>
    </body>
    </html>

     

     

     

    search_list.jsp에서는 rownum을 이용하는 이유는 우리가 데이터를 지우는 경우라면 no를 중심으로 select하기에는 

    무리가 있다.
    글의 no와 상관없이 찾기 위해 사용했다.

    우선 아래의 SQL문들을 각 각 실행해보자.

    맨 마지막 호출 문장은 괄호만 따로 실행해보고 전체 문장도 호출해서 그 결과를 알아보자.

    select * from message;
    select rownum,no,name,content from message;
    select rownum,no,name,content from message where rownum>0 and rownum<10;

    select rownum,no,name,content from message where rownum>5 and rownum<10;  <- SQL문이 제대로 호출 불가

     

    select rownum,no,name,content from 
    (select rownum,no,name,content from message where rownum<=30 and 

    name like '%hong%' order by rownum desc) where rownum <=10;

     

    search_list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%@ page import="com.iot.web.ConnectionPool" %>
    
    <!-- 임포트를 추가한다. -->
    <%@ page import="message.Message" %>
    <%@ page import="java.util.ArrayList" %>
    <%@ page import="java.util.List" %>
    
    <%		
    		//	변수 선언은 try 블록 위에 선언
    		Connection conn;
    		int requestPage = 1;
    		String _requestPage;
    		String sql;
    		PreparedStatement pstmt;
    		ResultSet rs;
    		
    		int totalCount = 0;		//	전체 글의 갯수
    		int countPerPage = 10;	//	페이지당 글의 갯수
    		int firstRow;
    		int endRow;
    		int startPage = 1;
    		int endPage = 1;
    		int totalPageCount = 0;
    		List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		String where=null;
    		String search=null;
    				
    		String name=request.getParameter("name");
    		//where=request.getParameter("where");
    		//search=request.getParameter("search");
    		System.out.printf("%s, %s\n",where, search);
    				
    		try{
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			conn=DriverManager.getConnection(
    			"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    	
    			if(conn==null) {System.out.println("DB접속에 실패");}
    			System.out.println("DB접속 성공");
    		//1.요청한 페이지번호 리스트 검색에 필요한 필드, 검색값 request
    		_requestPage=request.getParameter("requestPage");
    		//System.out.printf("requestPage:%s\n", _requestPage);
    		if(_requestPage!=null)
    		{requestPage=Integer.parseInt(_requestPage);}
    		System.out.printf("requestPage:%d\n", requestPage);
    		
    		where = request.getParameter("where");
    		search = request.getParameter("search");
    		if (where == null || search == null){
    			
    		}
    		System.out.printf("%s, %s\n",where, search);
    		
    		//	2. 전체 게시물 수를 구하기
    		sql="select * from message where ";
    		sql += where;
    		sql += " like ";
    		sql += "'%";
    		sql += search + "%'";
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		rs=pstmt.executeQuery();
    		
    		while(rs.next()) totalCount++;
    		
    		//	3. 전체 페이지 수를 구하기
    		//전체페이지 수를 구해야 
    		//요청한 페이지의 시작 글번호와 끝 글번호가 나오기 때문
    		//	3.전체페이지 수를 구해야함.
    		if(totalCount%10==0){
    			totalPageCount=(totalCount/countPerPage);
    			}else{
    				totalPageCount=(totalCount/countPerPage)+1;
    			}
    		
    		//	4. 시작페이지 구하기
    		if(startPage<1){startPage=1;}
    		//끝페이지 구하기
    		//int endPage=startPage+4;
    		
    		if((startPage+4)>totalPageCount){
    			endPage=totalPageCount;
    		}else{
    			endPage=startPage+4;
    		}
    		if(endPage>totalPageCount){endPage=totalPageCount;}
    		
    		//	5. 페이지에 대한 시작 글번호와 끝 글번호를 구하기(내림차순에 의해 수정필요)
    		firstRow = totalCount - (requestPage - 1) * countPerPage;
    		endRow = firstRow - countPerPage;
    		
    		//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    				
    		//sql="select * from message where no>=firstRow and no<=endRow";
    		//sql="select * from message where no>=? and no<=? order by no asc"; //desc(최근글), asc(이전글)
    		//sql="select * from message where no>=? and no<=? order by no desc"; //desc(최근글), asc(이전글)
    		/*
    		select * from 
    		(select * from MESSAGE where name like '%hong%') 
    		where no>=1 and no<=10 order by no desc;
    		*/
    		/*
    		sql = "select * from ";
    		sql += "(select * from MESSAGE where ";
    		sql += where;
    		sql += " like '%";
    		sql += search;
    		sql += "%') ";
    		sql += "where no>=? and no<=? order by no desc";
    		*
    		/*
    		새로운 번호를 부여하여 출력하기
    		select rownum,no,name,content from 
    		(select * from MESSAGE where name like '%hong%') 
    		where rownum>=1 and rownum<=10 order by rownum desc;
    		*/
    		//	새로운 번호를 부여하여 출력하기
    		sql = "select rownum,no,name,content from ";
    		sql += "(select rownum,no,name,content from MESSAGE where rownum<=? and ";
    		sql += where;
    		sql += " like '%";
    		sql += search;
    		sql += "%' order by rownum desc)";
    		sql += "where rownum<=?";
    		
    		pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    		//pstmt.setInt(1, firstRow); //asc
    		//pstmt.setInt(2, endRow); //asc
    		pstmt.setInt(1, firstRow); //desc
    		pstmt.setInt(2, countPerPage ); //desc.	10개씩만 보이게 한다.
    		rs=pstmt.executeQuery();
    		
    		//List<Message> list = new ArrayList<Message>();	//	쿼리를 저장할 리스트
    		
    		while(rs.next()) 
    		{
    			Message msg = new Message();
    			
    			msg.setNo(rs.getInt("no"));
    			msg.setName(rs.getNString("name"));
    			msg.setContent(rs.getNString("content"));	
    			
    			list.add(msg);
    		}
    		rs.close();
    		pstmt.close();
    		conn.close();
    		}
    		catch(Exception e){}
    		finally{}
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <title>Page Message List</title>
    <script>
    function dataCheck()
    {
    	if (document.getElementById("search").value ==""){
    		alert('검색할 단어를 입력하세요')
    		document.getElementById("search").focus();	//	커서의 이동
    		return;
    	}
    	document.form.submit();	//	name이 "form" 정보를 전송
    }
    </script>
    </head>
    <body>
    <div class="container">
    <h2><button class="btn" onclick="location.href='index.jsp'"><i class="fa fa-home"></i></button>메시지 전체 리스트</h2>
     <form name=form action="search_list.jsp" method=post>
     	<div class="form-group">
     	<select name=where>
     	<option value=name>이름</option>
     	<option value=content>메시지</option>
     	</select>
        <!-- <input type="text" name="name" placeholder="찾을 내용을 입력하세요"> -->
        <input type="text" id="search" name="search" placeholder="찾을 내용을 입력하세요">
        <button type="button" onclick=dataCheck() class="btn btn-default">검색</button>
        </div>
     </form>
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    
    <% //반복문 시작 %>
    <% for(int i = 0; i < list.size(); i++){
    	Message msg = list.get(i);
    %>
    
    <tr onClick="location.href='printSearch_proc.jsp?name=<%=msg.getName()%>'" 
    onmouseover="this.style.backgroundColor='lightgray'" 
    onmouseout="this.style.backgroundColor='white'">
    <td><%=msg.getNo()%></td>
    <td><%=msg.getName()%></td>
    <td><%=msg.getContent()%></td>
    </tr>
    <%}%>
    <%//반복문의 끝 %>
    
    <tr>
    <td colspan=2 align=center valign="center">
    <ul class="pagination">
        <% if(requestPage!=1){ %>
        <li class="page-item"><a class="page-link" href="search_list.jsp?requestPage=<%=requestPage-1%>&where=<%=where%>&search=<%=search%>">이전페이지</a></li>
        <%}%>
        <% for(int i=startPage;i<=endPage;i++){ %>
        <li class="page-item"><a class="page-link" href="search_list.jsp?requestPage=<%=i%>&where=<%=where%>&search=<%=search%>"><%=i%></a></li>
        <% } %>
        <% if(totalPageCount!=requestPage){ %>
        <li class="page-item"><a class="page-link" href="search_list.jsp?requestPage=<%=requestPage+1%>&where=<%=where%>&search=<%=search%>">다음페이지</a></li>
        <%} %>
      </ul>
    </td>
    <td>
    <button onclick="location.href='messageForm.jsp'">글쓰기</button>
    </td>
    </tr>
    </table>
    <%
    
    %>
    </div>
    </body>
    </html>

     

    'JAVA > 웹 프로그래밍 - JSP' 카테고리의 다른 글

    taglib문법  (0) 2020.11.17
    MVC(Model View Control)2  (0) 2020.11.13
    간단한 게시판 만들기  (0) 2020.11.09
    Form을 활용해서 정보를 DB와 연결하기  (2) 2020.11.07
    Form을 활용해서 정보를 DB와 연결하기  (0) 2020.11.05

    댓글

Designed by Tistory.