My footsteps
예외 처리 / 컬렉션 본문
< 아침복습 >
- xml: 서블릿이 실행될수 있는 url 주소를 매핑해주는 파일
- 어노테이션으로 바꾼 이유 : 서블릿 파일 내에서 편하게 맞는 url 주소를 매핑하려고
- 리퀘스트 : 클라이언트의 요청 정보를 꺼낼수 있게
- 리스폰스: 웹서버의 응답 정보를 담아서 보냄
- 서블릿이 하는 역할 : 클라이언트 요청 응답 처리
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){
// ------< 사용자로부터 값 입력받기 >--------------------------------------------
int page = 1; //기본 페이지 : 1페이지
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이아님
List<Menu> list = new ArrayList<>();
// ------< 메뉴 목록 데이터를 가져오기 >--------------------------------------------
{
String driverClassName ="org.mariadb.jdbc.Driver";
//jdbc드라이버의 전체 패키지 경로와 클래스 이름
String url = "jdbc:mariadb://db.newlecture.com:3306/rlanddb";
//jdbc 드라이버가 연결할 데이터베이스의 위치를 지정하는 url
int offset = (page - 1) * 10; // 1->0, 2->10, 3->20
int size = 10;
try {
Class.forName(driverClassName);
//jdbc 드라이버 클래스 이름을 사용하여 해당 클래스를 로드
Connection con = DriverManager.getConnection(url,"rland","20220823");
//드라이버매니저 메서드를 사용하여 db와의 연결을 설정
//연결
PreparedStatement st = con.prepareStatement("select * from menu limit ?,10");
//db에 대한 PreparedStatement 쿼리문을
//미리준비한다
st.setInt(1,offset);
//위의 숫자로 바꾼 id를 쿼리문에 세팅
//첫번째 인자에 오프셋이 들어간다
ResultSet rs = st.executeQuery();
//PreparedStatement 객체를 사용하여 작성된 쿼리문을 실행하고 그 결과로 얻어진 데이터를 담은
//ResultSet 객체생성
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>");
}
}
}
package kr;
import java.io.IOException;
import java.io.PrintWriter;
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 kr.co.rland.web.entity.Menu;
@WebServlet("/hello") // > url 매핑
public class Snippet extends HttpServlet{
protected void service(HttpServletRequest request
,HttpServletResponse response) throws IOException,ServletException{
PrintWriter out = response.getWriter();
//getwriter로 쓰고 printwriter로 받아주면 됨
out.write("hello");
//서블릿 구동부분
//톰캣이 서블릿을 실행시켜줌 > 그럼 서블릿이 자기 할일을 함
String name = request.getParameter("name");
//요청이옴
System.out.println(name);
//요청받음(요청담음) > 콘솔출력
int age = Integer.parseInt(request.getParameter("age"));
System.out.println(age);
}
}
- 예외는 수정할수가 없다
//1000넘으면 오류로 인식하게 하기
if(result>1000)
throw new 천을넘은예외();
//이렇게 하면 예외클래스(천을넘는예외)가 자동으로 만들어지고
//메인에서 throw 천을넘는예외 넣어주면 된다
package ex1;
public class Calculator {
private int x;
private int y;
//다른 값으로 계산한다면 static
//계속 같은 값으로 계산한다면 인스턴스
public static int add(int x,int y) throws 천을넘은예외 { //예외를 여러개 던질수 있기 때문에 throws
int result = x+y;
//1000넘으면 오류로 인식하게 하기
if(result>1000)
throw new 천을넘은예외();
return result;
}
public static int sub(int x,int y) {
int result = x-y;
return result;
}
public static int multi(int x,int y) {
int result = x*y;
return result;
}
public static int div(int x,int y) {
int result = x/y;
return result;
}
}
package ex1;
public class 천을넘은예외 extends Exception {
}
package ex1;
public class Program {
public static void main(String[] args){
int result = 0;
try {
result = Calculator.add(1000, 40);
} catch (천을넘은예외 e) {
e.printStackTrace();
}
System.out.println(result);
}
}
//이런식으로도 예외처리 가능 (써라운드)
- printStackTrace()를 쓰는건 좋지 않은 방법이다. 오류로 빨갛게 뜨는것보다 내선에서 sysout으로 어떤 오류가 있는지 부드럽게 얘기하는게 좋아..서...
- throw는 예외처리 클래스한테 예외처리 해달라고 하는거고, try-catch는 내가 알아서 예외 해결하는것
- Exception은 모든 오류를 말함
//예외가 한가지 이상일때의 방법 처리 방법
package ex1;
public class Program {
public static void main(String[] args){
int result = 0;
try {
result = Calculator.add(30, -39);
} catch (천을넘은예외 e) {
// e.printStackTrace();
System.out.println("사용법:add(합계가 1000이 안되는 x,합계가 1000이 안되는 y)");
//이런식으로 아예 사용법을 알려줄수도 있다
} catch(음수가되는예외 e) {
System.out.println("음수 오류!!");
}
System.out.println(result);
}
}
- Exception이 위쪽에 있으면 얘가 모든 예외를 다 잡기 때문에 그 밑에는 catch문이 올수가 없다
- else처럼 예외처리문에도 finally라는게 있어서 마무리 작업하기에 좋다(예외처리와 관계없이 항상 실행되는 코드 작성)
package ex1;
public class Program {
public static void main(String[] args){
int result = 0;
try {
result = Calculator.add(30, -39);
} catch (천을넘은예외 e) {
// e.printStackTrace();
System.out.println("사용법:add(합계가 1000이 안되는 x,합계가 1000이 안되는 y)");
} catch(음수가되는예외 e) {
System.out.println("음수 오류!!");
} finally {
System.out.println("마무리작업");
}
System.out.println(result);
}
}
- 오류가 발생한곳에서 close를 해줘야한다
rs.close();
st.close();
con.close();
try(
Connection con = DriverManager.getConnection(url,"rland","20220823");
PreparedStatement st = con.prepareStatement("select * from menu limit ?,10");
)
//이런식으로 try안에 커넥션이랑 프리페얼드스테이트먼트를 넣으면 아래에서도 저 둘을 사용할수있고
//예외가 발생하면 자동으로 .close()를 해주기 때문에 이 방법이 가장 적절한 방법이다
//try안에 기본으로 close라는 메서드를 갖고 있기 때문에 자동으로 닫아줌!!
String driverClassName ="org.mariadb.jdbc.Driver";
String url = "jdbc:mariadb://db.newlecture.com:3306/rlanddb";
Connection con = DriverManager.getConnection(url,"rland","20220823");
PreparedStatement st = con.prepareStatement("select * from menu limit ?,10");
try(
con;st
)
//jdk 9.0에서는 이렇게 할수도 있다
< 컬렉션 >
- 컬렉션 : 도구화된 배열
- 컬렉션의 장점은 인덱스를 거론하지 않고 넣을수 있다
- 값 형식(int같은것들)들을 참조할수 있도록 하는 wrapper 클래스가 존재한다
- 참조를 당연하게 생각하면 안된다
- string은 object를 바로 물려받는 유일한 애
- ★ 컬렉션 만드는법 ☆
package ex06.collection;
public class Program {
public static void main(String[] args) {
ObjectList list = new ObjectList();
list.add(2);
}
}
package ex06.collection;
public class ObjectList {
private Object[] store;
private int index;
private int max;
public ObjectList() {
max = 3;
store = new Object[max];
//여기서 Object배열의 길이를 고정으로 정해주지 말고 변수를 활용하자. 그래야 맘대로 배열 공간을 늘릴수 있으니까
index = 0;
}
public void add(Object value) {
if(index == max) {
//공간을 늘리는 코드
}
store[index] = value;
index++;
}
}
package ex06.collection;
public class ObjectList {
private Object[] store;
private int index;
private int max;
public ObjectList() {
max = 3;
store = new Object[max];
index = 0;
}
public void add(Object value) {
if(index == max) {
//공간을 늘리는 코드
}
store[index] = value;
index++;
}
public Object get(int i) {
Object obj = store[i];
return obj;
}
}
package ex06.collection;
public class Program {
public static void main(String[] args) {
ObjectList list = new ObjectList();
list.add(2);
Object obj = list.get(1);
}
}
'국비수업 > 수업정리' 카테고리의 다른 글
인터페이스 / 다형성 / 익명클래스 (0) | 2023.05.17 |
---|---|
컬렉션 / 2 + 추상화 (0) | 2023.05.16 |
서블릿 / 4 (0) | 2023.05.12 |
서블릿 / 3 (0) | 2023.05.11 |
서블릿 / 2 (0) | 2023.05.10 |