ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MVC(Model View Control)2
    JAVA/웹 프로그래밍 - JSP 2020. 11. 13. 18:27

    아래의 내용을 먼저 보도록 하자.

    designatedroom87.tistory.com/310?category=901206

     

    MVC(Model View Control)1

    아래의 내용을 살펴보자. designatedroom87.tistory.com/303?category=901206 게시판 만들기 우선, MultiInsert.jsp 파일부터 만드는데, MultiInsert이 하는 역할은 테이블에 데이터를 충분히 많이 저장하기 위해..

    designatedroom87.tistory.com

    위의 내용에서, HTML의 문법과 JSP의 문법을 따로 위 아래로 분리했던 것을

    여기에서는 아예 서로 다른 파일로 분리를 할 것 이다.

    웹 서블릿을 활용해서 처리하는 방법이다.
    기존의 처리 방식에선 jsp에서 직접하는데 이를 변경한다.

     

    우선 새로운 프로젝트를 만들도록 하자. Project Exploerer에서 마우스 우클릭해서 New를 선택해서

    Dynamic Web Project를 선택한다.

    프로젝트의 이름은 www로 하자.

     

    WebContent폴더의 내용은 공개이지만,  
    WebContent폴더의 하위 폴더인 WEB-INF폴더의 내용은 비공개이다.
    WEB-INF폴더를 사용할 것이다. JSP파일이 여기에 모을 것이다.

    그 이유는 보안 상의 문제 때문이다. 서블릿으로 mvc2를 구성할 것이다.

     

    새로운 웹 프로젝트를 하나 만들자.

    Next를 선택한다.

    Next를 선택한다.

     

    그리고 아래에서 Generate web.xml deployment descriptor를 체크한다.

    그리고 Finish를 선택한다.

     

    그리고, 웹 서버가 제대로 동작하는지 확인해보자.

    WebContent에 html파일 하나 생성한다. 이름은 index.html로 한다.

    아래의 내용을 적고 실행하자.

    컨텍스트 경로(Context Path) 확인은 톰캣서버에 경로 확인을 한다.

    index.html 내용

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    www
    </body>
    </html>

     

     

    그리고 설정해야할 것이 있다.

    현재의 프로젝트 외의 다른 프로젝트들의 서버를 종료하고 현재의 프로젝틔 서버만 실행하고 설정하는 것이다.

    이클립스에서 서버 탭이 보이지 않으면 Window 탭에서 Show View에서 Servers를 선택하면 된다.

    아래에 서버 탭이 생겼다.

    Servers탭에서 Tomcat v9.0 Server at localhost [Stopped]를 더블 클릭하자.

    아래와 같이 톰캣 서버가 열린다.

    아래와 같이 좌측 하단에 아래의 목록이 보이는데, Modules를 선택한다.


    Web Modules에서 www프로젝트(현재의 프로젝트)를 제외한 프로젝트를 선택하고
    Edit 버튼을 클릭해서 /를 제거하고 프로젝트 이름으로 설정한다. 
    www지금쓰려는 프로젝트는 /만 쓴다. 아래의 그림을 보자.

    아래는 예전의 프로젝트 설정

    아래는 현재 쓰려는 프로젝트 설정

    아래와 같이 설정하면 된다.

    우리가 사용하려는 프로젝트에만 /을 적고, 나머지 프로젝트들은 /를 뺀 프로젝트 이름으로 설정을 하도록 한다.

    그리고 저장하고 탭을 닫자.

     

    Java Resources폴더의 하위 폴더인 src에 www.controller 이름으로 패키지 생성한다.

    이 패키지에 Servlet 파일을 하나 생성하는데 여기서 중요한 것은 Finish 버튼을 선택하지 말자.

    클래스 명을 FrontController라고 선택하고 Next를 선택한다.

    URL mappings: 에서 /FrontController를 선택하고 Edit 선택해서 / 만 적는다. 아래의 그림을 참고하자.

    OK버튼을 누르고, Next 버튼을 선택하자.

    아래의 그림과 같이 체크하고 Finish를 클릭하자.

    그리고 혹시, 현재의 프로젝트 서버를 실행하다가 다른 프로젝트의 서버를 실행해야할 경우가 있을 수 있다.

    즉, 여러 개의 서버가 돌아가는 상태에서 원하는 프로젝트의 서버를 실행하고 싶으면

    아래와 같이 Servers 탭을 열자.

    서버 탭에서 Tomcat v9.0 Server at localhost 를 선택하고 우클릭해서 Add and Remove 탭을 선택한다.

    위와 같이 사용 하려는 프로젝트는 Add 버튼을 선택해서 오른쪽으로 이동시키고

    나머지 프로젝트들은 Remove 선택해서 왼쪽으로 이동시킨다. 그리고 Finish를 선택.

    Servers탭을 보면, 위와 같이 설정이 되어있음을 볼 수 있다.

    그리고 한 가지 더 설정을 하여야 한다.

    그리고 Tomcat v9.0 Server at localhost 을 더블클릭하자.

    그러면 어떤 창이 뜨면서 아래와 같이 왼쪽 하단에 Modules 탭이 보일 것이다.

    Modules탭을 선택하자. 아래와 같이 현재의 프로젝트를 선택하고 Edit 버튼을 선택한다.

    Path를 아래와 같이 /로 변경하고 OK를 선택한다.

    그리고 현재의 창을 close할 때, save 한다.

     

    그리고 현재의 프로젝트에도 ojdbc6.jar 파일을 붙여넣기 해야 한다.

    ojdbc6.jar 파일을 WEB-INF의 lib폴더에 복사 붙여넣기 한다.

    ojdbc6.jar 파일이 있는 경로를 찾는다.

    해당 파일을 CTRL + C로 복사해서 WebContent폴더의 하위 폴더의 lib 폴더에 CTRL + V로 붙여넣기 한다.

    아래와 같이 추가가 된다.

     

    해당 파일에서 필요없는 주석을 모두 제거하자.

    아래의 내용을 입력해보자.

    아래의 FrontController.java가 웹 브라우저가 url을 요청하고 나서 url을 받고 주소를 해석한다. 

    분석(parsing)이 되면 서블릿이 실행된다. (컨트롤러)
    오는 경로에 대해 확인을 한다.
    확인을 하고 나서 path로 리다이렉트 한다. 경로를 던져주는 역할을 한다.

    FrontController 는 url을 분석해서 다른 사이트로 이동하게 해줘야 한다.

    MVC1에서 했던 작업은 크게 DB 처리를 하는 부분과 단순히 Form을 보여주는 부분으로 나뉘었다.

    여기서도 이 부분들을 나눠보자.

    .do가 붙으면, DB 처리하는 역할하고 .do가 안 붙고 그냥 리름이 붙으면 Form의 역할을 한다. 
    FrontController가 나머지 부분 컨트롤러들에게 작업을 재 분배해주도록 한다. 
    do 컨트롤러와 do가 아닌 컨트롤러러 나눈다.

    이 .do 컨트롤러는 insert, delete, search, input의 SQL을 이용한 DB접속을 처리한다.

    컨트롤러는 매개변수를 받아서 던져주는 역할을 한다.

    주소를 이동시키는 방법은 2가지가 있다. 
    sendRedirect 와 RequestDispatcher 이다. 
    sendRedirect 는 단순히 주소 이동만 한다. 
    RequestDispatcher 는 url을 넘겨주는데, 데이터도 같이 넘겨준다. (setAttribute함수와 getAttribute함수)

    그리고, WEB-INF에 message폴더를 만들어서 나중에 jsp 파일들을 만들어 간다.

    위에서 말했다시피 WEB-INF에 파일을 만들어 두면 비공개 영역이 된다.

    jsp파일을 여기에 숨기도록 한다.

    컨트롤러를 통해 이 jsp파일을 실행하도록 하면 된다.

    FrontController.java 파일 내용

    더보기
    package www.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/")
    public class FrontController extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {
    		
    	}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());	
    		System.out.println(path);
    		
    		//response.sendRedirect("index.jsp");
    		//response.sendRedirect("Insert");	//	InsertController 서블릿 파일을 실행한다.
    		
    		response.sendRedirect(path);
    		/*
    		//	url을 분석하고 다른 서블릿 또는 자바 객체에 값을 전달
    		
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/message/index.jsp");
    		request.setAttribute("c","aaaa");
    		dispatcher.forward(request, response);
    		*/
    	}
    	
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    		
    		//response.getWriter().append("Served at: ").append(request.getContextPath());
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    		
    		//doGet(request, response);
    	}
    }

     

    서버를 재실행해서 index.html 파일을 실행해보자.

    그리고 콘솔 창의 결과를 같이 보도록 하자.

    FrontController.java에서 @WebServlet("/")대신에 @WebServlet("/member")로 적어보고

    index.html 파일을 실행해서 콘솔 창을 확인해보자.

    콘솔 창에는 그 어떠한것도 뜨지 않는다.

    즉,  @WebServlet("/")으로 설정을 하면 FrontController 서블릿으로 접속을 한다.

    URL 맵핑이 /로 되어 있는 경우에 모든 실행 경로는 이 서블릿으로 진입한다.
    모든 url이 FrontController 서블릿으로 오도록 해서 데이터를 처리할 수 있다.

     

    WebContent의 하위에 index.jsp 파일을 생성해서 다음과 같이 적어두자.

    index.jsp 내용

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	index.jsp
    </body>
    </html>

     

    DB에 대한 접속과 데이터를 찾아서 저장할 저장소가 필요하다.

    그리고 이 데이터는 여러 정보를담고 있어서 구조체가 필요하고 이 데이터들은 여러 개이므로 List가 필요하다.

    src 폴더에 패키지 www.message.entity 를 만든다.

    그리고 Message.java 파일을 넣는다. 데이터를 담을 구조체 역할을 한다.

    PageMessage.java 를 만든다.

    Message.java 파일 내용

    더보기
    package www.message.entity;
    
    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;}
    }

    그리고, PageMessage.java 파일도 같이 만든다.

    아래의 클래스는 요청한 페이지에 대한 정보를 담을 내용이다.

    PageMessage.java

    더보기
    package www.message.entity;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class PageMessage 
    {
    	List<Message> list = new ArrayList<Message>();
    	//	page를 구성하는데 필요한 요소
    	int requestPage;			//	요청한 페이지
    	int startPage;				//	시작 페이지
    	int endPage;				//	끝 페이지
    	int totalPageCount;			//	전체 페이지
    	//int firstRow;				//	요청한 글의 처음 번호
    	//int endRow;				//	요청한 글의 끝 번호
    	//int totalCount;			//	전체 글의 개수
    	//int countPerPage = 10;	//	페이지 당 글의 개수
    	public PageMessage() {}
    	public PageMessage(List<Message> list, int requestPage, int startPage, 
    			int endPage, int totalPageCount) 
    	{
    		this.list = list;
    		this.requestPage = requestPage;
    		this.startPage = startPage;
    		this.endPage = endPage;
    		this.totalPageCount = totalPageCount;
    	}
    
    	public List<Message> getList() {return list;}
    	public void setList(List<Message> list) {this.list = list;}
    	
    	public int getRequestPage() {return requestPage;}
    	public void setRequestPage(int requestPage) {this.requestPage = requestPage;}
    	
    	public int getStartPage() {return startPage;}
    	public void setStartPage(int startPage) {this.startPage = startPage;}
    	
    	public int getEndPage() {return endPage;}
    	public void setEndPage(int endPage) {this.endPage = endPage;}
    	
    	public int getTotalPageCount() {return totalPageCount;}
    	public void setTotalPageCount(int totalPageCount) {this.totalPageCount = totalPageCount;}
    }

     

    src 폴더에 패키지 www.message.service 만든다.

    이 패키지에 MessageService.java 파일을 만든다. 

    MessageService는 데이터를 찾아서 던져줄 것이다.

    해당 클래스는 Singleton 클래스로 만들도록 한다. 

    MessageService.java 내용

    더보기
    package www.message.service;
    
    import java.util.List;
    
    import www.message.entity.PageMessage;
    import www.message.DAO.MessageDAO;
    import www.message.entity.Message;
    
    public class MessageService 
    {
    	private static MessageService service = new MessageService();
    	public MessageDAO dao = MessageDAO.getInstance();
    	
    	private MessageService() {}
    	
    	public static MessageService getInstance(){return service;}
    	
    	//	DB에 있는 모든 데이터를 찾아 리턴한다.
    	public List<Message> list()
    	{
    		/*
    		List<Message> list = dao.list();
    		return list;
    		*/
    		return dao.list();
    	}
    	
    	//	요청한 페이지에 대한 정보를 DB에서 얻어온다.
    	public PageMessage list(int requestPage) {return dao.list(requestPage);}
    	
    	//	요청한 페이지에 대한 데이터들 중에서 조건에 맞는 데이터를 찾아 리턴한다. 
    	public PageMessage searchList(int requestPage, String field, String search) 
    	{
    		return dao.searchList(requestPage,field,search);
    	}
    
    	public int insert(Message message) {
    		return dao.insert(message);
    	}
    
    	public Message print(int no) {return dao.print(no);}
    
    	public int update(Message message) {return dao.update(message);}
    
    	public int delete(int no) {return dao.delete(no);}
    }

     

    그리고 src폴더에 www.message.DAO 패키지를 만든다. 이 패키지에 MessageDAO.java 파일을 만든다.

    MessageDAO는 DB에 처리에 대한 작업을 한다.

    DB에 접속하고 접속을 해제하고 데이터를 조회해서 데이터를 리스트에 담아 리턴하는 역할을 한다.

    이 클래스는 Singleton 클래스로 구현을 하는데,

    그 이유는 DB에 대한 처리를 하는 곳은 여러 개가 있을 필요가 없기 때문이다.

     

    실질적인 DB에 접근해서 데이터를 가져오는 클래스가 아래의 MessageDAO클래스이다.

    수정할 부분 중에서 가장 중요한 내용이 SQL문이다.

    검색조건에 맞는 데이터들을 기반으로 전체 게시물 수를 구해야 한다.

     

    select * from message where name like '%hong%';

    그리고 아래의 문장들도 하나씩 실행해서 그 결과를 보도록 하자.

     

    select * from message; 

    select * from message where name like '%hong%'; 

    select * from message where name like '%hong%' order by no desc 

    select rownum,no,name,content from message where rownum<= 20 and name like '%hong%' order by rownum desc

     

    아래의 SQL문은 상당히 길다.

    괄호를 테이블이라고 생각하고, 괄호의 내용 만을 실행해서 결과를 알아보자.

    테이블의 테이블이라고 생각하면 된다.

    select rownum,no,name,content from  
    (select rownum,no,name,content from message where rownum<=20 and name like  
    '%hong%' order by rownum desc) where rownum<=10

     

    list(int requestPage) 메소드에서 요청한 페이지에 따라 시작과 끝 페이지가 달라진다.
    그리고 이 시작 페이지와 끝 페이지에 대한 예외처리가 필요하다.

    시작 페이지가 결정이 되면 끝 페이지도 결정이된다.

    매개변수인 요청한 페이지를 중심으로 시작 페이지와 끝 페이지는 각 각 두 페이지씩 오프셋을 갖도록 구현한다.

    MessageDAO.java 파일 내용

    더보기
    package www.message.DAO;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import www.message.entity.Message;
    import www.message.entity.PageMessage;
    
    public class MessageDAO 
    {
    	private static MessageDAO dao = new MessageDAO();
    	
    	private MessageDAO() {}
    	
    	public static MessageDAO getInstance() {return dao;}
    	
    	public Connection connect()
    	{
    		Connection conn = null;
    		
    		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접속 성공");
    		
    		}catch(Exception e) {}
    		
    		return conn;
    	}
    	
    	public void close(Connection conn, PreparedStatement pstmt, ResultSet rs)
    	{
    		if (rs != null) 
    		{
    			try 
    			{
    				rs.close();
    			}
    			catch (SQLException e) {e.printStackTrace();}
    		}
    		this.close(conn,pstmt);
    	}
    	
    	public void close(Connection conn, PreparedStatement pstmt)
    	{
    		try {
    		pstmt.close();
    		conn.close();
    		}
    		catch (SQLException e) {e.printStackTrace();}
    	}
    	
    	//	DB에 접속해서 모든 데이터를 찾아 리턴하는 함수
    	public List<Message> list()
    	{
    		Connection conn = null;
    		String sql = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		List<Message> list = null;	//	쿼리를 저장할 리스트
    		
    		try 
    		{
    			conn = this.connect();
    			sql = "select * from message";
    			pstmt = conn.prepareStatement(sql);
    			rs = pstmt.executeQuery();
    			
    			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);
    				//	System.out.printf("%d %s %s \n",no,name,content);
    			}
    			this.close(conn, pstmt, rs);
    		}
    		catch(Exception e) {}
    		System.out.println("list 성공");
    		return list;
    	}
    	
    	//	요청한 페이지에 대한 정보를 리턴하는 함수
    	public PageMessage list(int requestPage) 
    	{
    		//	page에 해당하는 리스트와 페이지 정보를 담아 리턴하면 끝
    		String sql;
    		Connection conn = null;
    		PreparedStatement pstmt;
    		ResultSet rs;
    		
    		int totalCount = 0;		//	전체 글의 갯수
    		int countPerPage = 10;	//	페이지당 글의 갯수
    		int firstRow;
    		int endRow;
    		int startPage = requestPage;	//	기준을 잡는다.
    		int endPage = requestPage;
    		int totalPageCount = 0;
    		List<Message> list = new ArrayList<Message>();
    		PageMessage pagemessage = null;
    		
    		try{
    			//	DB 접속
    			conn = this.connect();
    				
    			//	1.요청한 페이지번호 파라미터로 요청한 페이지 번호가 넘어옴
    			System.out.printf("requestPage:%d\n", requestPage);
    			
    			//	2. 전체 게시물 수를 구한다.
    			sql="select * from message";
    			pstmt=conn.prepareStatement(sql);
    			rs=pstmt.executeQuery();
    			
    			while(rs.next()) totalCount++;
    			
    			//	3.전체 페이지 수를 구해야함.
    			if(totalCount%10==0){
    				totalPageCount=(totalCount/countPerPage);
    				}else{
    					totalPageCount=(totalCount/countPerPage)+1;
    				}
    			
    			//	4. 시작 페이지 구하기
    			startPage -= 2;
    			if(startPage<1)	startPage=1;
    			
    			//	끝 페이지 구하기
    			endPage = startPage + 4;
    			if(endPage>totalPageCount)
    			{
    				endPage=totalPageCount;
    				
    				startPage = endPage - 4;
    				
    				if(startPage<1)
    					startPage=1;
    			}
    			
    			//	5. 페이지에 대한 시작 글번호와 끝 글번호를 구하기(내림차순에 의해 수정필요)
    			firstRow = totalCount - (requestPage - 1) * countPerPage;
    			endRow = firstRow - countPerPage;
    			
    			//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    					
    			//sql="select * from message where no>? and no<=? order by no desc"; //desc(최근글)
    			sql = "select rownum,no,name,content from ";
    			sql += "(select rownum,no,name,content from message " + 
    						"where rownum<=? order by rownum desc)";
    			sql += "where rownum<=?";
    			
    			pstmt=conn.prepareStatement(sql);	//	위의 sql문을 처리하기 위해 객체 생성
    			
    			pstmt.setInt(1, firstRow); 	//	desc
    			pstmt.setInt(2, countPerPage ); //	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);
    			}
    			//	PageMessage를 생성자 객체를 만들고 한 번에 리턴
    			pagemessage = new PageMessage(
    					list,requestPage,startPage,endPage,totalPageCount);
    			
    			this.close(conn, pstmt, rs);
    			}
    			catch(Exception e){}
    			finally{}
    		System.out.println("page list 성공");
    		return pagemessage;
    	}
    	
    	//	요청한 페이지에 대한 데이터들 중에서 조건에 맞는 데이터를 찾아 리턴하는 함수
    	public PageMessage searchList(int requestPage, String field, String search) 
    	{
    		//	page에 해당하는 리스트와 페이지 정보를 담아 리턴하면 끝
    		String sql;
    		Connection conn = null;
    		PreparedStatement pstmt;
    		ResultSet rs;
    		
    		int totalCount = 0;		//	전체 글의 갯수
    		int countPerPage = 10;	//	페이지당 글의 갯수
    		int firstRow;
    		int endRow;
    		int startPage = requestPage;
    		int endPage = requestPage;
    		int totalPageCount = 0;
    		List<Message> list = new ArrayList<Message>();
    		PageMessage pagemessage = null;
    			
    		try{
    			//	DB 접속
    			conn = this.connect();
    				
    			//	1.요청한 페이지번호 파라미터로 요청한 페이지 번호가 넘어옴
    			System.out.printf("requestPage:%d\n", requestPage);
    			
    			//	2. 전체 게시물 수를 구한다.
    			//	select * from message where name like '%hong%';
    			sql="select * from message where ";
    			sql += field;
    			sql += " like '%";
    			sql += search;
    			sql += "%'";
    			
    			pstmt=conn.prepareStatement(sql);
    			rs=pstmt.executeQuery();
    			
    			while(rs.next()) totalCount++;
    			
    			//	3.전체페이지 수를 구해야함.
    			if(totalCount%10==0)	totalPageCount=(totalCount/countPerPage);
    			else					totalPageCount=(totalCount/countPerPage)+1;
    				
    			
    			//	4. 시작 페이지 구하기
    			startPage -= 2;
    			if(startPage<1)	startPage=1;
    			
    			//	끝 페이지 구하기
    			endPage = startPage + 4;
    			if(endPage>totalPageCount)
    			{
    				endPage=totalPageCount;
    				
    				startPage = endPage - 4;
    				
    				if(startPage<1)
    					startPage = 1;
    			}
    			
    			//	5.페이지에 대한 시작 글번호 끝 글번호
    			firstRow = totalCount -(requestPage-1)*countPerPage;
    			endRow = firstRow - countPerPage;
    			
    			//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    			
    			//	중간글의 삭제도 생각을 해야한다. 그래서 no를 가지고 탐색을 하면 안된다.
    			/*
    			 괄호를 테이블이라고 생각해보고, 괄호의 내용 만을 실행해서 결과를 알아보자.
    			 테이블의 테이블이라고 생각하면 된다.
    			 select rownum,no,name,content from 
    			(select rownum,no,name,content from message where rownum<=20 and name like 
    			'%hong%' order by rownum desc) where rownum<=10
    			 */
    			sql = "select rownum,no,name,content from ";
    			sql += "(select rownum,no,name,content from message where rownum<=? and ";	
    			sql += field;
    			sql += " like '%";
    			sql += search;
    			sql += "%' order by rownum desc)";
    			sql += "where rownum<=?";
    				
    			pstmt=conn.prepareStatement(sql);	//	위의 sql문을 처리하기 위해 객체 생성
    				
    			pstmt.setInt(1, firstRow); 		//	desc
    			pstmt.setInt(2, countPerPage ); //	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);
    			}
    			//	PageMessage를 생성자 객체를 만들고 한 번에 리턴
    			pagemessage = new PageMessage(
    					list,requestPage,startPage,endPage,totalPageCount);
    			
    			this.close(conn, pstmt, rs);
    			}
    			catch(Exception e){}
    			finally{}
    			
    			System.out.println("search page list 성공");
    			return pagemessage;
    	}
    
    	public int insert(Message message) 
    	{
    		String sql;
    		Connection conn = null;
    		PreparedStatement pstmt;
    		int result = 0;
    		
    		try 
    		{
    			conn = this.connect();
    			
    			System.out.println("dao-name : " +message.getName());
    			System.out.println("dao-content : " +message.getContent());
    			
    			sql="insert into message(no,name,content) values(message_seq_no.nextval,?,?)";
    			pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    			
    			pstmt.setString(1, message.getName());
    			pstmt.setString(2, message.getContent());
    			
    			result=pstmt.executeUpdate();
    			System.out.println("입력 성공");
    			
    			this.close(conn, pstmt);
    		}
    		catch(Exception e) {}
    		
    		return result;
    	}
    
    	public Message print(int _no) 
    	{
    		Message message = new Message();
    		//	page에 해당하는 리스트와 페이지 정보를 담아 리턴하면 끝
    			String sql;
    			Connection conn = null;
    			PreparedStatement pstmt;
    			ResultSet rs;
    			
    			try 
    			{
    				conn = this.connect();
    				
    				//sql문을 작성해서 conn객체를 이용하여 데이터 베이스에 데이터 가져오기
    				sql="select * from message where no=?";
    				pstmt=conn.prepareStatement(sql);//위의 sql문을 처리하기 위해 객체 생성
    				pstmt.setInt(1, _no);
    				rs=pstmt.executeQuery();
    				
    				int no = 0;
    				String name = "";
    				String content = "";
    				
    				if(rs.next()) {	
    					no = rs.getInt("no");
    					name=rs.getString("name");
    					content=rs.getString("content");	
    				}
    				
    				message.setNo(no);
    				message.setName(name);
    				message.setContent(content);
    				
    				this.close(conn, pstmt, rs);
    			}
    			catch(Exception e) {}
    			System.out.println("개별출력 성공");
    		return message;
    	}
    
    	public int update(Message message) 
    	{
    		String sql;
    		Connection conn = null;
    		PreparedStatement pstmt;
    		int success = 0;
    		
    		try 
    		{
    			conn = this.connect();
    			sql = "update message set name=?, content=? where no=?";
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setString(1, message.getName());
    			pstmt.setNString(2, message.getContent());
    			pstmt.setInt(3, message.getNo());
    			
    			success = pstmt.executeUpdate();
    			
    			this.close(conn, pstmt);
    		}
    		catch(Exception e) {}
    		System.out.println("업데이트 성공");
    		return success;
    	}
    
    	public int delete(int no) 
    	{
    		String sql;
    		Connection conn = null;
    		PreparedStatement pstmt;
    		int success = 0;
    		
    		try
    		{
    			conn = this.connect();
    			sql = "delete from message where no=?";
    			pstmt = conn.prepareStatement(sql);
    			
    			pstmt.setInt(1, no);
    			
    			success = pstmt.executeUpdate();
    			
    			this.close(conn, pstmt);
    		}
    		catch(Exception e) {}
    		System.out.println("삭제 성공");
    		return success;
    	}
    }

     

     

     

    0. DB에 있는 모든 데이터들을 출력해보기

    src하위에 www.controller 패키지를 만든다.

    컨트롤러에 대한 내용은 모두 이 패키지에 만든다.

    DB에 접속해서 데이터를 모두 찾은 다음에, 이에 대한 정보는 list.jsp에서 뿌려준다.

    /WEB-INF의 하위폴더에 message폴더를 하나 만든다.

    jsp 파일은 message폴더에 만든다.

    그리고 어노테이션에서 우리가 DB에 접속하는 작업을 하는 경우에는 .do라고 붙인다고 하였으므로

    ListController에는 @WebServlet("/List")가 아닌 @WebServlet("/List.do") 라고 쓴다.

    ListController.java의 displatcher는 jsp view를 웹 브라우저에게 전달한다.

    서비스 이용 : 데이터 가지고 오는 작업. 서비스는 다시 DAO로부터 데이터를 가지고 온다. 
    이 데이터를 jsp view에 뿌려주기 위해서 가지고 오는 것이다. 
    데이터를 가지고 올 때는 그냥 가져와서는 안 된다.

    request.setAttribute()함수를 호출해서 데이터를 실어주어야 한다.

    즉, 아래의 4가지 과정으로 이루어 진다.

    1. 넘어오는 정보 저장 
    2. 서비스를 통해 데이터를 받아옴 
    3. 데이터 저장 (넘겨주기 위해서) 
    4. 데이터 함께 jsp 호출(view 생성) 

    ListController.java

    더보기
    package www.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    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 www.message.entity.PageMessage;
    import www.message.service.MessageService;
    
    @WebServlet("/List.do")
    public class ListController extends HttpServlet 
    {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	1. 파라미터정보 저장(request.getParameter())
    		int requestPage = 1;
    		if (request.getParameter("requestPage") != null) 
    		{
    			requestPage = Integer.parseInt(
    				request.getParameter("requestPage")
    				);
    		}
    		
    		//	2. 데이터 베이스 처리
    		//	message 객체 만들기. DB접속 데이터 처리 (서비스라 칭한다.)
    		MessageService service = MessageService.getInstance();
    		
    		//	가지고 온 데이터를 저장
    		//List<Message> list = service.list();
    		PageMessage pagemessage = service.list(requestPage);
    		
     		//	3. 데이터를 dispatcher로 view에게 전달하면 끝
    		//	request.setAttribute("list", list);
    		request.setAttribute("pagemessage", pagemessage);
    		
    		//	4. 저장한 데이터와 함께 view 생성하기 위해 넘겨줌
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher("/WEB-INF/message/list.jsp");
    		
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	}
    }

     

    list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!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>
    
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    
    <!-- setAttribute함수에서 -->
    <c:forEach var="item" items = "${pagemessage.list}">
    <tr>
    <td>${item.no}</td>		<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${item.name}</td>	<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${item.content}</td><!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    </tr>
    </c:forEach>
    
    <!-- Start Page list -->
    <tr>
    <td colspan=2 align=center valign="center">
    <ul class="pagination">
        <c:if test="${pagemessage.requestPage!=1}">
        <li class="page-item"><a class="page-link" href="/List.do?requestPage=${pagemessage.requestPage-1}">이전페이지</a></li>
       </c:if>
       
        <c:forEach var="i" begin="${pagemessage.startPage}" end="${pagemessage.endPage}">
        <li class="page-item"><a class="page-link" href="/List.do?requestPage=${i}">${i}</a></li>
        </c:forEach>
        
        <c:if test="${pagemessage.totalPageCount!=pagemessage.requestPage}">
        <li class="page-item"><a class="page-link" href="/List.do?requestPage=${pagemessage.requestPage+1}">다음페이지</a></li>
        </c:if>
      </ul>
    </td>
    <td>
    <button onclick="location.href='messageForm.jsp'">글쓰기</button>
    </td>
    </tr>
    <!-- End Page list -->
    </table>
    
    </body>
    </html>

    ListListController를 실행해서 결과를 보자.

     

     

     

     

    1. 요청한 페이지에 대한 정보를 출력하는 기능 만들기

    ListController가 호출이 되면, DB에 접속해서 테이블의 정보를 모두 출력되도록 하는 작업을 한다.

    그러면 두 단계로 나뉘어야 한다.

    첫 번째, DB에 접속해서 테이블에 있는 정보를 얻어 오기

    두 번째, 얻어온 정보를 웹 페이지에 표시하기

    첫 번째 정보는 MessageService에서 얻어오고, 두 번째는 list.jsp에서 한다.

    ListController.java 자바 파일

    더보기
    package www.controller;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    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 www.message.entity.PageMessage;
    import www.message.service.MessageService;
    
    @WebServlet("/List.do")
    public class ListController extends HttpServlet 
    {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	1. 파라미터정보 저장(request.getParameter())
    		int requestPage = 1;
    		if (request.getParameter("requestPage") != null) 
    		{
    			requestPage = Integer.parseInt(
    				request.getParameter("requestPage")
    				);
    		}
    		
    		//	2. 데이터 베이스 처리
    		//	message 객체 만들기. DB접속 데이터 처리 (서비스라 칭한다.)
    		MessageService service = MessageService.getInstance();
    		
    		//	가지고 온 데이터를 저장
    		//List<Message> list = service.list();
    		PageMessage pagemessage = service.list(requestPage);
    		
     		//	3. 데이터를 dispatcher로 view에게 전달하면 끝
    		//	request.setAttribute("list", list);
    		request.setAttribute("pagemessage", pagemessage);
    		
    		//	4. 저장한 데이터와 함께 view 생성하기 위해 넘겨줌
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher("/WEB-INF/message/list.jsp");
    		
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	}
    }

     

     

    이 list.jsp에서 요청한 페이지에 대한 정보 받아서 화면에 뿌려주는 역할을 한다.

    그리고 list.jsp 내용을 보기 전에 아래의 문법을 살펴보자.

    더보기

    그리고, list.jsp의 for loop문을 다음과 같이 구성할 수 있다.

    변경된 부분은 for문이다.

    list.jsp 파일 내용

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <%@ page import="java.util.List" %>
    <%@ page import="www.message.entity.Message" %>
    
    <!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>
    
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    <%		
    List<Message> list = (List<Message>)request.getAttribute("list"); 
    
    for (Message msg : list) {
    %>
    <tr >
    <td><%=msg.getNo()%></td>
    <td><%=msg.getName()%></td>
    <td><%=msg.getContent()%></td>
    </tr>
    <%} //while end%>
    </table>
    </body>
    </html>

     

    그리고, 아래의 결과를 list.jsp 파일에 복사해서 그 결과를 알아보자.

    list[0]말고 1,2,3 등을 대입해서 그 결과를 알아보자.

    list.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>Page Message List</title>
    </head>
    <body>
    
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    
    <tr>
    <td>${list[0].no}</td>		<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${list[0].name}</td>	<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${list[0].content}</td>	<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    </tr>
    
    </table>
    <% request.setAttribute("test", "1234"); %>
    ${test}
    
    </body>
    </html>

    지금부터 list.jsp 파일에서 페이지에 관한 내용을 추가할 것이다.

    이 파일에서 테이블의 정보를 기존의 스플릿틀립(<% %>)으로 만들어진 것을 수정해보자.

    수정은 하지 않아도 된다. 그러나 MVC2가 지향하는 방향은 아니므로 수정할 가치는 있다.

    그러기 위해서는 jstl 이라는 라이브러리가 필요하다.

    아래의 파일을 다운 받아서 원하는 경로에 두도록 하자. 

    jstl-1.2.jar
    0.40MB

    경로에 저장한 해당 파일을 CTRL + C해서  WEB-INF폴더의 lib폴더에 CTRL + V 해서 붙여넣는다.

    위와 같이 추가가 되면 된다.

    그리고 list.jsp 파일의 맨 위에 아래의 문장을 적는다.

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    위의 내용을 아래의 문법으로 쓸 수 있다.

     

    나중에 아래의 내용을 참고 하자.

    designatedroom87.tistory.com/314?category=901206

     

    taglib문법

    ${ } 태그(html에서 넘어온 문법)와 setAttribute함수(자바 문법)에서 쓸 수 있다. 새 프로젝트를 생성한다. 다이나믹 프로젝트로 만드는데 이름은 El 프로젝트 아이콘에 X가 뜰 때가 있

    designatedroom87.tistory.com

     

    list.jsp 파일 내용

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!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>
    
    <table class="table">
    
    <tr class="success">
    <th>번호</th><th>이름</th><th>메시지</th>
    </tr>
    
    <c:forEach var="item" items = "${list}">
    <tr>
    <td>${item.no}</td>		<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${item.name}</td>	<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${item.content}</td><!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    </tr>
    </c:forEach>
    </table>
    
    </body>
    </html>

     

     

    list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!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>
    
    <!-- 검색 리스트 -->
    <form name=form action="SearchList.do" 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 onmouseover="this.focus()" 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>
    
    <!-- setAttribute함수에서 -->
    <c:forEach var="item" items = "${pagemessage.list}">
    <tr onClick="location.href='Print.do?no=${item.no}'" 
    onmouseover="this.style.backgroundColor='lightgray'" 
    onmouseout="this.style.backgroundColor='white'">
    <td>${item.no}</td>		<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${item.name}</td>	<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${item.content}</td><!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    </tr>
    </c:forEach>
    
    <!-- Start Page list -->
    <tr>
    <td colspan=2 align=center valign="center">
    <ul class="pagination">
        <c:if test="${pagemessage.requestPage!=1}">
        <li class="page-item"><a class="page-link" href="/List.do?requestPage=${pagemessage.requestPage-1}">이전페이지</a></li>
       </c:if>
       
        <c:forEach var="i" begin="${pagemessage.startPage}" end="${pagemessage.endPage}">
        <li class="page-item"><a class="page-link" href="/List.do?requestPage=${i}">${i}</a></li>
        </c:forEach>
        
        <c:if test="${pagemessage.totalPageCount!=pagemessage.requestPage}">
        <li class="page-item"><a class="page-link" href="/List.do?requestPage=${pagemessage.requestPage+1}">다음페이지</a></li>
        </c:if>
      </ul>
    </td>
    <td>
    <button onclick="location.href='/Insert'">글쓰기</button>
    </td>
    </tr>
    <!-- End Page list -->
    </table>
    
    </body>
    </html>

     

    ListController를 실행해서, 그 결과를 알아보자.

     

     

    2. 검색 기능 만들기

    list.jsp에서 검색 버튼을 눌러 검색에 맞는 데이터들을 조회한다. 이 버튼이 클릭 되면,

    SearchListController 가 실행이 되어 입력된 조건을 가지고 DB에 접근해서 조건에 맞는 데이터들을

    모두 가지고 와서 뿌려주는 일을 한다.

    SearchListController는 컨트롤러이므로 www.controller 패키지에 만든다.

    SearchListController.java

    더보기
    package www.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    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 www.message.entity.PageMessage;
    import www.message.service.MessageService;
    
    @WebServlet("/SearchList.do")
    public class SearchListController extends HttpServlet 
    {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	1. 파라미터정보 저장(request.getParameter())
    		int requestPage = 1;
    		if (request.getParameter("requestPage") != null) 
    		{
    			requestPage = Integer.parseInt(
    				request.getParameter("requestPage")
    				);
    		}
    		String field = request.getParameter("field");
    		String search = request.getParameter("search");
    		
    		//	2. 데이터 베이스 처리
    		//	message 객체 만들기. DB접속 데이터 처리 (서비스라 칭한다.)
    		MessageService service = MessageService.getInstance();
    		
    		//	가지고 온 데이터를 저장
    		//List<Message> list = service.list();
    		PageMessage pagemessage = service.searchList(requestPage,field,search);
    		
     		//	3. 데이터를 dispatcher로 view에게 전달하면 끝
    		//	request.setAttribute("list", list);
    		request.setAttribute("pagemessage", pagemessage);
    		request.setAttribute("field", field);
    		request.setAttribute("search", search);
    		
    		//	4. 저장한 데이터와 함께 view 생성하기 위해 넘겨줌
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher("/WEB-INF/message/search_list.jsp");
    		
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	}
    }

     

    search_list.jsp 파일에서, DB에서 얻은 정보를 뿌려주는 일을 한다.

    search_list.jsp는 WEB-INF/message 폴더에 만든다.

    search_list.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!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>Message Search List</title>
    <script>
    function dataCheck()
    {
    	if (document.getElementById("search").value ==""){
    		alert('검색할 단어를 입력하세요')
    		document.getElementById("search").focus();	//	커서의 이동
    		return;
    	}
    	document.form.submit();	//	name이 "form" 정보를 전송
    }
    </script>
    </head>
    <body>
    
    <!-- 검색 리스트 -->
    <form name=form action="SearchList.do" 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>
    
    <!-- setAttribute함수에서 -->
    <c:forEach var="item" items = "${pagemessage.list}">
    <tr onClick="location.href='Print.do?no=${item.no}'" 
    onmouseover="this.style.backgroundColor='lightgray'" 
    onmouseout="this.style.backgroundColor='white'">
    <td>${item.no}</td>		<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${item.name}</td>	<!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    <td>${item.content}</td><!-- Message클래스의 get함수가 없으면 호출 불가하다.웹으로 확인 가능 -->
    </tr>
    </c:forEach>
    
    <!-- Start Page list -->
    <tr>
    <td colspan=2 align=center valign="center">
    <ul class="pagination">
    <!-- 검색일 경우 검색필드, 검색 내용, 페이지를 보내야 한다. -->
        <c:if test="${pagemessage.requestPage!=1}">
        <li class="page-item"><a class="page-link" href="/SearchList.do?requestPage=${pagemessage.requestPage-1}&field=${field}&search=${search}">이전페이지</a></li>
       </c:if>
       
        <c:forEach var="i" begin="${pagemessage.startPage}" end="${pagemessage.endPage}">
        <li class="page-item"><a class="page-link" href="/SearchList.do?requestPage=${i}&field=${field}&search=${search}">${i}</a></li>
        </c:forEach>
        
        <c:if test="${pagemessage.totalPageCount!=pagemessage.requestPage}">
        <li class="page-item"><a class="page-link" href="/SearchList.do?requestPage=${pagemessage.requestPage+1}&field=${field}&search=${search}">다음페이지</a></li>
        </c:if>
      </ul>
    </td>
    <td>
    <button onclick="location.href='/Insert'">글쓰기</button>
    </td>
    </tr>
    <!-- End Page list -->
    </table>
    
    </body>
    </html>

     

    그리고, 각 정보들을 마우스 커서에 갖다대고 클릭을 하면, 조회할 수 있도록 

    PrintDoController 컨트롤러를 만든다.

     

    PrintDoController.java

    더보기
    package www.controller;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    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 www.message.entity.Message;
    import www.message.service.MessageService;
    
    @WebServlet("/Print.do")
    public class PrintDoController extends HttpServlet 
    {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	1. 파라미터정보 저장(request.getParameter())
    		int no = 0;
    		if (request.getParameter("no") != null) 
    		{
    			no = Integer.parseInt(
    				request.getParameter("no")
    				);
    		}
    		
    		//	2. 데이터 베이스 처리
    		//	message 객체 만들기. DB접속 데이터 처리 (서비스라 칭한다.)
    		MessageService service = MessageService.getInstance();
    		
    		//	가지고 온 데이터를 저장
    		//List<Message> list = service.list();
    		Message message = service.print(no);
    		
     		//	3. 데이터를 dispatcher로 view에게 전달하면 끝
    		//	request.setAttribute("list", list);
    		request.setAttribute("message", message);
    		
    		//	4. 저장한 데이터와 함께 view 생성하기 위해 넘겨줌
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher("/WEB-INF/message/print.jsp");
    		
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    	}
    }

     

     

     

    print.jsp 파일에서 출력할 데이터를 화면에 뿌려준다.

    print.jsp 

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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="${message.no}" disabled type="text" class="form-control" id="no" name="no" >
        </div>
        
        <div class="form-group">
          <label for="name">이름:</label>
          <input value="${message.name}" disabled type="text" class="form-control" id="name" name="name">
        </div>
        
        <div class="form-group">
          <label for="content">메모:</label>
          <input value="${message.content}" disabled type="text" class="form-control" id="content" name="content">
        </div>
        
        <div class="form-group">
    	<button onclick="location.href='/Update?no=${message.no}'">수정</button>
    	<button onclick="location.href='/Delete.do?no=${message.no}'">삭제</button>
        </div>
     
    </div>
    </body>
    </html>

     

     

     

    3. 수정 기능 만들기

    위의 print.jsp에서 출력한 정보가 화면에 보여지면 두 가지 선택을 할 수 있다.

    정보를 수정하거나 삭제할 수 있다.

    수정 기능부터 알아보자.

    UpdateController에서 이 기능을 수행한다.

    UpdateController.java

    더보기
    package www.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    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 www.message.entity.Message;
    import www.message.service.MessageService;
    
    @WebServlet("/Update")
    public class UpdateController extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {
    		// TODO Auto-generated method stub
    	}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	1. 파라미터정보 저장(request.getParameter())
    		int no = 0;
    		if (request.getParameter("no") != null) 
    		{
    			no = Integer.parseInt(
    				request.getParameter("no")
    				);
    		}
    		
    		//	2. 데이터 베이스 처리
    		//	message 객체 만들기. DB접속 데이터 처리 (서비스라 칭한다.)
    		MessageService service = MessageService.getInstance();
    		
    		//	가지고 온 데이터를 저장
    		//List<Message> list = service.list();
    		Message message = service.print(no);
    		
     		//	3. 데이터를 dispatcher로 view에게 전달하면 끝
    		//	request.setAttribute("list", list);
    		request.setAttribute("message", message);
    		
    		//	4. 저장한 데이터와 함께 view 생성하기 위해 넘겨줌
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher("/WEB-INF/message/update.jsp");
    		
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//response.getWriter().append("Served at: ").append(request.getContextPath());
    	}
    
    	
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//doGet(request, response);
    	}
    }

     

    update.jsp에서는 웹 상에서 먼저 정보를 보여주고, 수정할 수 있도록 한다.

    다만 번호는 수정하지 못하게 해야 한다.

    그리고 나서 수정하기 버튼을 선택하면 DB에 접속해서 이 정보를 수정한다.

    이에 대한 수정은 UpdateDoController 에서 한다.

    update.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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 Update</title>
    <script>
    function dataCheck()
    {
    	if (document.getElementById("name").value ==""){
    		alert('이름을 확인하세요.')
    		document.getElementById("name").focus();	//	커서의 이동
    		return;
    	}
    	if (document.getElementById("content").value ==""){
    		alert('내용을 확인하세요.')
    		document.getElementById("content").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 method="post" action="/Update.do">
        <div class="form-group">
          <label for="no">번호:</label>
          <input value="${message.no}" disabled type="text" class="form-control" id="no" name="no" >
          <input value="${message.no}" type="hidden" name="no" >
        </div>
        
        <div class="form-group">
          <label for="name">이름:</label>
          <input value="${message.name}" type="text" class="form-control" id="name" name="name">
        </div>
        
        <div class="form-group">
          <label for="content">메모:</label>
          <input value="${message.content}" type="text" class="form-control" id="content" name="content">
        </div>
        
        <div class="form-group">
    	<button onclick="dataCheck()">수정하기</button>
        </div>
     	</form>
    </div>
    </body>
    </html>

     

    UpdateDoController.java

    더보기
    package www.controller;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    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 www.message.entity.Message;
    import www.message.service.MessageService;
    
    @WebServlet("/Update.do")
    public class UpdateDoController extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {
    		// TODO Auto-generated method stub
    	}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    			throws UnsupportedEncodingException 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	한글 깨지는 문제 해결
    		request.setCharacterEncoding("UTF-8");
    		
    		//	1. 파라미터정보 저장(request.getParameter())
    		int no = Integer.parseInt(request.getParameter("no"));
    		String name = request.getParameter("name");
    		String content = request.getParameter("content");
    		
    		System.out.println("control-no : " +no);
    		System.out.println("control-name : " +name);
    		System.out.println("control-content : " +content);
    		
    		Message message = new Message(no,name,content);
    		
    		//	2. 데이터 베이스 처리
    		//	message 객체 만들기. DB접속 데이터 처리 (서비스라 칭한다.)
    		MessageService service = MessageService.getInstance();
    		
    		//	가지고 온 데이터를 저장
    		int success = service.update(message);	//	success가 1이면 성공 0이면 실패
    		String page = "";
    		
    		if (success < 1) {
    			//	입력 실패에 대한 페이지로 이동
    			page = "/WEB-INF/message/update_fail.jsp";
    		}
    		else{
    			//	입력 성공에 대한 페이지로 이동
    			page = "/WEB-INF/message/update_success.jsp";
    		}
    		
     		//	3. 데이터를 dispatcher로 view에게 전달하면 끝
    		//	request.setAttribute("list", list);
    		//	request.setAttribute("success", success);
    		
    		//	4. 저장한 데이터와 함께 view 생성하기 위해 넘겨줌
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher(page);
    		
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//response.getWriter().append("Served at: ").append(request.getContextPath());
    	}
    
    	
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//doGet(request, response);
    	}
    }

     

    그리고, update_fail.jsp와 update_success.jsp는 업데이트의 상태를 보여주기 위한 페이지로

    별 내용은 없다.

    update_fail.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	update fail
    </body>
    </html>

     

    update_success.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	update success<br>
    	<button onclick="location.href='/List.do'">리스트</button>
    </body>
    </html>

     

     

    4. 삭제 기능 만들기

    위의 print.jsp에서 출력한 정보가 화면에 보여지면 두 가지 선택을 할 수 있다.

    나머지 하나인 삭제 기능이다.

    삭제는 간단하다. 바로 DB에 접속해서 삭제를 하면 끝이다.

    DeleteDoController가 이 일을 한다.

     

    DeleteDoController.java

    더보기
    package www.controller;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    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 www.message.entity.Message;
    import www.message.service.MessageService;
    
    @WebServlet("/Delete.do")
    public class DeleteDoController extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {
    		// TODO Auto-generated method stub
    	}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    			throws UnsupportedEncodingException 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	한글 깨지는 문제 해결
    		request.setCharacterEncoding("UTF-8");
    		
    		//	1. 파라미터정보 저장(request.getParameter())
    		int no = 0;
    		if (request.getParameter("no") != null) 
    		{
    			no = Integer.parseInt(
    				request.getParameter("no")
    				);
    		}
    		
    		System.out.println("control-no : " +no);
    		
    		//	2. 데이터 베이스 처리
    		//	message 객체 만들기. DB접속 데이터 처리 (서비스라 칭한다.)
    		MessageService service = MessageService.getInstance();
    		
    		//	가지고 온 데이터를 저장
    		int success = service.delete(no);	//	success가 1이면 성공 0이면 실패
    		String page = "";
    		
    		if (success < 1) {
    			//	입력 실패에 대한 페이지로 이동
    			page = "/WEB-INF/message/delete_fail.jsp";
    		}
    		else{
    			//	입력 성공에 대한 페이지로 이동
    			page = "/WEB-INF/message/delete_success.jsp";
    		}
    		
     		//	3. 데이터를 dispatcher로 view에게 전달하면 끝
    		//	request.setAttribute("list", list);
    		//	request.setAttribute("success", success);
    		
    		//	4. 저장한 데이터와 함께 view 생성하기 위해 넘겨줌
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher(page);
    		
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//response.getWriter().append("Served at: ").append(request.getContextPath());
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//doGet(request, response);
    	}
    }

     

    삭제가 제대로 이루어졌는지 체크 하기 위해서 두 jsp 파일을 정의 한다.

    delete_fail.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	delete fail
    </body>
    </html>

     

    delete_success.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	delete success<br>
    	<button onclick="location.href='/List.do'">리스트</button>
    </body>
    </html>

     

     

    5. 삽입 기능 만들기

    list.jsp에서 글쓰기 버튼을 클릭하면 데이터를 입력받고, DB에 저장한다.

    즉, 글쓰기 버튼 눌리면 InsertController가 실행된다.

    그리고 messageForm.jsp 가 실행되어 Form으로 입력받을 준비를 한다.

    입력을 받으면 DB에 접속해야 하므로 InsertDoController가 실행된다.

    InsertDoController 에서 이름과 메시지를 DB에 저장한다.

    MessageDAO.java 와 MessageService.java 에서 

    각 각 DB에 데이터를 저장하는 함수인 insert 함수를 만들어서 호출한다.

    InsertController.java

    더보기
    package www.controller;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/Insert")
    public class InsertController extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {
    		// TODO Auto-generated method stub
    	}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	RequestDispatcher를 분리하는 작업을 한다.
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher("/WEB-INF/message/messageForm.jsp");
    		//request.setAttribute("c","aaaa");
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//response.getWriter().append("Served at: ").append(request.getContextPath());
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//doGet(request, response);
    	}
    }

     

     

    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='/'"><i class="fa fa-home"></i></button>메시지 입력</h2>
      <form name=form action="/Insert.do" 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>

     

     

    InsertDoController.java

    더보기
    package www.controller;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletConfig;
    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 www.message.entity.Message;
    import www.message.service.MessageService;
    
    @WebServlet("/Insert.do")
    public class InsertDoController extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public void init(ServletConfig config) throws ServletException {
    		// TODO Auto-generated method stub
    	}
    
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException 
    	{
    		//	사용자가 접속하는 url주소를 기준으로 주소를 분석(파싱)한다.
    		//	context 경로를 포함해서 url을 출력
    		String url = request.getRequestURI();
    		System.out.println(url);
    		
    		//	context path를 출력
    		String contextPath = request.getContextPath();
    		System.out.println(contextPath);
    		
    		//	context path를 이용하여 최종 url만 추출하는 작업
    		String path = url.substring(contextPath.length());
    		System.out.println(path);
    		
    		//	한글 깨지는 문제 해결
    		request.setCharacterEncoding("UTF-8");
    		
    		//	1. 파라미터정보 저장(request.getParameter())
    		String name = request.getParameter("name");
    		String content = request.getParameter("content");
    		
    		System.out.println("control-name : " +name);
    		System.out.println("control-content : " +content);
    		
    		Message message = new Message(0,name,content);	//	no는 자동증가로 쓰지 않으므로 0으로 설정
    		
    		//	2. 데이터 베이스 처리
    		//	message 객체 만들기. DB접속 데이터 처리 (서비스라 칭한다.)
    		MessageService service = MessageService.getInstance();
    		
    		//	가지고 온 데이터를 저장
    		int success = service.insert(message);	//	success가 1이면 성공 0이면 실패
    		String page = "";
    		
    		if (success < 1) {
    			//	입력 실패에 대한 페이지로 이동
    			page = "/WEB-INF/message/insert_fail.jsp";
    		}
    		else{
    			//	입력 성공에 대한 페이지로 이동
    			page = "/List.do";
    		}
    		
     		//	3. 데이터를 dispatcher로 view에게 전달하면 끝
    		//	request.setAttribute("list", list);
    		//	request.setAttribute("success", success);
    		
    		//	4. 저장한 데이터와 함께 view 생성하기 위해 넘겨줌
    		RequestDispatcher dispatcher = 
    				request.getRequestDispatcher(page);
    		
    		try {
    			dispatcher.forward(request, response);
    		} catch (ServletException | IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//response.getWriter().append("Served at: ").append(request.getContextPath());
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		//doGet(request, response);
    	}
    }

     

    insert_fail.jsp

    더보기
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    <script>
    	alert("메시지 입력 실패")
    </script>
    
    <jsp:forward page="list.jsp"/>
    	
    </body>
    </html>

     

     

     

    아래는 전체적인 파일의 계층 구조이다.

     

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

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

    댓글

Designed by Tistory.