My footsteps

서블릿 / 4 본문

국비수업/수업정리

서블릿 / 4

밀김 2023. 5. 12. 10:32
728x90

 

 

 

 

 

 

 

 

 

 

- get 요청 : 쿼리스트링을 이용

 

- post 요청 : 어떤것을 기입하길 요구하고 요청하는것

 

- 페이지 새로고침할때마다 get 요청을 하는것

 

 - 목록을 달라고 할때는 list,자세한 내용은 detail,데이터는 reg,수정은 update,삭제는 del 

 

@WebServlet("/menu/detail")

- xml에서 굳이 매핑할 필요없이 그냥 메인에서 이 한줄만 추가해주면 매핑이 된다. 이렇게 못하는 경우는 소스가 없을때

 

- 사용자 입출력에 수반하는 코드 = 컨트롤러 라고 통칭

 

- 패키지명을 잘 지어야 한다! 한눈에 봐도 딱 보일수 있게

 

 

//(일반사용자)가/menu(을)/detail(상세조회)하다 -> 익명사용자용 url
///admin(관리자)가/menu를/reg(등록)하다 ->
//역할자,대상,행위 순대로 폴더이름을 명명하면 된다

이런식으로 이름을 잘 지어야..

 

 

 

 

 

 

- 메뉴리스트 요청문

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>insert title here</title>
</head>
<body>
	<header>
		<h1>메뉴 목록</h1>
		<ul>
			<li><a href="detail?id=617">에소프레소</a></li>
			<li><a href="detail?id=737">버터쿠키</a></li>
			<li><a href="detail?id=741">딸기에이드</a></li>
			<li><a href="detail?id=748">자바칩쿠키</a></li>
		</ul>
	</header>
</body>
</html>

 

package kr.co.rland.web.controller.menu;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import kr.co.rland.web.entity.Menu;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


@WebServlet("/menu/detail") 
public class DetailController extends HttpServlet
{
    public void service(HttpServletRequest request
         ,HttpServletResponse response)
         throws IOException,ServletException{
         //------<요청에 대한 값>---------------
         //http://localhost:8080/hello?id=737 
         String id_ = request.getParameter("id");
         int id = Integer.parseInt(id_); 
    
//       ------< 데이터 로드 >--------------------------------------------
       Menu menu = null;
       {
          String driverClassName ="org.mariadb.jdbc.Driver";
          String url = "jdbc:mariadb://db.newlecture.com:3306/rlanddb";
          
          try {
            Class.forName(driverClassName);
            Connection con = DriverManager.getConnection(url,"rland","20220823");
             System.out.println(con.isClosed());
             
             PreparedStatement st = con.prepareStatement("select * from menu where id=?");
             st.setInt(1,id); //위의 숫자로 바꾼 id를 쿼리문에 세팅
             ResultSet rs = st.executeQuery();
             
             if(rs.next()) {
                menu = new Menu(
                      rs.getInt("id"),
                      rs.getString("name"),
                      rs.getInt("price"),
                      rs.getString("img"),
                      rs.getDate("reg_date"),
                      rs.getInt("reg_member_id")
                      );
             }
             rs.close();
             st.close();
             con.close();
         } catch (ClassNotFoundException e) {
            e.printStackTrace();
         } catch(SQLException e){
            e.printStackTrace();
         }
       }
//       ------< 출력 >--------------------------------------------
       
       {
           response.setContentType("text/html"); //무조건 리스폰스 설정 먼저 하고
           response.setCharacterEncoding("utf-8");
          //OutputStream os = response.getOutputStream();
         // PrintStream out = new PrintStream(os,true,"utf-8"); //스트림 해야함
         
           PrintWriter out = response.getWriter();
          // out.println(menu.toString());
          
          //입력하는 방법 알려달라고 쌤한테 말하기!! 
          out.write("<!DOCTYPE html>");
          out.write("<html>");
          out.write("<head>");
          out.write("<meta charset=\"UTF-8\">");
          out.write("<title>메뉴상세</title>");
          out.write(" </head>");
          out.write(" <body>");
          out.write(" <div><a href=\"list.html\">메뉴목록</a></div>");
          out.write("<section>");
          out.write("      <h1>"+menu.getName()+"</h1>");
          out.write("      <form>");
          out.write("         <fieldset>");
          out.write("            <div>");
          out.write("               <label>"+menu.getImg()+"</label>");
          out.write("               <span> <img src=\"\"></span>");
          out.write("            </div>");
          out.write("            <div>");
          out.write("               <label>설명</label>");
          out.write("               <span>코딩이 세상에서 제일 잼있다</span>");            
          out.write("            </div>");
          out.write("            <div>");
          out.write("      <label>"+menu.getPrice()+"</label>");
          out.write("      <span></span>");
          out.write("            </div>");
          out.write("         </fieldset>");
          out.write("       </form>");
          out.write("   </section>");
          out.write("</body>");
          out.write("</html>");
  
       }   

    }
}

 

 

- ? 다음으로 오는것들이 쿼리스트링이다

 

 

- select * from member limit 10 > 쿼리 컬럼들이 열개까지 딱 잘려서 나옴

select * from member limit 0,10 > 앞에꺼 건너뛰지 않고 10개 출력

select * from member limit 10,10 > 앞에꺼 10개 건너뛰고 그 다음 10개출력

 

 

- limit은 항상 맨마지막에 붙이면 됨

 

 

 

 

- 다른페이지를 가져오기

package kr.co.rland.web.controller.menu;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.ArrayList;
import kr.co.rland.web.entity.Menu;

@WebServlet("/menu/list") 
public class ListController extends HttpServlet{
	//정적문서를 동적문서로 만드는 방법
	protected void service(HttpServletRequest request
         ,HttpServletResponse response) throws IOException,ServletException{
		
//      ------< 사용자로부터 값 입력받기 >--------------------------------------------
		int page = 1; //기본 페이지 : 1페이지
		
        String page_ = request.getParameter("page");
        page = Integer.parseInt(page_); 

        List<Menu> list = new ArrayList<>();
		
//      ------< 메뉴 목록 데이터를 가져오기 >--------------------------------------------
		{
			
			String driverClassName ="org.mariadb.jdbc.Driver";
	        String url = "jdbc:mariadb://db.newlecture.com:3306/rlanddb";
	        
			int offset = (page - 1) * 10; // 1->0, 2->10, 3->20
			int size = 10;
			String sql = "";
	          
	         try {
	             Class.forName(driverClassName);
	             Connection con = DriverManager.getConnection(url,"rland","20220823");
	             System.out.println(con.isClosed());
	              
	              PreparedStatement st = con.prepareStatement("select * from menu limit ?,10");
	              st.setInt(1,offset); //위의 숫자로 바꾼 id를 쿼리문에 세팅
	              ResultSet rs = st.executeQuery();
	              
	              
	              while(rs.next()) {
	         		 Menu menu = new Menu( //메뉴는 10줄중에서 한줄
	         				 rs.getInt("id"),
	         				 rs.getString("name"),
	         				 rs.getInt("price"),
	         				 rs.getString("img"),
	         				 rs.getDate("reg_date"),
	         				 rs.getInt("reg_member_id")
	         				 );
	         		 list.add(menu);
	              }
	              
	              rs.close();
	              st.close();
	              con.close();
	          } catch (ClassNotFoundException e) {
	             e.printStackTrace();
	          } catch(SQLException e){
	             e.printStackTrace();
	          }
	 		
		}
		
		
		
//      ------< 사용자에게 데이터를 포함하는 문서"출력"하기 >--------------------------------------------
		{
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		
		PrintWriter out = response.getWriter();
		
		out.write("<!DOCTYPE html>");
		out.write("<html>");
		out.write("<head>");
		out.write("<meta charset=\"UTF-8\">");
		out.write("<title>insert title here</title>");
		out.write("</head>");
		out.write("<body>");
		out.write("	<header>");
		out.write("		<h1>메뉴 목록</h1>");
		out.write("		<ul>");
		for(Menu menu : list) {
			out.write("			<li><a href=\"detail?id="+menu.getId()+">"+menu.getName()+"</a></li>");		
		}
		out.write("			<li><a href=\"detail?id=737\">버터쿠키</a></li>");
		out.write("			<li><a href=\"detail?id=741\">딸기에이드</a></li>");
		out.write("			<li><a href=\"detail?id=748\">자바칩쿠키</a></li>");
		out.write("		</ul>");
		out.write("	</header>");
		out.write("</body>");
		out.write("</html>");
		}
	}

}

 

 

 

- 위의 코드를 서버로 실행하면 첫페이지는 500이 나오는데 왜냐면 page=1로 설정해놨기 때문에 당연히 0번째 페이지는 null이여서 나오지 않음

 

 

 

		//첫페이지 500 안뜨게 하는 방법
        
        if(request.getParameter("page")!=null) {
			String page_ = request.getParameter("page");
			page = Integer.parseInt(page_); 			
		}//null이면 첫페이지를 띄우게. null이 아니면 
		//매핑에 쿼리스트링이 없을때 1로 뜨게끔 설정(=이 상태가 null)
		//@WebServlet("/menu/list")면 null /menu/list?page=1 이면 null이아님

 

 

 

 


 

 

 

 

< 예외처리 >

 

 

- 예외란? : 여러개의 오류中 하나

 

논리오류가 제일 위험함. 구문에도 오류가 없기 때문에 (3으로 나눠서 얻고싶었던 결과값을 개발자의 실수로 4로 나눈다던지..)

 

 

 

 

- 예외처리 : 입력값에 대한 내용이 잘못되었는데 이거 걍 넘길래? 뭐 어떡할래?? 

 

 

 

 

 

 

 

 

728x90

'국비수업 > 수업정리' 카테고리의 다른 글

컬렉션 / 2 + 추상화  (0) 2023.05.16
예외 처리 / 컬렉션  (0) 2023.05.15
서블릿 / 3  (0) 2023.05.11
서블릿 / 2  (0) 2023.05.10
제약 조건 / 서블릿  (0) 2023.05.09