Window(Mac) + JDK + apache-tomcat + eclipse(intellij)
개발환경에서 서비스 환경으로 => 배포
Linux(Unix) + JDK + apache-tomcat
1.Servlet - class
2.jsp -html유사
=> 나중에는 둘 다 사용한다.
클라이언트(브라우저)와 서버가 있음
브라우저(요청, 렌더링) -> 요청 -> 서버(was)가 받음 <-> jsp / servlet
응답은 <- html <- 방향
<%@ : directive - jsp 페이지에 대한 설정 - (중요)
/*
directive에는
page - (language, contentType, pageEncoding, import(중요))
include
taglib 가 있다
*/
<%! : declaration - 멤버 필드, 메서드 선언 (많이 사용하지는 않음)
<% : scriptlet - java 소스/ 안에 들어갈 수 있는것은 지역변수,제어문) - 중요
<%= : expression - out.println 대치
JSP나 Servlet은 java ee 형식( se가 아님 )
jdbc - java ee
jdbc 프로젝트 생성 후 lib에 마리아디비 api를 직접 넣어줌.
클래스 생성하여 연결 되는지 확인.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String url = "jdbc:mysql://localhost:3306/sample";
String user = "root";
String password = "123456";
Connection conn = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
out.println("드라이버 로딩 성공<br>");
conn = DriverManager.getConnection(url, user, password);
out.println("데이터베이스 연결 성공<br>");
} catch(ClassNotFoundException e) {
System.out.println("[에러] : " + e.getMessage());
} catch(SQLException e) {
System.out.println("[에러] : " + e.getMessage());
} finally {
if(conn != null) conn.close();
}
%>
</body>
</html>
dept 테이블 가져오기
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.DriverManager" %>
<%@ 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>
</head>
<body>
<%
String url = "jdbc:mysql://localhost:3306/sample";
String user = "root";
String password = "123456";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
// preparestatment -> dept 테이블로 출력
String sql = "select * from dept";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
out.println("<table width='800'>");
while(rs.next()) {
out.println("<tr>");
out.println("<td>" + rs.getString("deptno") + "</td>");
out.println("<td>" + rs.getString("dname") + "</td>");
out.println("<td>" + rs.getString("loc") + "</td>");
out.println("</tr>");
}
out.println("</table>");
} catch(ClassNotFoundException 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();
}
%>
</body>
</html>
StringBuilder로 선언부에서 처리하고 변수에 담아서 한번에 출력.
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%
String url = "jdbc:mysql://localhost:3306/sample";
String user = "root";
String password = "123456";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuilder sbHtml = new StringBuilder();
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
// preparestatment -> dept 테이블로 출력
String sql = "select * from dept";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
sbHtml.append("<table width='800'>");
while(rs.next()) {
sbHtml.append("<tr>");
sbHtml.append("<td>" + rs.getString("deptno") + "</td>");
sbHtml.append("<td>" + rs.getString("dname") + "</td>");
sbHtml.append("<td>" + rs.getString("loc") + "</td>");
sbHtml.append("</tr>");
}
sbHtml.append("</table>");
} catch(ClassNotFoundException e) {
sbHtml.append("[에러] : " + e.getMessage());
} catch(SQLException e) {
sbHtml.append("[에러] : " + e.getMessage());
} finally {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=sbHtml %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%
request.setCharacterEncoding("utf-8");
StringBuilder sbHtml = new StringBuilder();
if(request.getParameter("dong") != null) {
String strDong = request.getParameter("dong");
String url = "jdbc:mysql://localhost:3306/project";
String user = "project";
String password = "1234";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
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();
sbHtml.append("<table width='800' border='1'>");
while(rs.next()) {
sbHtml.append("<tr>");
sbHtml.append("<td>" + rs.getString("zipcode") + "</td>");
sbHtml.append("<td>" + rs.getString("sido") + "</td>");
sbHtml.append("<td>" + rs.getString("gugun") + "</td>");
sbHtml.append("<td>" + rs.getString("dong") + "</td>");
sbHtml.append("<td>" + rs.getString("ri") + "</td>");
sbHtml.append("<td>" + rs.getString("bunji") + "</td>");
sbHtml.append("</tr>");
}
sbHtml.append("</table>");
} catch(ClassNotFoundException e) {
sbHtml.append("[에러] : " + e.getMessage());
} catch(SQLException e) {
sbHtml.append("[에러] : " + e.getMessage());
} finally {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./zipcode.jsp" method="post" name="frm">
<fieldset>
<legend>우편번호 검색</legend>
<label for="dong">동이름 입력</label>
<input type="text" id="dong" name="dong" size="40" placeholder="동이름 입력">
<input type="button" id="btn" value="우편번호 검색">
</fieldset>
</form>
<%=sbHtml %>
</body>
</html>
JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API다
자바 애플리케이션을 외부 디렉터리 서비스에 연결 (예: 주소 데이터베이스.. 등)
자바 애플릿이 호스팅 웹 컨테이너가 제공하는 구성 정보를 참고
=> 간단히 요약하자면 우리가 연결하고 싶은 데이터베이스의 DB Pool을 미리 Naming 시켜주는 방법 중 하나이다. 우리가 저장해놓은 WAS 의 데이터베이스 정보에 JNDI를 설정해 놓으면 웹 애플리케이션은 JNDI만 호출하면 간단해진다.
풀이 나오면 미리 만들어놓은 것을 쓴다는거라고 보면 됨
tomcat시작 - 풀링 -> JNDI -> 프로그램 접근
속도가 좀 더 나아진다.
풀링을 시작할 설정파일, JNDI 사용법 필요
파일명 잘 정해줘야함
name : JDBC의 이름이고 변경이 가능하다.
auth :컨테이너(서버, tomcat같은 것)를 자원 관리자로 쓸것이다.
(컨테이너 : JSP와 서블릿을 실행시킬 수 있는 소프트웨어를 웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고 한다.)
type : 웹에서 이 리소스를 사용시 datasource로 리턴된다. / 리소스의 타입을 지정. Connection Pool을 사용할 수있도록 해주는 객체의 javax.sqlDataSource이다.
driverClassName : JDBC 드라이버
url : 접속 url
username : 접속계정(마리아db접속계정)
password : 마리아계정 비번설정했던것
아이디나 비밀번호 적는것을 안해도 된다. 보안에도 좋음.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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.SQLException" %>
<%
Connection conn = null;
try {
// JNDI를 이용하기 위한 객체 생성
Context initCtx = new InitialContext();
// initCtx의 lookup메서드를 이용해서 "java:comp/env" 에 해당하는 객체를 찾아서 evnCtx에 삽입
// java:comp/env는 웹어플의 구성된 엔트리와 리소스들이 배치되어있는 부분.
// 그래서 이것에 접근을 하여 web.xml의 <resource-env-ref>에 설정한 jdbc/mysql과 매핑되는 리소스를 가져온다.
// lookup() : 등록된 naming 서비스로부터 자원을 찾고자할 때 사용하는 메서드
Context envCtx = (Context)initCtx.lookup("java:comp/env"); // 자바 실행환경
// 리소스를 찾은 후 리소스를 사용할 수 있도록 객체를 반환
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb1"); // 데이터 소스가 리턴
conn = dataSource.getConnection();
System.out.println("데이터베이스 연결 성공");
} catch(NamingException e) {
System.out.println("[에러] : " + e.getMessage());
} catch(SQLException e) {
System.out.println("[에러] : " + e.getMessage());
} finally {
if(conn != null) conn.close();
}
conn.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
만약 실행했을 때 바인딩이 되지 않았다는 에러가 뜬다면 잘못쓴거임
프로젝트에 접속하고싶은 경우 이런식으로 작성하면 됨.
실행할때도 name에 맞춰서 실행하면 연결이 된다.
<?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:3306/sample"
username="root"
password="123456" />
<Resource
name="jdbc/mariadb2"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mysql://localhost:3306/project"
username="project"
password="1234" />
</Context>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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.SQLException" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env"); // 자바 실행환경
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb1"); // 데이터 소스가 리턴
conn = dataSource.getConnection();
String sql = "select * from dept";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("deptno"));
}
} 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();
}
conn.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
우편번호
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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.SQLException" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%
request.setCharacterEncoding("utf-8");
StringBuilder sbHtml = new StringBuilder();
if(request.getParameter("dong") != null) {
String strDong = request.getParameter("dong");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env"); // 자바 실행환경
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2"); // 데이터 소스가 리턴
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();
sbHtml.append("<table width='800' border='1'>");
while(rs.next()) {
sbHtml.append("<tr>");
sbHtml.append("<td>" + rs.getString("zipcode") + "</td>");
sbHtml.append("<td>" + rs.getString("sido") + "</td>");
sbHtml.append("<td>" + rs.getString("gugun") + "</td>");
sbHtml.append("<td>" + rs.getString("dong") + "</td>");
sbHtml.append("<td>" + rs.getString("ri") + "</td>");
sbHtml.append("<td>" + rs.getString("bunji") + "</td>");
sbHtml.append("</tr>");
}
sbHtml.append("</table>");
} 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();
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./zipcode.jsp" method="post" name="frm">
<fieldset>
<legend>우편번호 검색</legend>
<label for="dong">동이름 입력</label>
<input type="text" id="dong" name="dong" size="40" placeholder="동이름 입력">
<input type="button" id="btn" value="우편번호 검색">
</fieldset>
</form>
<%=sbHtml %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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 strSido = request.getParameter( "sido" );
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuffer sbSido = new StringBuffer();
StringBuffer sbGugun = new StringBuffer();
try {
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
DataSource dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
conn = dataSource.getConnection();
String sql = "select distinct sido from zipcode";
pstmt = conn.prepareStatement( sql );
rs = pstmt.executeQuery();
while( rs.next() ) {
sbSido.append( "<option value='" + rs.getString( "sido" ) + "'>" + rs.getString( "sido" ) + "</option>" );
}
if( request.getParameter( "sido" ) != null ) {
sql = "select distinct gugun from zipcode where sido=?";
pstmt = conn.prepareStatement( sql );
pstmt.setString( 1, strSido );
rs = pstmt.executeQuery();
while( rs.next() ) {
sbGugun.append( "<option value='" + rs.getString( "gugun" ) + "'>" + rs.getString( "gugun" ) + "</option>" );
}
}
} 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();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
table { border: 1px solid black; font-size: 15px; border-collapse: collapse; }
td { width: 800px; padding: 10px; text-align: center; border: 1px solid black; }
#sido { width: 100px; }
#gugun { width: 100px; }
</style>
<script type="text/javascript">
window.onload = function() {
document.getElementById( 'sido' ).onchange = function() {
const sido = document.getElementById( 'sido' ).value;
//alert( sido );
document.frm.submit();
};
};
</script>
</head>
<body>
<form action="zipcode3.jsp" method="post" name="frm">
<table>
<tr>
<td>
<select name="sido" id="sido">
<option value="시도">시도</option>
<%=sbSido %>
</select>
<select name="gugun" id="gugun">
<option value="구군">구군</option>
<%=sbGugun %>
</select>
<input type="text" name="dong" id="dong" size="40" />
<input type="submit" value="우편번호검색" />
</td>
</tr>
</table>
</form>
</body>
</html>