5.JDBC/2)JDBC_개념

JDBC_개념_Day_11

구이제이 2024. 3. 5. 21:33

웹서버 - 제우스,웹로직 -  정적

와스 - 톰캣 -동적



http://

https://

 

s붙은것은 ss암호화, 보완성이 확보된 사이트(보안강화



##http의 특징

1.비연결성(요청이가고 다시 응답이오면 곧바로 끝어지는 것)

2.무상태(웹 서버가 웹 클라이언트의 상태정보를 유지하지 않는 것을 의미합니다.)




상태정보 - 요청한것들을 보낸다. 계속

세션, 쿠키를 통해서 상태정보 유지시킨다.



 

http

https

ㅡ프로토콜(통신약속)

 

//

ㅡ프로토콜 호스트 구분자

 

localhost:8090

ㅡ도메인

 

8090

ㅡ포트(방문)



hmtl

웹에필리케이션

 

member.html

디렉터리파일










##http 요청 프로토콜 구조

 

http 1.0 대가 가장 강력하게 사용되고 있습니다.

 

#차이

URI

URL 



##요청방식

GET - 조회(상세,목록)

POST - 등록

PUT - 수정

DELETE - 삭제

 

Get 

- read방식과 같다. - get날씨,실시간 알려줘, (보안에 취약하다)

데이터를 받는 용도 파라미터를 전달

클라이언트에서 작성된 데이터를 서버군 전송

‘text만 전송’




POST

-create

데이터를 받는 용도 파라미터를 전달

데이터양많다. 중요한 정보는 POST로 보낸다(body)

어떤것이든 보낼수있다.(바이너리,텍스트, 다보낸다)

 

PUT

-update

 

DELETE

-delete



#

URL과 URI 차이



URI는 이부분입니다.



#http 응답 프로토콜

 

status-line : 상태코드 상태메세지

 

메세지헤더 : 응답헤더,서버이름,버전,정보가 들어가지만, 문서의정보가 붙어서간다.

메세지제어정보,메세지본문데이터가 텍스트 형태로 들어간다.

CRLF : 

 

메세지바디 : 실질적으로 데이터가 포함된 것, 실질적인 문서가 메세지 바디안에

 들어가있습니다.우리가 받을 데이터가 메세지바디안에 들어가있다.



#

응답프로토콜 상태정보

400번대는 사용자의 잘못 클라이언트 쪽

500번대는 서버쪽에서 문제








ServletTest



package servlettest;

 

import java.io.IOException;

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("/hello") // 이클래스가 서블랫으로 사용되고 있다는 의미 어노테이션

public class ServletTest extends HttpServlet { // HttpServlet 상속받아서 처리합니다.

private static final long serialVersionUID = 1L; //주는것을 그냥 쓰면됩니다.

    

//객체 바이트단위 x

//바이트단위를 다시 객체로 내보내는것

 

//객체 > 바이트 = 직렬화? 

//바이트 > 객체 = 역직렬화?

 

 

//#생성자

    public ServletTest() {

        super();

    }

 

    /*

     

HttpServletRequest : http 프로토콜의 request 정보를 서블릿에 전달하기 위해 사용

     서블릿에서 클라이언트와 연결되어 처리할 작업은 HttpServletRequest를 통해서 가져와야 합니다.

     속성에서 getParameter(속성명(name) : name 속성으로 전달된 파라미터의 값

       name이 같은게 오는경우 체크박스, 라디오 버튼 같은경우 같습니다.

       이런경우는 , getParameterValue(name) : 동일한 name 속성으로 전달된 모든 파라미터 값 처리

    

     getParameter(name) : name 속성으로 전달된 파라미터의 값

     getParameterValue(name) : 동일한 name 속성으로 전달된 모든 파라미터 값 처리

getRequestURL() : url

getContextPath() : /shopApp20240305, 콘텍스트 경로

...

 

 

HttpServletResponse : 서블릿 컨테이너가 클라이언트에게 응답을 보내기 위해 이 객체를 생성해서 서블릿에 전달 

 

 

sendRedirect(String location) : 클라이언트에게 redirect 응답을 보낸 후 특정, url로 다시 요청함

getWriter() : 클라이언트로 데이터를 보내기 위한 출력 스트림을 리턴

setContentType(String type) : 클라이언트에 전달되는 콘텐츠 타입지정

addCookie(Cookie cookie) : 응답에 쿠키를 추가

 

쿠키(Cookie) : '클라이언트에 저장' (사용자의 하드디스크) 되는 작은 정보

 

파일형태로 컴퓨터에 저장, 보안상에 문제가 있을 수 있습니다.

쿠키를 먼저 읽어오고 처리한다.

사용자의 동의가 필요합니다.(사용자정보를 사용하기 때문입니다.)

ex)광고

 

 

    세션 ( Session ) : 클라이언트가 웹 애플리케이션 서버에 접속할 때 서버 쪽에 생성되는 공간

     '서버'쪽에 생성되는 공간

    

     별도의 세션 관리데이터베이스 - redis라고 하는 인메모리 데이터베이스 활용

    

    

     저장, 유효시간이 있습니다.(만료일)

     ex)

      브라우저, 로그인상태유지,장바구니기능,

      세션 유효시간, 언제까지인지 정해집니다.

     

      한두사람은 가능하지만,

      몆십만명이 들어오면, 세션공간을 확보하는 서버공간이 부담이 될수가 있습니다.

      메모리상에 부담이 올수있다.

      그래서 요즘 데이터베이스 상태로 관리.

     

      예제) 로그인 후 세션을 이용해 사용자 이름을 저장하고 메인 화면으로 이동하는 경우

      //controller

      session.setAttrubute("username", "홍길동"); //이름을 세션에 저장

      response.sendRedirect("/main.jsp"); 메인 화면으로 리디렉션

     

      //main.jsp

      <h1>${username}</h1> //이름 출력

     

      Scope Object : 

      Request '생성'이 언제 되냐면,  현제 페이지 요청될때

      '소멸'이 언제 되나면, 다른페이지로 이동할때,

      '범위'는, 현제 페이지, 포워딩의 경우는 다음 페이지까지 참조 가능

     

      session '생성'이 언제 되냐면,  클라이언트가 서버에 접속할때,

      '소멸'이 언제 되나면,  일정시간이 지나거나 브라우저가 종료될 때

      '범위'는, 현제 페이지, 동일 클라이언트에 대해, 다른페이지에서도 참조 가능합니다.

     

      Web Context '생성'이 언제 되냐면,  웹 애플리케이션이 시작할 때

      '소멸'이 언제 되나면,  웹 에플리케이션이 종료될 때

      '범위'는, 현제 페이지, 모든 클라이언트에서 참조 가능

     

     

     */

    

    

    

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);

}

 

}





ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



MVC패턴

 

MVC(모델 뷰 컨트롤러)

패턴 : 양식



뷰 템플릿 : jsp, 타임리프






MVC(Model View Controller) 패턴 - 서로간의 종속성을 약화시키는 효과가 있습니다.

   GUI 기반의 애플리케이션 개발에 사용되는 디자인 패턴

 

   모바일 앱 및 프론트엔드 기반 애플리케이션 개발 => mvp,  mvvm 패턴도 널리 사용

 

   ★

   화면과 데이터 처리를 분리, 

   ‘코드간의 종속’을 줄이고 구성요소간의 역할을 명확히 함(하나를 건들면 손대야할 것많기에)

   코드 분리가 쉽고 ‘협업’을 용이하게 함

 

Model : 데이터를 처리하는 영역

   실제 구현에는 데이터베이스와 연동을 위한 

   DAO(Data Access Object) 클래스와 데이터 구조를

   표현하는 DO(Data Object, Entity)클래스, DTO(Data Transfer Object)구성

   모델은 뷰나 컨트롤러에 독립적인 구조로 데이터베이스 처리를 필요로 하는 여러 애플리케이션에서 

   공유할 수 있으며, 웹 애플리케이션이 아닌 경우에도 사용할 수 있는 형태

 

서블렛(컨트롤러)가 모든 MVC의 핵심

DAO통해서 DB연결하고, 자료를 가지고 옵니다.

처리가 끝나면 뷰단(JSP)으로 넘어갑니다.

실질적으로 DAO 독립적입니다. 따로처리합니다.

어쩔수없이 JSP와 서블릿은 종속적입니다.

 

DTO (VO, DO) - 수레(담아가지고 가는)

데이터베이스 테이블을 엠티티?

DO객체

 

서블렛하고 DB를 연결해주는 DAO

데이터전송한다. DTO VO -DO 라고한다.

DTO 데이터 트랜스퍼 오브젝트 - 읽기 쓰끼

 

 

member DTO

v필드  겟터 셋터만 가지고 있는걸 DTO

 

VO - 읽기만

DO - 넓은 범위/ 데이터오브젝트

DB테이블구성, 엔티티객체와 연결해주는 것

엔티티클래스, 디오클래스

 

DTO와 DAO(실제 DB넘겨주는 처리하는 액세스,데이터처리하는 오브젝트)

DAO-모델 - 오직 컨트롤러와 DB만 연결

MVC는 즉 모델과 뷰와 컨트롤러 를 분리하고 처리하는 것을 의미합니다.

DAO 철로(연결,

DTO 수레(전달,

 

   

View  : 화면 구성을 담당,

   EL,jstl을 사용해 컨트롤러로 부터 전달된 데이터의 출력과

   html/css 등을 통해 화면 디자인을 처리

   뷰는 기본적으로 모델/컨트롤러와 종속성이 없도록 구현

   주어진 데이터를 출력하는 용도로만 사용하는 것이 바람직

   뷰 영역의 구현을 위해 뷰템플릿 엔진(타임리프, 프리마커,...)이 사용되며 jsp 역시 이러한 뷰 템플릿 엔진 중 하나

 

Controller : MVC 패턴의 핵심,  모든 사용자 요청의 중심에 위치 

핵심사령탑, 중간 지도역할

(JSP(대규모에선 권장x),서블릿,으로 사용)

 

      사용자 요청은 특정 뷰에 바로 전달되지 않고 컨트롤러를 통해야 하며, 컨트롤러는 사용자 요청에 따라

      모델을 통해 데이터베이스와 연동하여 데이터를 처리하고 뷰에 전달

      컨트롤러의 구현은 Servlet 또는 jsp 모두 가능하며, 

      ★되도록이면 Servlet 기반의 구현을 권장

      (사용자 요청이 들어오면 사용자 요청에 따라 모델을 이용해 데이터베이스 연동을 처리하고 뷰에 전달)

 

#

JSP로 구성만한다면 통이다. 유지보수가 좀 어려울수있습니다.

 

#

JSTL,EL 이 웹디자이너들이 잘모른다.

그래서 타임리프를 써서 디자이너들과 소통이 원활합니다.

 

#

컨트롤러 - 스프링 프레임워크




모델1

   JSP로만 구현한 웹 애플리케이션

   웹 브라우저의 요청을 JSP페이지가 받아서 처리하는 구조

 

모델2

   클라이언트의 요청 처리, 응답 처리, 비즈니스 로직 처리 부분을 모듈화한 구조

   컨트롤러 : Servlet

   뷰 : JSP

   모델 






=============================================

<컨트롤러 구현하는 세 가지 방법>

 

1. 사용자(Client) 각각의 요청마다 컨트롤러를 만들기 -> URL 요청 처리

2. 특정 모듈 단위로 하나의 컨트롤러 안에서 여러 요청 단위를 구분해서 처리하기

3. 프런트 컨트롤러를 따로 두어 모든 요청을 하나의 컨트롤러로 모은 다음 요청에

   따라 구현 컨트롤러를 호출하기

 

#컨트롤러

1.

2.if 나 switch 사용하면 유지보수가 불편할수가있습니다.

3. ex) .do 



<컨트롤러의 기본 기능 세가지>

1. client 요청 처리

2. 입력값 핸들링

3. 뷰 이동

   1) 데이터를 포함하지 않는 경우

      사용자 요청 처리 후 별로의 데이터를 포함하지 않는다면 해당 페이지로

      redirect 

      response.sendRedirect("이동할 페이지") // userInfo.jsp

   2) 데이터를 포함하는 경우

      request 속성으로 데이터를 넣은 후 원하는 페이지로 forwarding 해야 함

      데이터 활용 목적에 따라 session이나 application을 사용할 수도 있음

      . jsp의 경우

           <%

         request.setAttribute("변수", 값);  >> ex)  request.setAttribute("member", member); 

         pageContext.forwared("이동할 페이지");  // userInfo.jsp

            %>

      . servlet의 경우

         request.setAttribute("변수", 값);

         RequestDispatcher dispacher = request.getRequestDispatcher("이동할 페이지");

         dispacher.forward(request, response);

 

      . 스프링 프레임워크의 경우

         @GetMappling("info")   //urlMapping이름

         public String getMemberInfo(int id, Model model){

            ....

            model.addAttribute("member",m);   // 변수, 값

            return "userInfo";  //이동할 페이지 

         }








shopApp20240305 프로젝트 생성(xml 체크)



src/main/webapp - css,html,js(자바스크립트,j쿼리),image,JSP =>뷰단





라이브러리에 넣기 3개(DB연결 1개, JSTL사용하기위한것들2개)

C:\Program Files (x86)\MySQL\Connector J 8.0  => DB연결 1개




톰캣에서 다운로드(JSTL사용하기위한것들2개)



Connector J 8.0 빌드패스해주기



서블렛 생성



생명주기

 

서블릿 컨테이너 

: 사용자의 요청이 들어오면, HTTP서블렛 객체 생성 후

메모리있는지 없는지, 체크 

 

-init 메소드 : 서블릿 초기화시키는 담당, 딱한번만 실행, 생략가능

URL매핑 : 을 통해서 서블릿을 실행합니다.

 

서블릿컨테이너가 메모리에 있는지, 유무 확인, 

없다면, 

init 초기화 

 

-destroy : 서블릿이 종료할때 실행,  딱 한번만 실행

서블릿의 변동이 있다면, init, destroy가 실행된다고 보면됩니다.

요청이 들어오면 쓰레드를 만든다. 여기있는 서비스를 호출

 

-service(요청/응답)

서비스가 핵심, 메소드를 서비스메소드 요청이 실행되면, 

doget , dopost를 결정한다. 쓰레드들이, 서비스를 호출합니다.

 

이처리가 끝나면, 

init servelet후 destroy나옵니다.



즉,

어떤요청 서블릿 초기화 시키고

메모리 잇으면 초기화x

없다면 초기화 o

초기화후 각각의 요청후 서비스가 실행

dopost, doget 처리, 쓰레드는 여러개

서비스로 응답 후,  destroy들어와서 종료



#서블릿의 생명주기

init -초기화

service - 응답 요청

- doget

-dopost

destroy - -종료



put - 

get -read

post - create

delete - 




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이거를 대신해주는 것이 어노테이션입니다. 밑의그림

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

제품 목록 리스트 상세, 삭제, 수정을 이용한 페이지 출력

 

Model : (DTO/DAO)

Product.java, ProductService.java

 

View : productList.jsp(제품전체리스트 - jsp라 대문자로 사용x

productInfo.jsp(개별 상품 상세 정보)

 

Controller : ProductController.java

 

제품 전체 리스트 : findAll(), productList.jsp

      ProductService.java

        




package producttest

Product 

●ProductController

●ProductService

●productInfo.jsp

●productList.jsp

컨트롤러 : 

모델 : 

view : 

 

컨트롤러와 모델이 주고받고

컨트롤러가 뷰에 쏴줍니다.



●생성

ProductController생성




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

 

 

 







#

EL이나 스크립틀 을 간편하게 해주는것이 JSTL입니다.

자주활용하세요`



●Product

 

package producttest;

import java.util.Objects;

//DTO 역할 - DB와 연결한다면,(수레역할, 처리x 처리는 DAO)

// 접속 sql작성, 전송 -> DTO

// 처리 -> DAO

// 1)필드

// 2)생성자

// 3)겟터셋터

public class Product {

private String id; // 과일의 상품번호

private String name; // 과일명

private int price; // 가격

private String date; // 입고일

//생성자 - 기본 생성자

public Product(String id, String name, int price, String date) {

super();

this.id = id;

this.name = name;

this.price = price;

this.date = date;

}

 

//겟터 셋터

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getPrice() {

return price;

}

public void setPrice(int price) {

this.price = price;

}

public String getDate() {

return date;

}

public void setDate(String date) {

this.date = date;

}

 

//toString()

@Override

public String toString() {

return "Product [id=" + id + ", name=" + name + ", price=" + price + ", date=" + date + "]";

}

 

//equals와 hashcode 재정의( id만 비교하면 될것같습니다.)

@Override

public int hashCode() {

return Objects.hash(id);

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Product other = (Product) obj;

return Objects.equals(id, other.id);

}

 

}





●ProductController

 

package producttest;

 

import java.io.IOException;

import java.util.ArrayList;

 

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("/pcontrol")

public class ProductController extends HttpServlet {

private static final long serialVersionUID = 1L;

 

ProductService service; //참조주소를 받을수있게... 만들어놨습니다.

 

 

    public ProductController() {

        super();

        service = new ProductService(); // 객체 생성, 모든 사용자 요청에 대해 동일한 객체(=인스턴스)사용

        //service 오버라이드 되었습니다.

    }

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//클라이언트 요청 구분 -> 처리 메소드를 호출 -> 뷰로 이동하는 작업

//어디에다가 처리해줄지 그런 역할

 

String view = ""; //뷰 페이지를 담을 변수

String action = request.getParameter("action");

 

 

 

 

//action의 값이 null일 때도 있고 값이 null이 아닐 떄도 있음

 

//첫페이지, 아무것도 생성안되었을 때 실행 - if문보다 이후에 큰프로젝트 담당할때, 객체로 넘겨주면 좋습니다.

if(action == null) {

// null인 경우 자기 자신을 호출하도록, 뷰페이지 이동

// 뷰페이지로 이동 : response.sendRedirect("이동할 페이지") - 가져갈 데이터가 없을 때

// getServletContext().getRequestDispatcher("이동할 페이지").forward(request, response); - 가져갈 데이터가 있을 때,

 

/*

forward 액션 : 클라이언트 요청을 다른 페이지로 전환하는 액션태그

  클라이언트가 새롭게 접속하는 것이 아니라, 서버에서 내부적으로 

  새로운 페이지로 이동을 하고, 그 페이지의 내용을 클라이언트에게 

  응답으로 전달

  최초 request를 유지하거나 request의 setAttribute()로 속성값을 저장한 경우

  이를 유지하면서 페이지를 이동해야 하므로 forward가 적합

 

redirection : 서버가 클라이언트에게 새로운 페이지로 다시 접속하도록 응답을 보내고

  응답 받은 클라이언트가 다시 새로운 페이지로 접속하는 방식

  단순한 페이지 이동이 필요한 경우라면 리디렉션이 적합

  

 

 

*/

 

getServletContext().getRequestDispatcher("/pcontrol?action=list")

.forward(request, response);

//pcontrol?action=list

//pcontrol으로 가되, action에다가 리스트를 담아가지고 가라

 

//getServletContext() 프로젝트명

//getRequestDispatcher : 다른페이지로 이동해라

//pcontrol에 

//? : 변수를 넘겨줄때

// ?찍고 키값 밸류값

//forward(request, response) 가지고

 

 

//두번째

}else {

//action이 null이 아닌 경우,

 

switch(action) {

case "list" : view = list(request, response); break;

case "info" : view = info(request, response); break;

case "delete" : view = delete(request, response); break;

case "send" : view = "sendTest.jsp"; break;

 

 

}

 

//뷰 페이지로 이동

 

getServletContext().getRequestDispatcher("/" + view)

.forward(request, response);

 

 

 

 

 

}

 

 

}//end of service

 

 

public String list(HttpServletRequest request, HttpServletResponse response) {

//products에다가 리퀘스트 셋으로 객체를 생성한것

request.setAttribute("products", service.findAll()); //service.findAll()이라는 통째를 products에 담는다.

return "productList.jsp"; //findAll() 열어보면, return new ArrayList<Product>(products.values()); 이렇게 되어있습니다.

//setAttribute 새로운 속성을 만들어라.

}

 

public String info(HttpServletRequest request, HttpServletResponse response) {

//p에다가 리퀘스트 셋이라는 객체를 생성한것

request.setAttribute("pro", service.find(request.getParameter("id"))); //service.find(request.getParameter("id"))이라는 통째를 p에 담는다.

return "productInfo.jsp"; //service.find()열어보면, return products.get(id); 여

//setAttribute 새로운 속성을 만들어라.

}

 

public String delete(HttpServletRequest request, HttpServletResponse response) {

//products에다가 리퀘스트 셋으로 객체를 생성한것

request.setAttribute("products", service.delete(request.getParameter("id")));

return "productList.jsp";

//setAttribute 새로운 속성을 만들어라.

}

 

 

 

 

 

 

}








●ProductService




package producttest;

 

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

//db에 연동한다면 - DAO(철도)

//지금은 DB연결 없이 객체를 생성할 샘플 데이터를 만들 예정

//Map 형태로 메모리에 저장하고 사용



// Controller에게 전체상품목록과 개별 상품정보, 삭제 정보, 갱신 정보를

// 제공하기 위한 서비스 클래스 

 

public class ProductService {

 

//map은 키와 밸류로 구성

//키 유일, 밸류 중복되도 됩니다.

 

//맵객체.put(키,value값)  삽입 들어갑니다.

 

 

Map<String, Product> products = new HashMap<>(); 

//<>제네릭타입 

//키 : id값

//벨류 : Product

 

//products는 이객체의 주소

 

 

//#생성자(초기화담당) - 제품 리스트 만들기(전체목록)

public ProductService() {  

 

products.put("101", new Product("101", "사과", 5000, "2024-03-01"));

products.put("102", new Product("102", "딸기", 1500, "2024-03-01"));

products.put("103", new Product("103", "복숭아", 2000, "2024-03-03"));

products.put("104", new Product("104", "오렌지", 1300, "2024-03-03"));

products.put("105", new Product("105", "천혜향", 2500, "2024-03-05"));

products.put("106", new Product("106", "바나나", 2000, "2024-03-05"));

 

 

}

 

// 제품 목록 리스트 - findAll(), productList.jsp

public List<Product> findAll() { //여러개

return new ArrayList<Product>(products.values());

}

 

// 개별 상품 상세정보 : find(찾는 항목에 대한 값), productInfo.jsp

public Product find(String id) { //한개

return products.get(id);

}

 

 

// 삭제 : delete(삭제할 항목) - 삭제후 목록 전체목록을 보여줍니다. productList.jsp

public List<Product> delete(String id) { //여러개

products.remove(id); // id를 키로 사용, id에 해당하는 자료 삭제

return new ArrayList<Product>(products.values());

}

 

 

 

 

// 수정 : update(수정할 항목) , productInfo.jsp

 

 

 

 

 

 

 

 

 

 

 

 

}





●productInfo.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">

<title>Insert title here</title>

<style>

  th{

     width: 120px;

     height: 40px;

     line-height: 40px;

     background-color: blue;

     color:white;

  }

 

  td{

    height: 40px;

    line-height: 40px;

    text-align: center;

  }

 

  td:nth-child(2n) {

     background-color: pink;

  }

  h1{

     width:640px;

     text-align: center;

  }

</style>

</head>

<body>

<h1>${pro.name} 상품 상세 정보</h1> <!-- 인포 키값으로 넘겨받았습니다. 하나를 넘겨받았습니다. -->

   <hr>

  <br>

  <table border="1">

     <tr>

        <th>상품번호</th>

        <th>상 품 명</th>

        <th>상품가격</th>

        <th>입 고 일</th>

     </tr>

 

     <tr>

         <td>${pro.id}</td>

         <td>${pro.name}</td>

         <td>${pro.price}</td>

         <td>${pro.date}</td>

     </tr>

  </table>

</body>

</html>



●productList.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">

<title>Insert title here</title>

<style>

  th{

     width: 120px;

     height: 40px;

     line-height: 40px;

     background-color: blue;

     color:white;

  }

 

  td{

    height: 40px;

    line-height: 40px;

    text-align: center;

  }

 

  td:nth-child(2n) {

     background-color: pink;

  }

  th:nth-child(6) {

     width:280px;  

  }

h1{

  width:640px;

  text-align: center;

}

</style>

</head>

<body>

  <h1>전체 상품 목록</h1>

  <hr>

  <br>

  <table border="1">

     <tr>

        <th>일련번호</th>

        <th>상품번호</th>

        <th>상 품 명</th>

        <th>상품가격</th>

        <th>입 고 일</th>

        <th>작업선택</th>

     </tr>

 

     <c:forEach var="p" varStatus="i" items="${products}">

     <!--

   

     var = 임의로 설정

     varStatus이라는 것은 카운트

     products라는 request값을 ${products} 가져온것입니다.

    

   

     -->

     <tr>

         <td>${i.count}</td> <!--  index와 count -->

         <td>${p.id}</td>

         <td>${p.name}</td>

         <td>${p.price}</td>

         <td>${p.date}</td>

        <td>

           <a href="/shopApp20240305/pcontrol?action=info&id=${p.id}">상세</a>&nbsp;&nbsp;&nbsp;

           <a href="/shopApp20240305/pcontrol?action=delete&id=${p.id}">삭제</a>&nbsp;&nbsp;&nbsp;

           <a href="/shopApp20240305/pcontrol?action=send">send</a>&nbsp;&nbsp;&nbsp;

        </td>

 

     </tr>

     </c:forEach>

  </table>

</body>

</html>



●sendTest.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>

<h1>send 테스트 페이지</h1>

 

</body>

</html>






































'5.JDBC > 2)JDBC_개념' 카테고리의 다른 글

JDBC_개념_Day_13  (0) 2024.03.07
JDBC_개념_Day_12  (1) 2024.03.07
JDBC_개념_Day_10  (0) 2024.03.04
JDBC_개념_Day_09  (0) 2024.03.02
JDBC_개념_Day_08  (0) 2024.03.02