일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- dfs
- scanner
- set
- Java
- CSS
- alter
- BFS
- map
- date
- Properties
- 큐
- union_find
- NIO
- javascript
- 리소스모니터링
- sql
- math
- priority_queue
- html
- 힙덤프
- Calendar
- spring boot
- Union-find
- deque
- GC로그수집
- string
- List
- 스택
- 스프링부트
- JPA
- Today
- Total
매일 조금씩
12/28 - JSP(6) : JSP 기본객체, model1기법으로 게시판 만들기 본문
BasicEx01
p114
기본 객체와 영역
기본 객체 - 인스턴스(객체) 변수화된 클래스
중요 기본객체는 다음과 같다.
- request : 클라이언트의 요청정보를 저장한다.
- response : 응답 정보를 저장한다.
- out : JSP 페이지가 생성하는 결과를 출력할 때 사용하는 출력 스트림이다.
- session : HTTP 세션 정보를 저장한다.
- application : 웹 어플리케이션에 대한 정보를 저장한다.
추가 기본객체는 다음과 같다.
- pageContext : JSP 페이지에 대한 정보를 저장한다.
- page : JSP 페이지를 구현한 자바 클래스 인스턴스이다.
- config : JSP 페이지에 대한 설정 정보를 저장한다.
- exception : 익셉션 객체이다. 에러 페이지에서만 사용한다.
* tomcat (java se - ee)
1. request
javax.servlet.http.HttpServletRequest
setCharacterEncoding
getParameter
getRemoteAddr
88p
getHeaderNames()
getHeader()
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 헤더정보(숨겨진 정보) -->
<%
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
String name = (String)e.nextElement();
String value = request.getHeader(name);
out.println(name + ":" + value + "<br />");
}
%>
</body>
</html>
(user-agent 정보는 브라우저에 따라서 다달라짐)
2. response
javax.servlet.http.HttpServleResponse
▷p90
redirect - 자동이동
js
location.href = "파일명";
jsp
response.sendRedirect("파일명"); // location.href 랑 같음
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.sendRedirect("https://www.daum.net");
%>
▷p95 인코딩 => % 글자
java.net.URLEncoder
java.net.URLDecoder
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String msg = "Hello 안녕";
String encodeMsg = URLEncoder.encode(msg, "utf-8");
out.println(encodeMsg + "<br />");
String decodeMsg = URLEncoder.encode(encodeMsg,"utf-8");
out.println(decodeMsg + "<br />");
%>
</body>
</html>
3. out
javax.servlet.http.JspWriter
▷p115
print() / println() / newLine() - 엔터
1) jsp에서 서블릿을 만들고 출력은 out을 사용하는데 그 출력이 바로 클라이언트로 가는게 아니고
buffer에 누적을 했다가 거기서 완료가 되면 클라이언트로 넘어간다.
버퍼사용은 위 세가지 장점을 가진다.
2) 표현식 / 스크립틀릿
<% if(grade > 10) { %>
<%= gradeStringA %>
<% } else if(grade > 10) {%>
<%= gradeStringB %>
<% } %>
<% (위 방식 말고 아래 방식처럼 java / html 분리하는 방식으로 써야 에러가 적다)
if (grade >10){
out.println(gradeStringA);
} else if(grade > 5){
out.println(gradeStringB);
}
%>
3) 출력버퍼 조절
- 디렉티브에서 설정
out01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" buffer="4kb" autoFlush="true"%>
<%
// buffer="버퍼크기" 로 버퍼 크기 조절
// autoFlush = 버퍼 다차기 전에 클라이언트에 보내서 비우기 (다차면 에러걸림)
// 8kb
out.println(out.getBufferSize() + "<br />");
out.println(out.getRemaining() + "<br />");
out.println(out.isAutoFlush() + "<br />");
%>
out02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page buffer="1kb" autoFlush="true" %>
<%
out.println("버퍼 크기 : " + out.getBufferSize() + "<br />");
out.println("버퍼 크기 : " + out.getRemaining() + "<br />");
for(int i=1; i<=1000; i++){
out.println(i+"Hello JSP<br />");
if(i % 200 == 0){
out.println("버퍼 남은 크기 : " + out.getRemaining() + "<br />");
}
}
%>
- out객체에서 설정
out03.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
out.println("버퍼 크기 : " + out.getBufferSize() + "<br />");
out.println("버퍼 크기 : " + out.getRemaining() + "<br />");
out.println("1<br />");
out.println("2<br />");
out.println("3<br />");
out.clearBuffer(); // 이전 출력내용 출력안됨
out.println("버퍼 남은 크기 : " + out.getRemaining() + "<br />");
out.println("4<br />");
out.println("5<br />");
out.println("6<br />");
out.flush();
out.println("버퍼 남은 크기 : " + out.getRemaining() + "<br />");
out.println("7<br />");
out.println("8<br />");
out.close();
out.println("9<br />");
out.println("10<br />");
%>
4. session
javax.servlet.http.HttpSession
5. application
javax.servlet.http.ServletContext
6. pageContext
pageContext01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
out.println("Hello JSP<br />");
JspWriter writer = pageContext.getOut();
// getRequest()
// getResponse()
// writer = out 같은 개념이다.
out.println(out + "<br />");
out.println(writer + "<br />");
writer.println("Hello JSP<br />");
%>
99p 그림 중요!
1. jsp에 해당하는 서블릿이 존재하지 않을 경우
2. jsp에 해당하는 서블릿이 존재하는 경우
이 두가지 과정 구분하기
위 두가지 과정은 아래 두경우일때의 결과가 다르다.
1) eclipse 로 tomcat을 돌리기
2) tomcat 혼자 돌리기
eclipse로 tomcat돌리기
1. 소스
C:\Java\java\jsp-workspace\프로젝트명
2. 내부경로 복사(추가)
C:\Java\java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\프로젝트명
3. 자바, 클래스
C:\Java\java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\프로젝트명\org\apache\jsp
이클립스에서 이상한 결과가 나오면 동기화가 안된 경우를 생각해야한다.
1,2번이 동기화가 안된 경우가 있기 때문이다.
JSP 액션 태그
▷p155
Java에는 액션 태그라고 불리는 JSP 전용 태그가 있다.
HTML 같은 태그인데 서버에서 해석되는 태그이다.
<jsp:기능태그> </jsp:기능태그>
1. <jsp:include> 액션 태그를 이용한 공통 영역 작성
외부파일 포함 = include
반복되는 코드가 있으면 이걸 메서드화하는데 이 메서드를 페이지화 한것을 include라고 한다.
브라우저에서 페이지소스보기 하면 안나오고 그 코드가 나옴
C:\Java\java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\BasicEx01\org\apache\jsp
위주소로 가서 보면 파일이 class와 java 파일 두개로 나누어 저장된 것을 볼수 있다.
값을 전달 하려면 include 하는 곳(include01.jsp)에서 <% %>로 선언, 초기화 하고,
sub.jsp에서 부르면 안됨!
include01.jsp에 아래처럼 쓰고
<jsp:include page="./sub.jsp">
<jsp:param name="data" value="data"/>
</jsp:include>
sub.jsp에서 request.getParameter로 받아야한다.
<%
String data = request.getParameter("data");
out.println("Hello sub.jsp<br />");
out.println("data : " + data);
%>
include01.jsp 에서 데이터를 선언해서 쓰는것도 가능하긴 하다.
<%
String data="value";
%>
<jsp:include page="./sub.jsp">
<jsp:param name="data" value="<%=data %>"/>
<jsp:param name="data2" value="data2"/>
</jsp:include>
2. include 디렉티브를 이용한 공통 영역 작성
include02.jsp
<%
String data1 = "value1";
%>
<%@ include file="sub02.jsp" %>
sub02.jsp
<%
out.println("Hello sub.jsp<br />");
out.println("data1 : " + data1);
%>
이렇게 하면 sub02에서 data1부분에 에러가 뜨는데 실행은 잘만 된다.
include 디렉티브에 sub02.jsp파일의 위코드가 그대로 들어가는거라고 볼수 있기 때문이다.
(파일명을 sub02.jspf로 확장자명을 바꿔주면 에러안남)
▷p177
*** 두가지 방법의 차이
<jsp:include>
디자인 모듈(nav bar같은거)
<%@ page include>
프로그램 모듈(코드에서 공통되는 부분) + 간단한 디자인
( 파일명을 sub02.jspf로 확장자명을 바꿔주면 에러안남 )
3. <jsp:forward> 액션 태그를 이용한 JSP 페이지 이동
실습1) sub03.jsp로 페이지 이동
forward01.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>
시작<br />
<jsp:forward page="sub03.jsp"></jsp:forward>
끝 <br />
</body>
</html>
sub03.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>
sub03.jsp
</body>
</html>
위 결과처럼 url은 forward01.jsp인데 결과는 sub03.jsp이다.
실행은 시키는데 forward결과는 다 날려버리고 sub03.jsp의 결과만 데려온다.
실습2) 같은 url에서 ?url로 여러가지 결과페이지 보여주기
forward02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String url = request.getParameter("url");
RequestDispatcher dispatcher=null;
if(url == null || url.equals("a")){
dispatcher = request.getRequestDispatcher("./forward/a.jsp");
}else{
dispatcher = request.getRequestDispatcher("./forward/b.jsp");
}
dispatcher.forward(request, response);
%>
같은 url인데 ?url= 를 사용해서 여러가지 결과 페이지를 보여줄수 있다.
자바빈과 <jsp:useBean> 액션 태그
▷p190
자바빈즈(콩)
(D)TO / VO
1. Java
2. 액션 태그
1. Java 코드를 이용하여 자바 객체 사용
BasicEx01> Java Resource > src > pack1> Member01.java
package pack1;
// Beans
public class MemberTO {
private String id;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
member_ok01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="pack1.MemberTO" %>
<%
MemberTO to = new MemberTO();
to.setId("test");
to.setPassword("1234");
out.println(to.getId() + "<br />");
out.println(to.getPassword() + "<br />");
%>
2. <jsp:useBean> 태그를 이용한 자바 객체 사용
실습1) hardcoding 사용 <jsp:useBean>
member_ok02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//MemberTO to = new MemberTO();
%>
<jsp:useBean id="to" class="pack1.MemberTO" />
<%
//to.setId("test");
//to.setPassword("1234");
%>
<jsp:setProperty name="to" property="id" value="test" />
<jsp:setProperty name="to" property="password" value="1234" />
<%
//out.println(to.getId() + "<br />");
//out.println(to.getPassword() + "<br />");
%>
<jsp:getProperty name="to" property="id" /><br />
<jsp:getProperty name="to" property="password" /><br />
이렇게 jsp만 가지고 짜는 코드는 hard Coding이라고 한다.
반면 1. 의 자바 코드로 클래스를 만들어서 짜는 코드를 model 1기법 이라고 한다.
이 둘중 뭘로 할건지 정해줘야한다.
model2구조도 있다.
실제 업무에선 model2를 많이 사용한다.
jsp만 가지고 처리하는게 아니라 class(JavaBeans)를 가지고 처리하는 걸 model1 기법이라고 한다.
model1 만드는 법은 swing과 비슷하다.
model1
swing
DAO
TO
실습2) model1 구조로 사원테이블 검색
BasicEx01> Java Resource > src > model1 > DeptTO.java
package model1;
public class DeptTO {
private String deptno;
private String dname;
private String loc;
public String getDeptno() {
return deptno;
}
public void setDeptno(String deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
BasicEx01> Java Resource > src > model1 > DeptDAO.java
package model1;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DeptDAO {
private DataSource dataSource = null;
public DeptDAO() {
// TODO Auto-generated constructor stub
try {
Context iniCtx = new InitialContext();
Context envCtx = (Context)iniCtx.lookup("java:comp/env");
this.dataSource = (DataSource)envCtx.lookup("jdbc/mariadb1");
} catch (NamingException e) {
System.out.println("[에러] " + e.getMessage());
}
}
public ArrayList<DeptTO> listDept(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<DeptTO> lists = new ArrayList<DeptTO>();
try {
conn = dataSource.getConnection();
String sql = "select deptno, dname, loc from dept";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
DeptTO to = new DeptTO();
to.setDeptno(rs.getString("deptno"));
to.setDname(rs.getString("dname"));
to.setLoc(rs.getString("loc"));
lists.add(to);
}
} catch (SQLException e) {
System.out.println("[예외] : " + e.getMessage());
}finally {
if(rs!=null) try { rs.close(); } catch(SQLException e) {}
if(pstmt!=null) try { pstmt.close(); } catch(SQLException e) {}
if(conn!=null) try { conn.close(); } catch(SQLException e) {}
}
return lists;
}
}
deptlist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="model1.DeptTO" %>
<%@ page import="model1.DeptDAO" %>
<%@page import="java.util.ArrayList"%>
<%
DeptDAO dao = new DeptDAO();
ArrayList<DeptTO> lists = dao.listDept();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
for(DeptTO to : lists){
out.println(to.getDeptno() + "/" + to.getDname() + "/" + to.getLoc() + "/" + "<br />");
}
%>
</body>
</html>
실습3) 동이름 검색해서 주소 테이블 출력하기
BasicEx01> Java Resource > src > model1 > ZipTO.java
package model1;
public class ZipTO {
private String zipcode;
private String sido;
private String gugun;
private String dong;
private String ri;
private String bunji;
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getSido() {
return sido;
}
public void setSido(String sido) {
this.sido = sido;
}
public String getGugun() {
return gugun;
}
public void setGugun(String gugun) {
this.gugun = gugun;
}
public String getDong() {
return dong;
}
public void setDong(String dong) {
this.dong = dong;
}
public String getRi() {
return ri;
}
public void setRi(String ri) {
this.ri = ri;
}
public String getBunji() {
return bunji;
}
public void setBunji(String bunji) {
this.bunji = bunji;
}
}
BasicEx01> Java Resource > src > model1 > ZipDAO.java
package model1;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class ZipDAO {
private DataSource dataSource = null;
public ZipDAO() {
// TODO Auto-generated constructor stub
try {
Context iniCtx = new InitialContext();
Context envCtx = (Context)iniCtx.lookup("java:comp/env");
this.dataSource = (DataSource)envCtx.lookup("jdbc/mariadb1");
} catch (NamingException e) {
System.out.println("[에러] " + e.getMessage());
}
}
public ArrayList<ZipTO> listDong(String strDong){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<ZipTO> lists = new ArrayList<ZipTO>();
try {
conn = dataSource.getConnection();
String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, strDong + "%");
rs = pstmt.executeQuery();
while(rs.next()) {
ZipTO to = new ZipTO();
to.setZipcode(rs.getString("zipcode"));
to.setSido(rs.getString("sido"));
to.setGugun(rs.getString("gugun"));
to.setDong(rs.getString("dong"));
to.setRi(rs.getString("ri"));
to.setBunji(rs.getString("bunji"));
lists.add(to);
}
} catch (SQLException e) {
System.out.println("[예외] : " + e.getMessage());
}finally {
if(rs!=null) try { rs.close(); } catch(SQLException e) {}
if(pstmt!=null) try { pstmt.close(); } catch(SQLException e) {}
if(conn!=null) try { conn.close(); } catch(SQLException e) {}
}
return lists;
}
}
zipcode01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="model1.ZipTO" %>
<%@ page import="model1.ZipDAO" %>
<%@page import="java.util.ArrayList"%>
<%
request.setCharacterEncoding("utf-8");
String strDong = request.getParameter("dong");
// if문 밖에서 출력되니까 if문 밖에 선언
StringBuffer html = new StringBuffer();
if(strDong != null){
ZipDAO dao = new ZipDAO();
ArrayList<ZipTO> lists = dao.listDong(strDong);
html.append("<hr />");
html.append("<table width='600' border='1'>");
html.append("<tr>");
html.append("<td>우편번호</td>");
html.append("<td>시도</td>");
html.append("<td>구군</td>");
html.append("<td>동</td>");
html.append("<td>리</td>");
html.append("<td>번지</td>");
html.append("</tr>");
for(ZipTO to : lists){
html.append("<tr>");
html.append("<td>" + to.getZipcode() + "</td>");
html.append("<td>" + to.getSido() + "</td>");
html.append("<td>" + to.getGugun() + "</td>");
html.append("<td>" + to.getDong() + "</td>");
html.append("<td>" + to.getRi() + "</td>");
html.append("<td>" + to.getBunji() + "</td>");
}
html.append("</table>");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
const checkfrm = function(){
if(document.frm.dong.value.trim() == ""){
alert('동이름을 입력하세요');
return;
}
document.frm.submit();
};
</script>
</head>
<body>
<form name="frm" method="post" action="zipcode01.jsp">
<input type="text" name="dong" />
<input type="button" value="동이름 검색" onclick="checkfrm()"/>
</form>
<%
out.println(html);
%>
</body>
</html>
model1 기법으로 게시판 만들기
새로운 프로젝트 Model1Ex01
TO
- 테이블 구조
+
- 추가 컬럼 ... wgap
DAO
생성자
메서드 - 페이지당 하나만드는게 가장 기본적
1. TO 만들기
package model1;
public class BoardTO {
private String seq;
private String subject;
private String writer;
private String mail;
private String password;
private String content;
private String hit;
private String wdate;
private String wip;
private int wgap;
public String getWip() {
return wip;
}
public void setWip(String wip) {
this.wip = wip;
}
public String getSeq() {
return seq;
}
public void setSeq(String seq) {
this.seq = seq;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getHit() {
return hit;
}
public void setHit(String hit) {
this.hit = hit;
}
public String getWdate() {
return wdate;
}
public void setWdate(String wdate) {
this.wdate = wdate;
}
public int getWgap() {
return wgap;
}
public void setWgap(int wgap) {
this.wgap = wgap;
}
}
2. DAO 만들기
게시판 페이지 별로 클래스 하나씩이라고 생각했었는데
DAO에선 그 클래스를 메서드로 만든다고 생각하면된다.
package model1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class BoardDAO {
private DataSource dataSource;
public BoardDAO() {
try {
Context iniCtx = new InitialContext();
Context envCtx = (Context)iniCtx.lookup("java:comp/env");
this.dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2");
} catch (NamingException e) {
System.out.println("[에러] " + e.getMessage());
}
}
// writer - dao 통과 안해도됨
public void boardWrite() {}
// writer_ok - flag 값있어야함
public int boardWriteOk(BoardTO to) {
Connection conn = null;
PreparedStatement pstmt = null;
// 정상처리 / 비정상 => 결과를 통합처리하기 위한 변수
int flag = 1;
try{
conn = dataSource.getConnection();
String sql = "insert board1 values(0, ?, ?, ?, ?, ?, 0, ?, now())";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, to.getSubject());
pstmt.setString(2, to.getWriter());
pstmt.setString(3, to.getMail());
pstmt.setString(4, to.getPassword());
pstmt.setString(5, to.getContent());
pstmt.setString(6, to.getWip());
// 일반적으로 0 값은 정상이다.
int result = pstmt.executeUpdate();
if(result == 1){
flag = 0;
}
}catch(SQLException e){
System.out.println("[에러] : "+e.getMessage());
}finally{
if(pstmt != null) try{pstmt.close();} catch(SQLException e) {}
if(conn != null) try{conn.close();} catch(SQLException e) {}
}
return flag;
}
// list
public ArrayList<BoardTO> boardList(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<BoardTO> lists = new ArrayList<BoardTO>();
try{
conn = dataSource.getConnection();
String sql = "select seq, subject, writer, date_format(wdate,'%Y-%m-%d') wdate, hit, datediff(now(), wdate) wgap from board1 order by seq desc";
pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = pstmt.executeQuery();
while(rs.next()){
BoardTO to = new BoardTO();
to.setSeq(rs.getString("seq"));
to.setSubject(rs.getString("subject"));
to.setWriter(rs.getString("writer"));
to.setWdate(rs.getString("wdate"));
to.setHit(rs.getString("hit"));
to.setWgap(rs.getInt("wgap"));
lists.add(to);
}
}catch(SQLException e){
System.out.println("[에러] : "+e.getMessage());
}finally{
if(rs != null) try{ rs.close();} catch(SQLException e) {}
if(pstmt != null) try{ pstmt.close();} catch(SQLException e) {}
if(conn != null) try{conn.close();} catch(SQLException e) {}
}
return lists;
}
// view
public BoardTO boardView(BoardTO to) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = dataSource.getConnection();
// 조회수 증가를 위한 update
String sql = "update board1 set hit=hit+1 where seq=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, to.getSeq());
pstmt.executeUpdate();
sql = "select subject, writer, mail, wip, wdate, hit, content from board1 where seq=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, to.getSeq());
rs = pstmt.executeQuery();
// 하나만 가져오니까 if문 사용
if(rs.next()){
to.setSubject(rs.getString("subject"));
to.setWriter(rs.getString("writer"));
to.setMail(rs.getString("mail"));
to.setHit(rs.getString("hit"));
to.setWip(rs.getString("wip"));
to.setWdate(rs.getString("wdate"));
to.setContent(rs.getString("content"));
}
}catch(SQLException e){
System.out.println("[에러] : "+e.getMessage());
}finally{
if(rs != null) try{rs.close();} catch(SQLException e) {}
if(pstmt != null) try{pstmt.close();} catch(SQLException e) {}
if(conn != null) try{conn.close();} catch(SQLException e) {}
}
return to;
}
// delete
public BoardTO boardDelete(BoardTO to) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = dataSource.getConnection();
String sql = "select subject, writer from board1 where seq=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, to.getSeq());
rs = pstmt.executeQuery();
// 하나만 가져오니까 if문 사용
if(rs.next()){
to.setSubject(rs.getString("subject"));
to.setWriter(rs.getString("writer"));
}
}catch(SQLException e){
System.out.println("[에러] : "+e.getMessage());
}finally{
if(rs != null) try{rs.close();} catch(SQLException e) {}
if(pstmt != null) try{pstmt.close();} catch(SQLException e) {}
if(conn != null) try{conn.close();} catch(SQLException e) {}
}
return to;
}
// delete_ok
public int boardDeleteOk(BoardTO to) {
Connection conn = null;
PreparedStatement pstmt = null;
// 정상처리 / 비정상 => 결과를 통합처리하기 위한 변수
int flag = 2;
try{
conn = dataSource.getConnection();
String sql = "delete from board1 where seq=? and password=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, to.getSeq());
pstmt.setString(2, to.getPassword());
int result = pstmt.executeUpdate();
if(result == 0){
// 비밀번호 오류
flag = 1;
}else if(result == 1){
// 정상
flag = 0;
}
}catch(SQLException e){
System.out.println("[에러] : "+e.getMessage());
}finally{
if(pstmt != null) try{pstmt.close();} catch(SQLException e) {}
if(conn != null) try{conn.close();} catch(SQLException e) {}
}
return flag;
}
// modify
public BoardTO boardModify(BoardTO to) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
conn = dataSource.getConnection();
String sql = "select subject, writer, content, mail from board1 where seq=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, to.getSeq());
rs = pstmt.executeQuery();
// 하나만 가져오니까 if문 사용
if(rs.next()){
to.setSubject(rs.getString("subject"));
to.setWriter(rs.getString("writer"));
to.setMail(rs.getString("mail"));
to.setContent(rs.getString("content"));
}
}catch(SQLException e){
System.out.println("[에러] : "+e.getMessage());
}finally{
if(rs != null) try{rs.close();} catch(SQLException e) {}
if(pstmt != null) try{pstmt.close();} catch(SQLException e) {}
if(conn != null) try{conn.close();} catch(SQLException e) {}
}
return to;
}
// modify_ok
public int boardModifyOk(BoardTO to) {
Connection conn = null;
PreparedStatement pstmt = null;
// 정상처리 / 비정상 => 결과를 통합처리하기 위한 변수
int flag = 2;
try{
conn = dataSource.getConnection();
String sql = "update board1 set subject = ?, mail=?, content=? where seq=? and password=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, to.getSubject());
pstmt.setString(2, to.getMail());
pstmt.setString(3, to.getContent());
pstmt.setString(4, to.getSeq());
pstmt.setString(5, to.getPassword());
int result = pstmt.executeUpdate();
if(result == 0){
// 비밀번호 오류
flag = 1;
}else if(result == 1){
// 정상
flag = 0;
}
}catch(SQLException e){
System.out.println("[에러] : "+e.getMessage());
}finally{
if(pstmt != null) try{pstmt.close();} catch(SQLException e) {}
if(conn != null) try{conn.close();} catch(SQLException e) {}
}
return flag;
}
}
3. 게시판 페이지 코드 수정
TO, DAO를 사용하는 페이지 코드에 다음과 같이 TO, DAO를 import 해줘야한다.
<%@ page import="model1.BoardTO" %>
<%@ page import="model1.BoardDAO" %>
대표적으로 board_modify1.jsp 페이지를 보면 원래는 다음과 같은 코드이다.
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="javax.sql.DataSource" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%
request.setCharacterEncoding("utf-8");
String seq = request.getParameter("seq");
String subject = "";
String writer = "";
String[] mail = null;
String content = "";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
Context iniCtx = new InitialContext();
Context envCtx = (Context)iniCtx.lookup("java:comp/env");
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2");
conn = dataSource.getConnection();
String sql =
"select subject, writer, content, mail from board1 where seq=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, seq);
rs = pstmt.executeQuery();
// 하나만 가져오니까 if문 사용
if(rs.next()){
subject = rs.getString("subject");
writer = rs.getString("writer");
if(rs.getString("mail").equals("")){
mail = new String[] {"",""};
}else{
mail = rs.getString("mail").split("@");
}
content = rs.getString("content").replaceAll("\n","<br />");
}
}catch(NamingException e){
System.out.println("[에러] : "+e.getMessage());
}catch(SQLException e){
System.out.println("[에러] : "+e.getMessage());
}finally{
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}
%>
model1 기법을 위해 수정된 코드는 다음과 같다.
<%@ page import="model1.BoardTO" %>
<%@ page import="model1.BoardDAO" %>
<%@page import="java.util.ArrayList"%>
<%
request.setCharacterEncoding("utf-8");
String seq = request.getParameter("seq");
BoardTO to = new BoardTO();
to.setSeq(seq);
BoardDAO dao = new BoardDAO();
to = dao.boardView(to);
String subject = to.getSubject();
String writer = to.getWriter();
String[] mail = null;
if(to.getMail().equals("")){
mail = new String[] {"",""};
}else{
mail = to.getMail().split("@");
}
String content = to.getContent();
%>
'빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정' 카테고리의 다른 글
12/30 - JSP(8) : 파일 첨부 되는 model1 게시판 만들기, 톰캣만으로 게시판 실행(배포) (0) | 2021.01.04 |
---|---|
12/29 - JSP(7) : 파일첨부 방법, 파일첨부 되는 model1 게시판 만들기(기본 게시판) (1) | 2021.01.04 |
12/24 - JSP(5) : 최신글 표시, 페이징 있는 게시판 만들기 (0) | 2021.01.04 |
12/23 - JSP(4) : 게시판 만들기 (0) | 2021.01.04 |
12/22 - JSP(3) : 데이터베이스 연결, 커넥션 풀, 게시판 만들 준비 (0) | 2021.01.04 |