✍ Today I Learned
- JSP란(Java Server Pages)란? Java 언어를 기반으로 하는 Server Side 스크립트 언어를 의미한다. HTML 코드에 Java 코드를 넣어 동적인 웹 페이지를 생성하는 웹 애플리케이션 도구이다.
- JSP를 실행시키기 위한 Servlet 엔진이 필요하다.
- 서블릿(Servlet)이란? 클라이언트의 요청을 받고 요청을 처리하여 결과를 클라이언트에게 제공하는 Java 인터페이스이다. 간단한 메서드 호출만으로 웹 요청과 응답의 흐름을 체계적으로 다룰 수 있는 기술이다.
- 톰캣(Tomcat)이란? JSP와 Servlet을 구동하기 위한 서블릿 컨테이너이자 웹 서버이다. Java EE 기반으로 만들어졌다. (Port:8080 → 8088)
- 브라우저와 자바 애플리케이션을 연결하기 위해 서블릿을 웹 서버에 장착한다. 그게 바로 웹 애플리케이션 서버(Web Application Server)이다.
서블릿은 자바 클래스로 웹 애플리케이션을 작성한 뒤 이후 웹 서버 안에 있는 웹 컨테이너에서 이것을 실행하고, 웹 컨테이너에서는 서블릿 인스턴스를 생성 후 서버에서 실행되다가 웹 브라우저에서 서버에 요청(Request)을 하면 요청에 맞는 동작을 수행하고 웹 브라우저에 HTTP형식으로 응답(Response)합니다.
(출처:https://coding-factory.tistory.com/742)
- 톰캣 8.0.53 버전을 다운로드하여 Java EE perspective로 변경한 후 Servers 탭에서 톰캣을 등록하고, Dynamic Web Project를 생성하였다.
- 데이터베이스와 연결하기 위해 Connector/J의 Path를 설정해주어야 하는데 webapp > lib 폴더에 Connector/J jar 파일을 이동시키기만 해도 이클립스가 자동으로 Path 설정을 해준다.
- .java 파일은 main > java에 위치시키고, .jsp 파일은 main > webapp에 위치시킨다.
- webapp > WEB-INF > web.xml 파일에서 초기 설정을 진행한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>01_jsp_first_mysql</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ProductController</servlet-name>
<servlet-class>controller.ProductController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProductController</servlet-name>
<url-pattern>*.pd</url-pattern>
</servlet-mapping>
</web-app>
- index.jsp를 welcome-file로 지정하고, .pd 패턴으로 들어오는 모든 서블릿 주소는 ProductController로 매핑시킨다. ProductController 객체에 servlet의 역할을 맡기겠다는 의미이다.
- 이 모든 내용은 Servers > Tomcat v8.0 Server at localhost-config > web.xml 파일에 정의되어 있다.
- ProductController에 HttpServlet를 extends 하면, HttpServlet(톰캣 소속) 객체의 메서드를 이용하여 데이터를 주고받을 수 있다. 그중 service, doGet, doPost 메서드를 오버 라이딩한다.
private static final long serialVersionUID = 1L;
ProductController를 static 영역에 생성하여 인스턴스를 생성하지 않고도 사용할 수 있도록 해준다.- index.jsp를 생성하고 기존에 만들어둔 Product System을 controller(controller), domain(VO), orm(DatabaseConnector), repository(DAO), service(service)의 구조로 배치한다. 여기서 orm은 Object Relational Mapping을 의미한다.
- HTML에서 시작하기 때문에 main은 필요하지 않다.
- 데이터 전달 과정에서 반드시 알아야 할 3가지
- 요청 데이터 주소 URL
- 데이터가 무엇인지, 어떤 데이터 타입인지(string이 아닌 것도 있음)
- (string이 아닐 때) 어떻게 처리할 것인지
- 모든 주소체계를 .pd로 설정하여 ProductController를 거치도록 해주었다.
- ProductController의 service 메서드 내에서 utf-8로 인코딩해주고, 요청되는 경로를 if/else문으로 분기 처리하였다.
- RequestDispatcher를 이용하여 이동 페이지를 세팅한다.
- 각 실행문에서 CRUD 기능의 메서드를 호출하여 데이터를 관리한다. 이때 jsp와의 데이터 전달은
getParameter()
,setAttribute()
,getAttribute()
메서드를 이용하는데, 전달된 데이터의 데이터 타입은 string임을 주의하자. - jsp에서 Java 코드를 입력할 때는
<% %>
기호를 이용한다.
Registr(insert)
- register.jsp에서 form 태그로 유저에게 데이터를 입력받고, action 값을 "./insert.pd"로, method 값을 "post"로 설정한다.
- 입력받은 데이터를 ProductController에서
getParameter()
로 전달받고 ProductService 객체의 메서드를 호출하여 데이터베이스에 데이터를 저장한다.
List(select)
- ProductController에서 list.jsp로 destPage와, 데이터베이스에서 가져온 전체 리스트를
setAttribute()
메서드를 이용하여 전달한다. - 전달받은 데이터를 list.jsp에서
getAttribute()
메서드를 이용하여 list 변수에 담고 반복문을 돌려 화면에 출력한다.
Detail(select one)
- list의 name 부분에 각 detail의 링크를 건다. 이때, "./detail.pd"의 쿼리 스트링으로 pno를 함께 전달한다.
<td><a href="./detail.pd?pno=<%=pvo.getPno() %>"><%=pvo.getPname() %></a></td>
- ProductController에서 detail.jsp로 destPage와, 데이터베이스에서 가져온 특정 리스트를 setAttribute() 메서드를 이용하여 전달한다.
- 전달받은 데이터를 detail.jsp에서
getAttribute()
메서드를 이용하여 pvo 변수에 담고 화면에 출력한다.
Edit(update)
- detail.jsp 하단에 Product Modify 버튼을 만들어 수정할 수 있는 페이지("./edit.jsp")로 이동시킨다.
- edit.jsp로 이동하면서 detail의 데이터를 가져와 input 태그로 출력하고 수정된 내용은 action 값 "./modify.pd"로 전달한다.
- 이때 pno는 수정하면 안 되기 때문에 input 태그로 바꾸지 않았는데 데이터를 전달하기 위해 input type hidden을 이용하여 form 태그 안쪽에 pno를 작성한다.
- 수정된 데이터를 ProductController에서
getParameter()
로 전달받고 ProductService 객체의 메서드를 호출하여 데이터베이스에 데이터를 업데이트한다.
Remove(delete)
- edit과 마찬가지로 detail.jsp 하단에 Product Remove 버튼을 만들어 pno와 함께 전달하고, 전달받은 데이터를 데이터베이스에서 삭제한 후 "/index.jsp"로 이동시킨다.
'📝 TIL' 카테고리의 다른 글
[TIL] MySQL 내장함수, GROUP BY, HAVING (0) | 2022.06.02 |
---|---|
[TIL] MySQL, DBeaver, SELECT, WHERE, ORDER BY (0) | 2022.05.31 |
[TIL] Java 주소록, 상품관리, 호텔관리 시스템 (0) | 2022.05.27 |
[TIL] Java Enum, MySQL 개발 환경 설정, JDBC (0) | 2022.05.26 |
[TIL] Java ArrayList, HashSet, HashMap, Generic (0) | 2022.05.24 |