-
JSP-MySQL,게시물등록(jsp버전)JAVA 2021. 7. 24. 23:48
- JSP구조
지시자 태그 + HTML + 스크립트 태그 + 액션 태그
- JSP 모델구조
모델1 -> 모델2 -> 최종모델: Spring MVC
여러 과도기를 거쳐서 최종모델.
- Eclipse의 workspace가 과부화되서 잘 안될 경우
1. 안쓰는 project는 close project로 놓는다(그럼 자바에서 데이터를 띄워놓을 필요가 없어 가벼워진다)
2. 그래도 안될 경우 workspace를 새로하나 만들고 기존껄 import로 가져온다.
게시물 등록
0. JDBC API를 만든 동적Project에 'WEB-INF폴더 -> lib폴더' 아래에 복사해 넣기!(저번에 했던 내용)
1. 게시물등록준비.jsp: title(제목), contants(내용)을 클라이언트에게 입력받아서 게시물등록.jsp에 넘긴다.
2. 게시물등록: 넘어온 데이터를 db에 저장시킨다.
화면에서 등록하여 서버로 넘어가는데 화면과 서버의 접점을 인터페이스이다.
화면을 보통 GUI라고 부르는데 여기서 I가 interface이다.(서로 상호작용)
>> db.spl
drop database if exists board1_1; create database board1_1; use board1_1; create table 게시물 ( 번호 int primary key auto_increment, 제목 varchar(50) not null, 내용 varchar(200) null, 작성일 timestamp default current_timestamp, 조회수 int default 0 );
>> 게시물등록준비.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> <center> <h1>게시물등록 제목</h1> <form action="게시물등록.jsp" method="post"> 제목<input type="text" name="title" maxlength="50"> <br> 내용<textarea col1=10 rows=10 name="contents"></textarea> <input type="submit" value="등록"> </form> </center> </body> </html>
게시물 등록에서 넘어온 자료
서버는 Client가 데이터를 입력하며 요청할 경우
Client의 주소(IP,Port) 정보, 데이터등을 알 수 있다(그래야 응답할 것을 넘길테니까)
자바파일은 컴파일을 하는데 이 대상을 scr폴더에서 찾는다.
그렇기 때문에 자바파일을 src아래에 패키지를 만들어 넣는것이다.
1. 자바파일로 할 일
: 자바는 객체지향이지만, 브라우저들은 당연히 아니기때문에 그저 String으로 받아야한다.
하지만 자바는 역시 객체지향이기때문에 결과물은 객체를 만들어 완성품을 만든다.
마치 모든 부품은 수입으로 가져오고, 국내에서 완성품을 만드는 느낌?
(브라우저에서는 그냥 부품을 주고, 자바에서는 객체완성품을 넘긴다.)
1) board1 프로젝트 아래에 Java Resources 의 src폴더에 패키지 하나를 만든다.
: 이제 자바파일을 만드는데 역할은 SQL의 데이터타입과 호환이 안되니 varchar는 String 이런식으로 가져오게 할 것이다
(반대상황도 가능하다 = 상호호환 가능)
JPA(JAVA Persistence API)
: 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
: Persistence(지속성): JPA의 아주 중요한 개념인데 다른 프로그램들과 달리 DB는 그 정보들이 지속성을 띄고 있어 오래 보관한다는 의미이다.
UML 설계 => 객체다이어그램
너무 추상적인 객체를 UML설계를 통해 객체를 사각형(다이어그램)으로 표현하기로 했다.
객체 상자안에 변수들과 변수값들이 있는 것이다.
VO(Value Object)
딱히 특별한 기능을 하는 메서드가 없고 값(value)만 가지고 있는 객체
>> 게시물.java(VO)
package boardmanage; import java.sql.Date; public class 게시물 { private int 번호; private String 제목; private String 내용; private Date 작성일; //Date는 java.sql 패키지에 있는 클래스로!! private int 조회수; public int get번호() { return 번호; } public void set번호(int 번호) { this.번호 = 번호; } public String get제목() { return 제목; } public void set제목(String 제목) { this.제목 = 제목; } public String get내용() { return 내용; } public void set내용(String 내용) { this.내용 = 내용; } public Date get작성일() { return 작성일; } public void set작성일(Date 작성일) { this.작성일 = 작성일; } public int get조회수() { return 조회수; } public void set조회수(int 조회수) { this.조회수 = 조회수; } }
2. 받은 자료를 게시물등록.jsp 에서( = 서버에서) 할 일
1) 데이터 받기
: 위에서 만든 객체로 받아보자.
2) 업무규칙 검사(입력한 내용중 검렬할게 있는지)
3) DB에 저장
: 저번 방법은 사실 객체지향을 모르는 상투적인 코드이다.
넘어온 값을 저장한 객체로 DB에 저장하자!(앞으로 배울 Spring에 관련있다.)
4) 결과통보
: Client가 아무 문구가 없으면 잘 된건지 알 수 없어 답답하다.
그래서 결과통보 HTML을 보낸다.
>> 게시물등록.jsp (UTF-8 대문자로 안쓰면 오류난다)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <%@ page import="boardmanage.게시물" %> <% request.setCharacterEncoding("UTF-8"); // 1. 넘긴 데이터 받기 //private으로 멤버를 가진 객체의 get,set메서드로 값을 다루는 이유: 부품을 가져오는 상황은 항상 잘 안보이게 숨기는게 좋다. String 제목 = request.getParameter("title"); String 내용 = request.getParameter("contents"); 게시물 완제품 = new 게시물(); 완제품.set제목(제목); 완제품.set내용(내용); // 2. 업무규칙 검사(입력한 내용중 검렬할게 있는지) // 했다 치고 // 3. DB에 저장 try { // DB연결관리객체: Connection, 명령전달객체: Statement, 질의결과관리객체: ResultSet // 0) 드라이버로드. 다운받은 mysql-library에 있는 Driver가져오면 된다. Class.forName("com.mysql.cj.jdbc.Driver"); // 1) 드라이버관리자를 통해 DB연결자를 얻는다. Connection DB연결관리자 = DriverManager.getConnection("jdbc:mysql://localhost:3306/board1_1?useUnicode=true", "root", "1234"); // 2) DB연결관리자 통해 명령전달자를 얻는다. Statement 명령전달자 = DB연결관리자.createStatement(); System.out.println("연결 성공"); // 3) 명령하기 String 삽입SQL = "insert into 게시물(제목,내용) values('" + 완제품.get제목() + "','" + 완제품.get내용() + "');"; 명령전달자.executeUpdate(삽입SQL); // 명령전달자가 보낸다. // 4) 연결끊기 DB연결관리자.close(); } catch (Exception e) { e.printStackTrace(); } %> <%-- 4. 결과통보 --%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <%= 완제품.get제목() %>: 게시물 등록 완료 </body> </html>
3. 게시물 목록출력하기
ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);
명령전달자가 질의를 실행해 가져온 표를 ResultSet이 받아온다.
insert into, delete from , update-set 들은 표가 바뀐다(UPDATE)
select-from은 표가 바뀌는것이 아니라 내가 물어본 질의(Query)에 표로 결과를 주는 것이다.
Query라는 건 질의로 그 결과로 나온 표를 ResultSet (Set은 Collection같이 생각하고, Result는 결과로 나온 값이라고 생각하자)
에 담는다.
그리고 표에 담긴 ResultSet을 next()시켜(줄 내보내고 삭제되며 , 더이상 내보낼줄이 없으면 false)
다음행들을 가져오고
getString("열이름")으로 해당 열의 값을 String으로 가져온다.
>> App.java
public class App { public static void 목록출력하다() { try { // DB연결관리객체: Connection, 명령전달객체: Statement, 질의결과관리객체: ResultSet // 0. 드라이버로드. 다운받은 mysql-library에 있는 Driver가져오면 된다. Class.forName("com.mysql.cj.jdbc.Driver"); // 1. 드라이버관리자를 통해 DB연결자를 얻는다.(이미 연결된 상태로) Connection DB연결관리자 = DriverManager.getConnection("jdbc:mysql://localhost:3306/board1_1?useUnicode=true", "root", "1234"); // 2. DB연결관리자 통해 명령전달자를 얻는다. Statement 명령전달자 = DB연결관리자.createStatement(); System.out.println("연결 성공"); // 3. 명령하기 String 수집SQL = "select * from 게시물;"; ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL); while(수집된표관리자.next()) {//다음 줄로(행으로) System.out.println(수집된표관리자.getString("제목"));//현재줄의 제목열값을 java String형으로 바꿔서 줄래 System.out.println(수집된표관리자.getString("내용")); } 수집된표관리자.close(); // 4. 연결끊기 // DB연결관리자야 연결 끊어 DB연결관리자.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { 목록출력하다(); } }
여기서 다시 정리하는 JDBC의 3대 객체
Connection: 연결
Statement: 명령
Resultset: 수집결과관리
'JAVA' 카테고리의 다른 글
게시물목록,상세보기,Paging(jsp버전) (0) 2021.07.25 게시물목록(jsp버전) (0) 2021.07.25 JDBC (0) 2021.07.24 JAVA와 DBMS연결하기-JDBC (0) 2021.07.24 HTTP,Tomcat이론,JSP:스크립트요소 (0) 2021.07.23