지구정복

[JSP] 12/28 | JSP 헤더정보 출력, response 기본객체, JSP처리과정, out 기본객체, <jsp:include>액션태그, include디렉티브태그, <jsp:forward>액션태그, dispatcher사용, 자바빈 사용, 우편번호검색기, 게시판만들기 본문

데이터 엔지니어링 정복/JAVA & JSP

[JSP] 12/28 | JSP 헤더정보 출력, response 기본객체, JSP처리과정, out 기본객체, <jsp:include>액션태그, include디렉티브태그, <jsp:forward>액션태그, dispatcher사용, 자바빈 사용, 우편번호검색기, 게시판만들기

eeaarrtthh 2020. 12. 28. 20:43
728x90
반응형

 

 

ㅇ헤더정보 출력하기

p88

<%@ 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 names = (String)e.nextElement();
		String value = request.getHeader(names);
		out.println( names + " : " + value + "<br>" );
	}
%>
</body>
</html>

결과를 보면 사용자가 어떤 브라우저를 사용하는지 또는 윈도우정보 등 헤더에 포함된 내용이 나온다.

 

 

3.6 response 기본객체

-sendRedirect( "파일명" )

헤더에 특정 url로 이동할 수 있는 객체

자바스크립에서는 location.href = "파일명" 과 같다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%	
	/* 헤더에 아래코드를 작성하면 바로 설정된 url로 이동한다. */
	response.sendRedirect( "https://www.daum.net" );
%>

 

 

-인코딩 처리하기

한글을 다른 글자로 바꾸는 것이고, 디코딩은 인코딩된 글자를 한글로 바꾸는 것

<%@ 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>

 

 

4. 필수 이해 요소

4.1 JSP처리 과정

p99

 

 

WAS는 JSP 페이지에 대한 요청이 들어오면 다음과 같은 처리를 한다.

 

-JSP 해당하는 서블릿이 존재하지 않은 경우

1.2 : jsp 페이지로부터 자바 코드를 생성

1.3 : 자바 코드를 컴파일해서 서블릿 클래스를 생성

2.1 : 서블릿에 클라이언트 요청을 전달

2.2 : 서블릿이 요청을 처리한 결과를 응답으로 생성

3   : 응답을 웹 브아루저에 전송

 

-JSP 해당하는 서블릿이 존재하는 경우 ( 즉, 이미 1.1~1.3과정을 거친 경우)

2.1 : 서블릿에 클라이언트 요청을 전달

2.2 : 서블릿이 요청을 처리한 결과를 응답으로 생성

3   : 응답을 웹 브라우저에 전송

 

JSP 페이지를 자바 코드로 변경하는 단계를 '변환'이라고하고 자바 코드를 서블릿 클래스로 변경하는 단계를 '컴파일'이라고 한다.

즉 개발자는 jsp파일을 코딩을 하면 웹서버는 jsp파일을 자바코드로 변환하고 이를 컴파일해서 실행한다.

이때 jsp파일을 자바코드로 변환하는 것을 서블릿 변환이라고 한다.

 

이때 서블릿은 서버쪽에서 실행되고 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스이다.

하지만 이 클래스를 자바와 달리 tomcat과 같은 JSP/Servlet 컨테이너에서만 실행된다.

 

일반적으로 웹서버는 정적인 페이지만 제공한다. 그래서 동적인 페이지를 제공하기 위해서 웹서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성한다. 동적인 페이지는 사용자가 요청한 시점에 페이지를 생성해서 전달하는 것을 의미한다.

여기서 웹서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션이 서블릿클래스이다.

 

 

이클립스와 톰캣을 설치한 경우

1. 소스의 위치는 
C:\Java\jsp-workspace\프로젝트명   에 복사가 된다.

2. 소스를 내부 경로에 복사하고
C:\Java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\프로젝트명

3. 내부 경로 소소를 아래 디렉터리에서 자바와 클래스로 만들어준다.
C:\Java\jsp-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\BasicEx1\org\apache\jsp

 

5. 기본객체와 영역

5.2 out 기본 객체

print()
println()
newLine() : 엔터키 포함

표현식 / 스크립틀릿
<% if (grade > 10) { %>
<%= gradeStringA %>
<% } else if (grade > 5) { %>
<%= gradeStringB } %>
<% } %>


<%
	if (grade > 10) {
		out.println( gradeStringA );
	} else if ( grade > 5 ) {
		out.println( gradeStringB ):
	}
%>


출력버퍼를 조정하는 법

1. 디렉티브에서 설정하기
2. out 객체에서 설정하기

 

-버퍼 사이즈 확인 및 설정하기

JSP는 출력 내용을 버퍼에 저장한 후 나중에 전송한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" buffer="4kb" autoFlush="true" %>
    
<%
	/* 출력버퍼 사이즈 확인 : 기본적인 버퍼사이즈는 8kb */
	out.println( out.getBufferSize() + "<br>" );

	/* 출력버퍼 사이즈 확인 : 기본적인 버퍼사이즈는 8kb */
	out.println( out.getRemaining() + "<br>" );

	/* autoFlush="true"는 html정보가 버퍼를 다 채워지면 전송시켜주고 버퍼를 지워준다. 
			false일경우 다 차기전에 전송하지 않으면 오류가 난다. */
	/* isAutoFlush() autoFlush기능이 켜져있는지 확인하는 메서드 */
	out.println( out.isAutoFlush() + "<br>" );
%>

 

이번에는 autoFlush를 false로 설정하고 오류가 나는지 확인하자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page buffer="1kb" autoFlush="flase"%>

<%
	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>" );	
		}
	}
%>

다시 autoFlush를 true로 바꾸고 실행하면 에러가 사라진다.

 

이번에는 버퍼의 크기를 설정해서 출력을 조정해보자.

<%@ 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>" );
%>

 

-out객체의 참조주소를 확인하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	out.println( "Hello JSP <br>" );
	/* out의 원형객체를 확인하기  write = out */
	JspWriter writer = pageContext.getOut();
	out.println( out + "<br>" );
	writer.println( writer + "<br>" );
%>

 

7. 페이지 모듈화와 요청 흐름 제어

ㅇ<jsp:include> 액션태그 사용하기

p155

<jsp:기능태그> 내용 </jsp:기능태그>

 

외부파일 포함시키기

 

혹시 코딩중에 반복되는 코드를 하나의 메소드로 만들고 이를 외부파일에 저장해놓고 이를 불러와서 사용하는 것을 말한다.

 

-sub.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	out.println( "Hello sub.jsp <br>" );
%>

-include01.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:include page="./sub.jsp"></jsp:include>

끝<br>

</body>
</html>

 

이번에는 액션태그를 사용할 때 그 안에 데이터를 전달해보자.

-sub.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	/* include01.jsp에서 설정한 data값을 전달받기 */
	String data = request.getParameter( "data" );
	String data1 = request.getParameter( "data1" );

	out.println( "Hello sub.jsp <br>" );
%>

-include01.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>
<%
	String data1 = "value1";
%>
<jsp:include page="./sub.jsp">
	<jsp:param name="data" value="value" />
	<jsp:param name="data1" value="<%= data1 %>" />
</jsp:include>
끝<br>

</body>
</html>

이때 jsp액션태그 안에서 주석사용하면 에러가 난다.

 

 

 

ㅇinclude 디렉티브 태그 사용하기

<%@ include file="sub02.jsp" %>를 사용하면 sub02.jsp에 대한 서블릿 클래스를 만들지 않고

include02.jsp에 포함시켜서 하나의 서블릿 클래스를 만들게 된다.

즉 include액션태그와  include디렉티브 태그는 서로 다른 점을 알 수 있다.

 

-sub02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
	out.println( "Hello sub02.jsp <br>" );
	out.println( "data1 : " + data1 + "<br>" );
%>

-include02.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>
<%
	String data1 = "value1";
%>
<%@ include file="sub02.jsp" %>
끝<br>
</body>
</html>

 

보통 <jsp:include> 액션태그는 디자인 반복되는 코드가 있을 때 사용된다.

<%@ include filc> 디렉티브태그는 프로그램 반복되는 코드가 있을 때 + 간단하게 반복되는 디자인있을 때 사용한다.

 

디렉티브 태그를 사용할 때는 sub02.jsp가 에러표시가 나는데 이때는 확장자명은 .jspf로 바꿔주고

include02.jsp에서도 sub02.jsp를 sub02.jspf로 바꿔서 사용하면 에러표시가 사라진다.

 

7.3 <jsp:forward> 액션태그 사용해서 JSP 페이지 이동하기

JSP페이지에서 다른 JSP 페이지로 요청 처리를 전달할 때 사용된다. 이때 실행이되는 JSP페이지의 내용은 모두 사라지고

요청한 다른 JSP페이지의 결과가 출력된다.

 

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

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

url은 forward01.jsp인데 출력결과는 sub03.jsp임을 확인할 수 있다.

 

원리는 버퍼를 조정해서 forward01.jsp의 버퍼는 모두 없애고 sub03.jsp만 가져오는 것이다.

 

ㅇdispatcher 사용하기

forward란 폴더를 만들고 그 안에 a.jsp, b.jsp 파일을 만든다.

-a.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>
a.jsp
</body>
</html>

-b.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>
b.jsp
</body>
</html>

-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" );
	}
	
	/* 아래 코드가 forward액션태그와 똑같은 기능이다. */
	dispatcher.forward(request, response);
%>

url값을 b로 바꿔주면 b.jsp 내용이 출력된다.

 

 

8. 액션태그로 자바 클래스 사용하기 <jsp:useBean>

p190

8.1 자바빈(JavaBeans)

빈즈란 DTO/TO와 같다.

사용방법은

 

1. Java를 통해서 사용하기 (= model1 기법)

2. 액션 태그를 통해서 사용하기 (= hard coding 기법)

 

있다.

 

1. Java를 통해서 사용하기

아래와 같이 자바프로젝트 > Java Resources > src 에 패키지와 자바파일을 만든다.

 

-MemberTO.java = 자바빈즈

package pack1;

//빈즈 또는 TO라고 부른다.
public class MemberTO {
	private String id;
	private String password;
	
	public void setId(String id) {
		this.id = id;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String getId() {
		return id;
	}
	public String getPassword() {
		return 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. 액션 태그를 통해서 사용하기 

p196

-MemberTO.java = 자바빈즈

package pack1;

//빈즈 또는 TO라고 부른다.
public class MemberTO {
	private String id;
	private String password;
	
	public void setId(String id) {
		this.id = id;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String getId() {
		return id;
	}
	public String getPassword() {
		return password;
	}
	
	
}

-member_ok02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<jsp:useBean id="to" class="pack1.MemberTO"></jsp:useBean>

<%
	//to.setId( "test" );
	//to.setPassword( "1234" );
%>
<%
	//out.println( to.getId() + "<br>" );
	//out.println( to.getPassword() + "<br>" );
%>

<jsp:setProperty name="to" property="id" value="test"/>
<jsp:setProperty name="to" property="password" value="1234"/>

<jsp:getProperty name="to" property="id" /><br>
<jsp:getProperty name="to" property="password" /><br>

 

보통 첫 번째 방법을 많이 사용한다.

 

 

ㅇ자바빈즈를 이용해서 MariaDB의 부서정보 테이블 가져오기

먼저 마리아디비 드라이버와 context.xml을 아래와 같이 집어넣는다.

-context.xml

<?xml version="1.0" encoding="utf-8" ?>
<Context>
	<Resource
		name = "jdbc/mariadb1"
		auth = "Container"
		type = "javax.sql.DataSource"
		driverClassName = "org.mariadb.jdbc.Driver"
		url = "jdbc:mysql://localhost:3307/sample"
		username = "root"
		password = "!123456"
	/>
</Context>

아래와 같이 패키지를 만들고 DAO, TO 클래스를 만든다.

-DeptTO.java

package model1;

public class DeptTO {
	private String deptno;
	private String dname;
	private String loc;
	
	public String getDeptno() {
		return deptno;
	}
	public String getDname() {
		return dname;
	}
	public String getLoc() {
		return loc;
	}
	
	public void setDeptno(String deptno) {
		this.deptno = deptno;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
}

-DeptDAO.java

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 DeptDAO {
	private DataSource dataSource = null;
	
	public DeptDAO() {
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.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 import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "model1.DeptTO" %>
<%@ page import = "model1.DeptDAO" %>

<%
	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>

-실행결과

 

 

이번에는 우편번호 검색기를 모델1기법을 이용해서 만든다.

-ZipcodeTO1.java

package Zipcode1;

public class ZipcodeTO1 {
	private String zipcode;
	private String sido;
	private String gugun;
	private String dong;
	private String ri;
	private String bunji;
	private String seq;
	
	public String getZipcode() {
		return zipcode;
	}
	public String getSido() {
		return sido;
	}
	public String getGugun() {
		return gugun;
	}
	public String getDong() {
		return dong;
	}
	public String getRi() {
		return ri;
	}
	public String getBunji() {
		return bunji;
	}
	public String getSeq() {
		return seq;
	}
	
	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
	public void setSido(String sido) {
		this.sido = sido;
	}
	public void setGugun(String gugun) {
		this.gugun = gugun;
	}
	public void setDong(String dong) {
		this.dong = dong;
	}
	public void setRi(String ri) {
		this.ri = ri;
	}
	public void setBunji(String bunji) {
		this.bunji = bunji;
	}
	public void setSeq(String seq) {
		this.seq = seq;
	}
}

-ZipcodeDAO1.java

package Zipcode1;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ZipcodeDAO1 {
	private DataSource dataSource = null;
	StringBuffer html = new StringBuffer();
	
	public ZipcodeDAO1() {
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
			this.dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb1" );
			
		} catch (NamingException e) {
			System.out.println( "에러: " + e.getMessage() );
		}
	}
	
	public StringBuffer searchZip( String strDong ) {
		if ( strDong != null ) { 
			Connection conn = null;
			PreparedStatement pstmt = null;
			ResultSet rs = null;
			
			try {
				conn = dataSource.getConnection();
				
				String sql = "select zipcode, sido, gugun, dong, ri, bunji, seq from zipcode where dong like ?";
				pstmt = conn.prepareStatement(sql);
				pstmt.setString( 1, strDong + "%");
				rs = pstmt.executeQuery();
		
				html.append( "<table border='1' width='900'>" );
				while ( rs.next() ) {
					html.append( "<tr width='100'>" );
					html.append( "	<td>" + rs.getString( 1 ) + "<br>" + "</td>" );
					html.append( "	<td>" + rs.getString( 2 ) + "<br>" + "</td>" );
					html.append( "	<td>" + rs.getString( 3 ) + "<br>" + "</td>" );
					html.append( "	<td>" + rs.getString( 4 ) + "<br>" + "</td>" );
					html.append( "	<td>" + rs.getString( 5 ) + "<br>" + "</td>" );
					html.append( "	<td>" + rs.getString( 6 ) + "<br>" + "</td>" );
					html.append( "	<td>" + rs.getString( 7 ) + "<br>" + "</td>" );
					html.append( "</tr>" );
				}
				html.append( "</table>" );
				
			} catch(SQLException e) {
				System.out.println( "error: " + 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 html;
	}
	
}

-ZipcodeEx1.jsp

<%@page import="model1.DeptDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="Zipcode1.ZipcodeDAO1" %>
<%@ page import="Zipcode1.ZipcodeTO1" %>
    
<%@ 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" %>

<!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>

<%
	request.setCharacterEncoding( "utf-8" );
	StringBuffer html = null;
	String strDong = request.getParameter( "dong" );
	
	ZipcodeDAO1 dao = new ZipcodeDAO1();
	
	html = dao.searchZip( strDong );
	
%>

<form action="ZipcodeEx1.jsp" name="frm" method="post">
동이름 입력하기<input type="text" name="dong">&nbsp&nbsp&nbsp
<input type="button" value="검색하기" onclick="checkfrm()">
</form>

<br><br><hr><br>
<%= html %>

</body>
</html>

-실행결과

 

 

ㅇ게시판을 자바빈즈를 이용해서 만들기

게시판 파일은 아래 파일을 사용

sample1.zip
0.01MB

 

 

 

-BoardTO.java

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 wip;
	private String wdate;
	private int wgap;
	
	public String getSeq() {
		return seq;
	}
	public String getSubject() {
		return subject;
	}
	public String getWriter() {
		return writer;
	}
	public String getMail() {
		return mail;
	}
	public String getPassword() {
		return password;
	}
	public String getContent() {
		return content;
	}
	public String getHit() {
		return hit;
	}
	public String getWip() {
		return wip;
	}
	public String getWdate() {
		return wdate;
	}
	public int getWgap() {
		return wgap;
	}
	
	public void setSeq(String seq) {
		this.seq = seq;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public void setMail(String mail) {
		this.mail = mail;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public void setHit(String hit) {
		this.hit = hit;
	}
	public void setWip(String wip) {
		this.wip = wip;
	}
	public void setWdate(String wdate) {
		this.wdate = wdate;
	}
	public void setWgap(int wgap) {
		this.wgap = wgap;
	}
}

-BoardDAO.java (미완성 view까지 완성)

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.sql.DataSource;

public class BoardDAO {
	private DataSource dataSource;
	
	public BoardDAO() {
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
			this.dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		} catch (Exception e) {
			System.out.println( "에러: " + e.getMessage() );
		}
	}
	
	//write
	public void boardWrite() {}
	
	//write_ok
	public int boardWriteOk( BoardTO to ) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		int flag = 1;
		
		try {
			conn = dataSource.getConnection();
			
			String sql = "insert into 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() );
			
			int result = pstmt.executeUpdate();
			if ( result == 1 ) {
				//정상일 때
				flag = 0;
			}
		} catch(SQLException e) {
			System.out.println( "error: " + 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( "error: " + 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();
			
			//board_view.jsp에 들어오면 조회수 증가를 위한 update문을 사용한다.
			String sql = "update board1 set hit = hit+1 where seq = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString( 1, to.getSeq() );
			rs = pstmt.executeQuery();
			
			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();
			
			//데이터를 하나만 가져오니깐 while문 대신 if문을 사용한다.
			if ( rs.next() ) {
				to.setSubject( rs.getString( "subject" ) );
				to.setWriter( rs.getString( "writer" ) );
				to.setMail( rs.getString( "mail" ) );
				to.setWip( rs.getString( "wip" ) );
				to.setWdate( rs.getString( "wdate" ) );
				to.setHit( rs.getString( "hit" ) );
				to.setContent( rs.getString( "content" ).replaceAll( "\n", "<br>") );
			}
		} catch (SQLException e) {
			System.out.println( "error: " + 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 ) {
		return null;
	}
	//delete_ok
	public int boardDeleteOk( BoardTO to ) {
		return 0;
	}
	//modify
	public BoardTO boardModify( BoardTO to ) {
		return null;
	}
	//modify_ok
	public int boardModifyOk( BoardTO to ) {
		return 0;
	}
}

-board_write1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_write.css">

<script type="text/javascript">
	window.onload = function() {
		document.getElementById( 'submit1' ).onclick = function() {
			if ( document.wfrm.info.checked == false ) {
				alert( '동의를 해주세요' );
				return false;
			}
			if ( document.wfrm.writer.value.trim() == '' ) {
				alert( '글쓴이를 입력해주세요' );
				return false;
			}
			if ( document.wfrm.subject.value.trim() == '' ) {
				alert( '제목을 입력해주세요' );
				return false;
			}
			if ( document.wfrm.password.value.trim() == '' ) {
				alert( '비밀번호를 입력해주세요' );
				return false;
			}
			document.wfrm.submit();
		}
	}
</script>

</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<form action="board_write1_ok.jsp" method="post" name="wfrm">
		<div class="contents_sub">	
			<!--게시판-->
			<div class="board_write">
				<table>
				<tr>
					<th class="top">글쓴이</th>
					<td class="top" colspan="3"><input type="text" name="writer" value="" class="board_view_input_mail" maxlength="5" /></td>
				</tr>
				<tr>
					<th>제목</th>
					<td colspan="3"><input type="text" name="subject" value="" class="board_view_input" /></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td colspan="3"><input type="password" name="password" value="" class="board_view_input_mail"/></td>
				</tr>
				<tr>
					<th>내용</th>
					<td colspan="3"><textarea name="content" class="board_editor_area"></textarea></td>
				</tr>
				<tr>
					<th>이메일</th>
					<td colspan="3"><input type="text" name="mail1" value="" class="board_view_input_mail"/> @ <input type="text" name="mail2" value="" class="board_view_input_mail"/></td>
				</tr>
				</table>
				
				<table>
				<tr>
					<br />
					<td style="text-align:left;border:1px solid #e0e0e0;background-color:f9f9f9;padding:5px">
						<div style="padding-top:7px;padding-bottom:5px;font-weight:bold;padding-left:7px;font-family: Gulim,Tahoma,verdana;">※ 개인정보 수집 및 이용에 관한 안내</div>
						<div style="padding-left:10px;">
							<div style="width:97%;height:95px;font-size:11px;letter-spacing: -0.1em;border:1px solid #c5c5c5;background-color:#fff;padding-left:14px;padding-top:7px;">
								1. 수집 개인정보 항목 : 회사명, 담당자명, 메일 주소, 전화번호, 홈페이지 주소, 팩스번호, 주소 <br />
								2. 개인정보의 수집 및 이용목적 : 제휴신청에 따른 본인확인 및 원활한 의사소통 경로 확보 <br />
								3. 개인정보의 이용기간 : 모든 검토가 완료된 후 3개월간 이용자의 조회를 위하여 보관하며, 이후 해당정보를 지체 없이 파기합니다. <br />
								4. 그 밖의 사항은 개인정보취급방침을 준수합니다.
							</div>
						</div>
						<div style="padding-top:7px;padding-left:5px;padding-bottom:7px;font-family: Gulim,Tahoma,verdana;">
							<input type="checkbox" name="info" value="1" class="input_radio"> 개인정보 수집 및 이용에 대해 동의합니다.
						</div>
					</td>
				</tr>
				</table>
			</div>
			
			<div class="btn_area">
				<div class="align_left">
					<input type="button" value="목록" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_list1.jsp'" />
				</div>
				<div class="align_right">
					<input type="button" id="submit1" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" />
				</div>
			</div>
			<!--//게시판-->
		</div>
	</form>
</div>
<!-- 하단 디자인 -->

</body>
</html>

-board_write1_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model1.BoardTO" %>
<%@ page import="model1.BoardDAO" %>

<%
	request.setCharacterEncoding("utf-8");

	BoardTO to = new BoardTO();	

	to.setSubject( request.getParameter( "subject" ) ); 
	to.setWriter( request.getParameter( "writer" ) );
	to.setMail( "" );
	if ( !request.getParameter( "mail1" ).equals("") && !request.getParameter( "mail2" ).equals("") ) {
		to.setMail( request.getParameter( "mail1" ) +  "@" + request.getParameter( "mail2" ) );
	}
	to.setPassword( request.getParameter( "password" ) );
	to.setContent( request.getParameter( "content" ) );
	to.setWip( request.getRemoteAddr() );
	
	
	BoardDAO dao = new BoardDAO();
	int flag = dao.boardWriteOk(to);
	
	
	out.println( " <script type='text/javascript'> " );
	if( flag == 0 ) {
		out.println( " alert('글쓰기에 성공했습니다.'); " );
		out.println( " location.href='board_list1.jsp;' " );
	} else {
		out.println( " alert('글쓰기에 실패했습니다.'); " );
		out.println( " history.back(); " );
	}
	out.println( " </script> " );
%>


-board_list1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ page import="model1.BoardTO" %>
<%@ page import="model1.BoardDAO" %>
<%@ page import="java.util.ArrayList" %>

<%
	BoardDAO dao = new BoardDAO();
	ArrayList<BoardTO> lists = dao.boardList();
	
	int totalRecord = lists.size();
	
	StringBuffer sbHtml = new StringBuffer();
		
	for( BoardTO to : lists ) {
		String seq = to.getSeq();
		String subject = to.getSubject();
		String writer = to.getWriter();
		String wdate = to.getWdate();
		String hit = to.getHit();
		int wgap = to.getWgap();
		
		sbHtml.append( " <tr> " );
		sbHtml.append( " 	<td>&nbsp;</td> " );
		sbHtml.append( " 	<td>" + seq + "</td> " );
		sbHtml.append( "	<td class='left'> ");
		sbHtml.append( "		<a href='board_view1.jsp?seq=" + seq + "'>" + subject + "</a>&nbsp; ");
		if( wgap == 0 ) {
			sbHtml.append( "		<img src='../../images/icon_hot.gif' alt='HOT'> ");
		}
		sbHtml.append( "	</td> " );
		sbHtml.append( " 	<td>" + writer + "</td> " );
		sbHtml.append( " 	<td>" + wdate + "</td> " );
		sbHtml.append( " 	<td>" + hit + "</td> " );
		sbHtml.append( " 	<td>&nbsp;</td> " );
		sbHtml.append( " </tr> " );
	}
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_list.css">
</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<div class="contents_sub">
		<div class="board_top">
			<div class="bold">총 <span class="txt_orange"><%= totalRecord %></span>건</div>
		</div>

		<!--게시판-->
		<div class="board">
			<table>
			<tr>
				<th width="3%">&nbsp;</th>
				<th width="5%">번호</th>
				<th>제목</th>
				<th width="10%">글쓴이</th>
				<th width="17%">등록일</th>
				<th width="5%">조회</th>
				<th width="3%">&nbsp;</th>
			</tr>
			<%= sbHtml %>
			</table>
		</div>	
		<!--//게시판-->

		<div class="align_right">
			<input type="button" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='board_write1.jsp'" />
		</div>
	</div>
</div>
<!--//하단 디자인 -->

</body>
</html>

-board_view1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ page import="model1.BoardTO" %>
<%@ page import="model1.BoardDAO" %>

<%
	request.setCharacterEncoding( "utf-8" );
	
	BoardTO to = new BoardTO();
	to.setSeq( request.getParameter( "seq" ) );
	to.setSubject( "" );
	to.setWriter( "" );
	to.setMail( "" );
	to.setWip( "" );
	to.setWdate( "" );
	to.setHit( "" );
	to.setContent( "" );
	
	BoardDAO dao = new BoardDAO();
	
	to = dao.boardView( to );
	
%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../../css/board_view.css">
</head>

<body>
<!-- 상단 디자인 -->
<div class="con_title">
	<h3>게시판</h3>
	<p>HOME &gt; 게시판 &gt; <strong>게시판</strong></p>
</div>
<div class="con_txt">
	<div class="contents_sub">
		<!--게시판-->
		<div class="board_view">
			<table>
			<tr>
				<th width="10%">제목</th>
				<td width="60%"><%= to.getSubject() %></td>
				<th width="10%">등록일</th>
				<td width="20%"><%= to.getWdate() %></td>
			</tr>
			<tr>
				<th>글쓴이</th>
				<td><%= to.getWriter() %>(<%= to.getMail() %>)(<%= to.getWip() %>)</td>
				<th>조회</th>
				<td><%= to.getHit() %></td>
			</tr>
			<tr>
				<td colspan="4" height="200" valign="top" style="padding: 20px; line-height: 160%"><%= to.getContent() %></td>
			</tr>
			</table>
		</div>

		<div class="btn_area">
			<div class="align_left">
				<input type="button" value="목록" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_list1.jsp'" />
			</div>
			<div class="align_right">
				<input type="button" value="수정" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_modify1.jsp?seq=<%= to.getSeq() %>'" />
				<input type="button" value="삭제" class="btn_list btn_txt02" style="cursor: pointer;" onclick="location.href='board_delete1.jsp?seq=<%= to.getSeq() %>'" />
				<input type="button" value="쓰기" class="btn_write btn_txt01" style="cursor: pointer;" onclick="location.href='board_write1.jsp'" />
			</div>
		</div>	
		<!--//게시판-->
	</div>
</div>
<!-- 하단 디자인 -->

</body>
</html>
728x90
반응형
Comments