My footsteps
서블릿 / 4 본문
- 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이아님
< 예외처리 >
- 예외란? : 여러개의 오류中 하나
- 예외처리 : 입력값에 대한 내용이 잘못되었는데 이거 걍 넘길래? 뭐 어떡할래??
'국비수업 > 수업정리' 카테고리의 다른 글
컬렉션 / 2 + 추상화 (0) | 2023.05.16 |
---|---|
예외 처리 / 컬렉션 (0) | 2023.05.15 |
서블릿 / 3 (0) | 2023.05.11 |
서블릿 / 2 (0) | 2023.05.10 |
제약 조건 / 서블릿 (0) | 2023.05.09 |