PC

블로그 이미지

DAVID

'Programming'에 해당되는 글 109건

제목 날짜
  • 160513: 42회차 2016.05.13
  • 160512: 41회차 2016.05.12
  • 160511: 40회차 2016.05.11
  • 160510: 39회차 2016.05.10
  • 160509: 38회차 2016.05.09
  • 160504: 37회차 2016.05.04
  • 160503: 36회차1 2016.05.03
  • 160502: 35회차 2016.05.02
  • 160429: 34회차 2016.04.29
  • 160428: 33회차 2016.04.28

160513: 42회차

Programming 2016. 5. 13. 18:19

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


<c:if test="${not empty dto.address2}">

이거 nul이 아니라면이라고 쓰는 거랑 같은 말...


<?xml version="1.0" encoding="UTF-8" ?>


<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 

                        web-jsptaglibrary_2_0.xsd"

version="2.0">


<description>EL에서 함수실행</description>

<tlib-version>1.0</tlib-version>

<short-name>ELfunctions</short-name>

<uri>/ELFunctions</uri>


<function>  <!-- EL에서 사용할 함수 정의 하나의 함수당 하나의 <function>객체에 매핑됩니다. -->

<description>새 이미지 추가</description>

<name>newImg</name>  <!-- <name>태그는 EL에서 사용할 함수의 이름 -->

<function-class>                   <!-- <function-class>함수의 기능을 제공할 클래스의 이름 -->

utility.Utility

</function-class>

<function-signature>     <!-- <function-signature>함수 기능을 실행할 메소드를 명시 -->

boolean compareDay( java.lang.String )

</function-signature>

</function>


<function>  <!-- EL에서 사용할 함수 정의 하나의 함수당 하나의 <function>객체에 매핑됩니다. -->

<description>직업명 가져오기</description>

<name>getJob</name>  <!-- <name>태그는 EL에서 사용할 함수의 이름 -->

<function-class>                   <!-- <function-class>함수의 기능을 제공할 클래스의 이름 -->

utility.Utility

</function-class>

<function-signature>     <!-- <function-signature>함수 기능을 실행할 메소드를 명시 -->

java.lang.String getCodeValue( java.lang.String )

</function-signature>

</function>

</taglib> 




1. 표현 언어의 연산자   

        연  산   자                                설          명 
   ------------------------------------------------------------------------ 
        .                            빈의 프로퍼티나 맵(Map)의 엔트리 접근 
        []                          배열이나 리스트(List) 엘리먼트 접근 
        ()                          괄호, 표현식의 연산 순서를 바꿔서 연산하게 할 때 
        a?b:c                     조건 테스트 - 조건(a)? true일때 리턴 값(b),false일때 리턴값(c) 
        + , -, *                   사칙 연산 :  더하기, 배기, 곱하기  
        / 또는 div               나누기 
        % 또는 Mod            나머지 
        == 또는 =                같다. =은 권장 아님 
        !=                          다르다  
        < 또는 lt                 보다 작다 
        > 또는 gt                보다 크다 
        <= 또는 le              작거나 같다 
        >= 또는 ge             크거나 같다. 
        && 또는 and          논리 AND 
        || 또는 or              논리 OR 
        ! 또는 not              단항 not(true를 false로 false를 true로) 
        empty                  빈 변수 값 체크, null, 빈 문자열, 빈 배열등 인지를 테스트  
        func(args)            함수 호출, func 함수 이름이고 args는 인자로 없을 수도 있고,  
                                   한 개 혹은 쉼표(,)로 분리된 여러 개의 함수 인자를 가질 수도 있다. 



5. 수업

진도: 

hw: 


6. 할것


홈페이지 - 모델1 방식으로 ... - 마저 구현해 놓을 것...


admin 로그인 한 뒤 list 안뜸...


http://thatisgood.tistory.com/entry/model1-vs-model2-%EC%B0%A8%EC%9D%B4%EC%A0%90

'Programming' 카테고리의 다른 글

160517: 44회차  (0) 2016.05.17
160516: 43회차  (0) 2016.05.16
160512: 41회차  (0) 2016.05.12
160511: 40회차  (0) 2016.05.11
160510: 39회차  (0) 2016.05.10
Posted by DAVID

160512: 41회차

Programming 2016. 5. 12. 18:15

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


계속 model1이랑 2 복습하다가 새로 배우니까 또 적는 것


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

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<html>

<head>

<title>함수 사용</title>

</head>

<body>

<c:set var="str1" value="Functions <태그>를 사용합니다. " />

<c:set var="str2" value="사용" />

<c:set var="tokens" value="1,2,3,4,5,6,7,8,9,10" />


length(str1) = ${fn:length(str1)}

<br> toUpperCase(str1) = "${fn:toUpperCase(str1)}"

<br> toLowerCase(str1) = "${fn:toLowerCase(str1)}"

<br> substring(str1, 3, 6) = "${fn:substring(str1, 3, 6)}"

<br> substringAfter(str1, str2) = "${fn:substringAfter(str1, str2)}"

<br> substringBefore(str1, str2) = "${fn:substringBefore(str1, str2)}"

<br> trim(str1) = "${fn:trim(str1)}"

<br> replace(str1, src, dest) = "${fn:replace(str1, " ", "-")}"

<br> indexOf(str1, str2) = "${fn:indexOf(str1, str2)}"

<br> startsWith(str1, str2) = "${fn:startsWith(str1, 'Fun')}"

<br> endsWith(str1, str2) = "${fn:endsWith(str1, "합니다.")}"

<br> contains(str1, str2) = "${fn:contains(str1, str2)}"

<br> containsIgnoreCase(str1, str2) =

"${fn:containsIgnoreCase(str1, str2)}"

<br>


<c:set var="array" value="${fn:split(tokens, ',')}" />


join(array, "-") = "${fn:join(array, "-")}"

<br> escapeXml(str1) = "${fn:escapeXml(str1)}"

<br>


</body>

</html>


----------------------------------


contains - 대소문자 구분

containsIgnoreCase-대소문자 구분하지 않고 


split은 array로 만들어주는 함수 '3'

join은 array를 묶는 것


----------------------

mvc_team 고치고 있음

<body>

<div class="content">

<c:choose>

<c:when test="${flag}">

팀정보를 생성했습니다.<br>

<input type = 'button' value = '목록' onclick = 'listT()'>

<input type = 'button' value = '다시등록' onclick = 'createT()'> <br>

</c:when>

<c:otherwise>

팀정보 생성을 실패했습니다.

<input type = 'button' value = '다시실행' onclick = 'history.back()'>

</c:otherwise>

</c:choose>

</div>




</body>


이렇게 if else 문을 choose - when&otherwise로 고침



==========================3ㅅ ㅣ13분---


String root = request.getContextPath();

<%root> 이거


${pageContext.request.contextPath}


========================


getAttribute 와 getParameter 의 차이

Study_Web/Web Common 2012.03.20 20:25

<getParameter>

- GET / POST 방식으로 파라미터 값을 넘기고, 그 값을 사용할때 쓰는 메소드가 getParameter이며, 리퀘스트 영역에 있는 메소드입니다.
- getParameter는 String타입으로 반환합니다.

 <getAttribute>

- getAttribute는  page, request, response, session, application과 같은 스코프 영역에 임의의
   속성값(Attribute)을 저장하고 가져올 때 사용하는 것입니다.
- 거의 모든영역에서 공통적으로 사용하는 메소드로 해쉬맵방식으로 key값 value값을 
   settAttribute메소드를 이용해서 저장하고

   getAttribute메소드를 이용해서 반환받습니다.
- getAttribute는 Object타입을 반환합니다. 




































5. 수업

진도: 

hw: 


6. 할것


'Programming' 카테고리의 다른 글

160516: 43회차  (0) 2016.05.16
160513: 42회차  (0) 2016.05.13
160511: 40회차  (0) 2016.05.11
160510: 39회차  (0) 2016.05.10
160509: 38회차  (0) 2016.05.09
Posted by DAVID

160511: 40회차

Programming 2016. 5. 11. 18:00

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


오전에는 그거했음

-어제하던거


[18] EL(Expression Language), 클래스 메소드의 사용, EL 비 활성화(Resin)

[01] EL(표현 언어, Expression Language) 
   - EL은 JSP 객체의 출력을 단순화하는 용도에 사용됩니다. 
   - JSP 2.0은 JSTL 1.1버전에 포한된 EL의 기능을 제공합니다. 
   - 스크립틀릿(<%%>)보다 사용법이 간단합니다. 
   - 실습을 위해서 Tomcat 5.0.X이상, Resin 3.0.X이상 설치 하세요. 
   - 값이 없는 경우 "null"값을 출력하지 않습니다. 
   - EL은 JSP 내부 객체에 접근하여 출력을 처리합니다. 
   - 기본적으로 자바의 문법이 적용됩니다.    
   - EL이 인식이 안되면 페이지 상단에 <%@ page isELIgnored="false"%> 를 선언하면 됩니다. 
     <%@ page isELIgnored="false" contentType = "text/html; charset=UTF-8" %> 
   - 표현 방법 ${expr} 


1. 표현 언어의 연산자   

        연  산   자                                설          명 
   ------------------------------------------------------------------------ 
        .                            빈의 프로퍼티나 맵(Map)의 엔트리 접근 
        []                          배열이나 리스트(List) 엘리먼트 접근 
        ()                          괄호, 표현식의 연산 순서를 바꿔서 연산하게 할 때 
        a?b:c                     조건 테스트 - 조건(a)? true일때 리턴 값(b),false일때 리턴값(c) 
        + , -, *                   사칙 연산 :  더하기, 배기, 곱하기  
        / 또는 div               나누기 
        % 또는 Mod            나머지 
        == 또는 =                같다. =은 권장 아님 
        !=                          다르다  
        < 또는 lt                 보다 작다 less then
        > 또는 gt                보다 크다 great then
        <= 또는 le              작거나 같다  less equal

        >= 또는 ge             크거나 같다. great equal
        && 또는 and          논리 AND 
        || 또는 or              논리 OR 
        ! 또는 not              단항 not(true를 false로 false를 true로) 
        empty                  빈 변수 값 체크, null, 빈 문자열, 빈 배열등 인지를 테스트 - 데이터가 있는지 없는지 쳌
        func(args)            함수 호출, func 함수 이름이고 args는 인자로 없을 수도 있고,  
                                   한 개 혹은 쉼표(,)로 분리된 여러 개의 함수 인자를 가질 수도 있다. 






2. JSP 내부 객체에 접근하기위해 EL에서 제공하는 객체 
   - pageContext        : PageContext 객체 
   - pageScope          : page 영역에 포함된 객체 
   - requestScope      : request 영역에 포함된 객체 
   - sessionScope     : session 영역에 포함된 객체 
   - applicationScope : application 영역에 포함된 객체 
   - param                : HTTP의 파라미터들 
   - paramValues      : 하나의 파라미터의 값들 
   - header               : 헤더 정보들 
   - headerValues     : 하나의 헤더의 값들 
   - cookie               : 쿠키들 
   - initParam           :컨텐츠의 초기화 파라미터들 






3. EL 객체의 사용예 
   1) ${pageContext.request.requestURI}: request URI 
   2) ${sessionScope.profile}                 : session 영역에서 profile이라는 이름으로 
                                                           저장된 객체 
   3) ${param.productId}                        : productId라는 이름의 파라미터 값 
   4) ${paramValues.productId}              : productId라는 이름의 파라미터 값들 
   5) ${pageContext.request.contextPath}: Context Path 추출  


$ 가 <%=%>대신에 쓰는 거임 - 출력용!



응 그래요 ^^... 라서 예제를 볼 거임



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

pageEncoding="UTF-8"%>

<%


request.setAttribute("name","자바 개발자");

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>EL Object</title>

</head>

<body>

<h2>

request의 name 속성(스크립틀릿의 친구 표현식 방식): <%=request.getAttribute("name")%> <br> 

request의 name 속성(EL-requestScope.name): ${requestScope.name} <br /><br /> 

<!-- ㅁㅁ영역의 속성값을 나타낼때 ㅁㅁScope.ㅁㅁ의이름 -->

request의 name 속성(EL-name): ${name} <br /><br /> 

<!-- requestScope가 기본값이라서 name만 적어도 requestScope.name이래! - 근데 sessionScope는 기본이 아님 -->

</h2>

</body>

</html>


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


<html> 

<head><title>EL Object</title></head> 

<body> 


<h2> 

<%  

// http://localhost:8000/mvc_test/el/elParam.jsp 

// http://localhost:8000/mvc_test/el/elParam.jsp?code=ABCDE 


String code = request.getParameter("code"); %> 

code 파라미터(스크립틀릿 방식): <% out.println(code);%> <br> 


<!-- 위에애랑 밑에애랑 같은데 넘나 밑에애가 좋은것 -->


code 파라미터(EL 방식): ${param.code} <br /> 

</h2> 


</body> 

</html> 


ㅇㅇ

으 예제에 키아누 리브스 있음

넘나 옛날것



내가 보려고



결국 맞았군


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


<h2> 

<% 

request.setAttribute("name", "가길동"); 

request.setAttribute("tot", 190); 

request.setAttribute("avg", 95); 

%> 


<% 

// Scriptlet을 이용한 경우 

String name = (String)request.getAttribute("name"); 

Object  obj = request.getAttribute("tot"); 

Integer itg = (Integer)obj; 

int tot = itg.intValue(); 

int avg = ((Integer)(request.getAttribute("avg"))).intValue(); 


out.println("성명: " + name + "<br/>"); 

out.println("총점: " + (tot) + "<br/>"); 

out.println("가산점: " + (tot+5) + "<br/>"); 

out.println("평균: " + avg + "<br/>"); 

%> 


<br><br> 

성명:${name}<br> 

총점:${tot}<br> 

가산점:${tot+5}<br> 

평균:${avg} 점<br> 

</h2> 





▣ 표현언어에서의 클래스 메소드의 사용 
   - static 메소드만 사용이 가능합니다. 

1. DateUtil.java 
package el; 

import java.util.Date; 
import java.text.SimpleDateFormat; 

public class DateUtil { 
    private static SimpleDateFormat formatter =  
                new SimpleDateFormat("yyyy-MM-dd"); 
     
    public static String format(Date date) { 
        return formatter.format(date); 
    } 
} 




2. WEB-INF/tlds/el-functions.tld 
   - 클래스파일을 작성한 후 TLD파일을 작성합니다. 
   - TLD는 Tag Library Descriptor의 약자로 태그라이브러리에 대한 
      설정 정보를 담고 있습니다. 
   - dateFormat 함수를 호출하면 format함수가 매핑되어 호출됩니다. 




일반적으로 tld는 xml 파일임 -ㅅ- - 다른것도 있긴 함


<?xml version="1.0" encoding="UTF-8" ?> 이게 맨 처음 문장에 와야 함 (엔터 치면 안됨)





http://www.lectureblue.pe.kr/reqtiles/read.jsp?bbsno=150&nowPage=1&col=&word=&code=9

[19] JSTL(JSP Standard TAG Library)의 사용, EL and JSTL의 사용 1

[01]  JSTL(JSP Standard TAG Library)의 사용 
   - 많이 사용되는 사용자 정의 태그를 모아서 JSTL이라는 규약이 만들어졌습니다.   
   - 스크립틀릿, 표현식을 사용하는 것보다 훨씬 간결한 문법 구조를 지원합니다. 
   - JSTL은 5가지의 태그를 지원합니다. 
   - jstl API (http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html) 


라이브러리     기능                                 접두어         관련 URL 
----------------------------------------------------------------------------- 
Core              변수지원,흐름제어,URL처리       c     http://java.sun.com/jsp/jstl/core ★ 
XML              XML코어,흐름제어,XML변환         x     http://java.sun.com/jsp/jstl/xml 
국제화           지역,메시지형식,숫자및날짜형식   fmt   http://java.sun.com/jsp/jstl/fmt 
데이터베이스  SQL                                       sql   http://java.sun.com/jsp/jstl/sql 
함수              콜렉션 처리, String 처리            fn     http://java.sun.com/jsp/jstl/functions ★ 



1. 설치 
   - http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/  
     에서 다운합니다. 

   - 압축을 해제한 후  
    "F:\JAVA\jstl\jakarta-taglibs-standard-20050804\jakarta-taglibs\standard\lib" 
     폴더안에 있는 'jstl.jar', 'standard.jar'파일을 "D:\tomcat-5.0.19\common\lib" 
     폴더로 복사합니다. 
     . Resin은 'C:\ojt\resin-3.0.14\lib'폴더에 같다 붙입니다. 





▣ Core Tag 

기능        태그명     기능설명 
--------------------------------------------------------------------------- 
변수 지원   set        jsp에서 사용될 변수를 설정합니다. 
               remove     설정한 변수를 제거합니다.  //request session이 살아있는 동안 뭐라고? -_-);; 

ㅇ... 쓰코프...ㅇ

ㅇㅋ...


^^

★
--------------------------------------------------------------------------- 
흐름 제어   if         조건에 따라 내부 코드를 수행합니다. 
               choose     다중 조건을 처리할 때 사용됩니다. 
               forEach    Collection의 각 항목을 처리할 때 사용합니다. 
               forTokens  구분자로 분리된 각각의 토큰을 처리할 때 사용합니다.  
    


--------------------------------------------------------------------------- 
URL 처리    import     URL을 사용하여 다른 자원의 결과를 삽입합니다. 
                redirect   지정한 경로로 이동합니다. 
                url        URL을 재 작성합니다.  
--------------------------------------------------------------------------- 
기타 태그   catch      예외 처리에 사용합니다. 
                out        jspWriter에 내용을 알맞게 처리한 후 출력합니다. 
--------------------------------------------------------------------------- 

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

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  

<c:set var="num1" value="${20}" /> 

<c:set var="num2"> 

10.5 

</c:set> 

<c:set var="today" value="<%= new java.util.Date() %>" /> 


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

변수 num1 = ${num1} <br> <!-- request가 우선순위긴 한데 없으니까 위에서 num1 변수를 인식함 -->

변수 num2 = ${num2} <br> 

num1 + num2 = ${num1 + num2} <br> 

오늘은 ${today} 입니다. 


<c:remove var="num1" scope="page" /> 


<p> 

삭제한 후의 num1 = ${num1} <br> 

삭제한 후의 num1 + num2 = ${num1 + num2} 

</body>

</html>


-----------------------------


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

pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:set var="map" value="<%= new java.util.HashMap() %>" />

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<c:set target="${map}" property="name" value="인뿌라" /> <!-- 이게 set request인건가 -->

<c:set target="${map}" property="aromi" value="덴뿌라" /> 

<h2> 

변수 map에 저장된 name 값: ${map.name}<br> 

변수 map에 저장된 name 값: ${map.aromi} 


</body>

</html>


----------------------------------------


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

    pageEncoding="UTF-8"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<c:if test="true"> 

무조건 수행<br> 

</c:if> 


<c:if test="${param.name == 'tree'}"> 

name 파라미터의 값이 ${param.name} 입니다.<br> 

</c:if> 


<c:if test="${18 < param.age}"> 

당신의 나이는 18세 이상입니다. 

</c:if> 


<!-- 지금은 else가 없음  앞으로도 없는건가 그리고 test라고 꼭 써줘야함-->


</body>

</html>


----------------------------------------


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

    pageEncoding="UTF-8"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<ul> 

<c:choose>  

<!-- else if가 없는 대신 when을 쓰면 첫번째 when은 if고 두번째 when은 else if 고 마지막 when은 else 되는 것 -->

  <c:when test="${param.name == 'tree'}" >  

    <li> 당신의 이름은 ${param.name} 입니다. 

  </c:when>  

  <c:when test="${param.age > 18}" >  

    <li> 당신은 18세 이상입니다. 

  </c:when>  

  <c:otherwise>  

    <li> 당신은 'bk'가 아니고 18세 이상이 아닙니다. 

  </c:otherwise>  

</c:choose>  

</ul> 


</body>

</html>


[20] JSTL(JSP Standard TAG Library)의 사용, EL and JSTL의 사용 2

[03] JSTL(JSP Standard TAG Library)의 사용, EL and JSTL의 사용 2 

-  EL & JSTL의 사용 - Core Tag: URL 처리 태그의 사용 

<%@ page contentType = "text/html; charset=UTF-8" 

  isELIgnored="false" %> 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<c:import url="url.jsp" var="urlEx" /> 

<c:import url="http://127.0.0.1:8000/mvc_test/jstl/header.jsp" var="head"> 

    <c:param name="id" value="tree" /> 

</c:import> 

<c:import url="footer.jsp" var="foot" /> 


<html> 

<head><title>import와 url 태그</title></head> 

<body> 


${head} 


${urlEx} 


${foot} 


</body> 

</html> 



include같은 건데 import랑 차이점은 자기 자원이 아니어도 접근 가능


▣ EL & JSTL의 사용 - Core Tag: 기타 태그들 

1. out 태그 
   - JspWriter에 데이터를 출력합니다. 
   - <pre>~</pre>는 공백과 엔터를 있는 그대로 출력을 합니다. 
   - escapeXml="true": < <, > >, & &, ' ', " " 



ㅇㅇ


19랑 20 보기 :>

넘나재밌는것












5. 수업

진도: 

hw: 


6. 할것


엉덩이

'Programming' 카테고리의 다른 글

160513: 42회차  (0) 2016.05.13
160512: 41회차  (0) 2016.05.12
160510: 39회차  (0) 2016.05.10
160509: 38회차  (0) 2016.05.09
160504: 37회차  (0) 2016.05.04
Posted by DAVID

160510: 39회차

Programming 2016. 5. 10. 17:48

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것



download 처리시 web.xml에 서블릿 생성해 놔야 함  


  <servlet>

  <servlet-name>fileDown</servlet-name>

<servlet-class>utility.FileDownload</servlet-class>

  </servlet>

  

  <servlet-mapping>

  <servlet-name>fileDown</servlet-name>

<url-pattern>/download</url-pattern>

  </servlet-mapping>

  

-----------------


필터도 사용하는 것 똑같음



  

  <filter>

  <filter-name>adminCheck</filter-name>

<filter-class>utility.AdminLoginCheckFilter</filter-class>


  </filter>

  

  <filter-mapping>

  <filter-name>adminCheck</filter-name>

  <url-pattern>/admin/*</url-pattern> <!-- admin 경로를 포함하고 있는 모든 것 -->

  </filter-mapping>

  

-----------------



이클립스 eclipse 한글 깨지는 것 고치기

help -> eclipse marketplace




  


톰캣 에러 Several ports (8005, 8009) required by Tomcat v7.0 Server at localhost (2) are already in use. 오류 고치기

그냥 시리얼 포트를 바꿔주니까 됨...



shutdown은 안먹힘

  



5. 수업

진도: 

hw: 


6. 할것


eclipse 세팅 한 것


1. tomcat

2. commons lib 2개 다운로드

http://pc-cat.tistory.com/entry/160421-28%ED%9A%8C%EC%B0%A8

3. 오라클 연결 - 테이블 다 밀었음.


안 한 것 찾아보기.


<<안한것>>

4. 템플릿 세팅

http://pc-cat.tistory.com/entry/160415-24%ED%9A%8C%EC%B0%A8




'Programming' 카테고리의 다른 글

160512: 41회차  (0) 2016.05.12
160511: 40회차  (0) 2016.05.11
160509: 38회차  (0) 2016.05.09
160504: 37회차  (0) 2016.05.04
160503: 36회차  (1) 2016.05.03
Posted by DAVID

160509: 38회차

Programming 2016. 5. 9. 18:30

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


web.xml servlet 선언하는 법 :>






application 은 JSP 내부객체라서 - JSP 안 쓸 때는 못 씀 - 그래서 request로 고쳤군


1. 기본 객체


 기본 객체

 실제 타입 

 설명 

 request

 javax.servlet.http.HttpServletRequest 

 클라이언트의 요청 정보를 저장한다. 

 response

 javax.servlet.http.HttpServletResponse 

 응답 정보를 저장한다. 

 pageContext 

 javax.servlet.jsp.PageContext 

 JSP 페이지에 대한 정보를 저장한다. 

 session 

 javax.servlet.http.HttpSession 

 HTTP 세션 정보를 저장한다. 

 application 

 javax.servlet.ServletContext 

 웹 어플리케이션에 대한 정보를 저장한다. 

 out 

 javax.servlet.jsp.JspWriter 

 JSP 페이지가 생성하는 결과를 출력할 때 사용되는 출력 스트림이다. 

 config

 javax.servlet.ServletConfig 

 JSP 페이지에 대한 설정 정보를 저장한다. 

 page

 java.lang.Object 

 JSP 페이지를 구현한 자바 클래스 인스턴스이다. 

 exception

 java.lang.Throwable 

 익셉션 객체, 에러 페이지에서만 사용된다. 


출처: http://gangzzang.tistory.com/entry/JSP-%EA%B8%B0%EB%B3%B8-%EA%B0%9D%EC%B2%B4-out-pageContext-application-page




세션 쓸 때는

package action.member;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import action.Action;

import model.member.MemberDAO;

import model.member.MemberDTO;


public class ReadAction implements Action {


@Override

public String execute(HttpServletRequest request, HttpServletResponse response) throws Throwable {

// TODO Auto-generated method stub


String id = request.getParameter("id");

// 일반사용자가 로그인후 나의정보를 클릭하고 올때

if (id == null) {

id = (String) request.getSession().getAttribute("id"); //ㅋㅋㅋㅋㅋㅋㅋㅋㅋrequest.getSession()

}

MemberDAO dao = new MemberDAO();

MemberDTO dto = dao.read(id);

request.setAttribute("dto", dto);


return "/view/member/read.jsp";

}


}


넘나 짱나는것ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

출석일 8/8~8/9로 바꿈 -그럼 10 11 12 13 14 15 쉼 
ㅇㅋ


세션은 가져다 쓸 떄

request.getSession() 하면 됨 ㅋㅋㅋㅋ







5. 수업

진도: 

hw: 


6. 할것


실행 명령어 만들기

1. eclipse 

2. 공유폴더

3. 선생님공유폴더


//만듬

크롬이랑 파이어폭스랑 익스플로러 초기화 할 것



게임 중독자 5일 남은것...★★

5일 뒤면 끝남



아니 집컴 왜 초기화 했어야 하지 -_-?

'Programming' 카테고리의 다른 글

160511: 40회차  (0) 2016.05.11
160510: 39회차  (0) 2016.05.10
160504: 37회차  (0) 2016.05.04
160503: 36회차  (1) 2016.05.03
160502: 35회차  (0) 2016.05.02
Posted by DAVID

160504: 37회차

Programming 2016. 5. 4. 12:05

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


오늘은 넘나 좋은 우리의친구 team 프로젝트 (팀 프로젝트가 아니라 프로젝트 이름이 team인 것)

를 모델 2 타입으로 바꿔 볼 겁니다


web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <display-name>mvc_team</display-name>

  

  <servlet>

<servlet-name>controller</servlet-name>

  <servlet-class>controller.Controller</servlet-class>

  <init-param>

  <param-name>configFile</param-name>

  <param-value>D:/javadb/web/workspace_mvc/mvc_team/WebContent/WEB-INF/config/action-config.properties</param-value>

  <!-- init() 호출 할 때 내용을 읽어와서 해시맵에 저장할 거라서 절대경로를 써줘야함 -> 역슬래시를 슬래시로 바꿔야함! :) -->

  </init-param>

  <init-param>

  <param-name>templatePage</param-name>

  <param-value>/template/template.jsp</param-value>

  <!-- 얘는 forward 방식으로 받는 거라서 이렇게 써도 됨 :> -->

  </init-param>

  </servlet>

  

  <servlet-mapping>

  <servlet-name>controller</servlet-name>

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

  

  

  

  

  

  

  

  

  

  

  

  

  

  

</web-app>




-----------------------------------------




5. 수업

진도: 

hw: 


6. 할것


게임 중독자 하지 말 것... -_-);;

'Programming' 카테고리의 다른 글

160510: 39회차  (0) 2016.05.10
160509: 38회차  (0) 2016.05.09
160503: 36회차  (1) 2016.05.03
160502: 35회차  (0) 2016.05.02
160429: 34회차  (0) 2016.04.29
Posted by DAVID

160503: 36회차

Programming 2016. 5. 3. 17:56

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


Eclipse 

Class Not Found Exception


고치는 법은


1. Class 가 없나 확인해본다.


2. Class 가 있는데도 실행이 안 될 경우에는


1) Workspace가 있는 경로의 build 파일을

D:\javadb\web\workspace_mvc\mvc_board\build\classes


2) Metadata가 있는 경로에서 확인해 보면 아마 폴더만 있거나 생성이 안 되어 있을 것이니까

저 빌드 파일을 여기에 복사 붙여넣기 한다.

D:\javadb\web\workspace_mvc\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\mvc_board\WEB-INF



아침에 오자마자 고침 -_-)...

어제까지 되다가 껐다 키니까 빌드가 사라지는 기적...



앞으로는 try catch finally 안하고 try finally 하고 throws 해주기로 함 - 어짜피 manager에서 exception 처리 해주니까



졸음코딩하다가 12시 20분부터 12시 50분까지 한 30분 잤음...

으 좀 괜찮다...


카페인이 안 들어있다고 했다가 들어있다고 했다가 하는 컨피던스를 샀습니다.

오로나민C 왜 품절이져...2+1이긴 한디... 저번 주에 나한테는 1+1이라고 말 안해서 알바가 하나 챙긴 기억이 나네여...


넘나 어려운 트랜잭션(Transaction)


public boolean reply(BoardDTO dto) {

boolean flag = false;

Connection con = DBOpen.getConnection();

try{

//TRANSACTION 처리

//1. ansnum 증가(update)

//2. 답변을 생성(create)한다

// 둘 중 하나가 안 되면 취소되야함

con.setAutoCommit(false); //executeUpdate시 자동으로 Database가 처리하지 못하도록 false로 바꿈


//1. ansnum 증가(update)

dao.upAnsnum(dto.getRef(), dto.getAnsnum(), con); //부모의 ref와 같으면서 ansnum보다 커야하니까

//2. 답변을 생성(create)한다

flag = dao.replyCreate(dto, con);

//1이나 2가 rollback 됨을 처리하려고 같은 connection을 쓴다. 

con.commit(); //위에서 executeUpdate시 자동으로 Database가 처리하지 못하도록 false로 바꿈

//상태였는데 이제 commit 하면 db에 정말로 저장이 된다.

}catch(Exception e){

try {

con.rollback(); //오류가 났을 때 catch로 오니까 여기서 rollback(복귀) 해준다.

} catch (SQLException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

e.printStackTrace();

}finally {

try {

con.setAutoCommit(true); //다시 자동으로 Database가 처리하도록 true 로 바꿈

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} 

DBClose.close(con);

}

return flag;

}


}



---------------------------------------------------------------------------------------

트랜잭션 트랜젝션 트랜스액션 (내가 검색하는 용으로)


예시는

A계좌 - 100만원

B계좌 - 200만원


1) B에서 100출금해서

2) A로 100 입금하고 싶을 떄


1)+2)가 계좌이체이다! -> 원자성을 가진다.


만약에

1) 성공

2) 오류가 나면 1)이 취소되어서 돈이 돌아와야함! - 분리할 수 없는 작업


1) DAO 1개

2) DAO 1개


총 DAO 2개지면 Manager에서 하나의 단위로 묶는다 - 트랜잭션


트랜스 액션 트랜잭션 트랜젝션 Transaction 이다


-----------------------------------------------------------------------------------------------------------


ReplyProcAction.java


package action;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.apache.commons.fileupload.FileItem;


import model.BoardDTO;

import model.BoardMgr;

import utility.UploadSave;

import utility.Utility;


public class ReplyProcAction implements Action {


@Override

public String execute(HttpServletRequest request, HttpServletResponse response) throws Throwable {

// TODO Auto-generated method stub

BoardDTO dto = new BoardDTO();

String upDir = request.getRealPath("/view/storage");

String tempDir = request.getRealPath("/view/temp");

UploadSave upload = new UploadSave(request, -1, -1, tempDir);


int num = Integer.parseInt(upload.getParameter("num"));

int ref = Integer.parseInt(upload.getParameter("ref"));

int ansnum = Integer.parseInt(upload.getParameter("ansnum"));

int indent = Integer.parseInt(upload.getParameter("indent"));

String nowPage = upload.getParameter("nowPage");

String col = upload.getParameter("col");

String word = UploadSave.encode(upload.getParameter("word"));


String name = UploadSave.encode(upload.getParameter("name"));

String subject = UploadSave.encode(upload.getParameter("subject"));

String content = UploadSave.encode(upload.getParameter("content"));

String passwd = UploadSave.encode(upload.getParameter("passwd"));


FileItem fileItem = upload.getFileItem("filename");

int filesize = (int) fileItem.getSize();

String filename = "";


if (filesize > 0) {


filename = UploadSave.saveFile(fileItem, upDir);

}


// dto.setNum(num); - 새롭게 생성하는 부분이니까 num을 넣어주지 않음


dto.setName(name);

dto.setSubject(subject);

dto.setContent(content);

dto.setPasswd(passwd);

dto.setFilename(filename);

dto.setFilesize(filesize);

dto.setRefnum(num); // 부모글 확인 컬럼

dto.setRef(ref);

dto.setIndent(indent);

dto.setAnsnum(ansnum);

dto.setIp(request.getRemoteAddr());


BoardMgr mgr = new BoardMgr();

boolean flag = mgr.reply(dto);


request.setAttribute("flag", flag);

request.setAttribute("nowPage", nowPage);

request.setAttribute("col", col);

request.setAttribute("word", word);


return "/view/replyProc.jsp";

}


}


------------------------------------------------

매니저에서 reply


public boolean reply(BoardDTO dto) {
boolean flag = false;
Connection con = DBOpen.getConnection();
try{
//TRANSACTION 처리
//1. ansnum 증가(update)
//2. 답변을 생성(create)한다
// 둘 중 하나가 안 되면 취소되야함
con.setAutoCommit(false); //executeUpdate시 자동으로 Database가 처리하지 못하도록 false로 바꿈

//1. ansnum 증가(update)
dao.upAnsnum(dto.getRef(), dto.getAnsnum(), con); //부모의 ref와 같으면서 ansnum보다 커야하니까
//2. 답변을 생성(create)한다
flag = dao.replyCreate(dto, con);
//1이나 2가 rollback 됨을 처리하려고 같은 connection을 쓴다. 
con.commit(); //위에서 executeUpdate시 자동으로 Database가 처리하지 못하도록 false로 바꿈
//상태였는데 이제 commit 하면 db에 정말로 저장이 된다.
}catch(Exception e){
try {
con.rollback(); //오류가 났을 때 catch로 오니까 여기서 rollback(복귀) 해준다.
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
con.setAutoCommit(true); //다시 자동으로 Database가 처리하도록 true 로 바꿈
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 
DBClose.close(con);
}
return flag;
}
-----------------------------------------------------------------------------







mvc_board.zip

























5. 수업

진도: 

hw: 


6. 할것



//parameter랑 attribute차이... :>
오늘은 아파도 문제 풀고 잘 것... - 아예 세트로 된 거 한 세트 풀고 자기! :>

parameter : 브라우저(사용자)에서 넘어온 값

attribute : 개발자가 코딩으로 설정하는 값

그래서 HttpServletRequest 명세를 보면 setAttribute 는 있지만 setParameter 는 없습니다.

출처: http://okky.kr/article/287288


getParameter와 getAttribute 차이

Development/JSP & Servlet 2012.03.28 21:50



GET / POST 방식으로 파라미터 값을 넘기고, 그 값을 사용할때 쓰는 메소드가 getParameter

 

request, session 등등과 같은 영역에 임의의 속성값(Attribute)을 저장하고 가져올때 사용하는것이

 

set/getAttribute()입니다.


getParameter는 리퀘스트 영역에 있는 메소드 입니다...

 

아실거라 생각하지만....스코프에는 page , request, response , session , aplication 등이 있습니다...

 

getAttribute에 경우 위에있는 모든영역에 공통으로 있는 메소드로...

 

 헤쉬맵 방식으로....키값과 벨류값으로 setAttribute 한 값을 키값을 이용해 벨류값을

 

반환받을수 있습니다...

 

일단 큰차이로는 벨류값에 타입인데요...

 

getParameter는 스트링 타입입니다....

 

그리고 getAttribute 는 오브젝트 타입입니다...

 

getParameter는 스트링값을 다루기때문에 주로 쿼리스트링값등을 받는데 사용되고....

 

getAttribute는 오브젝트 타입을 다루기때문에 자바빈객체나 뭐 다른클레스객체등을 받을때 사용합니다..


출처: http://linuxism.tistory.com/497













http://egloos.zum.com/elindreams/v/821839
이거도 확인해 볼 것






//스크립틀릿에는 일반자바소스코드를 그대로 코딩하기떄문에 끝에 반드시 세미콜론이 있어야한다.

'Programming' 카테고리의 다른 글

160509: 38회차  (0) 2016.05.09
160504: 37회차  (0) 2016.05.04
160502: 35회차  (0) 2016.05.02
160429: 34회차  (0) 2016.04.29
160428: 33회차  (0) 2016.04.28
Posted by DAVID

160502: 35회차

Programming 2016. 5. 2. 17:35

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[09] [MVC][board] web 개발환경 설정, DB 설정

[01] MVC 기반의 게시판 구현 


     - URI상에 있는 주소를 얻어와 명령어로 처리하는 태턴입니다. 

1. Web Application 설정 
      
     - Eclipse Setting 
       . Project Type: Dynamic Web Project 
       . Project Name: mvc_board  
       . Dynamic Web Module: 3.0 
       . Java Compiler: 1.7 
       . Package Name: model, controller, action, utility(beans)

     - 폴더 구조 
       mvc_board/WebContent/view         : 게시판 관련 jsp 파일 
       mvc_board/WebContent/view/storage : 파일이 전송되어 저장되는 폴더 
       mvc_board/WebContent/view/temp    : 파일 전송시 임시 저장 폴더 
       mvc_board/WebContent/template     : template 관련 파일들 
       mvc_board/WEB-INF                 : web.xml 환경 설정 파일 위치 
       mvc_board/WEB-INF/classes         : 서블릿 클래스 위치, 자동 생성 
       mvc_board/WEB-INF/config          : properties 파일등, 기타 리소스 파일  
       mvc_board/WEB-INF/lib             : jar 파일의 라이브러리 위치 



[02] WebContent/WEB-INF/sql/board.sql



1. 게시판 데이터베이스 구조 


DROP TABLE board CASCADE CONSTRAINTS PURGE; 

 

CREATE TABLE board ( 

       num                  NUMBER(6) NOT NULL,      -- 글 일련 번호 

       name                 VARCHAR(10) NOT NULL,    -- 글쓴이 성명 

       subject              VARCHAR(100) NOT NULL,   -- 제목 

       content              VARCHAR(4000) NOT NULL,  -- 내용 

       ref                  NUMBER(5) NOT NULL,      -- 부모글 번호(그룹번호) 

       indent               NUMBER(2) DEFAULT 0 NOT NULL, -- 답변여부,깊이 

       ansnum               NUMBER(5) DEFAULT 0 NOT NULL, -- 답변 순서(최신답변은 부모글 바로 아래 달려집니다.) 

       regdate              DATE NOT NULL,           -- 글 등록일 

       passwd               VARCHAR(15) NOT NULL,    -- 패스워드 

       count                NUMBER(5) DEFAULT 0 NOT NULL,      -- 조회수  

       ip                   VARCHAR(15) NOT NULL,    -- 글쓴이 IP  

       filename             VARCHAR(50) NULL,        -- 파일명  

       filesize             NUMBER(7) NULL,          -- 파일 사이즈 

       refnum               NUMBER    DEFAULT 0,          -- 답변확인 컬럼 

       PRIMARY KEY (num) 

); 

 

 

 

--  Sequence Object 

 

    CREATE SEQUENCE board_seq 

    START WITH   1         --시작번호 

    INCREMENT BY 1         --증가값 

    MAXVALUE     99999     --최대값 

    CACHE 20               --시쿼스 변경시 자주 update되는 것을 방지하기위한 캐시값 

    NOCYCLE;     

    

-- Sequence 만드는 규칙 create SEQUENCE 테이블명_컬럼명 (어떠한 테이블의 시퀀스임을 알려주려고)


 

 

     

select * from BOARD 

 

-- 단순한 데이터 출력 

-- rownum: 가상 컬럼, SELECT시에 동적으로 일련번호를 생성합니다. 

SELECT num, name, subject, regdate, rownum FROM board; 

 

 

-- 내림 차순 출력, rownum컬럼은 ORDER BY 문 보다 먼저 생성됩니다. 

SELECT num, name, subject, regdate, rownum FROM board 

ORDER BY name DESC; 

 

 

-- 서브쿼리와 rownum의 출력, 내부 쿼리는 정렬 실행,  

-- 외부 쿼리는 rownum 일련번호 산출 

SELECT num, name, subject, regdate, rownum r 

FROM ( 

      SELECT num, name, subject, regdate FROM board 

      ORDER BY name DESC 

) 

 

 

 

-- r컬럼을 인식을 못합니다. 

SELECT num, name, subject, regdate, rownum r 

FROM ( 

      SELECT num, name, subject, regdate FROM board 

      ORDER BY name DESC 

) 

WHERE r >= 1 and r <= 5; 

 

 

 

-- rownum을 이용한 페이징 출력, 1~5번 레코드만 출력 

SELECT num, name, subject, regdate, r 

FROM( 

    SELECT num, name, subject, regdate, rownum r 

    FROM ( 

        SELECT num, name, subject, regdate FROM board 

--        where subject like '%게%' 

--        or content like '%게%' 

        ORDER BY num DESC 

    ) 

) 

WHERE r >= 6 and r <=10; 

 

 

-- 6 ~ 10번 레코드만 출력 

SELECT num, name, subject, regdate, r 

FROM( 

    SELECT num, name, subject, regdate, rownum r 

    FROM ( 

        SELECT num, name, subject, regdate FROM board 

        ORDER BY num DESC 

    ) 

) 

WHERE r >= 6 and r <= 10; 

 

select num,ref,indent,ansnum,refnum,subject 

from board 

order by ref DESC, ansnum 

 

 

 

select * from board 


 

---몬가 복붙을 많이 했음...---

넘나 머리가 아픈것


오늘도 폴더를 압축해서 가져갈거 같은 예감..

시험이 6일남았으니 넘나 바쁨...



Controller가 하는 것은 Hashmap의 정보를 읽어다가 쓰는 것

ㅁ.do를 전달받으면 init()에서 action을 분류한 후 요청한다! (properties에 정의해놓은 것)


transaction 하기 위해서 close하는 메소드를 con 따로 pstmt 따로 짠다 :>


까지 점심 전에 했습니다.




--------------------------------------------------------------------------------------------


//액션이 가져야 할 기능 - 모델 사용 - 결과를 리퀘스트에 저장 - 뷰페이지 리턴



listAction.java


package action;


import java.util.HashMap;

import java.util.List;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import model.BoardDTO;

import model.BoardMgr;

import utility.Paging;

import utility.Utility;




public class ListAction implements Action {


@Override

public String execute(HttpServletRequest request, HttpServletResponse response) throws Throwable {

// TODO Auto-generated method stub

int nowPage = 1;

int recordPerPage = 5;

if(request.getParameter("nowPage") != null){

nowPage = Integer.parseInt(request.getParameter("nowPage"));

}

int sno = ((nowPage - 1) * recordPerPage) + 1;

int eno = nowPage * recordPerPage;

request.setCharacterEncoding("UTF-8"); //word 때문에 한글화 해줌

String col = Utility.nullCheck(request.getParameter("Col"));

String word = Utility.nullCheck(request.getParameter("word"));

if(col.equals("total")){

word = "";

}

Map map = new HashMap();

map.put("sno", sno);

map.put("eno", eno);

map.put("col", col);

map.put("word", word);

//액션이 가져야 할 기능 - 모델 사용 - 결과를 리퀘스트에 저장 - 뷰페이지 리턴

//모델 사용

BoardMgr mgr = new BoardMgr();

List<BoardDTO> list = mgr.list(map);

int total = mgr.total(map);

String paging = new Paging().paging3(total, nowPage, recordPerPage, col, word);

//결과를 리퀘스트에 저장

request.setAttribute("list", list);

request.setAttribute("paging", paging);

//페이징 유지를 위해서 nowpage, col, word도 가져감


request.setAttribute("nowPage", nowPage);

request.setAttribute("col", col);

request.setAttribute("word", word);

//뷰페이지 리턴

String url = "/view/list.jsp";

return url;

}


}



mvc_board.zip



























5. 수업

진도: 

hw: 


6. 할것


http://luckybluegifs.co.vu/page/13

즐겨찾기 지우려고 저장한 것



접속용nosqljava/bigdataaa

'Programming' 카테고리의 다른 글

160504: 37회차  (0) 2016.05.04
160503: 36회차  (1) 2016.05.03
160429: 34회차  (0) 2016.04.29
160428: 33회차  (0) 2016.04.28
160427: 32회차  (1) 2016.04.27
Posted by DAVID

160429: 34회차

Programming 2016. 4. 29. 11:59

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


오라클 오류나서 

http://bubblecat.co.kr/103


로 고쳤음




2. properties 이용 클래스 

>>>>> src/test/properties/PropertyTest.java 

package test.properties2; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.util.Iterator; 
import java.util.Properties; 

public class PropertyTest { 

    public static void main(String[] args) { 
        Properties prop = new Properties(); 
         
        FileInputStream fis = null;   // 파일을 읽어 오는 역활을 합니다. 
        //  경로  산출 
        File file = new File("jdbc.properties"); 
        System.out.println("절대경로: " + file
.getAbsoluteFile()); 
                
        try { 
            fis = new FileInputStream(file); 
            //속성 파일을 객체로 로딩, 키와 문자열 값으로 저장됩니다. 
            prop.load(fis); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } finally { 
            if (fis != null) try { fis.close(); } catch(IOException ex) {} 
        } 
         
        // properties 객체에서 키목록을 추출합니다. 
        // driver, url, account, password 
        Iterator keyIter = prop.keySet().iterator(); 
        while( keyIter.hasNext() ) { 
            String key = (String)keyIter.next();  //키 추출 
            String value = prop.getProperty(key); //키에 따른 값 추출 
            System.out.println(key + "=" + value); 
        } 
         
        Connection con = null; 
        PreparedStatement pstmt = null; 
        ResultSet rs = null; 
        String sql = ""; 
        String driver = ""; 
        String url = ""; 
        String account = ""; 
        String password=""; 
         
        driver = prop.getProperty("driver"); 
        url = prop.getProperty("url"); 
        account = prop.getProperty("account"); 
        password = prop.getProperty("password"); 

        try{ 
            Class.forName(driver); 
            con = DriverManager.getConnection(url, account, password); 
            sql = "SELECT count(*) cnt FROM tab"; 
            pstmt = con.prepareStatement(sql); 
            rs = pstmt.executeQuery(); 
            if (rs.next()){ 
                System.out.print(account + " 계정의 테이블 갯수: "); 
                System.out.println(rs.getInt("cnt")); 
            } 
        }catch(Exception e){ 
            System.out.println(e); 
        }         
    } 
} 




▷ 아래의 속성 파일을 이용해 사칙연산을 수행하는 자바 프로그램을 
   작성하세요. 

   >>>>> calc.properties 
   su1 = 50 
   su2 = 10 

    
   >>>>> Calc.java 




3. 문자열 추출 

>>>>> StringTest.java 

package test.properties; 

public class StringTest { 

    public static void main(String[] args) { 
        String mapping = "/mvc/hello.do"; 
         
        // 'hello.do' 문자열의 추출 
        System.out.println(mapping); 
        System.out.println("-----------------------"); 
        System.out.print(mapping.charAt(0));   // '/' 
        System.out.print(mapping.charAt(1));   // 'm' 
        System.out.print(mapping.charAt(2));   // 'v' 
        System.out.println(mapping.charAt(3)); // 'c' 
        System.out.println("-----------------------");         
        System.out.println("mapping.substring(5): " + mapping.substring(5)); 
        System.out.println("-----------------------");         
         
        // 문자열이 '/mvc'로 시작하는지 검사하여 boolean값 리턴 
        System.out.println("startsWith: " + mapping.startsWith("/mvc")); 

        // 문자열이 '/mvc'로 끝나는지 검사하여 boolean값 리턴 
        System.out.println("endsWith: " + mapping.endsWith("/hello.do"));         
         
        // 마지막으로 "/"문자가 나타난 index 값 리턴 
        int index = mapping.lastIndexOf("/"); 
        System.out.println("index: " + index); 
         
        System.out.println("substring(index+1): " + mapping.substring(index+1)); 
         
        System.out.println("substring(0, 3): " + mapping.substring(0, 3));   
         
    } 
} 





>>>>> StringTest2.java 

package test.properties; 

public class StringTest2 { 

    public static void main(String[] args) { 
         
        String str = "mail@domain.com"; 
     
        pl("ⓐ '@'문자가 있는지의 여부를 출력하는 루틴 제작"); 
        pl(str.indexOf('@'));      // 4 
        pl(str.indexOf('X'));      // 존재하지 않음으로 -1 
        pl(str.indexOf("domain")); // domain 문자열의 시작위치 5 
        pl(str.indexOf('.'));      // 11 
        pl(str.length());          // 15 
        pl(str.replaceAll("domain", "www.java")); // mail@www.java.com 

        for(int i=0; i < str.length(); i++){ 
            p(str.charAt(i)); 
        } 

    } 
     
    public static void pl(String str){ 
        System.out.println(str); 
    } 

    public static void pl(int i){ 
        System.out.println(i); 
    } 
     
    public static void p(char i){ 
        System.out.print(i); 
    }     
} 





▷ 콘솔상에서 파일명을 입력받아 파일명과 확장자를 추출하여 
   출력하는 프로그램을 작성하세요. 
   단, 잘못된 파일명(abc, .txt, abc.)을 입력했을때 오류메세지 출력후  
   다시 입력받아 처리 할 수 있도록 작성하세요 

    InputStream i = System.in; 
   //BufferedReader  r = new BufferedReader(new InputStreamReader(i)); 
   System.out.println("파일명을 입력하세요"); 
   //String file = r.readLine(); 


   Scanner r = new Scanner(System.in); 
   System.out.println("파일명을 입력하세요"); 
   String file = r.nextLine(); 

   System.out.println(file); 
   
   while(true){ 

     1. 오류파일 검사(indexOf(), startsWith(), endsWith()) 
         1-1 오류파일인경우  
             - 메세지 출력  
             - 다시 file입력받기 
         1-2 정상적인 파일인 경우 
             - .의 위치 추출(indexOf()) 
             - .의 앞부분 문자열값 추출(substring()) 
             - .의 뒤부분 문자열값 추출 
             - 출력하고 break; 

    } 



    
   --- 실행 결과 --- 
   파일명을 입력하세요.: abc.txt 
    
   파일명은 abc 입니다. 
   파일의 확장자는 txt 입니다. 


   파일명을 입력하세요.: abc.html 
    
   파일명은 abc 입니다. 
   파일의 확장자는 html 입니다. 


이거 짰음


package test.properties;


import java.util.Scanner;


/*

 * 

▷ 콘솔상에서 파일명을 입력받아 파일명과 확장자를 추출하여 

   출력하는 프로그램을 작성하세요. 

   단, 잘못된 파일명(abc, .txt, abc.)을 입력했을때 오류메세지 출력후  

   다시 입력받아 처리 할 수 있도록 작성하세요 


 * */


public class StringTested {

public static void main(String[] args) {


Scanner scanner = new Scanner(System.in);


while (true) {

System.out.print("파일명을 입력하세요: ");

String file = scanner.nextLine();

System.out.println(file);


int filesize1 = file.indexOf(".");

String filename = file.substring(0, filesize1);

int filesize2 = file.lastIndexOf(".");

String filetype = file.substring(filesize2 + 1);


if (file.startsWith(".") || file.endsWith(".")) {

System.out.println("다시 입력해 주세요.");

}


else {

System.out.println("파일명: " + filename);

System.out.println("확장자: " + filetype);

break;

}

}

}


}


친절하지 않은 나의 코드
저기 if문 안에 file.size(1) 도 넣을 것



[03] Class class 
package test.properties; 

/** 표준 인터페이스 */ 
interface Action{ 
    public void execute(); 
} 

class Spring implements Action{ 
    public void execute(){ 
        System.out.println("따뜻한 봄 입니다. - 새싹"); 
    } 
} 

class Summer implements Action{ 
    public void execute(){ 
        System.out.println("더운 여름입니다. - 바다"); 
    } 
} 

class Fall implements Action{ 
    public void execute(){ 
        System.out.println("시원한 가을입니다. - 등산"); 
    } 
} 

class Winter implements Action{ 
    public void execute(){ 
        System.out.println("눈이오는 겨울입니다. - X-MAS"); 
    } 
} 

public class ClassTest { 

    public static void main(String[] args) { 
         
        String className = args[0]; // 실행할 클래스명, 패키지 포함 
        
        //Class.forName으로 객체를 생성하면 jvm으로 소스를 로딩한다.
        //클래스를 오브젝트형으로 형변환했당 :>
        
        
        try{ 
            Class object = Class.forName(className); // JVM으로 소스 로딩 
            Action instance = (Action)object.newInstance(); // 객체 생성 
            instance.execute(); 
        }catch(Exception e){ 
            System.out.println(e); 
        } 

    } 

} 

이거 실행하려면 run configuration에 test.properties.Winter 이런 식으로 넣ㅇ ㅓ줘야 한당...
클래스명, 패키지 포함인것


2. 다른 페이지 요청

   
forward
1번을 요청할 때 생긴 resource는 2번을 요청하는 resource랑 같은 애다

redirect
1번을 요청할떄 생긴 resource는 2번을 요청할 떄 생긴 resource랑 다르다
2번 호출하기 전에 1번거는 끝남



(1)   response.sendRedirect( ); 

      -  재요청에대한 응답으로  다른 페이지로 이동합니다.
     
     -  새로운 request객체가 생성되므로  기존 request영역에 저장된 모든 

        데이타가 없어집니다.




 (2)  <jsp:forward page="" />

      - 기존요청에 대신 응답으로 다른페이지로 이동합니다.

     - 기존의 request객체가 살아있으므로 그영역의 저장된 모든 데이타는

       유지됩니다.


---------------------------------------------------------


(3)  <jsp:include page=""/>

    - 다른 자원을 요청 페이지에 포함 시킵니다.



    
서블렛2의 응답이 서블렛1의 응답하고 합쳐져서 보내짐...
(실행된 결과가 합쳐짐)




--------------------
리퀘스트 테스트

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>
<center>
<%
//request.getParameter = 전에 애가 넘겨준 파라미터 받는 용
//request.setAttribute는 getAttribute랑 짝
request.setAttribute("name", "개발자");
out.println("name: " + request.getAttribute("name") + "<br/>");

request.setAttribute("count", 0);//boxing - new Integer(0): 그래서 해시코드가 들어감
out.println("count: " + request.getAttribute("count") + "<br/>");

Object obj = request.getAttribute("count");
int count = (Integer) obj;
count = count + 100;
request.setAttribute("count", count);

out.println("count: " + request.getAttribute("count") + "<br/>");
%>
</center>
</h2>
</body>
</html>
</html>

------------------------------
디티오

package test.request; 

public class PageInfo { //DTO 같은 것
    private int nowPage = 0; 
    private String searchColumn = ""; 
    private String searchWord = ""; 
     
    /** 
     * 기본 생성자 
     */ 
    public PageInfo() { 
        super(); 
        // TODO Auto-generated constructor stub 
    } 

    /** 
     * @param nowPage 
     * @param searchColumn 
     * @param searchWord 
     */ 
    public PageInfo(int nowPage, String searchColumn, String searchWord) { 
        super(); 
        this.nowPage = nowPage; 
        this.searchColumn = searchColumn; 
        this.searchWord = searchWord; 
    } 

    /** 
     * @return the nowPage 
     */ 
    public int getNowPage() { 
        return nowPage; 
    } 

    /** 
     * @param nowPage the nowPage to set 
     */ 
    public void setNowPage(int nowPage) { 
        this.nowPage = nowPage; 
    } 

    /** 
     * @return the searchColumn 
     */ 
    public String getSearchColumn() { 
        return searchColumn; 
    } 

    /** 
     * @param searchColumn the searchColumn to set 
     */ 
    public void setSearchColumn(String searchColumn) { 
        this.searchColumn = searchColumn; 
    } 

    /** 
     * @return the searchWord 
     */ 
    public String getSearchWord() { 
        return searchWord; 
    } 

    /** 
     * @param searchWord the searchWord to set 
     */ 
    public void setSearchWord(String searchWord) { 
        this.searchWord = searchWord; 
    } 

     
} 

-------------------------------------------

pageInfo_test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="test.request.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>
<center>
<%
// request에 객체 저장 
PageInfo info = new PageInfo();
request.setAttribute("info", info);

// "info"로 저장된 객체를 가져옴 
PageInfo temp = (PageInfo) request.getAttribute("info");

// 객체에 값 저장 
temp.setNowPage(1);
temp.setSearchColumn("title");
temp.setSearchWord("JSP");

// 새로 설정된 값을 가지고 있는 객체를 저장 
request.setAttribute("info", temp);

// "info"로 저장된 객체를 가져옴 
PageInfo pageinfo = (PageInfo) request.getAttribute("info");

// 값 출력 
out.println("nowPage: " + pageinfo.getNowPage() + "<br/>");
out.println("searchColumn: " + pageinfo.getSearchColumn() + "<br/>");
out.println("searchWord: " + pageinfo.getSearchWord() + "<br/>");

response.sendRedirect("test_proc.jsp");
%>
</center>
</h2>

</body>
</html>

-------------------------------------------------------
java.lang.NullPointerException
떠야 정상적임 -  response로 sendRedirect 해줘서 못 받습니다.

이건 forward로 보내줘서 잘 받습니다.

>>>>> pageInfo_test.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8" import="test.request.*"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
<h2><center> 
<% 
// request에 객체 저장 
PageInfo info = new PageInfo(); 
request.setAttribute("info", info); 

// "info"로 저장된 객체를 가져옴 
PageInfo temp = (PageInfo)request.getAttribute("info"); 

// 객체에 값 저장 
temp.setNowPage(1); 
temp.setSearchColumn("title"); 
temp.setSearchWord("JSP"); 

// 새로 설정된 값을 가지고 있는 객체를 저장 
request.setAttribute("info", temp); 

// "info"로 저장된 객체를 가져옴 
PageInfo pageinfo = (PageInfo)request.getAttribute("info"); 

// 값 출력 
out.println("nowPage: " + pageinfo.getNowPage() + "<br/>"); 
out.println("searchColumn: " + pageinfo.getSearchColumn() + "<br/>"); 
out.println("searchWord: " + pageinfo.getSearchWord() + "<br/>"); 

//response.sendRedirect("test_proc.jsp"); 
%> 
<jsp:forward page="/request/test_proc.jsp"/> 
</center></h2> 
</body> 
</html> 

-----------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8" import="test.request.*"%> 
<% 
PageInfo info = (PageInfo)request.getAttribute("info"); 
//sendredirect -null / forward - 값들어감
%>     
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center"> 
<h2> 
>>> test_proc.jsp 입니다.<br/> 
    nowPage:      <%=info.getNowPage() %> <br/> 
    searchColumn: <%=info.getSearchColumn() %> <br/> 
    searchWord:   <%=info.getSearchWord() %> <br/> 
</h2> 

</div> 
</body>
</html>

이건 proc.jsp



4. Controller의 처리순서 

         Browser --------> Servlet(Controller) 
                              1. HTTP 요청 받음, doGet(), doPost() 메소드 호출 
                              2. 클라이언트가 요구하는 기능을 분석(방명록의 경우 글쓰기등) 
                              3. 요청한 비즈니스 로직을 처리하는 Model 사용, Business Logic Class 
                              4. 결과를 request 또는 session의 setAttribute()메소드를 사용하여 저장 
                              5. 알맞은 뷰 선택 후, 
                              6. 뷰로 포워딩(또는 리다이렉트), jsp 페이지로 이동 
                            ↙ 
                         JSP 
                        ↙  
                     HTTP 응답 
                    ↙ 
         Browser 

요기서 345를 action한테 처리하라고 위임함!

[06] [MVC] MVC의 구현(Manager, Action)
[01] 템플릿 기반의 URI Command Pattern에 기반한 MVC의 구현 

     - URI상에 있는 주소를 얻어와 명령어로 처리하는 패턴입니다. 

이게바로 345를 action한테 처리하라고 위임하는 것이다.

     - Eclipse Setting 
       . Project Type: Dynamic Web Project 
       .         Name: www_mvc  
       . Package Name: mvc.action, mvc.controller 

     - 폴더 구조 
       www_mvc/WebContent/mvc/view        : jsp 파일들  
       www_mvc/WebContent/mvc/template    : template관련 파일들 
       www_mvc/WEB-INF         : web.xml 환경 설정 파일 위치 
       www_mvc/WEB-INF/classes : 서블릿 클래스 위치, 자동 생성 
       www_mvc/WEB-INF/config  : properties 파일등, 기타 리소스 파일  
       www_mvc/WEB-INF/lib     : jar 파일의 라이브러리 위치, 자동 생성 


졸았음... ㅠㅠ


]package mvc.action; 

import java.util.Date; 

public class CommandMgr { 

    /** 
     * 기본 생성자 
     */ 
    public CommandMgr() { 
        super(); 
    } 

    public StringBuffer getHello(){ 
        StringBuffer sb = new StringBuffer(); 
        sb.append("<li> 안녕하세요..MVC 입니다.<br>"); 
        sb.append("<li> Template Page<br>"); 
        sb.append("<li> URI Command Pattern<br>"); 
        sb.append("<li> Properties 파일을 이용한 처리입니다.<br>"); 
         
        return sb; 

    } 

    public String getDate(){ 
        Date dt = new Date(); 
        String str = dt.toLocaleString();  
         
        return str; 
    } 

} 


이건 beans (model)



2. Command Handler 

   - 인터페이스 또는 추상클래스로 구현 합니다. 
    
   - 비즈니스 로직 클래스(자식 클래스)들이 동일한 메소드를 실행 하도록 강제성 
     부여하며 표준 인터페이스 역활을 합니다. 

어떤 액션객체가 수행될 지 모르니까 인터페이스로 상속받아서 하는 것


456은 졸려서 헤멨으니까 점심때 꼭 봐야 함...

프로퍼티스 파일은 - 어떤 애가 실행되면 어떤 게 호출되는지 규약을 적어놓는 곳임 - 컨트롤러가 쓰라고

# command = Action class Mapping List
/mvc/hello.do=mvc.action.HelloAction
/mvc/date.do=mvc.action.DateAction

/mvc/*.do = ㅁㅁㅁㅁㅁ
이렇게 짜면 뭐가 오든지  컨트롤러에서 액션 처리해주는 것 :>



오 템플릿 넘나 좋은것
여기다가 위 아래 페이지 인크루드하고 내용도 인크루드하면 내용에다가 위 아래 안해줘도 됨



-----------------------------------------------------------
4. Controller의 처리순서 

         Browser --------> Servlet(Controller) 
                              1. HTTP 요청 받음, doGet(), doPost() 메소드 호출 
                              2. 클라이언트가 요구하는 기능을 분석(방명록의 경우 글쓰기등) 
                              3. 요청한 비즈니스 로직을 처리하는 Model 사용, Business Logic Class 
                              4. 결과를 request 또는 session의 setAttribute()메소드를 사용하여 저장 
                              5. 알맞은 뷰 선택 후, 
                              6. 뷰로 포워딩(또는 리다이렉트), jsp 페이지로 이동 
                            ↙ 
                         JSP 
                        ↙  
                     HTTP 응답 
                    ↙ 
         Browser 

345 - 액션에게 위임하고
6-컨트롤러가 직접 처리한다

1. 프로퍼티 파일에 명령어하고 액션이 정이되었나 봐야함

# action-config.properties
# command = Action class Mapping List
/mvc/hello.do=mvc.action.HelloAction
/mvc/date.do=mvc.action.DateAction
# /mvc/*.do=까지 하면 web.xml을 호출해줌

2. implements action을 하고 있는 액션 클래스가 있나 봐야함
2. 저 안에서 모델 사용할 객체를 생성하고 리턴값을 제대로 줬나 봐야함
package mvc.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DateAction implements Action {

@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Throwable {
// TODO Auto-generated method stub
CommandMgr mgr = new CommandMgr();
String date = mgr.getDate();
// 모델 사용할 객체 생성

request.setAttribute("date", date);

return "/mvc/view/date.jsp";

}

}


그리고 나서 서버를 재구동 했나 봐야함


-----------------------------------------------------------

컨트롤러는 HttpServlet을 구현해야함!

아--------------------

액션 만드는 법

package mvc.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyinfoAction implements Action {

@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Throwable {
//3. model 사용
CommandMgr mgr = new CommandMgr();
StringBuffer myinfo = mgr.getMyinfo();
//4. 결과를 request에 저장
request.setAttribute("myinfo", myinfo);
//5. view 페이지 리턴
return "/mvc/view/myinfo.jsp";
}

}


----------------------------------------------






























-----------------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------


















5. 수업

진도: 

hw: 


6. 할것


점심때 456 복습할 것! :>



Class.forName

            Class object = Class.forName(className); // JVM으로 소스 로딩 
            Action instance = (Action)object.newInstance(); // 객체 생성 
            instance.execute(); 
이거

클래스로더 1, 동적인 클래스 로딩과 클래스로더

Java 2000.07.16 07:52
동적인 클래스 로딩

자바는 동적으로 클래스를 읽어온다. 즉, 런타임에 모든 코드가 JVM에 링크된다. 모든 클래스는 그 클래스가 참조되는 순간에 동적으로 JVM에 링크되며, 메모리에 로딩된다. 자바의 런타임 라이브러리([JDK 설치 디렉토리]/jre/lib/rt.jar) 역시 예외가 아니다. 이러한 동적인 클래스 로딩은 자바의 클래스로더 시스템을 통해서 이루어지며, 자바가 기본적으로 제공하는 클래스로더는 java.lang.ClassLoader를 통해서 표현된다. JVM이 시작되면, 부트스트랩(bootstrap) 클래스로더를 생성하고, 그 다음에 가장 첫번째 클래스인 Object를 시스템에 읽어온다.

런타임에 동적으로 클래스를 로딩하다는 것은 JVM이 클래스에 대한 정보를 갖고 있지 않다는 것을 의미한다. 즉, JVM은 클래스의 메소드, 필드, 상속관계 등에 대한 정보를 알지 못한다. 따라서, 클래스로더는 클래스를 로딩할 때 필요한 정보를 구하고, 그 클래스가 올바른지를 검사할 수 있어야 한다. 만약 이것을 할 수 없다면, JVM은 .class 파일의 버전이 일치하지 않을 수 있으며, 또한 타입 검사를 하는 것이 불가능할 것이다. JVM은 내부적으로 클래스를 분석할 수 있는 기능을 갖고 있으며, JDK 1.1부터는 개발자들이 리플렉션(Reflection)을 통해서 이러한 클래스의 분석을 할 수 있도록 하고 있다.

로드타임 동적 로딩(load-time dynamic loading)과 런타임 동적 로딩(run-time dynamic loading)

클래스를 로딩하는 방식에는 로드타임 동적 로딩(load-time dynamic loading)과 런타임 동적 로딩(run-time dynamic loading)이 있다. 먼저 로드타임 동적 로딩에 대해서 알아보기 위해 다음과 코드를 살펴보자.

  public class HelloWorld {
     public static void main(String[] args) {
        System.out.println("안녕하세요!");
     }
  }

HelloWorld 클래스를 실행하였다고 가정해보자. 아마도, 명령행에서 다음과 같이 입력할 것이다.

  $ java HelloWorld

이 경우, JVM이 시작되고, 앞에서 말했듯이 부트스트랩 클래스로더가 생성된 후에, 모든 클래스가 상속받고 있는 Object 클래스를 읽어온다. 그 이후에, 클래스로더는 명령행에서 지정한 HelloWorld 클래스를 로딩하기 위해, HelloWorld.class 파일을 읽는다. HelloWorld 클래스를 로딩하는 과정에서 필요한 클래스가 존재한다. 바로 java.lang.String과 java.lang.System이다. 이 두 클래스는 HelloWorld 클래스를 읽어오는 과정에서, 즉 로드타임에 로딩된다. 이 처럼, 하나의 클래스를 로딩하는 과정에서 동적으로 클래스를 로딩하는 것을 로드타임 동적 로딩이라고 한다.

이제, 런타임 동적 로딩에 대해서 알아보자. 우선, 다음의 코드를 보자.

  public class HelloWorld1 implements Runnable {
     public void run() {
        System.out.println("안녕하세요, 1");
     }
  }
  public class HelloWorld2 implements Runnable {
     public void run() {
        System.out.println("안녕하세요, 2");
     }
  }

이 두 클래스를 Runnable 인터페이스를 구현한 간단한 클래스이다. 이제 실제로 런타임 동적 로딩이 일어나는 클래스를 만들어보자.

  public class RuntimeLoading {
     public static void main(String[] args) {
        try {
           if (args.length < 1) {
              System.out.println("사용법: java RuntimeLoading [클래스 이름]");
              System.exit(1);
           }
           Class klass = Class.forName(args[0]);
           Object obj = klass.newInstance();
           Runnable r = (Runnable) obj;
           r.run();
        } catch(Exception ex) {
           ex.printStackTrace();
        }
     }
  }

위 코드에서, Class.forName(className)은 파리미터로 받은 className에 해당하는 클래스를 로딩한 후에, 그 클래스에 해당하는 Class 인스턴스(로딩한 클래스의 인스턴스가 아니다!)를 리턴한다. Class 클래스의 newInstance() 메소드는 Class가 나타내는 클래스의 인스턴스를 생성한다. 예를 들어, 다음과 같이 한다면 java.lang.String 클래스의 객체가 생성된다.

  Class klass = Class.forName("java.lang.String");
  Object obj = klass.newInstance();

따라서, Class.forName() 메소드가 실행되기 전까지는 RuntimeLoading 클래스에서 어떤 클래스를 참조하는 지 알수 없다. 다시 말해서, RuntimeLoading 클래스를 로딩할 때는 어떤 클래스도 읽어오지 않고, RuntimeLoading 클래스의 main() 메소드가 실행되고 Class.forName(args[0])를 호출하는 순간에 비로서 args[0]에 해당하는 클래스를 읽어온다. 이처럼 클래스를 로딩할 때가 아닌 코드를 실행하는 순간에 클래스를 로딩하는 것을 런타임 동적 로딩이라고 한다.

다음은 RuntimeLoading 클래스를 명령행에서 실행한 결과를 보여주고 있다.

  $ java RuntimeLoading HelloWorld1
  안녕하세요, 1

Class.newInstance() 메소드와 관련해서 한 가지 알아둘 점은 해당하는 클래스의 기본생성자(즉, 파라미터가 없는)를 호출한다는 점이다. 자바는 실제로 기본생성자가 코드에 포함되어 있지 않더라도 코드를 컴파일할 때 자동적으로 기본생성자를 생성해준다. 이러한 기본생성자는 단순히 다음과 같이 구성되어 있을 것이다.

  public ClassName() {
     super();
  }

ClassLoader

자바는 클래스로더를 사용하고, 클래스를 어떻게 언제 JVM으로 로딩하고, 언로딩하는지에 대한 특정한 규칙을 갖고 있다. 이러한 규칙을 이해해야, 클래스로더를 좀 더 유용하게 사용할 수 있으며 개발자가 직접 자신만의 커스텀 클래스로더를 작성할 수 있게 된다.

클래스로더의 사용

이 글을 읽는 사람들은 거의 대부분은 클래스로더를 프로그래밍에서 직접적으로 사용해본 경험이 없을 것이다. 클래스로더를 사용하는 것은 어렵지 않으며, 보통의 자바 클래스를 사용하는 것과 완전히 동일하다. 다시 말해서, 클래스로더에 해당하는 클래스의 객체를 생성하고, 그 객체의 특정 메소드를 호출하기만 하면 된다. 간단하지 않은가? 다음의 코드를 보자.

  ClassLoader cl = . . . // ClassLoader의 객체를 생성한다.
  Class klass = null;
  try {
     klass = cl.loadClass("java.util.Date");
  } catch(ClassNotFoundException ex) {
     // 클래스를 발견할 수 없을 경우에 발생한다.
     ex.printStackTrace();
  }

일단 클래스로더를 통해서 필요한 클래스를 로딩하면, 앞의 예제와 마찬가지로 Class 클래스의 newInstance() 메소드를 사용하여 해당하는 클래스의 인스턴스를 생성할 수 있게 된다. 형태는 다음과 같다.

  try {
     Object obj = klass.newInstance();
  } catch(InstantiationException ex) {
     ....
  } catch(IllegalAccessException ex) {
     ....
  } catch(SecurityException ex) {
     ....
  } catch(ExceptionIninitializerError error) {
     ...
  }

위 코드를 보면, Class.newInstance()를 호출할 때 몇개의 예외와 에러가 발생하는 것을 알 수 있다. 이것들에 대한 내용은 Java API를 참고하기 바란다.

자바 2의 클래스로더

자바 2 플랫폼에서 클래스로더의 인터페이스와 세만틱(semantic)은 개발자들이 자바 클래스로딩 메커니즘을 빠르고 쉽게 확장할 수 있도록 하기 위해 몇몇 부분을 재정의되었다. 그 결과로, 1.1이나 1.0에 맞게 작성된 (커스텀 클래스로더를 포함한) 클래스로더는 자바 2 플랫폼에서는 제기능을 하지 못할 수도 있으며, 클래스로더 사용하기 위해 작성했던 코드를 재작성하는 것이 그렇게 간단하지만은 않다.

자바 1.x와 자바 2에서 클래스로더에 있어서 가장 큰 차이점은 자바 2의 클래스로더는 부모 클래스로더(상위 클래스가 아니다!)를 갖고 있다는 점이다. 자바 1.x의 클래스로더와는 달리, 자바 2의 클래스로더는 부모 클래스로더가 먼저 클래스를 로딩하도록 한다. 이를 클래스로더 딜리게이션 모델(ClassLoader Delegation Model)이라고 하며, 이것이 바로 이전 버전의 클래스로더와 가장 큰 차이점이다.

자바 2의 클래스로더 딜리게이션 모델에 대해 구체적으로 알아보기 위해 로컬파일시스템과 네트워크로부터 클래스를 읽어와야 할 필요가 있다고 가정해보자. 이 경우, 쉽게 로컬파일시스템의 jar 파일로부터 클래스를 읽어오는 클래스로더와 네트워크로부터 클래스를 읽어오는 클래스로더가 필요하다는 것을 생각할 수 있다. 이 두 클래스로더를 각각 JarFileClassLoader와 NetworkClassLoader라고 하자.

JDK 1.1에서, 커스텀 클래스로더를 만들기 위해서는 ClassLoader 클래스를 상속받은 후에 loadClass() 메소드를 오버라이딩하고, loadClass() 메소드에서 바이트코드를 읽어온 후, defineClass() 메소드를 호출하면 된다. 여기서 defineClass() 메소드는 읽어온 바이트코드로부터 실제 Class 인스턴스를 생성해서 리턴한다. 예를 들어, JarFileClassLoader는 다음과 같은 형태를 지닐 것이다.

  public class JarFileClassLoader extends ClassLoader {
     ...
     private byte[] loadClassFromJarFile(String className) {
        // 지정한 jar 파일로부터 className에 해당하는 클래스의
        // 바이트코드를 byte[] 배열로 읽어온다.
        ....
        return byteArr;
     }
     
     public synchronized class loadClass(String className, boolean resolveIt)
        throws ClassNotFoundException {
        
        Class klass = null;
        
        // 클래스를 로드할 때, 캐시를 사용할 수 있다.
        klass = (Class) cache.get(className);
        
        if (klass != null) return klass;
        
        // 캐시에 없을 경우, 시스템 클래스로더로부터
        // 지정한 클래스가 있는 지 알아본다.
        try {
           klass = super.findSystemClass(className);
           return klass;
        } catch(ClassNotFoundException ex) {
           // do nothing
        }
        
        // Jar 파일로부터 className이 나타내는 클래스를 읽어온다.
        byte[] byteArray = loadClassFromJarFile(className);
        klass = defineClass(byteArray, 0, byteArray.length);
        if (resolve)
           resolveClass(klass);
        cache.put(className, klass); // 캐시에 추가
        return klass;
     }
  }

위의 개략적인 코드를 보면, 시스템 클래스로더에게 이름이 className인 클래스가 존재하는 지 요청한다. (여기서 시스템 클래스로더 또는 primordial 시스템 클래스로더는 부트스트랩 클래스로더이다). 그런 후에, 시스템 클래스로더로부터 클래스를 읽어올 수 없는 경우 Jar 파일로부터 읽어온다. 이 때, className은 완전한 클래스 이름(qualified class name; 즉, 패키지이름을 포함한)이다. NetworkClassLoader 클래스 역시 이 클래스와 비슷한 형태로 이루어져 있을 것이다. 이 때, 시스템 클래스로더와 그 외의 다른 클래스로더와의 관계는 다음 그림과 같다.


위 그림을 보면, 각각의 클래스로더는 오직 시스템 클래스로더와 관계를 맺고 있다. 다시 말해서, JarFileClassLoader는 NetworkClassLoader나 AppletClassLoader와는 관계를 맺고 있지 않다. 이제, A라는 클래스가 내부적으로 B라는 클래스를 사용한다고 가정해보자. 이 때, 만약 A 클래스는 네트워크를 통해서 읽어오고, B라는 클래스는 Jar 파일을 통해서 읽어와야 한다면? 이 경우에 어떻게 해야 하는가? 쉽사리 해결책이 떠오르지 않을 것이다. 이러한 문제는 JarFileClassLoader와 NetworkClassLoader 간에 유기적인 결합을 할 수 없기 때문에 발생한다.

자바 2에서는 이러한 문제를 클래스로더 딜리게이션 모델을 통해서 해결하고 있다. 즉, 특정 클래스로더 클래스를 읽어온 클래스로더(이를 부모 클래스로더라고 한다)에게 클래스 로딩을 요청하는 것이다. 다음의 그림을 보자.


이 그림은 자바 2에서 클래스로더간의 관계를 보여주고 있다. 이 경우, NetworkClassLoader 클래스는 JarFileClassLoader가 로딩하고, JarFileClassLoader 클래스는 AppClassLoader가 로딩하였음을 보여준다. 즉, JarFileClassLoader는 NetworkClassLoader의 부모 클래스로더가 되고, AppClassLoader는 JarFileClassLoader의 부모 클래스로더가 되는 것이다.

이 경우, 앞에서 발생했던 문제가 모두 해결된다. A 클래스가 필요하면, 가장 먼저 NetworkClassLoader에 클래스로딩을 요청한다. 그럼, NetworkClassLoader는 네트워크로부터 A 클래스를 로딩할 수 있으므로, A 클래스를 로딩한다. 그런 후, A 클래스는 B 클래스를 필요로 한다. B 클래스를 로딩하기 위해 NetworkClassLoader는 JarFileClassLoader에 클래스 로딩을 위임(delegation)한다. JarFileClassLoader는 Jar 파일로부터 B 클래스를 읽어온 후 NetworkClassLoader에게 리턴할 것이며, 따라서 NetworkClassLoader는 Jar 파일에 있는 B 클래스를 사용할 수 있게 된다. 앞의 JDK 1.1에서의 클래스로더 사이의 관계에 비해 훨씬 발전적인 구조라는 것을 알 수 있다.

앞에서 말했듯이, 자바 2에서는 몇몇 클래스로더 메커니즘을 재정의하였다. 이 때문에, JDK 1.1에서의 클래스로더에 관한 몇몇개의 규칙이 깨졌다. 먼저, loadClass() 메소드를 더 이상 오버라이딩(overriding) 하지 않고, 대신 findClass()를 오버라이딩한다. loadClass() 메소드는 public에서 protected로 변경되었으며, 실제 JDK1.3의 ClassLoader 클래스의 소크 코드를 보면 다음과 같이 정의되어 있다.

  // src/java/lang/ClassLoader.java
  public abstract class ClassLoader {
      /*
       * The parent class loader for delegation.
       */
      private ClassLoader parent;
      
      protected synchronized Class loadClass(String name, boolean resolve)
      throws ClassNotFoundException
      {
          // First, check if the class has already been loaded
          Class c = findLoadedClass(name);
          if (c == null) {
              try {
                  if (parent != null) {
                      c = parent.loadClass(name, false);
                  } else {
                      c = findBootstrapClass0(name);
                  }
              } catch (ClassNotFoundException e) {
                  // If still not found, then call findClass in order
                  // to find the class.
                  c = findClass(name);
              }
          }
          if (resolve) {
              resolveClass(c);
          }
          return c;
      }
      ....
  }

위 코드를 보면 부모 클래스로더로부터 먼저 클래스 로딩을 요청하고, 그것이 실패할 경우(즉, catch 블럭)에 비로소 직접 클래스를 로딩한다. 여기서 그렇다면 부모 클래스는 어떻게 결정되는 지 살펴보자. 먼저 JDK 1.3의 ClassLoader 클래스는 다음과 같은 두 개의 생성자를 갖고 있다.

  protected ClassLoader(ClassLoader parent) {
      SecurityManager security = System.getSecurityManager();
      if (security != null) {
          security.checkCreateClassLoader();
      }
      this.parent = parent;
      initialized = true;
  }
  protected ClassLoader() {
      SecurityManager security = System.getSecurityManager();
      if (security != null) {
          security.checkCreateClassLoader();
      }
      this.parent = getSystemClassLoader();
      initialized = true;
  }

이 두 코드를 살펴보면, 부모 클래스로더를 지정하지 않을 경우, 시스템 클래스로더를 부모 클래스로더로 지정하는 것을 알 수 있다. 따라서 커스텀 클래스로더에서 부모 클래스로더를 지정하기 위해서는 다음과 같이 하면 된다.

  public class JarFileClassLoader extends ClassLoader {
     public JarFileClassLoader () {
        super(JarFileClassLoader.class.getClassLoader());
        // 다른 초기화 관련 사항
     }
     ....
     public Class findClass(String name) {
        // 지정한 클래스를 찾는다.
     }
  }

모든 클래스는 그 클래스에 해당하는 Class 인스턴스를 갖고 있다. 그 Class 인스턴스의 getClassLoader() 메소드를 통해서 그 클래스를 로딩한 클래스로더를 구할 수 있다. 즉, 위 코드는 JarFileClassLoader 클래스를 로딩한 클래스로더를 JarFileClassLoader 클래스로더의 부모 클래스로더로 지정하는 것이다. (실제로 커스텀 클래스로더를 구현하는 것에 대한 내용은 이 Article의 시리중에서 3번째에 알아보기로 한다).

JVM에서 부모 클래스로더를 갖지 않은 유일한 클래스로더는 부트스트랩 클래스로더이다. 부트스트랩 클래스로더는 자바 런타임 라이브러리에 있는 클래스를 로딩하는 역할을 맡고 있으며, 항상 클래스로더 체인의 가장 첫번째에 해당한다. 기본적으로 자바 런타임 라이브러리에 있는 모든 클래스는 JRE/lib 디렉토리에 있는 rt.jar 파일에 포함되어 있다.

결론

이번 Article에서는 자바에서 클래스 로딩이 동적으로 이루어지면, 클래스 로딩 방식에서는 로드타임 로딩과 런타임 로딩의 두 가지 방식이 있다는 것을 배웠다. 그리고 자바 2에서의 클래스로딩이 클래스로더 딜리게이션 모델(Classloader Delegation Model)을 통해서 이루어진다는 점과 이 모델에 자바 1.x에서의 클래스로딩 메커니즘과 어떻게 다르며, 어떤 장점이 있는 지 알아보았다. 다음 Article에서는 자바 2에서 기본적으로 제공하는 클래스로더에 대해서 알아보기로 한다.


출처: http://javacan.tistory.com/entry/1




Class.forName("package.ClassName")를 실행하는 경우 문자열로 전달되는 클래스가 존재하는 클래스를 메모리에 로드하는 역할을 한다. http://stackoverflow.com/questions/4202252/how-does-class-forname-work 글을 보면 대략적으로 이해할 수 있다.

Class.forName("com.mysql.jdbc.Driver");

위와 같이 구현할 경우 "com.mysql.jdbc.Driver" 클래스가 메모리에 로드된다. 메모리에 로드되면서 static 절이 실행된다. 그렇다면 "com.mysql.jdbc.Driver" 클래스 내부 소스를 보면 다음과 같다.

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        try {
           java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }


    [...]
}

Mysql JDBC Driver 소스코드는 http://www.docjar.com/html/api/com/mysql/jdbc/Driver.java.html 에서 확인할 수 있다.

이와 같이 DriverManager.registerDriver() 메소드를 통해 자기 자신을 등록하는 과정을 거친다.

Class.forName("com.mysql.jdbc.Driver")만 실행할 경우 특별히 다른 과정을 거치지 않았음에도 불구하고 JDBC Driver가 자동으로 등록되는 이유이다.

이와 같이 등록한 JDBC Driver는 Connection conn = DriverManager.getConnection(url + dbName,userName, password);에서 데이터베이스 Connection을 생성하는 시점에 사용되게 된다.

http://stackoverflow.com/questions/5484227/jdbc-class-forname-vs-drivermanager-registerdriver 이 문서도 읽어보면 좋겠다.

지금까지 아무 생각없이 그냥 그려려니 하면서 사용했는데 호기심에 찾아봤는데 나름 재미있네.

그럼 다음은 Class.forName("com.mysql.jdbc.Driver")와 Class.forName("com.mysql.jdbc.Driver").newInstance()의 무슨 차이가 있는지도 함 찾아보면 재미있겠다.


출처: https://slipp.net/questions/276



'Programming' 카테고리의 다른 글

160503: 36회차  (1) 2016.05.03
160502: 35회차  (0) 2016.05.02
160428: 33회차  (0) 2016.04.28
160427: 32회차  (1) 2016.04.27
160426: 31회차  (1) 2016.04.26
Posted by DAVID

160428: 33회차

Programming 2016. 4. 28. 00:15

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:



짤.egg

workspace_mvc.egg

홈페이지도 쓸 거면...!!


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[37] 서블릿을 이용한 다운로드
[01] 서블릿을 이용한 다운로드 

1. servlet 원리 
   - JSP로는 해결이 어려운 그래픽, 네트워크등의 콤포넌트 제작이 가능함. 

   - 웹사이트의 속도 개선을 위해 JSP보다 서블릿을 사용할 수 있으나 개발과 유지보수가 
     매우 어려움. 

   - 서블릿은 닷넷의 DLL과 비슷한 작동을 함. 

   - JSP는 실행시 서블릿으로 컴파일(변경)되어 실행됩니다. 
     WTP상에서의 서블릿 변환 위치:  
      
     test.jsp -> test_005_jsp.java -> test_005_jsp.class -> binary compile후 실행 

     재실행 

     test_005_jsp.class -> binary compile후 실행 


Windows:       D:\rfid02\ws_web\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\jsp_pds\org\apache\jsp\pds\test 
        
Linux: 
/home/dev/ws_jsp/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/www_jsp/org/apache/jsp 



//외울 것!
   - 서블릿의 생명주기: 관련 메소드가 자동으로 호출됨(CallBack Method). 
     . service()메소드에서 요청 처리를 하는 경우  
     init() ---> service() ---> destroy() 
     init() ---> doGet(), doPost() ---> destroy()

     ★ Tomcat 서버에서 jsp 파일이 실행되는 경로 
     ------------------------------------------- 
     컴파일 순서: index.jsp ---> index_jsp.java ---> index_jsp.class 컴파일 ---> 실행 
     메소드 실행 순서: _jspInit() --> _jspService() --> _jspDestroy()  

   - 서블릿에서의 출력 
     response.setContentType("text/html;charset=utf-8"); 

     PrintWriter out =  response.getWriter(); 
     request.setCharacterEncoding("euc-kr");  //한글처리 하려고! :>
     out.println("서블릿에서의 출력 테스트");  




// init = 응애 메소드 -.-) (최초에 한번 객체가 생성된 이후에 자동으로 호출되는 메소드 - 자기가 알아서)

// service = service가 호출되어지면 doGet이나 doPost를 자동으로 호출함!  방식의 차이임 - 

get방식 호출은 doGet / post방식 호출은 doPost



Init(): 처음 호출시

destroy(): 마지막에 연결 객체 끊어줄 때 자동으로 호출되는 메소드

service: 서블릿을 요청할 때 마다 호출되는 메소드 - 얘는 요청해야만 호출됨 - doGet doPost service는 요청이 있어야만 호출된다.



response.setContentType("text/html~); 은 page지시자의 contenttype이랑 같은 거임 

---------------------------------------------------------------------------------------------------------------
코드

package utility;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileDownload extends javax.servlet.http.HttpServlet {
//public class FileDownload extends HttpServlet 이거랑 같은 거임! :>
//얘를 상속해야만 servlet인 것
// 서블릿 버전, 생략 가능
static final long serialVersionUID = 1L;

// web.xml에 접근 가능 - 서버하고 소통하려면 web.xml에 접근해야 한다.
private ServletConfig config = null;

// 기본 생성자
public FileDownload() {
super();
}

/**
* 톰캣 실행시 최초 1번만 실행 됩니다. init()은 생략가능
* 
* @param config
*            web.xml에 접근가능, 서블릿 환경 정보 저장 객체
*/
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
}

// Form - get 방식 처리
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doProcess(request, response);
}

// Form - post 방식 처리
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doProcess(request, response);
}

//위에 두 개... doGet이랑 doPost의 parameter를 보면 service()의 매개변수를 알 수 있음.
protected void doProcess(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext ctx = config.getServletContext();

// 저장 폴더를 절대 경로로 변환
String dir = ctx.getRealPath(request.getParameter("dir"));

// 파일명 받기
String filename = request.getParameter("filename");

// 전체 절대 경로 조합
File file = new File(dir + "/" + filename);
String fileStr = dir + "/" + filename;
String contentType = getType(fileStr);
System.out.println("다운로드 타입: " + contentType);

String disposition = getDisposition(filename, getBrowser(request));
response.addHeader("Content-disposition", disposition);
response.setHeader("Content-Transfer-Encoding", "binary");
response.setContentLength((int) file.length());
response.setContentType(contentType);
response.setHeader("Connection", "close");

// 파일을 읽어올 크기 지정
byte buffer[] = new byte[4096];

try {
if (file.isFile()) {
// 파일을 읽어 오는 역활
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

// 사이트에 접속된 접속자에게 출력
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

int read = 0;
// bis.read(buffer): 파일에서 4KB씩 읽어서
// buffer에 저장
// 파일의 끝이면 -1
while ((read = bis.read(buffer)) != -1) {
// 접속자로 출력
bos.write(buffer, 0, read);
} // while
bis.close();
bos.close();
}

} catch (Exception e) {

}
}

public String getType(String fileUrl) {
String type = "";
fileUrl = "file:" + fileUrl;
try {
URL u = new URL(fileUrl);
URLConnection uc = u.openConnection();
type = uc.getContentType();

} catch (Exception e) {
System.out.println(e.toString());
}

return type;
}

public String getBrowser(HttpServletRequest request) {
String header = request.getHeader("User-Agent");
if (header.indexOf("MSIE") > -1) {
return "MSIE";
} else if (header.indexOf("Chrome") > -1) {
return "Chrome";
} else if (header.indexOf("Opera") > -1) {
return "Opera";
}
return "Firefox";
}

public static synchronized String getDisposition(String filename, String browser) {
String dispositionPrefix = "attachment;filename=";
String encodedFilename = null;
try {
if (browser.equals("MSIE")) {
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
} else if (browser.equals("Firefox")) {
encodedFilename =

"\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Opera")) {
encodedFilename =

"\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Chrome")) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < filename.length(); i++) {
char c = filename.charAt(i);
if (c > '~') {
sb.append(URLEncoder.encode("" + c, "UTF-8"));
} else {
sb.append(c);
}
}
encodedFilename = sb.toString();
} else {
System.out.println("Not supported browser");
}
} catch (Exception e) {

}

return dispositionPrefix + encodedFilename;
}

}


이것은 FileDownload.java


---------------------------------------------------------------------------------------------------------------



D:\javadb\web\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Homepage\WEB-INF\classes

이렇게 WEB-INF에 있는 것은 브라우저에서 접근 불가능이지만

servlet은 가능! :> 


new 이런거 안하고 톰캣이 알아서 객체를 생성함

web.xml이라는 곳에다가 서블릿의 객체를 생성해달라고 선언해놔야함


1. 브라우저에서 어떠한 뭐시기를 함

2. 서부릿에서 web.xml에다가 객체를 생성해달라고 부탁함

3. 톰캣이 객체를 생성함



저렇게 web-inf에다가 web.xml을 만들어준다


---------------------------------------------------------------------------------------------------------------------------------------------


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

<display-name>jsp_blog</display-name>

<welcome-file-list>

<!-- 주소상에 도메이나 파일명을 입력했을 때 자동으로 실행되는 파일 목록, 가장 먼저 명시된 파일이 실행되고 없을시 다음 파일이 

실행됨. -->

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>


<session-config>

<session-timeout>30</session-timeout> <!-- 30분으로 연장한 것! 기준이 분임 :> -->

</session-config>


<!-- ************************************************************** -->

<!-- 파일 다운로드 서블릿 접속 주소가 http://127.0.0.1:8000/download로 시작하면 자동으로 utility.FileDownload 

클래스가 작동되게 되어 있습니다. , 프로젝트 전체에서 사용가능 -->

<servlet><!-- 서블릿 이름과 서블릿 클래스 선언 -->

<servlet-name>FileDownload</servlet-name><!-- 이름은 아무거나 써도 됨 -->

<servlet-class>utility.FileDownload</servlet-class><!-- 이건 매우 중요함 -->

</servlet>

<!-- 요기까지 하면 톰캣에서 객체를 생성해달라고 요청하는 것입니다 :) 그래서 요기까지만 해도 사용은 가능함! -->

<!-- 근데 브라우저 상에서 요청을 해야 하니까 servlet-mapping을 해줘야 함 -->

<servlet-mapping><!-- URL상으로 접근해야하는 경로명 -->

<servlet-name>FileDownload</servlet-name><!-- 위에 객체랑 같은 이름 -->

<url-pattern>/download</url-pattern><!-- servlet 요청을 저 경로로 하겠다. -->

</servlet-mapping>

<!-- ************************************************************** -->

</web-app>


----------------------------------------------------------------------------------------------------------------------------------------------



아 수업 하니까 넘나 재밌습니다.

셀프 제작 넘나 힘든것


---------------------------------------------------------



INSERT INTO member(id, passwd, mname, tel, email, zipcode,  

address1,address2, job, mdate, grade) 

VALUES('admin', '1234', '관리자', '123-1234', 'admin@mail.com',  

'123-123','서울시','종로구' ,'A01', sysdate, 'A'); 



member.sql에 이거 넣었음! :>


그리고 WebContent에 admin 이라는 폴더 만들어서 member의 list를 옮겼음



이건 코드 http://lectureblue.pe.kr/reqtiles/read.jsp?bbsno=107&nowPage=1&col=&word=&code=7

여깃거 볼 것... -.-







※※  브라우저 주소창에서 직접 주소를 입력하여 회원목록 페이지를 요청시
       권한이 없어도 그페이지가 열리는 버그발생
        Filter를 이용해서  버그 수정 할 수 있다.




[02] Filter 

    - 접속자의 요청을 처리하기전에 필터링하여 정상적인 요청인지 확인하고
       페이지를 전송해 줄 수 있습니다.
 
     - 처리 결과를 접속자에게 전송하기전에 필요한 처리를 중간에서 가로채어
       할 수 있습니다.
 
 

가로채기!

필터는 인터페이스! :>


뭔가 엄청 많이 합니다.


[38] [참고] 관리자 인증의 구현, Filter
[01] 회원목록
   
 - 관리자만 접근해야 하므로 admin폴더를 만들고 list.jsp 구현
 - member.sql에서 admin계정 추가
 - 관리자 권한이 있어야만 메뉴에 회원목록이 보여짐

 - menu/top.jsp 회원목록 메뉴 등록

<%@ page contentType="text/html; charset=UTF-8" %>  
<% 
String root = request.getContextPath(); 
String id=(String)session.getAttribute("id");
String grade=(String)session.getAttribute("grade");
%>
<html>
<head>
<style type="text/css">
ul#menu li{
display : inline;
}
ul#menu li a{
background-color: black;
color:white;
pading : 10px 20px;
text-decoration:none;
border-radius:4px 4px 0 0;
}
ul#menu li a:hover{
background-color: orange;
}
 
li#admin{
float:right;
padding-right: 30px
}
</style>
</head>
<body>
<!-- 상단 메뉴 -->
<div style="background-color: #EEEEEE;">
<table style="width: 100%">
  <tr>
    <td>
        <img src="<%=root %>/menu/images/main-03.jpg" width='100%' height='100%'>
    </td>
  </tr>
  
  <tr>
    <td>
    <ul id="menu">
     <li><a href="<%=root %>/index.jsp">홈</a></li>
    <%if(id==null){ %>    
     <li><a href="<%=root %>/member/loginForm.jsp">로그인</a></li>
     <li><a href="<%=root %>/member/agreement.jsp">회원가입</a></li>
     <li><a href="<%=root %>/member/idFindForm.jsp">아이디찾기</a></li>
     <li><a href="<%=root %>/member/pwFindForm.jsp">비밀번호찾기</a></li>
    <%}else{ %> 
     <li><a href="<%=root %>/member/logout.jsp">로그아웃</a></li>
     <li><a href="<%=root %>/member/read.jsp">나의정보</a></li>
     <li><a href="<%=root %>/member/updateForm.jsp">정보수정</a></li>
     <li><a href="<%=root %>/member/deleteForm.jsp">회원탈퇴</a></li>
     <li><a href="<%=root %>/member/updatePasswdForm.jsp">패스워드변경</a></li>
    <%} %>
     <li><a href="<%=root %>/bbs/list.jsp">게시판목록</a></li>
     <li><a href="<%=root %>/memov3/list.jsp">메모목록</a></li>
    <%if(id!=null && grade.equals("A")){ %>
     <li id="admin"><a href="<%=root %>/admin/list.jsp">회원목록</a></li>
    <%} %>
    </ul>
    </td> 
  </tr>
 
</table>
</div>
<!-- 상단 메뉴 끝 -->
 
 
 
<!-- 내용 시작 -->


- index.jsp 페이지의 변경 : 관리자로 로그인하였음을 나타냄

<%@ page contentType="text/html; charset=UTF-8" %> 
<% 
request.setCharacterEncoding("utf-8"); 
String id=(String)session.getAttribute("id");
String grade=(String)session.getAttribute("grade");
String title="나의 여행 블로그";
if(id!=null && grade.equals("A")){
   title="관리자 페이지";
}
   
%> 
 
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title></title> 
<style type="text/css"> 
*{ 
  font-family: gulim; 
  font-size: 20px; 
} 
</style> 
<link href="./css/style.css" rel="Stylesheet" type="text/css">
</head> 
<!-- *********************************************** -->
<body leftmargin="0" topmargin="0">
<jsp:include page="/menu/top.jsp" flush="false"/>
<!-- *********************************************** -->
 
<DIV class="title"><%=title %></DIV> 
 
<DIV class='content'> 
  <IMG src='./images/wol01.jpg' width='50%'><br> 
   
  <%  
 
   
  if (id == null){%> 
    <input type='button' value='로그인' 
           onclick="location.href='./member/loginForm.jsp'">   
  <% 
  }else{%> 
    <input type='button' value='로그아웃' 
           onclick="location.href='./member/logout.jsp'"> 
  <% 
  }%> 
   
</DIV> 
 
<DIV class="bottom"></DIV> 
 
 
<!-- *********************************************** -->
<jsp:include page="/menu/bottom.jsp" flush="false"/>
</body>
<!-- *********************************************** -->
</html> 
 

※※  브라우저 주소창에서 직접 주소를 입력하여 회원목록 페이지를 요청시
       권한이 없어도 그페이지가 열리는 버그발생
        Filter를 이용해서  버그 수정 할 수 있다.


[02] Filter 

    - 접속자의 요청을 처리하기전에 필터링하여 정상적인 요청인지 확인하고
       페이지를 전송해 줄 수 있습니다.
 
     - 처리 결과를 접속자에게 전송하기전에 필요한 처리를 중간에서 가로채어
       할 수 있습니다.
 
 
 
1. request, response 객체를 최종적으로 처리되기 전에 변경 할 수 있는
   기능를 제공합니다.
 
   - 유형 1
   jsp ---> request ---> Filter  ---> JSP, Servlet, Beans
                                                       │
                                                       │
   jsp <--- reponse <--- Filter  <------┘                             
 
   - 유형 2: Filter chain
   jsp ---> request ---> Filter  ---> Filter ---> JSP, Servlet, Beans
                                                                       │
                                                                       │
   jsp <--- reponse <--- Filter <--- Filter <-------┘                             
 
 
 
 
2. 관련 인터페이스, 클래스
   - javax.servlet.Filter Interface
     . 필터 구현 인터페이스
   - javax.servlet.ServletRequestWrapper class
     . 요청 변경시 상속받아 구현
   - javax.servlet.ServletResponseWrapper class
     . 처리 결과 변경시 상속받아 구현
 
 
 
    
3. Filter Interface
   - public void init(FilterConfig filterConfig) throws ServletException
     . 필터 생성시 호출되며 초기화 합니다.
 
   - public void doFilter(ServletRequest request, servletResponse response,
     FilterChain chain) throws java.io.IOException, ServletException
     . 필터와 관련된 로직을 구현합니다.
     . chain을 따라 다음 필터로 이동하며, 체인의 가장 마지막에는 클라이언트가
       요청한 파일이 위치합니다.
 
   - public void destroy()
     . 필터가 삭제될 때에 호출됩니다. 
 
 
 
[02] Filter 로그인 실습
 
1. Filter 구현 java source

   - 브라우저 주소창에서 직접 주소를 입력하여 페이지를 요청시

   관리자 권한이 부족하면  자동으로 loginForm 페이지로 이동
 
>>>>> AdminLoginCheckFilter.java
 
package utility;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
public class AdminLoginCheckFilter implements Filter {
 
    public void init(FilterConfig arg0) throws ServletException {
    }
 
    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain)
    throws IOException, ServletException {
        
        // Filter가 요청 중간에서 request 객체를 추출합니다.
        HttpServletRequest httpRequest = (HttpServletRequest)request;
 
        // 새로운 세션을 생성하지않고 request 객체에서 기존의 세션 반환
        HttpSession session = httpRequest.getSession(false);
        
        // 로그인 하지 않았다고 가정
        boolean login = false;
        
        if (session != null) { // session 객체가 생성되어 있는지 확인
            // 로그인을 했으면서 관리자인지 확인합니다.
            if (session.getAttribute("id") != null 
                    && session.getAttribute("grade").equals("A")) {
                login = true;  // 관리자라면
            }
        }
        
        // 정상적으로 로그인이 되었다면 요청 페이지로 이동합니다.
        if (login) {
            chain.doFilter(request, response); //요청 페이지로 이동
        } else {
            // 로그인이 안되었다면 로그인 페이지로 이동
            RequestDispatcher dispatcher = 
                request.getRequestDispatcher("/member/loginForm.jsp");
            dispatcher.forward(request, response);
        }
    }
 
    public void destroy() {
    }
}
 
 
 
 
 
2. WEB-INF/web.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>blog</display-name>
     
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    
    <filter>
        <filter-name>AdminLoginCheckFilter</filter-name>
        <filter-class>utility.AdminLoginCheckFilter</filter-class>
    </filter>
 
    <filter-mapping>
        <filter-name>AdminLoginCheckFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>    
</web-app>
 
 
 
>>>>> loginForm.jsp 의 <Form>tag의 action속성 경로 수정

<%@ page contentType="text/html; charset=UTF-8" %> 
<% 
    String root = request.getContextPath();
request.setCharacterEncoding("utf-8"); 
String c_id="";//id저장여부
String c_id_val="";//id저장변수
 
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
if(cookies!=null){
for(int i=0; i<cookies.length; i++){
   cookie = cookies[i];
   if(cookie.getName().equals("c_id")){
       c_id = cookie.getValue();
   }else if(cookie.getName().equals("c_id_val")){
       c_id_val = cookie.getValue();
   }
}
}
%> 
 
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title></title> 
<style type="text/css"> 
*{ 
  font-family: gulim; 
  font-size: 24px; 
} 
</style> 
<link href="../css/style.css" rel="Stylesheet" type="text/css">
</head> 
<!-- *********************************************** -->
<body leftmargin="0" topmargin="0">
<jsp:include page="/menu/top.jsp" flush="false"/>
<!-- *********************************************** -->
 
<DIV class="title">로그인</DIV>
 
<FORM name='frm' method='POST' action='<%=root %>/member/loginProc.jsp'>
  <TABLE class='table'>
    <TR>
      <TH>아이디</TH>
      <TD>
       <input type="text" name="id" size="20" value="<%=c_id_val%>">
        <input type="checkbox" name="c_id" value="Y"
        <% if(c_id.equals("Y")){out.print("checked=checked ");} %>
        />ID저장 
      </TD>
    </TR>
    <TR>
      <TH>비밀번호</TH>
      <TD><input type="password" name="passwd" size="20"></TD>
    </TR>
  </TABLE>
  
  <DIV class='bottom'>
    <input type='submit' value='로그인'>
    <input type='button' value='회원가입' onclick="location.href='agreement.jsp'">
  </DIV>
</FORM>
 
 
<!-- *********************************************** -->
<jsp:include page="/menu/bottom.jsp" flush="false"/>
</body>
<!-- *********************************************** -->
</html> 
 
 
 


JSP Forward 와 Redirect 의 차이

web/JSP 2010.12.03 05:38
원문 : Struts 처음 배우기 (손권남)

JSP/Servlet 에는 현재 작업중인 페이지에서 다른 페이지로 이동하는 두 가지 방식의 페이지 전환 기능이 있다. 하는 Forward 이고 하나는 Redirect 이다.
- Forward : Web Container 차원에서 페이지 이동만 있다. 실제로 웹 브라우저는 다른 페이지로 이동했음을 알 수 없다. 그렇기 때문에, 웹 브라우저에는 최초에 호출한 URL이 표시되고 이동한 페이지의 URL 정보는 볼수 없다. 동일한 웹 컨테이너에 있는 페이지로만 이동할수 있다. 현재 실행중인 페이지와 Forward에 의해 호출될 페이지는 request와 response 객체를 공유한다.

- Redirect : Web Container 는 Redirect 명령이 들어오면 웹 브라우저에게 다른 페이지로 이동하라고 명령을 내린다. 그러면 웹 브라우저는 URL을 지시된 주소로 바꾸고 그 주소로 이동한다. 다른 웹 컨테이너에 있는 주소로 이동이 가능하다. 새로운 페이지에서는 request 와 response 객체가 새롭게 생성된다.


출처: 

http://uiandwe.tistory.com/381


------------------------------


MVC는 비번.. IOC


그리고 D:\javadb\web\workspace_mvc


만들었당 :>


그리고 저길로 workspace 바꾼 다음에 oracle 연결했음! :>

이건 좀 찍을까!






----------------------


이거 new Template임


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

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

 

<!DOCTYPE html> 

<html> 

<head> 

<meta charset="UTF-8"> 

<title></title> 

<style type="text/css"> 

*{ 

  font-family: gulim; 

  font-size: 20px; 

} 

</style> 

<link href="../css/style.css" rel="Stylesheet" type="text/css">

</head> 

<!-- *********************************************** -->

<body>

<jsp:include page="/menu/top.jsp" flush="false"/>

<!-- *********************************************** -->

 

<DIV class="title"></DIV>

 

<FORM name='frm' method='POST' action='./.do'>

  <TABLE class='table'>

    <TR>

      <TH></TH>

      <TD></TD>

    </TR>

  </TABLE>

  

  <DIV class='bottom'>

    <input type='submit' value=''>

    <input type='button' value='' onclick="location.href=''">

  </DIV>

</FORM>

 

 

<!-- *********************************************** -->

<jsp:include page="/menu/bottom.jsp" flush="false"/>

</body>

<!-- *********************************************** -->

</html> 






이런 Spring ㅋㅋㅋㅋㅋㅋㅋㅋㅋ


[03] [MVC] Model 2(MVC:Model, View, Controller)의 이해, MVC 개발 순서
[01] Model 2(MVC:Model, View, Controller)의 이해 

     



Model - Beans 같은 거

View - jsp html 같은 거 ㅋㅋㅋㅋㅋ

Controller - Servlet으로 생성할 거임여


 - Web Application Framework의 발전 형태 


CGI --> Servlet --+-> JSP --> MVC --> Framework --> Struts 1.X, WebWork --> Struts + WebWork --> Spring, Struts 2.0 
                  |   
                  +-> Beans --> Framework --> EJB 2.X --> Hibernate, IBatis --> EJB 3.0 

//CGI에서 동시 접속자가 많아지면 깨꼬댁해서(메모리 과부하인것) -  Servlet으로 발전함 :>!

//근데 서부릿이 넘나 안이뻐서 우리의친구 JSP가 나왔습니다

//HTML 안에 JSP가 포함된 거라 넘나 이쁜 것

//MVC는 MVC알못이랑 잘암이랑 같이 하면 암이 걸리는 것입니다

//1. 잘할것 2. 못하지않을것

//패턴을 알지 못하면 **같은 경우가 됩니다! :>


//그래서 이 **같은 거를 해결하려고 Framework를 만듬! :>

//이거 넘나 조은 것입니다 - MVC는 이상하게 짜도 ***안하는데 얘는 아예 안됨


//그리고 스트러치랑 웹워크를 합친게 쓰프링임미다

//그래서 쓰트러치 안배우고 쓰프링만 배움 우리의 친구임

//그래서 쓰트러치 2.0도 나왔는데 스프링만씀미다


//빈즈는 또 다른 우리의친구인데 - EJB라는 게 있는데 이게 가격이 창렬이라서 (기본 천만원ㅋㅋㅋㅋㅋㅋ) 

그래서 아이바티쓰가 나왔는데 신상은 마이바티스임 아! 이게 아이바티스야? ㅋㅋㅋㅋㅋㅋ

//반가운것! :D 하이버네이트는 sql 자동 생성되는 넘나 좋은 것입니다


// 근데 나 가르치려면 돈 드니까 그냥 아이바티스나 마이바티스나 둘 중 하나 씀...

// 개발자 하기 넘나 힘든것 ㅋㅋㅋㅋㅋㅋㅋㅋ 뭘 다 해야 하네






     - Client의 요청을 처리하는 객체를 Servlet Controller로 단일화해 
       인증, 권한, 국제화등 여러 통합된 기능을 쉽게 구현 할 수 있습니다. 
    
     - 비즈니스 로직을 처리하는 모델과 결과 화면을 보여주는 뷰(JSP)가  
       분리되어 있습니다. 
    
     - 모델과 뷰, 컨트롤러가 분리되어 있어 변경이 쉽고 유지 보수 비용을 
       획기적으로 절감할 수 있는 콤포넌트 기반 기술입니다. 
       . Model: JSP Beans(DTO, Manager Class, DAO), EJB 
       . View: JSP, HTML 
       . Controller: Servlet 

  

//아까는 컨트롤러가 없어서 필터로 한번 걸렀음... 'ㅅ')...
  

     - 개발인력이 MVC에 대한 이해가 제대로 서 있지 않으면 Model1보다 
       개발 속도가 느립니다. 하지만 이해를 하고 있다면 속도가 훨씬 
       빠르고 유지보수가 신속한 사이트를 제작할 수 있습니다. 

   
  - MVC 모델은 매우 유지보수성이 좋은 구조를 가지고 있으나 개발자가  

       web application의 기능을 전부 구현해야 함으로 많은 부담이 발생하게 
       되며 이런 프로젝트에서 공통적으로 쓰이는 기능을 구현해 솔루션화 
       한 프레임웍이 Spring, 스트럿츠(Struts) 입니다. 





1. model1 과 model2의 비교 

   - JSP Model 1 - 장점    
     . 기본적인 HTML, JavaScript, JAVA만 알아도 배우기 쉽니다. 
     . 객체지향 원리를 잘 몰라도 기능을 구현 할 수 있습니다. 
     . 처리 로직이 jsp 페이지상에 JAVA 코드로 구현 되어 있습니다. 
      

   - JSP Model 1 - 단점    
     . 디자인(HTML, CSS, JavaScript)과 로직(JAVA)이 혼합되어 있어  
       소스 수정시 예상하지 못한 곳에서 많은 시간이 지연됩니다. 
     . 같은 JAVA코드가 여러 JSP페이지에 중복되어 있어 소스 수정이  
       어렵습니다.(SSI로 일부 해결 가능) 
     . 권한등의 구현시 모든 jsp페이지 상에 SSI등을 이용해 구현해야 합니다. 
       (Filter로 일부 해결 가능) 

   - JSP Model 1 변형    
     . Interface, Manager, DAO, DTO, Connection Pool, Filter등으로 JSP Model 1을 개선 
       할 수 있습니다. 

   - JSP Model 2 - 장점    
     . Client의 요청을 받는 부분, 처리 로직 부분, 뷰 부분이 분리되어 있어 
       유지보수가 편리 합니다. 
     . 모든 기능이 세분화해 구조를 이루고 있음으로 기능 확장이 용이합니다.  
     . 컨트롤러 서블릿에서 권한 및 인증 구현을 편리하게 할 수 있습니다. 


   - JSP Model 2 - 단점    
     . 디자인 패턴등의 개념과 자바언어를 잘 알고 있어야 합니다.  
     . Application이 처리 파트별로 나뉘어져 있음으로 개발 작업의 양이  
       많습니다. 
     . 디버깅 작업을 처리 파트별로 살펴야 함으로 어려운 부분이 있습니다. 
     . 개발자들이 MVC에대한 개념을 가지고 있어야 효과를 볼 수 있습니다. 


   ※ Model1도 design pattern, beans, template적용등을 사용하여 어느정도  
      성능 향상을 가져올 수 있습니다. 하지만 프로젝트의 규모가 커지면  
      유지보수에 어려움이 발생하게 됩니다.  



실제경로와 요청url경로를 잘 구분해야 한당 :>!



http://pc-cat.tistory.com/entry/160405-17%EC%9D%BC%EC%B0%A8


이거 model1 배울 때 그렸던 것!



  - request 객체(JSP 내부 객체) 
     request 객체는 클라이언트로부터 값을 가져오는 목적으로 사용되나 
     값을 출력하는 목적으로도 사용됩니다. 

   - 컨트롤러(Controller) 
     . 어플리케이션의 흐름 제어나 사용자의 처리 요청을 구현합니다. 
     . 사용자 인증, 보안 설정이라든지 전체 어플리케이션에 영향을 미치는 요소를  
       구현 합니다. 
     . 사용자의 요청에 대해서 알맞은 모델을 사용하고 사용자에게 보여줄 뷰를 선택하기만 
       하면 됩니다. 
     . Servlet 으로 제작 

   - 모델(Model) = 빈즈! :D 
     . 비즈니스 로직과 관련된 부분만 처리합니다. 
     . 데이터베이스 관련 로직을 구현합니다. 
     . JSP Beans, EJB Component, DAO, DTO, Manager  

   - 뷰(View) 
     . 사용자에게 알맞은 화면을 보여주는 역활만 수행합니다. 
     . JSP, EL, JSTL, Custom Tag, XML 



   
  

이건 servlet이 응답하는 거 같지만 내부적으로 jsp를 처리해 준 것





내가 외우실 것

4. Controller의 처리순서 

         Browser --------> Servlet(Controller) 
                              1. HTTP 요청 받음, doGet(), doPost() 메소드 호출  - 서비스! :D
                              2. 클라이언트가 요구하는 기능을 분석(방명록의 경우 글쓰기등) 
                              3. 요청한 비즈니스 로직을 처리하는 Model 사용, Business Logic Class 
                              4. 결과를 request 또는 session의 setAttribute()메소드를 사용하여 저장 
                              5. 알맞은 뷰 선택 후, 
                              6. 뷰로 포워딩(또는 리다이렉트), jsp 페이지로 이동 
                            ↙ 
                         JSP 
                        ↙  
                     HTTP 응답 
                    ↙ 
         Browser 


3번은 생략 가능! :D - 왜냐면 그냥 출력하는 경우도 있으니까! :>

근데 그냥 순서니까 외우는거시빈다


4번에 리퀘스트도 속성값 저장할 수 있는 것


5번에서는 서블릿이 뷰를 선택하시는것 - JSP친구들


6번에서 포워딩인지 리다이렉트인지 확인 해 보 ㅏ야 함!

리퀘스트 - 포워드 ㅇㅋ - 살아남아있다! :D

리다이렉트 - 세션만 ㅇㅋ




[02]  MVC App 개발 순서 

1. Web Application 개발 순서 

   ① DBMS 설정 

   ② DTO(Data Transfer Object) Class 제작 

   ③ DAO(Data Access Object) Class 제작 

   ④  Manager Class 제작 

   ⑤  Mgr/DAO test 

   ⑥ JSP 생성 연동 



4번만 빼면 다 해본거십니다




2. MVC Web Application 개발 순서 

   ① DBMS 설정 

   ② DTO(Data Transfer Object) Class 제작 

   ③ DAO(Data Access Object) Class 제작 

   ④  Manager Class 제작 

   ⑤  Mgr/DAO test 

   ⑥ Servlet Controller 제작 

   ⑦ Action Interface 제작 

   ⑧ Action 구현 Class 제작 
     . Manager Class 연동  

   ⑨ JSP 생성 연동 



이제 6번인 서블렛 컨트롤러도 만들고 액션 인터페이스도 만듬!

액션이 뭐냐면 서블릿이 넘나 바쁘니까 


서블릿에는 기본적인 부분만 놔두고

액션 인터페이스한테 위임을 시키는 거십니다


액션 인터페이스는 컨트롤러의 뻬이비인것

얘가 하는 걸 나눠서 합시다 입니다


[04] [MVC] Properties class, String class, Class class
[01] Properties Class의 사용 
     - 키와 값의 구조를 가지고 있으며 특정 객체를 생성하는 경우에 초기값으로 많이 
       사용합니다. 

     - 상속 구조 

java.lang.Object 
    java.util.Dictionary<K,V> 
        java.util.Hashtable<Object,Object> 
            java.util.Properties<String,String> 


얘는 맵 쓸 때 해본 우리의친구임

http://lectureblue.pe.kr/reqtiles/read.jsp?bbsno=135&nowPage=2&col=&word=&code=9

프로퍼티 만드러서 복붙할 때

#---------------------------------- 

#  jdbc.properties 

#---------------------------------- 

driver=oracle.jdbc.driver.OracleDriver 

url=jdbc:oracle:thin:@127.0.0.1:1521:ora10g2 

account=jsp21000_08_1 

password=oracle 


#driver=org.gjt.mm.mysql.Driver 

#url=jdbc:mysql://127.0.0.1:3306/ojtdb?useUnicode=true&characterEncoding=euckr 

#account=ojtuser 

#password=1234 


#driver=org.gjt.mm.mysql.Driver 

#url=jdbc:mysql://127.0.0.1:3306/******?useUnicode=true&characterEncoding=euckr 

#account=****** 

#password=****** 



요렇게 127.0.01로 바꿈!


아 뒤에 ora10g2랑 계정 패스워드도 바꿈

#---------------------------------- 

#  jdbc.properties 

#---------------------------------- 

driver=oracle.jdbc.driver.OracleDriver 

url=jdbc:oracle:thin:@127.0.0.1:1521:XE 

account=soldesk 

password=1234 


#driver=org.gjt.mm.mysql.Driver 

#url=jdbc:mysql://127.0.0.1:3306/ojtdb?useUnicode=true&characterEncoding=euckr 

#account=ojtuser 

#password=1234 


#driver=org.gjt.mm.mysql.Driver 

#url=jdbc:mysql://127.0.0.1:3306/******?useUnicode=true&characterEncoding=euckr 

#account=****** 

#password=****** 




------------------------

중요한 것: 프로퍼티는 문자열 타입의 키와 값을 가진다! :D

property는 keyset()

--------------------------


package test.properties2; 


import java.io.File; 

import java.io.FileInputStream; 

import java.io.IOException; 

import java.sql.Connection; 

import java.sql.DriverManager; 

import java.sql.PreparedStatement; 

import java.sql.ResultSet; 

import java.util.Iterator; 

import java.util.Properties; 


public class PropertyTest { 


    public static void main(String[] args) { 

        Properties prop = new Properties(); 

         

        FileInputStream fis = null;   // 파일을 읽어 오는 역활을 합니다. 

        //  경로  산출 

        File file = new File("jdbc.properties"); 

        System.out.println("절대경로: " + file.getAbsoluteFile()); 

                

        try { 

            fis = new FileInputStream(file); 

            //속성 파일을 객체로 로딩, 키와 문자열 값으로 저장됩니다. 

            prop.load(fis); 

        } catch (IOException e) { 

            e.printStackTrace(); 

        } finally { 

            if (fis != null) try { fis.close(); } catch(IOException ex) {} 

        } 

         

        // properties 객체에서 키목록을 추출합니다. 

        // driver, url, account, password 

        Iterator keyIter = prop.keySet().iterator(); 

        while( keyIter.hasNext() ) { 

            String key = (String)keyIter.next();  //키 추출 

            String value = prop.getProperty(key); //키에 따른 값 추출 

            System.out.println(key + "=" + value); 

        } 

         

        Connection con = null; 

        PreparedStatement pstmt = null; 

        ResultSet rs = null; 

        String sql = ""; 

        String driver = ""; 

        String url = ""; 

        String account = ""; 

        String password=""; 

         

        driver = prop.getProperty("driver"); 

        url = prop.getProperty("url"); 

        account = prop.getProperty("account"); 

        password = prop.getProperty("password"); 


        try{ 

            Class.forName(driver); 

            con = DriverManager.getConnection(url, account, password); 

            sql = "SELECT count(*) cnt FROM tab"; 

            pstmt = con.prepareStatement(sql); 

            rs = pstmt.executeQuery(); 

            if (rs.next()){ 

                System.out.print(account + " 계정의 테이블 갯수: "); 

                System.out.println(rs.getInt("cnt")); 

            } 

        }catch(Exception e){ 

            System.out.println(e); 

        }         

    } 

} 



이거 돌렸을 때 오류나면
properties에 가서 빈 문자열 없애주면 됨니당 :D







출처: http://dlalsqhr.tistory.com/entry/webxml-%EC%84%A4%EC%A0%95


web.xml (설정)

JSP 2008.01.29 11:50

web.xml이란...

Web Application의 구조
                                               Root                          
                                                  |
 
html                  img                 WEB_INF(web.xml)
 
                                                |             |            |
 
                                        classes          tld         lib
 

DD:(Deployment Descriptor)로 각 어플리케이션의 환경을 설정하는 부분을 담당한다. (deploy)'배치'

      WAR 파일이 패키지 될 때 같이 포함되며 root directory 밑에 /WEB-INF 디렉토리에 위치한다.

web.xml 의 구조

xml 정의와 schema 선언

<?xml version="1.0" encoding="EUC-KR"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd>

위 스키마는 sun 사에서 미리 정의된것이다.


웹 어플리케이션의 환경 설정

<web-app>    <servlet>
     <servlet-name>      
 사용되는 클래스명         </servlet-name> "가"
      <servlet-class>클래스 경로(패키지명.클래스) </servlet-class> "나"
    </servlet>
    <servlet-mapping>
      <servlet-name>       사용되는 클래스명            <servlet-name> "다"
      <url-pattern>서버에서 사용할 url-pattern ( /url )</url-pattern> "라"
   </servlet-mapping>
실행순서.  라 -->다--->가--->나(패키지명.클래스 실행)
 
 
 
 <mime-mapping>
      <extension>txt</extension>
      <mime-type>text/plain</mime-type>
    </mime-mapping>
    <welcome-file-list>
      <welcome-file>기본 파일 경로</welcome-file>
      <welcome-file>두번째 시작하는 파일 경로</welcome-file>
    </welcome-file-list>
    <taglib>
      <taglib-uri>태그라이브러리</taglib-uri>
      <taglib-location>경로</taglib-location>
    </taglib>
</web-app>

web.xml은 xml파일이다. 따라서 xml 작성과 동일한 규칙이 적용된다.
환경설정은 <web-app>으로 시작하고 </web-app>로 끝난다. 그외 삽입되는 요소로는 다음과 같다.

.ServletContext Init Parameters
.Session Configuration
.Servlet/JSP Definitions
.Servlet/JSP Mappings
.Mime Type Mappings
.Welcom File list
.Error Pages


web.xml의 elements의 순서각 element의 순서는 아래 순서에 따른다.

<icon?>,
<display-name?>,
<description?>,
<distributable?>,
<context-param*>,
<filter*>,
<filter-mapping*>,
<listener*>,
<servlet*>,
<servlet-mapping*>,
<session-config?>,
<mime-mapping*>,
<welcome-file-list?>,
<error-page*>,
<taglib*>,
<resource-env-ref*>,
<resource-ref*>,
<security-constraint*>,
<login-config?>,
<security-role*>,
<env-entry*>,
<ejb-ref*>,
<ejb-local-ref*>


자주 쓰이는 elements 예제

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd>

<web-app>
    <display-name>어플리케이션 이름</display-name>
    <description>어플리케이션 설명</desccription>
    <!-- 서블릿 매핑 : 보안과 주소를 간략화 하기 위해 사용
        http://localhost/servlet/KCount 이렇게 사용가능  -->
    <servlet>
      <servlet-name>KCount</servlet-name>
      <servlet-class>kr.pe.kkaok.mycount.KCount</servlet-class>
    </servlet>
    <!-- load-on-startup 옵션은 서버 구동시 자동으로 시작 되도록 하는 것이다. -->
    <servlet>
      <servlet-name>PoolManager</servlet-name>
      <servlet-class>kr.pe.kkaok.jdbc.PoolManager</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- 서블릿 매핑 : 위에서 servlet 부분을 삭제한다.
        http://localhost/KCount 이렇게 사용가능  -->
    <servlet-mapping>
      <servlet-name>KCount</servlet-name>
      <url-pattern>/KCount</url-pattern>
    </servlet-mapping>
    <!-- /servlet/* 과 동일한 패턴의 요청이 들어오면 servlet으로 처리 -->
    <servlet-mapping>
      <servlet-name>invoker</servlet-name>
      <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
    <!-- 세션 기간 설정 -->
    <session-config>
      <session-timeout>
        30
      </session-timeout>
    </session-config>
    <!-- mime 매핑 -->
    <mime-mapping>
      <extension>txt</extension>
      <mime-type>text/plain</mime-type>
    </mime-mapping>
    <!-- 시작페이지 설정 -->
    <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
      <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <!-- 존재하지 않는 페이지, 404에러시 처리 페이지 설정 -->
    <error-page>
      <error-code>404</error-code>
      <location>/error.jsp</location>
    </error-page>
    <!-- 태그 라이브러리 설정 -->
    <taglib>
      <taglib-uri>taglibs</taglib-uri>
      <taglib-location>/WEB-INF/taglibs-cache.tld</taglib-location>
    </taglib>
    <!-- resource 설정 -->
 <resource-ref>
      <res-ref-name>jdbc/jack1972</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
    </resource-ref>
</web-app>



invoker 서블릿의 매핑이 보안문제로 막혀있어서 발생하는 문제로 $CATALINA_HOME/conf/web.xml를 열고 해당 부분의 주석을 제거한다.

<!-- The mapping for the invoker servlet -->
<servlet-mapping>
  <servlet-name>invoker</servlet-name>
  <url-pattern>/servlet/*</url-pattern>
</servlet-mapping>

security-constraint 엘리먼트를 $CATALINA_HOME/conf/web.xml 파일의 welcome-file-list 엘리먼트 아래쪽 <web-app> 에 중첩되게 복사합니다.

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
 
<security-constraint>
  <display-name>Default Servlet</display-name>
  <!-- Disable direct alls on the Default Servlet -->
  <web-resource-collection>
    <web-resource-name>Disallowed Location</web-resource-name>
    <url-pattern>/servlet/org.apac.




























5. 수업

진도: 

hw: 


6. 할것


오늘은 http://luckybluegifs.co.vu/page/13

까지 봤습니다.


http://hong-fol.tistory.com/23

이거 참조할 것 ! :>


우리의친구 아카데미 인강좀 확인해 볼 것!



'Programming' 카테고리의 다른 글

160502: 35회차  (0) 2016.05.02
160429: 34회차  (0) 2016.04.29
160427: 32회차  (1) 2016.04.27
160426: 31회차  (1) 2016.04.26
160425: 30회차  (0) 2016.04.25
Posted by DAVID
이전페이지 다음페이지
블로그 이미지

by DAVID

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

글 보관함

«   2026/04   »
일 월 화 수 목 금 토
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

링크

카테고리

PC (112)
Programming (109)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
DAVID's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

PC

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • PC (112)
    • Programming (109)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바