이번 작업은 웹용자바(JSP)의 역사를 실제예를 들어서 알아 보기로 했습니다.
============================================================================================
1). 2000~2005년 사이: JSP 소스에 네이티브JAVA코드를 삽입하여 화면에 뿌려주기(파일명:test_1.jsp)
아래는 위 화면을 출력하기 위한 jsp소스 입니다.(dB커넥션, 쿼리, 출력을 위한 for반복문 등이 1개의 파일에 모두 있습니다.)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<!DOCTYPE html>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html lang="ko">
<jsp:include page="../fragments/headTag.jsp"/>
<%
Connection conn = null; // null로 초기화 한다.
try{
String url = "jdbc:mysql://db:3306/petclinic?useUnicode=true&characterEncoding=UTF-8"; // 사용하려는 데이터베이스명을 포함한 URL 기술
String id = "petclinic"; // 사용자 계정
String pw = "password"; // 사용자 계정의 패스워드
Class.forName("com.mysql.jdbc.Driver"); // 데이터베이스와 연동하기 위해 DriverManager에 등록한다.
conn=DriverManager.getConnection(url,id,pw); // DriverManager 객체로부터 Connection 객체를 얻어온다.
out.println("제대로 연결되었습니다."); // 커넥션이 제대로 연결되면 수행된다.
}catch(Exception e){ // 예외가 발생하면 예외 상황을 처리한다.
e.printStackTrace();
}
%>
<body>
<div class="container">
<h2>환영합니다.</h2>
<br/>HELLO JSP! 결과 확인<br/>
<%= new java.util.Date() %>
<table width="550" border="1">
<%
PreparedStatement pstmt = null;
ResultSet rs = null;
int n=0;
try{
String usql = "update owners set last_name=? where first_name = 'George'";
pstmt = conn.prepareStatement(usql);
pstmt.setString(1,"test");
n = pstmt.executeUpdate();
}catch(Exception e){ // 예외가 발생하면 예외 상황을 처리한다.
e.printStackTrace();
out.println(e.toString());
}finally{ // 쿼리가 성공 또는 실패에 상관없이 사용한 자원을 해제 한다. (순서중요)
if(n>0) {
out.println(n+"업데이트 성공했습니다.");
}else{
out.println(n+"업데이트 실패했습니다.");
}
if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){} // PreparedStatement 객체 해제
}
try{
String sql = "select * from owners"; // sql 쿼리 where idx = ? where first_name = 'kim1'
pstmt = conn.prepareStatement(sql); // prepareStatement에서 해당 sql을 미리 컴파일한다.
// pstmt.setString(1,"1");
rs = pstmt.executeQuery(); // 쿼리를 실행하고 결과를 ResultSet 객체에 담는다.
while(rs.next()){ // 결과를 한 행씩 돌아가면서 가져온다.
String no = rs.getString("id");
String fn = rs.getString("first_name");
String ln = rs.getString("last_name");
String addr = rs.getString("address");
String tel = rs.getString("telephone");
%>
<tr>
<td width="100"><%=no%></td>
<td width="100"><%=fn%></td>
<td width="100"><%=ln%></td>
<td width="100"><%=addr%></td>
<td width="100"><%=tel%></td>
</tr>
<%
}
}catch(Exception e){ // 예외가 발생하면 예외 상황을 처리한다.
e.printStackTrace();
out.println("users 테이블 호출에 실패했습니다.");
}finally{ // 쿼리가 성공 또는 실패에 상관없이 사용한 자원을 해제 한다. (순서중요)
if(rs != null) try{rs.close();}catch(SQLException sqle){} // Rsultset 객체 해제
if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){} // PreparedStatement 객체 해제
if(conn != null) try{conn.close();}catch(SQLException sqle){} // Connection 해제
}
%>
</table>
</div>
</body>
</html>
=====================================================================================================================
2). 2005~2010년 사이: jsp화면(뷰)와 java컨트롤러(DB커넥트, 쿼리, 반복자료구조용javar구문포함) 파일명: test_2.jsp, Owners.java , TestController.java 이렇게 파일이 나눠 집니다. 결과는 아래 처럼 똑 같습니다.
위 화면의 jsp 소스는 아래와 같습니다.(jsp화면에 네이티브 Java코드가 없이 구현 됩니다.)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.springframework.samples.petclinic.web.Owners" %>
<!DOCTYPE html>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html lang="ko">
<jsp:include page="../fragments/headTag.jsp"/>
<body>
<div class="container">
<h2>환영합니다.</h2>
<br/>HELLO JSP! 결과 확인<br/>
<jsp:useBean id="toDay" class="java.util.Date" />
<fmt:formatDate value="${toDay}" pattern="yyyy-MM-dd HH:mm:ss" />
<c:out value="${testStr}"/><br/>
<table width="550" border="1">
<tr>
<td width="100">no</td>
<td width="100">fn</td>
<td width="100">ln</td>
<td width="100">addr</td>
<td width="100">tel</td>
</tr>
<c:forEach var="owners" items="${list}">
<tr>
<td width="100">${owners.id}</td>
<td width="100">${owners.fn}</td>
<td width="100">${owners.ln}</td>
<td width="100">${owners.addr}</td>
<td width="100">${owners.tel}</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
위 코드처럼 디자인 입히기 편하게 깨긋 한 코드가 되었지만, 컨트롤러와 변수필드전용 자바 파일 2개가 추가로 사용 되게 됩니다.
- 파일명: TestController.java
package org.springframework.samples.petclinic.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.*;
import java.sql.*;
import org.springframework.ui.Model;
import org.springframework.samples.petclinic.web.Owners;
/**
* @author 김일국
* @author Kim ilguk
*/
class Database{
PreparedStatement pstmt = null;
ResultSet rs = null;
Connection conn = null; // null로 초기화 한다.
public void connect() {
try{
String url = "jdbc:mysql://db:3306/petclinic?useUnicode=true&characterEncoding=UTF-8"; // 사용하려는 데이터베이스명을 포함한 URL 기술
String id = "petclinic"; // 사용자 계정
String pw = "password"; // 사용자 계정의 패스워드
Class.forName("com.mysql.jdbc.Driver"); // 데이터베이스와 연동하기 위해 DriverManager에 등록한다.
conn = DriverManager.getConnection(url,id,pw); // DriverManager 객체로부터 Connection 객체를 얻어온다.
System.out.println("제대로 연결되었습니다."); // 커넥션이 제대로 연결되면 수행된다.
}catch(Exception e){ // 예외가 발생하면 예외 상황을 처리한다.
e.printStackTrace();
}
}
public void disconnect() {
if(rs != null) try{rs.close();}catch(SQLException sqle){} // Rsultset 객체 해제
if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){} // PreparedStatement 객체 해제
if(conn != null) try{conn.close();}catch(SQLException sqle){} // Connection 해제
}
}
@Controller
public class TestController {
Database db = new Database();//공통사용 DB클래스
@RequestMapping(value = "/test/test_1", method = RequestMethod.GET)
public String initView(Map<String, Object> model) {
return "test/test_1";
}
@RequestMapping(value = "/test/test_2", method = RequestMethod.GET)
public String listView(Model model) {
db.connect();
int n = 0;
try{
String usql = "update owners set last_name=? where first_name = 'George'";
db.pstmt = db.conn.prepareStatement(usql);
db.pstmt.setString(1,"test");
n = db.pstmt.executeUpdate();
String sql = "select * from owners";// sql 쿼리 where idx = ?
db.pstmt = db.conn.prepareStatement(sql);// prepareStatement에서 해당 sql을 미리 컴파일한다.
db.rs = db.pstmt.executeQuery();
ArrayList<Owners> ownersResultList = new ArrayList<Owners>();
while(db.rs.next()){
Owners owners = new Owners();
System.out.println( db.rs.getString("first_name") );
owners.setid( db.rs.getString("id") );
owners.setfn( db.rs.getString("first_name") );
owners.setln( db.rs.getString("last_name") );
owners.setaddr( db.rs.getString("address") );
owners.settel( db.rs.getString("telephone") );
ownersResultList.add(owners);
}
model.addAttribute("list", ownersResultList);
/* 출력결과 디버그
int totalElements = ownersResultList.size();// arrayList의 요소의 갯수를 구한다.
for (int index = 0; index < totalElements; index++) {
Owners test = ownersResultList.get(index);
System.out.println( test.getfn() );
}
*/
}catch(Exception e){ // 예외가 발생하면 예외 상황을 처리한다.
e.printStackTrace();
System.out.println("users 테이블 호출에 실패했습니다.");
}finally{ // 쿼리가 성공 또는 실패에 상관없이 사용한 자원을 해제 한다. (순서중요)
if(n>0) {
model.addAttribute("testStr", "업데이트 성공했습니다.");
}else{
model.addAttribute("testStr", "업데이트 실패했습니다.");
}
db.disconnect();
}
return "test/test_2";
}
}
- 파일명: Owners.java (사용자가 추가한 멤버변수들 일반적인 get(), set() 변수들 입니다.)
public class Owners {
private String id;
private String fn;
private String ln;
private String addr;
private String city;
private String tel;
//constructors //getter-setters
public String settel(String tel){
return this.tel = tel;
}
public String gettel() {
return this.tel;
}
public String setcity(String city){
return this.city = city;
}
public String getcity() {
return this.city;
}
public String setaddr(String addr){
return this.addr = addr;
}
public String getaddr() {
return this.addr;
}
public String setln(String ln){
return this.ln = ln;
}
public String getln() {
return this.ln;
}
public String setfn(String fn){
return this.fn = fn;
}
public String getfn() {
return this.fn;
}
public String setid(String id){
return this.id = id;
}
public String getid() {
return this.id;
}
}
==========================================================================================================================
3). 2010~2017년 사이: MVC(모델,뷰,컨트롤러)로 확정된 스프링프레임웍4버전이 사용 중입니다. 즉, 위에서는 V, C 2부분에서 C부분이 M(모델:DB핸들링,쿼리) 와 C(컨트롤러:Java 서블릿)으로 분리가 되어서, 뷰(jsp파일), 모델(Model), 컨트롤러(Controller)로 3부분으로 정착되었습니다. *문제는 위의 옛날 방식 1).2). 처럼 한곳에 모든 기술이 들어가 있지 않아서, 구조적으로 알아야 할 지식이 많아 져서 아마추어들이 접근하기 쉽지 않다는데 있습니다.
스프링에 관련된 사항은 이전 포스트에서 확인 가능하십니다. http://blog.daum.net/web_design/388
현재는 스프링을 사용하지 않으면, 2명이상인 프로젝트에서 공동작업을 할 수 없습니다.
공동작업을 위해서도 스프링은 알아야 합니다. 스프링공동작업시 확인할 사항들5가지=> http://blog.daum.net/web_design/362
new전자정부프레임웍_2/3 사전기술검토(3.6.0버전) (0) | 2017.12.06 |
---|---|
new전자정부프레임웍_1/3 사전기술검토(3.6.0버전) (0) | 2017.12.05 |
codenvy 온라인실습실에서 petclinic 사이트 작업01 (0) | 2017.07.19 |
자바 AWT를 사용하여 class파일 디컴파일러를 제작해 보았습니다. (0) | 2017.04.13 |
이번에 스프링프레임웍 작업하면서, gitlab.com 에서 소스공유(비공개)로 공동작업을 하게 되었습니다 (0) | 2016.08.30 |
댓글 영역