제이쿼리(jquery) 기초 1

제이쿼리(jquery) 기초 1

 // h1=[] 배열
 /*
  var i=10;          int
     var i=10.0;        double
     var i=”aaa”;       String
     var i=[];          배열
     var i={};          객체
        var m={name:”aaa”,sex:”bbb”,dept:”ccc”};
            m.name
            m.sex
            m.dept  ====> JSON방식(자바스크립트 데이터 표현법)
                    ====> 몽고디비.

$(document.ready(function(){})); 와
$(function(){}); 는 똑같은 window.onload 이다.

css의 기능들과 같다. ‘셀렉터’라고 한다.(원하는 태그들을 바꿔나간다)

getElementsByTagName

 
$(‘h1’).css(‘color’,’red’);    getElementsByTagName
$(‘h1#a’).css(‘color’,’red’);  
$(‘#a’).css(‘color’,’red’);     document.getElementById
$(‘.d’).css(‘color’,’red’);

태그와 태그 사이 가져오기

var str=$(‘.d’).text();

태그와 태그 사이 값바꾸기

$(‘#e’).text(str); 매개변수를 넣으면 값이 바뀐다.

한쪽 값을 가져와서 다른 쪽 값에 뿌리기

 $(‘#btn’).click(function(){
  var inData=$(‘#in’).val();
  $(‘#out’).val(inData);
 });

필터
$(function(){
 $(‘tr:eq(0)’).css(‘background’,’#eeeeee’);
 $(‘tr:nth-child(2n)’).css(‘background’,’#eeeeee’);
 //2n -> 0,2,4,6
 //2n+1->1,3,5,7
 
 $(‘tr:lt(3)’).css(‘color’,’green’);
 //tr<3   0,1,2
 $(‘tr:gt(3)’).css(‘color’,’red’);
 //tr>3   4,5
 $(‘tr:not(#aaa)’).css(‘color’,’blue’);
 
});

 <table border=1 width=300>
  <tr id=”aaa”>
   <th>이름</th>
   <th>성별</th>
   <th>주소</th>
  </tr>
  <tr>
   <td>우</td>
   <td>121</td>
   <td>131</td>
  </tr>
  <tr>
   <td>홍</td>
   <td>121</td>
   <td>131</td>
  </tr>
  <tr>
   <td>김</td>
   <td>121</td>
   <td>131</td>
  </tr>
  <tr>
   <td>박</td>
   <td>121</td>
   <td>131</td>
  </tr>
  <tr>
   <td>이</td>
   <td>121</td>
   <td>131</td>
  </tr>
 </table>

$(‘input:button’)

$(‘input[type=”button”]’)는 같다.

$(function(){
 $(‘input:button’).click(function(){
  
  var a=$(‘#aaa input:text’).val();
  $(‘#bbb input:text’).val(a);
  } 
 );
 
 
});

아이디가 없을 땐

$(function(){
 $(‘input:button’).click(function(){
  
  var a=$(‘input:text:eq(0)’).val();
  $(‘#input:text:eq(1)’).val(a);
  } 
 ); 
});

투명도 조절
$(function(){
 $(‘img’).animate({“opacity”:.3});
 
 $(‘img’).hover(function(){
  $(this).animate({“opacity”:1});
 },function(){
  $(this).animate({“opacity”:.3});
 });
 
});

태그와 태그 사이 text()
밸류값 가져오기 val()
속성값 가져오기 attr(‘href’)
//////////////////////////////////////////////////////////////////////////

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!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=EUC-KR”>
<title>Insert title here</title>
<style type=”text/css”>
#bigimg{
 text-align:center;
 position: absolute;
 margin: 0 auto;
 border: 1px solid #AAAAAA;
}
</style>
<script type=”text/javascript”></script>
<script type=”text/javascript” src=”../js/jquery.js”></script>
<script type=”text/javascript”>
$(function(){
 var ox=20;
 var oy=10;
 $(‘#wrap a’).hover(function(e){
  
   var href=$(this).attr(‘href’);
   $(‘<img id=”bigimg” src=”‘+href+'”>’).css(‘top’,e.pageY+oy).css(‘left’,e.pageX+ox).appendTo(‘body’);
  },
   function(){
   $(‘#bigimg’).remove();
  });
 
});
</script>
</head>
<body>
 <div id=”wrap”>
  <a href=”../image/a.jpg”><img src=”../image/a.jpg” width=100 height=120></a>
  <a href=”../image/b.jpg”><img src=”../image/b.jpg” width=100 height=120></a>
  <a href=”../image/c.jpg”><img src=”../image/c.jpg” width=100 height=120></a>
  <a href=”../image/d.jpg”><img src=”../image/d.jpg” width=100 height=120></a>
  <a href=”../image/e.jpg”><img src=”../image/e.jpg” width=100 height=120></a>
 </div>
</body>
</html>

퀵메뉴

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!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=EUC-KR”>
<title>Insert title here</title>
<style>
 #wrap{
 text-align: center;
 margin: 0 auto;
 width: 600px;
 }
 #menu{
 background: #ededed;
 position: absolute;
 width: 100px;
 top: 50px;
 right: 10px;
 }
</style>
 
<script type=”text/javascript” src=”../js/jquery.js”></script>
<script type=”text/javascript”>
$(function(){
 var cp=parseInt($(‘#menu’).css(‘top’));
 $(window).scroll(function(){
  var pos=$(window).scrollTop();//맨위의 위치
  $(‘#menu’).stop().animate({‘top’:cp+pos+”px”},500);
 });
 
});
</script>
</head>
<body>
 <div id=”wrap” style=”border:1px solid #000000″>
 
 </div>
 
 <div id=”menu” style=”border: 1px solid #000000″>
    <ul>
     <li><a href=”#”>메뉴1</a></li>
     <li><a href=”#”>메뉴2</a></li>
     <li><a href=”#”>메뉴3</a></li>
     <li><a href=”#”>메뉴4</a></li>
     <li><a href=”#”>메뉴5</a></li>
    </ul>
 </div>
</body>
</html>

체크박스와 라디오버튼 선택

<script>
$(function(){

 $(‘input[name=”f”]:radio’).click(function(){
  $(‘#cb>option[value=”‘+$(this).val()+'”]’).attr(“selected”,”selected”);
  $(‘input:text’).val($(this).parent().prev().text());
  
 });
 $(‘#cb’).change(function(){
  var value=$(‘#cb option:selected’).val();
  $(‘input:radio[value=”‘+value+'”]’).attr(“checked”,”checked”);
  $(‘input:text’).val($(‘#cb option:selected’).text());
  
 }); 
});
</script>

텍스트 값 전달(keyup)

<script type=”text/javascript” src=”../js/jquery.js”></script>
<script type=”text/javascript”>
 $(function(){
  $(‘#second’).attr(“disabled”,”disabled”);
  $(‘#first’).keyup(function(){
   $(‘#second’).val($(‘#first’).val());
   
  });
 });
</script>

spring 프로젝트를 옮겨오는 방법(ex:학원->집)

spring 프로젝트를 옮겨오는 방법(ex:학원->집)

2. 톰캣 세팅이 동일해야한다.
스프링윈도우 좌측에 탐색기(Explorer)에서 Servers->톰캣 폴더->server.xml 의 내용을 통일해야 한다.

예를 들면 기본값인 <Connector connectionTimeout=”20000″ port=”8080″ protocol=”HTTP/1.1″ redirectPort=”8443″/> 를
<Connector URIEncoding=”EUC-KR” connectionTimeout=”20000″ port=”80″ protocol=”HTTP/1.1″ redirectPort=”8443″/> 로 바꿀 수 있다.

3. 오라클/마이바티스 세팅이 동일해야 한다.

​또한 오라클 계정이 소속된 정확한 SID이 같아야 한다. sid란 ‘orcl’과 같은 서버식별자를 뜻한다. 컴퓨터에 깔린 오라클SID를 알아내는 법은 다음과 같다.

 

4. ojdbc14.jar파일을 톰캣에 포함시켜야 한다.

 

사용하는 톰캣 폴더 내의 lib 폴더 안에 ojdbc14.jar 파일을 넣어야 한다.

 

오라클 계정이 어떤 DB소속인지(SID) 알아내는 법

오라클 계정이 어떤 DB소속인지(SID) 알아내는 법

 

시작-실행-cmd에서

sqlplus

라는 명령어를 이용해 sqlplus에 접속하자.

 

conn 명령어로 원하는 아이디/비번으로 접속하자.

예를 들면 conn scott/tiger

 

접속이 되었으면 set명령어를 이용해 프롬프트를 바꿔줌으로써 SID를 알아낼 수 있다.

 

SET SQLPROMPT ‘&_USER.>’

을 쓰면 유저이름을 알 수 있고,

 

SET SQLPROMPT ‘&_CONNECT_IDENTIFIER.>’

를 쓰면 계정명을 알아낼 수 있다.

예를 들면 orcl 이 계정명이다.

jsp 자료실 소스: 수정하기(첨부파일수정)

jsp 자료실 소스: 수정하기(첨부파일수정)

1.자료실 글 수정하기 관련sql(mapper.xml)

 <update id=”databoardUpdate” parameterType=”DataBoard”>
  UPDATE databoard SET name=#{name},subject=#{subject},content=#{content},
  regdate=SYSDATE,filename=#{filename},filesize=#{filesize}
  WHERE no=#{no}
 </update>

2. 자료실 글 수정하기(모델)(스프링에선 컨트롤러, 스트러츠에선 액션)

@RequestMapping(“databoard_update_ok.do”)
 public String databoard_update_ok(Model model) throws Exception{
  
  //비번 검색
  model.getRequest().setCharacterEncoding(“EUC-KR”);
  String path=”c:\\download”;
  File dir=new File(path);
  if(!dir.exists())
   dir.mkdir();
  
  String enctype=”EUC-KR”;//한글 파일명 저장
  int size=1024*1024*500;//최대 500메가
  MultipartRequest mr=new MultipartRequest(model.getRequest(),path,size,enctype,new DefaultFileRenamePolicy());
  String name=mr.getParameter(“name”);
  String subject=mr.getParameter(“subject”);
  String content=mr.getParameter(“content”);
  String pwd=mr.getParameter(“pwd”);
  String page=mr.getParameter(“page”);
  String no=mr.getParameter(“no”);
  
  String filename=mr.getFilesystemName(“upload”);
  
  DataBoardVO vo=new DataBoardVO();
  
  vo.setNo(Integer.parseInt(no));
  vo.setName(name);
  vo.setSubject(subject);
  vo.setContent(content);
  vo.setPwd(pwd);
  String db_pwd=DataBoardDAO.databoardGetPwd(Integer.parseInt(no));
  String res=””;
  
  if(db_pwd.equals(pwd)){
   res=”YES”;
   DataBoardVO dbvo=DataBoardDAO.databoardUpdateData(Integer.parseInt(no));
   if(filename==null){
    if(dbvo.getFilesize()==0){
     //파일이 없는 글이면
     vo.setFilename(“”);
     vo.setFilesize(0);
    }
    else{
     //파일이 그대로 있는 글이면 파일 유지
     vo.setFilename(dbvo.getFilename());
     vo.setFilesize(dbvo.getFilesize());
    }
   }
   else{
    //업로드를 했었으나, 새로운 파일을 올렸을 경우.
    //1)새로운 파일을 올림.
    vo.setFilename(filename);
    File file=new File(path+”\\”+filename);
    vo.setFilesize((int)file.length());
    
    //2)기존 파일 삭제
    File delFile=new File(path+”\\”+dbvo.getFilename());//기존 파일을 지운다.
    delFile.delete();//파일삭제
   }
   
   //UPDATE
   DataBoardDAO.databoardUpdate(vo);
  }
  else{
   res=”NO”;
  }
  
  model.addAttribute(“res”, res);
  model.addAttribute(“page”, page);
  model.addAttribute(“no”, no);
  return “databoard/update_ok”;
 }

jsp 자료실 소스

jsp 자료실 소스

content.jsp(내용보기 jsp)

<tr>
    <td width=20% align=center>첨부파일</td>
   <c:if test=”${vo.filesize!=0}”>
    <td colspan=”3″ align=left>
      <a href=”databoard/download.jsp?fn=${vo.filename}”>
     ${vo.filename}
      </a>
      &nbsp;(${vo.filesize} bytes)
    </td>
   </c:if>
   <c:if test=”${vo.filesize==0}”>
    <td colspan=”3″ align=left>첨부파일 없음</td>
   </c:if>
   </tr>

sql

 <select id=”databoardContentData” parameterType=”int” resultType=”DataBoard”>
  SELECT no,name,subject,content,regdate,hit,filename,filesize FROM databoard WHERE no=#{no}
 </select>

DAO

public static DataBoardVO databoardContentData(int no){
  return ssf.openSession().selectOne(“databoardContentData”,no);
 }

download.jsp부분(다운로드 jsp)

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<%@ page import=”java.io.*,java.util.*,java.net.*”%>
<%
 String fn=request.getParameter(“fn”);
    try{
     response.setHeader(“Content-Disposition”, “attachment;filename=”+URLEncoder.encode(fn, “UTF-8”));//다운로드 창 띄우기
     File file=new File(“c:\\download\\”+fn);

     response.setContentLength((int)file.length());//파일 크기 알려주기
     
  BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));//파일을 서버에서 읽기 시작함
  BufferedOutputStream bos=new BufferedOutputStream(response.getOutputStream());//리스폰스가 접속한 사람임. 접속한 사람에게 응답하기 위해서 리스폰스를 씀. 읽어온 파일을 접속한 사람에게 줌.
  
  int i=0;
  byte[] buffer=new byte[1024];//한번 읽을때마다 1024씩 읽는다.
  while((i=bis.read(buffer,0,1024))!=-1)
  {
   //-1 EOF
   bos.write(buffer,0,i);//i가 읽은 바이트 수
  }
  bis.close();
  bos.close();
  out.clear();
  out=pageContext.pushBody();//새로운 아웃객체를 생성해야 오류가 안남.
  
    }catch(Exception ex){
   
    }
%>

아이바티스와 마이바티스의 차이

아이바티스와 마이바티스의 차이

마이바티스는 resultType=”int”  parameterType=”String”라 쓰고, 아이바티스(마이바티스의 구버전)는 resultClass=”int”  parameterClass=”String”라 쓴다.

마이바티스는 #{no}라 쓰고, 아이바티스는 #no# 를 쓴다.

아이바티스는 sql문을 <![CDATA{            }]]> 로 묶는다.

전자정부 프레임워크

전자정부 프레임워크

전자정부는 메소드가 인터페이스로 되어있다. 이러한 인터페이스를 만들고 구현하는 과정을 BO(비즈니스오브젝트)라고 한다.

전자정부 프레임워크 안에는 DAO가 있고, “서비스(service)”가 있다.(서비스 폴더에 모아져있음)

1. 제일 처음 서비스를 만든다. 서비스는 인터페이스로 되어있다.

2. DAO는 서비스를 이용해서 따로 구현(임플리먼츠)된다.

3. 필요할 때 클래스를 합쳐준다. 이 과정을 BO라고 한다.

전자정부의 “인터셉터”

스프링의 AOP(관점 기반 프로그래밍)와 같다.

jsp select 콤보박스에 파라미터/어트리뷰트값 대입하기

jsp select 콤보박스에 파라미터/어트리뷰트값 대입하기

콤보박스가 아닌, 라디오 버튼 등은 체크드

 <p>
         <label for=”usersex”>성별</label>
         <input type=radio name=”sex” value=”남자” ${vo.sex==’남자’?”checked”:””}>남자
         <input type=radio name=”sex” value=”여자” ${vo.sex==’여자’?”checked”:””}>여자
 </p>

콤보박스는 셀렉티드

 <select id=”userPhone” name=”tel1″>
             <option ${vo.sex==’02’?”selected”:””}>02</option>
             <option ${vo.sex==’031′?”selected”:””}>031</option>
             <option ${vo.sex==’032′?”selected”:””}>032</option>
             <option ${vo.sex==’051′?”selected”:””}>051</option>
             <option ${vo.sex==’053′?”selected”:””}>053</option>
 </select>

 

노가다.

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<%
 String aaa=”동물”;//getParameter나 getAttribute로 원하는 값을 가져온다
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
<script>
window.onload=function(){
  document.getElementById(“combo”).value=document.getElementById(“ptxt”).value;

  //자바스크립트로 ptxt를 찾아서 combo박스 값에 대입한다.

}
</script>
</head>
<body>
 <input type=”hidden” id=”ptxt” value=<%=aaa%>> //ptxt에 aaa값(동물)을 담는다.
 
 <select id=”combo”>
   <option>남자</option>
   <option>여자</option>
   <option>동물</option>
   <option>무생물</option>
 </select>

</body>
</html>

 

포워드와 샌드 리다이렉트의 차이

포워드와 샌드 리다이렉트의 차이

 

포워드(forward)와 샌드 리다이렉트(sendRedirect)는 특정 URL로 접근시킬 수 있다. 단, 포워드는 웹서버에서 호출하고, 샌드 리다이렉트는 클라이언트 측에서 호출하게 만든다.

 

소스를 보면 큰 차이를 보인다.

 

1. 포워드

RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);

 

2. 샌드 리다이렉트

response.sendRedirect(url);

 

포워드는 리퀘스트와 리스폰스가 있는 반면, 샌드 리다이렉트는 단 한 줄의 URL 밖에 없다. 다시 말해, 샌드 리다이렉트(sendRedirect)는 클라이언트가 직접 주소를 쳐서 들어가는 효과와 같다.

 

결론부터 말하면, 포워드는 리퀘스트/리스폰스의 어트리뷰트를 실어나르고 싶다면 써야한다. 샌드 리다이렉트는 그냥 이동시킬 때 쓴다.

 

이에 따라 아래와 같은 차이점을 갖는다.

 

차이점

1. 포워드는 웹페이지를 웹서버에서 호출하고, 샌드 리다이렉트는 클라이언트 측에서 http를 요청하게 만든다.

말 그대로다.

 

2. 포워드는 setAttribute로 소유한 객체를 실어나를 수 있으나, 샌드 리다이렉트는 텍스트만 보낼 수 있다.

말 그대로 샌드 리다이렉트는 사용자가 직접 주소를 치는 것과 똑같기 때문에, website.com/id=hong&name=홍길동  식으로 get방식처럼 주소를 보낼 수 밖에 없다.

 

3. 포워드는 request와 response째로 나르기 때문에 한글변환이 필요없다. 그러나 샌드 리다이렉트는 URI 인코딩이 필요하다.

website.com/id=hong&name=홍길동 같은 주소의 경우, 한글이 깨져나갈 수 있다. get방식에서 server.xml의 Connector부분에 URIEncoding=”UTF-8″ 추가하듯 인코딩을 해줘야 한다.

 

4. 포워드는 같은 웹 서버 내의 프로젝트만 호출할 수 있지만, 샌드 리다이렉트는 어떤 웹사이트 URL이든 갖다쓸 수 있다.

샌드 리다이렉트는 사용자가 직접 주소를 치는 것과 똑같으므로, 전혀 관련이 없는 웹서버의 페이지와도 연결할 수 있다.
 
5. 포워드(forward)는 웹 브라우저의 주소가 바뀌지 않고, 샌드 리다이렉트(sendRedirect)는 웹 브라우저의 주소가 파일명에 따라 바뀐다.

MVC 흐름 설명(초단순화)

MVC 흐름 설명(초단순화)

 

가장 먼저 찾아야하는 것은 어노테이션(골뱅이)이다. @는 controller.java 안에 있다.

 

MVC 흐름 설명(자세히)

MVC 흐름 설명(자세히)

 

.do : .do[쩜두]파일을 주소창에 치면 web.xml에 의해 디스패처 서블릿으로 간다.

 

web.xml : 맨 처음 톰캣 켜면 자동으로 읽히는 파일. 쩜두(*.do)와 디스패처 서블릿을 연결시켜 놓았다. 쩜두 치면 디스패처 서블릿으로 간다.

 

C(컨트롤러)

디스패처 서블릿 : 3가지 역할을 한다. 1. 자바클래스를 패키지 단위로 가져온다. 2. 어노테이션을 이용해서 메소드를 찾아서 발동시킨다(invoke) 3. 특정 위치로 포워드시킨다

 

컨트롤러 : 클래스를 구분하는 인터페이스. 실행시간 동안(@Retention(RetentionPolicy.RUNTIME)) 클래스(@Target(ElementType.TYPE))를 어노테이션으로 구분해준다.

 

리퀘스트 매핑 : 메소드를 구분하는 인터페이스. 실행시간 동안(@Retention(RetentionPolicy.RUNTIME)) 메소드(@Target(ElementType.METHOD))를 어노테이션으로 구분해준다.

 

뷰 리졸버 : 페이지를 찾아올 때 쓴다. 앞에 경로(prefix, ‘/’ )와 뒤의 경로(suffix, ‘.jsp’)를 붙여서 리턴해준다.

 

모델 : HttpServletRequest를 상속받아서 리퀘스트와 리스폰스를 private으로 선언하되 get(게터)할 수 있게 만든다. 겟 리퀘스트는 파라미터를 가져올 때 쓰이고, 겟 리스폰스는 파일을 다운로드할 때 쓴다.

 

M(모델)

Controller : 스프링의 모델을 ‘컨트롤러’라 부른다.(스트러츠는 ‘액션’) 스프링의 컨트롤러는 어노테이션으로 메소드가 구분되어 있다.

DAO : 1. Config.xml을 읽어와서 처리한다. 2. sql을 실행하는 메소드를 쓴다.(jsp파일 맨 위쪽에 적히는 자바로직을 수행)

 

Config.xml : 타입 알리아스(별칭), 오라클 정보(겟커넥션, 디스커넥션), 매퍼(mapper.xml)의 경로와 이름을 갖고 있다.

 

mapper.xml : 매퍼xml은 sql문을 모아두고 있다. 마이바티스의 sql문을 쓸 때 #{}은 데이터고, ${}는 컬럼이다.

 

VO : 밸류 오브젝트. 데이터를 모아둔다. DTO(데이터 트랜스퍼 오브젝트)와 같다. private로 변수 선언하고 게터/세터를 준다.

 

V(뷰)

jsp파일 등이 있다.

 

———————————————————————————————————————-

 

유저가 *.do를 치면 web.xml에 의해 디스패처 서블릿이 연결된다. 디스패처 서블릿은 자바클래스를 메모리 할당하고, (2)어노테이션으로 메소드를 발동하고, (3)포워드시킨다.

 

메모리 할당되는 클래스들은 모델(스프링에선 ‘XXX컨트롤러.java’)이다. 모델 내부는 어노테이션으로 클래스, 메소드가 전부 구분되어 있다.(클래스를 런타임동안 연결해주는게 “컨트롤러”, 메소드와 연결해주는게 “리퀘스트 매핑”이다).

 

모델 내부에서 어노테이션으로 메소드를 찾았다면 해당 메소드를 발동한다(invoke). 메소드 안쪽은 보통 DAO를 사용하고, DAO는 Config.xml에 의해서 mapper.xml과 연결되어 있다. 처리가 끝나면 포워드를 통해 페이지를 이동한다.

어트리뷰트(attribute)와 파라미터(parameter)의 차이

어트리뷰트(attribute)와 파라미터(parameter)의 차이

 

1. 어트리뷰트는 set과 get, 파라미터는 get만
-어트리뷰트는 리퀘스트(request)가 가지고 있다. 프로그래머가 리퀘스트에 어트리뷰트를 setAttribute하거나  getAttribute한다. 보통 MVC 패턴의 모델(자바파일)에서 어트리뷰트를 set하고, jsp에서 get해와서 html로 번역해 뿌린다.

 

-파라미터는 일반적으로 get만 한다. setParameter는 사용자(user)가 input박스에 직접 써넣기 때문에 거의 쓰이지 않는다.

 

2. 어트리뷰트는 해시맵, 파라미터는 스트링 반환
-어트리뷰트는 String을 넘기면 Object가 반환된다. Attribute는 [키,키값]형식의 해시맵(HashMap)이다. setAttribute는 vo나 List같은 오브젝트를 통째로 어트리뷰트에 싣고 전달할 수 있다. getAttribute는 키를 넘기면 키값이 오브젝트로 반환된다.

 

-파라미터는 String을 넘기면 String이 반환된다. getParameter는 스트링을 매개변수(인수)로 넘기면 스트링 값을 구할 수 있다.

 

3. 어트리뷰트는 모든 영역, 파라미터는 리퀘스트 영역
-어트리뷰트는 어떤 스코프든 상관없이 공통적으로 존재한다. 다시 말해 어트리뷰트는 리퀘스트에 싣는 것도 가능하지만(setAttribute), 세션에도 실을 수 있고, 어플리케이션 컨텍스트에도 실어 보낼 수 있다.

 

-파라미터는 리퀘스트 영역에 존재한다.

 

※jsp의 스코프(scope=영역)
page < request < session < application context

1) ‘페이지’는 하나의 페이지 안에서만 유효하다(기본값).

2) ‘리퀘스트’는 응답할 때까지만 유효하다.

   -ServletRequest에 접근 권한이 있는 경우만 접근가능

3) ‘세션’은 웹 브라우저를 종료할 때까지만(혹은 세션이 만료될 때까지만) 유효하다.(로그인과 일치)

   -HttpSession에 접근 권한이 있는 경우만 접근가능

4) ‘어플리케이션 컨텍스트’는 웹 서버를 종료할 때까지 유효하다. 모든 서블릿이 공유하는 영역이다.

   -누구나 접근가능

 

4. 어트리뷰트는 표현언어(EL), 파라미터는 표현식으로 출력

 -어트리뷰트는 ${aa}로 출력한다.(표현언어)

표현언어는 HashMap의 get(key);와 비슷하다.

 

-getParameter로 얻어온 파라미터는 <%=aa%>로 출력한다(표현식)

표현식은 System.out.print();와 비슷하다.

 

-만약 표현언어로 파라미터를 출력하려면 ${param.aa}로 출력하면 된다.

표현식과 표현언어(EL)

표현식과 표현언어(EL)

표현식: 파라미터에 싣는다. <%= %>

표현언어: 어트리뷰트에 싣는다.

<%=    표현식

${ }   EL(표현언어)

<% String pp=request.getParameter(“price”);
request.setAttribute(“price”, pp);%>
는 아래 한 줄로 대체될 수 있다.

<c:set var=”price” value=”${param.price}”/>

온로드

<script type=”text/javascript”>

  $(function(){
 
   var aa=$(‘#a span’).text();
   $(‘#print’).text(aa);
 
  });
</script>

에이젝스

$.ajax({
   METHOD:’POST’,
   DATA:’aaa’,
   URL:”,
   function(response)
      {
   
      }
  })

스판 태그 안에 글자 넣기

  $(function(){
  $(‘#abc’).click(function(){
   var aa=$(‘#a span’).text();
   $(‘#print’).text(aa);
  });
  });

$(document).ready(function(){}); 는
$(function(){});                 로 대체가능

<script type=”text/javascript”>
  $(function(){
  $(‘#abc’).click(function(no){
   var aa=$(‘#a’+no+’ span’).text();
   $(‘#print’).text(aa);
  });
  });
</script>

태그 안의 속성일 경우 val을 써야함
var aa=$(‘#a span’).val();
$(‘#print’).val();

텍스트일 경우 텍스트를 써야함

var aa=$(‘#a span’).text();
$(‘#print’).text(aa);

<body>
  <div id=”a”>
    <span id=”aaa”>aaa</span>
  </div><br>
  <div id=”b”>
     <span id=”aaa”>bbb</span>
  </div>
  <input type=button id=”abc” value=”클릭”>
  <br>
 
  <div id=”print”>
  
  </div>
 
</body>

div 2개에 AJAX동시적용

div 2개에 AJAX동시적용

 

myajax.js라는 파일 안에 sendGet(‘divA’,’price.jsp’,’price=3000′) 라는 자바스크립트 함수를 만들어봤다. 이 함수는 ‘price=3000’을 get방식으로 넘겨줬을 때, ‘price.jsp’를 ‘divA’라는 div 안에 ajax방식으로 출력해주는 함수이다.

 

그런데 이 메소드에는 문제가 하나 있다.

 

만약 sendGet(‘divA’,’price.jsp’,’price=3000′) 함수와 sendGet(‘divB’,’price.jsp’,’price=2500′) 함수 두 개가 있다고 하자. 두 함수를 각각 실행하면 제대로 돌아가지만, 연달아서 실행하면 실행되지 않는다. 다시 말해 function temp(){ }라는 함수를 만들어서 그 안에 두 줄을 연달아 넣는다면, 한 쪽 div에는 출력되지만 다른 쪽 div에는 출력되지 않는다.

 

이를 해결하기 위해 만든 메소드가 sendGet2 이다.

 

sendGet2(‘divA’,’divB’,’price.jsp’,’price=3000′)라는 자바스크립트 함수를 실행했을 때, divA와 divB 안에 같은 파일을 ajax로 뿌려준다.

 

index.jsp

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>

     <script src=”myajax.js” type=”text/javascript”></script>
     <script type=”text/javascript”>
  function up(){
   document.frm.price.value=parseInt(document.frm.price.value)+1;//parseInt: 정수화
  }
  function down(){
   document.frm.price.value=parseInt(document.frm.price.value)-1;//parseInt: 정수화
  }
  </script>

</head>
<body>
  <a href=”javascript:sendGet2(‘divA’,’divB’,’price.jsp’,’price=’+document.frm.price.value)”>두 칸 동시출력</a>
  <p><p><p>
   
  <form name=”frm”>
   <input type=”text” name=”price” value=”2015″>   
 
   <a href=”javascript:up()”>UP</a>&nbsp;&nbsp;&nbsp;&nbsp;
   <a href=”javascript:down()”>DOWN</a>
   
 
</form>

   <p><p><p>
   
   <div id=”divA” style=”border:1px solid #000000; width:50%; display:table-cell;”></div>
   <div id=”divB” style=”border:1px solid #000000; width:50%; display:table-cell;”></div>
   <p><p><p>
   <a href=”javascript:sendGet(‘divA’,’price.jsp’,’price=’+document.frm.price.value)”>왼쪽만 대입</a>&nbsp;&nbsp;&nbsp;&nbsp;
   <a href=”javascript:sendGet(‘divB’,’price.jsp’,’price=’+document.frm.price.value)”>오른쪽만 대입</a>
 
 
</body>

</html>

 

price.jsp

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>

<c:set var=”price” value=”${param.price}”/>
<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>
</head>
<body>
가격은  ${price}입니다.

</body>
</html>

 

myajax.js

 var httpRequest=null;
var pView=null;
var pView2=null;
function createHttpRequest(){
  if(window.ActiveXObject) //IE
  { return new ActiveXObject(“Msxml2.XMLHTTP”); }

  else if(window.XMLHttpRequest)//Crome,FireFox
  { return new XMLHttpRequest(); }

  else//NOT SUPPORT
  { return null; }
}

//포스트
function sendPost(divId,pFile,pValue){
  httpRequest=createHttpRequest();
  httpRequest.open(“POST”,pFile,true);
  httpRequest.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
 
  httpRequest.send(pValue); //id=aaa&pwd=1234
  pView=divId;
  httpRequest.onreadystatechange=pResult;
}

//겟
function sendGet(divId,pFile,pValue){
   httpRequest=createHttpRequest();
   if(pValue==null||pValue==””){
    httpRequest.open(“GET”,pFile,true);
   }
   else{
    httpRequest.open(“GET”,pFile+”?”+pValue,true);}//id=aaa&pwd=1234
   httpRequest.send(null);
   pView=divId;
   httpRequest.onreadystatechange=pResult;
}

//결과를 div에 출력
function pResult(){
  if(httpRequest.readyState==4){
    if(httpRequest.status==200){
       var div=document.getElementById(pView);
       div.innerHTML=httpRequest.responseText;
    }
  }
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

//포스트: div 2개에 출력하기 위한 메소드
function sendPost2(divId1,divId2,pFile,pValue){
 alert(“divId1” + “divId2” + “pFile” + “pValue”);
  httpRequest=createHttpRequest();
  httpRequest.open(“POST”,pFile,true);
  httpRequest.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
 
  httpRequest.send(pValue); //id=aaa&pwd=1234
  pView=divId1;
  pView2=divId2;
  httpRequest.onreadystatechange=pResult2;
}

//겟: div 2개에 출력하기 위한 메소드
function sendGet2(divId1,divId2,pFile,pValue){
   httpRequest=createHttpRequest();
   if(pValue==null||pValue==””){
    httpRequest.open(“GET”,pFile,true);
   }
   else{
    httpRequest.open(“GET”,pFile+”?”+pValue,true);}//id=aaa&pwd=1234
   httpRequest.send(null);
   pView=divId1;
   pView2=divId2;
   httpRequest.onreadystatechange=pResult2;
 }

//div 2개에 결과출력
function pResult2(){
  if(httpRequest.readyState==4){
    if(httpRequest.status==200){
       var div=document.getElementById(pView);
       div.innerHTML=httpRequest.responseText;
       var div=document.getElementById(pView2);
       div.innerHTML=httpRequest.responseText;
    }
  }
}

 

ORM 오브젝트 릴레이션 매핑

ORM 오브젝트 릴레이션 매핑(object-relational mapping)

ORM하면, 마이바티스나 하이버네이트를 뜻한다.

ajax 메소드화

ajax 메소드화

 

아래는 ajax를 메소드화한 것이다. sendPost(출력할 div id, 가져올 파일, 넘길 파라미터) 또는 sendGet 으로 쉽게 ajax를 쓸 수 있다.

 

 

예를 들어 index.jsp에 login.jsp파일을 갖다 쓰고 싶다고 하자. 우선 index.jsp 안에 div를 하나 만든다. 이 div의 id가 temp 라고 하자. 그리고 id와 pwd라는 파라미터를 넘긴다고 해보자. 그럴경우 아래와 같이 링크걸 수 있다.

 

<a href=”javascript:sendPost(‘temp’,‘login.jsp’,‘id=admin&pwd=1234’)”>로그인</a>

                   //sendPost(출력할 div id가져올 파일, 넘길 파라미터)

 

————————————————————————————-

index.jsp

 <%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>

     <script src=”pppAjax.js” type=”text/javascript”></script>
<!–      <script type=”text/javascript”> –>

<!–      </script> –>

</head>
<body>
  <form name=”frm”>
  <input type=”hidden” name=”id” value=”admin”>
  <a href=”javascript:sendPost(‘div1′,’product.jsp’,’id=’+document.frm.id.value)”>제품 조회(포스트)</a>
  </form>
  <div id=”div1″ style=”border:1px solid #000000;”></div>
  <p>
  <a href=”javascript:sendGet(‘div2′,’price.jsp’,’name=홍길동’)”>가격 조회(겟)</a>
  <div id=”div2″style=”border:1px solid #000000;”></div>
 
</body>
</html>

 

pppAjax.js

var httpRequest=null;
var pView=null;
function createHttpRequest(){
  if(window.ActiveXObject) //IE
  { return new ActiveXObject(“Msxml2.XMLHTTP”); }

  else if(window.XMLHttpRequest)//Crome,FireFox
  { return new XMLHttpRequest(); }

  else//NOT SUPPORT
  { return null; }
}

function sendPost(divId,pFile,pValue){
  httpRequest=createHttpRequest();
  httpRequest.open(“POST”,pFile,true);
  httpRequest.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
 
  httpRequest.send(pValue); //id=aaa&pwd=1234
  pView=divId;
  httpRequest.onreadystatechange=pResult;
}

function sendGet(divId,pFile,pValue){
  httpRequest=createHttpRequest();
  if(pValue==null||pValue==””){
   httpRequest.open(“GET”,pFile,true);
  }
  else{
   httpRequest.open(“GET”,pFile+”?”+pValue,true);}//id=aaa&pwd=1234
  httpRequest.send(null);
  pView=divId;
  httpRequest.onreadystatechange=pResult;
}

function pResult(){
  if(httpRequest.readyState==4){
    if(httpRequest.status==200){
       var div=document.getElementById(pView);
       div.innerHTML=httpRequest.responseText;
    }
  }
}

 

price.jsp

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<% String name=request.getParameter(“name”);%>
<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<%=name%>님, 가격 페이지입니다.
</body>
</html>

 

product.jsp

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<% String id=request.getParameter(“id”); %>
<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<%=id%>님, 제품 페이지입니다.
</body>
</html>

 

ajax 기본정리

ajax 기본정리

 

간단한 ajax를 만들어보았다.

 

겟 방식과 포스트 방식 각각으로, index.jsp 안에 result.jsp를 비동기적(어싱크로노우스)으로 뿌릴 수 있다.

 

index.jsp

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
<title>Insert title here</title>

     <script src=”myajax.js” type=”text/javascript”></script>
     <script type=”text/javascript”>

     //자바스크립트 쓰는곳

     </script>

</head>
<body>
  <form name=”frm”>
 <input type=”text” name=”txt1″ value=”id=admin”>
 <a href=”javascript:sendPost(document.frm.txt1.value)”>포스트로 보내기</a>
 <a href=”javascript:sendGet(document.frm.txt1.value)”>겟으로 보내기</a>
 <div id=”result”></div>
  </form>
</body>
</html>

 

myajax.js

var httpRequest=null;//통신객체(각 브라우저에 내장)

 

function createHttpRequest(){
  if(window.ActiveXObject) //IE
  { return new ActiveXObject(“Msxml2.XMLHTTP”); }

  else if(window.XMLHttpRequest) //크롬,파이어폭스
  { return new XMLHttpRequest(); }

  else //지원하지 않는 브라우저
  { return null; }
}

 

function sendPost(pValue){
  httpRequest=createHttpRequest();
  httpRequest.open(“POST”,”result.jsp”,true);
  httpRequest.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
  httpRequest.send(pValue); //id=aaa&pwd=1234
  httpRequest.onreadystatechange=pResult;
 /*
 1. 객체를 얻어온다.
 2. open: 서버 연결. (메소드 방식,연결하는 타입명,true(=비동기))
 3. 한글 변환(POST만 할것)
 4. send: 데이터 전송. 예를 들어 포스트 방식은 여기에 id=aaa&pwd=1234라고 쓰고, get방식은 null을 줘야한다. (get방식은 open의 url안에 써야함)
 5. onreadystatechange: 서버로부터 응답이 들어오면 메소드 호출한다.
 */
}

 

function sendGet(pValue){
  httpRequest=createHttpRequest();
  httpRequest.open(“GET”,”result.jsp?”+pValue,true); //id=aaa&pwd=1234
  httpRequest.send(null);
  httpRequest.onreadystatechange=pResult;
}

 

function pResult(){
  if(httpRequest.readyState==4){
   if(httpRequest.status==200){
      var div=document.getElementById(“result”); //$(‘#result’).text() 와 같음
      div.innerHTML=httpRequest.responseText;
      //위 두 줄을 $(‘#result’).html(httpRequest.responseText)로 대체 가능
   }
  }
}

 

/*readyState
0: uninitialized : 객체만 생성되고 아직 초기화 되지 않은 상태
1: loading : open 메서드가 호출되고 아직 send 메서드가 불리지 않은 상태
2: loaded : send메소드가 불렸지만 status 와 헤더는 도착하지 않은 상태
3: interactive : 데이터의 일부를 받은 상태
4: completed :  데이터를 전부 받은 상태, 완전한 데이터 이용가능

 

status
200 : ok 요청성공
403 : Forbidden  접근거부
404 : not found  페이지 없음
500 : internal server error 서버오류 발생*/

 

result.jsp

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html>
<html>
<head>
<meta charset=”EUC-KR”>
</head>
<body>
 
    <input type=”text” value=”값”>
 
</body>
</html>

 

 

이클립스나 STS에서 exit code 13 에러

이클립스나 STS에서 exit code 13 에러

 

 

이클립스나 STS에서 exit code 13 에러가 발생했다면 exe파일이 있는 곳의 int 파일을 메모장으로 고쳐야 한다. 예를 들어 C:\SpringDev\sts-bundle\sts-3.6.3.RELEASE 에 STS.exe가 있다면 같이 있는 STS.ini 파일을 편집한다.

 

-startup 다음줄에 아래처럼 입력해주면 된다.

 

-vm
C:\Program Files\Java\jdk1.8.0_25\bin\javaw.exe

 

(이때 javaw.exe 경로는 본인의 컴퓨터에 맞게 써주어야 한다)

 

 

css 가상선택자

css 가상선택자

 

:link, :visited, :hover, :active, :focus, :first-child

:first-line, :first-letter, :before, :after

 

가상 선택자란 실제로는 존재하지 않는 요소나 특수한 상황에서만 발생하는 동적인 요소를 CSS 명령으로 제어하는 기법이다.

 

가상 선택자의 종류는 2가지.

1) ‘가상 클래스 선택자’

가상 클래스 선택자(:link, :visited, :hover, :active, :focus, :first-child)는 특정 요소에 마치 동적으로 class를 부여한 것과 비슷

 

2) ‘가상 요소 선택자’

가상 요소 선택자(:first-line, :first-letter, :before, :after)는 실제로 존재하지 않는 요소를 마치 존재하는 것처럼 이용

예) .container:after { content:””; clear:both; display:block; }

ex)  :after 라는 가상 요소 선택자는 content 라는 속성을 이용해서 .container 블럭이 끝나기 직전 content 속성의 값 “*” 을 화면에 출력할 수 있음. 이렇게 생성된 요소에 clear:both 속성을 부여하면 자식의 높이를 부모에게 전달할 수 있는데 실제로 HTML 코드에는 빈 요소가 존재하지 않기 때문에 가장 이상적인 방법이라고 할 수 있음. 그러나 IE 6~7 브라우저는 가상 요소 선택자를 지원하지 않음

[Tomcat] UTF-8 URIEncoding 적용

[Tomcat] UTF-8 URIEncoding 적용

server.xml 수정

<Connector URIEncoding=”UTF-8″ connectionTimeout=”20000″ port=”8080″ protocol=”HTTP/1.1″ redirectPort=”8443″ />

오라클 아이피 변경

어드민 폴더의, 티네임서버(메모장)와 리스너(메모장) 내부를 바꿔야 함

서브스트링 a<=str<b

 

서브스트링 a<=str<b

 

substirng(a,b)
서브스트링은 a번째는 포함하되, b번째는 포함하지 않는다.

a<=str<b

URL: 인터넷 주소 전체를 URL이라고 한다.

     ex) http://naver.com/web/main.do
URI: URL의 뒤쪽 세부경로 부분을 URI라고 한다.

     ex) web/main.do
contextPath: 뒤쪽 세부경로 중 파일명만 뺀 부분을 컨텍스트 패스 라고 한다.

     ex) web/

예제 소스)

filename=uri.substring(contextPath.length)

filefront=filename.substring(0,filename.lastIndexof(‘.’));
fileback=filename.substring(filename.lastIndexof(‘.’)+1);
 

AOP

AOP

class A
  insert

class B extends A
  getConnection    BEFORE
  insert
  disConnection    AFTER

A a=new B();

AOP라고 한다. (스트러츠에서는) ‘인터셉트’라고도 한다.

중복코딩을 제거한다.

-BEFORE: 전에 호출해라

-AFTER: 들어가면 후에 호출해라.

ex)

-BEFORE(DAO.*()): DAO에 들어가는 모든 메소드에 get커넥션, 디스커넥션 들어간다.

-AFTER(DAO.*()) : 매개변수가 없는것만.

-AFTER(DAO.*(..)) : 매개변수가 몇개가 들어가도 상관없음.

컴포넌트 패턴, GOF 패턴

컴포넌트 패턴

스프링에서는 8가지 패턴을 쓴다. 이 8가지를 합쳐서 컴포넌트 패턴이라고 한다.

1. 싱글턴

2. 팩토리

3. MVC(옵저버)

4. 어댑터 패턴: 한 번에 모아서 생성.

5. 프록시 패턴: AOP와 관련. 프록시=대리자

6.

7.

8.

GOF 패턴

모든 디자인 패턴은 25가지다. 만든 사람들의 이름을 따서 GOF 패턴이라고 한다.

어댑터 패턴

어댑터 패턴

클래스를 통합할 때 쓰는 패턴.

MVC패턴

MVC 패턴

옵저버 패턴(observer pattern)을 발전시킨 형태.

POJO

POJO(플레인 올드 자바 오브젝트)

상속이 없고 임플리먼츠가 없는 클래스. 만약 Model을 임플리먼츠 받았다면 Model이라는 형을 갖지만, 이런 POJO는 Object로만 캐스팅할 수 있다.

리플렉트

리플렉트

3가지가 있다.

클래스 리플렉스
메소드 리플렉스
멤버변수 리플렉스

어노테이션

어노테이션

/*
 * 어노테이션은 4가지가 있다.
 *   @ 클래스 구분자  ElementType.TYPE(클래스 위에 골뱅이가 붙어야 함) 
 *   Class A
 *   {
 *    @ 멤버변수 구분자 ElementType.FIELD
 *    B b
 *    public A(@ B b) 매개변수 구분자  ElementType.PARAMETER
 *    @ 메소드 구분자  ElementType.METHOD
 *    public void aaa()
 *    @
 *    public void bbb()
 *   }
 */

package com.controller;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//@Controller 로 호출

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)

public @interface Controller {
 public String value(); //@Controller(“mc“)에서 mc를 가져옴
 
//인터페이스 이므로 기능은 없음
 //컴파일까지만 유지:소스 RetentionPolicy.SOURCE
 //실행시에도 유지(프로그램 종료시까지 기능 유지) :런타임
}

package com.controller;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})

public @interface RequestMapping {
 public String value();
}

관계 데이터 연산

관계 데이터 연산은 관계 데이터 모델의 연산이다. 관계 데이터 모델은 수학의 릴레이션(관계)을 이용하여 ERD(개체 관계 다이어그램)의 개체와 관계를 모두 표현할 수 있다는 생각이었다. 따라서 릴레이션은 일종의 집합이며, 집합에 대한 수학 연산을 그대로 이용한다.

 

따라서 관계 데이터 연산은 정형 관계 데이터 언어를 사용한다. 이는 관계 대수와 관계 해석으로 나뉜다. 관계 대수는 절차언어이며 수행 계획 표현에 적절하다. 방법(how)과 원하는 것(what)을 명세한다. 관계해석은 비절차적 언어로 원하는 것(what)만 명세하고 그 방법(how)은 생략한다.

 

첫째, 관계 대수는 릴레이션 조작을 위한 연산집합이다. 피연산자, 일반 집합 연산자, 순수관계 연산자로 구성되어 있다. 피연산자는 하나 이상의 릴레이션이다.

 

일반 집합 연산자는 합집합, 교집합, 차집합, 카티션 프로덕트가 있다. 합집합은 릴레이션들을 합하고, 교집합은 릴레이션들의 공통분모를 추려내며, 차집합은 릴레이션에서 다른 릴레이션을 빼고, 카티션 프로덕트는 릴레이션 둘을 곱한다.

 

순수 관계 연산자는 셀렉션, 프로젝션, 조인, 디비전이 있다. 릴레이션은 튜플의 집합으로 튜플의 구조를 건드리는 연산이 필요하다. 셀렉션은 원하는 튜플을 골라낸다. 프로젝션은 원하는 애트리뷰트를 골라낸다. 조인은 튜플들을 연결한다. 디비전은 튜플을 나눈다.

 

둘째, 관계 해석은 도메인 관계해석과 튜플 관계해석으로 나뉜다. 도메인 관계해석은 튜플값 대신 도메인으로 값을 취한다. 표현식은 {P()} 로 쓴다. 튜플 관계해석은 계산방법을 명세하지 않고 답의 집합을 표현한다. 식은 p(T)로 쓴다. 식 p(T)는 T=t일때 참이 되는 모든 튜플 t의 집합이다.

스프링 용어

스프링 용어

스프링에서의 “서비스” => “인터페이스”

스프링에서의 “컨트롤러”(스트러츠에서의 액션) => 디스패처 서블릿이 아니라 “모델” 을 의미.

(디스패처 서블릿은 “프론트 컨트롤러”라 부름)

프로퍼티=> 셋 메소드를 의미

타입=> 클래스를 의미

스프링 세터 di

세터 di

스프링에서 xml의 값을 한 번에 바꾸는것. 셋 메소드의 값을 다 바꿔버린다.

MVC패턴 흐름도

MVC패턴 흐름도

 

JSTL

JSTL

JSTL

        1) core    : 제어문, URL

        2) format : 문자, 숫자, 날짜 변환

        3) xml     : XML 파싱                è 자바에서 처리

        4) sql      : 데이터베이스 연결    è 자바(DAO)

        5) fn       : String과 컬렉션 클래스의 함수 지원 è 자바

연산자

산술연산자(+    *  /  %)

   + 는 산술만 사용 (문자열 결합이 없다)

       ${“10″+1} è 11   (문자형태 숫자는 연산하면 숫자로 변환)

       ${“10 “+1} è 에러 (공백 등 숫자변환 불가능한 주면 에러)

       ${5 / 2} è  2.5  ${5 div 2} 와 같다. (정수 나누기 정수는 실수)

       ${5 % 2 } è 1   ${5 mod 2} 와 같다.

   null0으로 인식

       ${null+1}  è 1 (null0으로 인식)

비교 연산자 (boolean)

    ==    <    >    <=   >=   !=

    (eq)   (lt)  (gt)   (le)  (ge)  (no)

    equals가 없으므로 문자열 이콜 검사에도 == 를 쓴다.

    ${10 == 20} è ${10 eq 20}

    ${“aaa“==”bbb“}

논리 연산자 (boolean)

    &&     ||

    (and)  (or)

삼항연산자 (조건?:)


ojdbc 경로

ojdbc 경로

 

오토와이어드(Autowired)

오토와이어드(Autowired)

new라는 연산자를 쓰지 않아도 A a하고 오토와이어드(Autowired)를 하면 주소값이 붙는다.

반응형웹

반응형웹

반응형웹의 원리는 브라우저 크기에 따라 css를 교체해준다.

1. head 안에

<meta name=”viewport” content=”width=device-width, initial-scale=1″>

<link rel=”stylesheet” href=”스타일시트이름.css”> 을 넣는다.

2. css 파일에 아래 내용을 넣는다.

@media screen and (max-width:450px){
/*    모바일 */
   #d_title{font-size: 12px;  width:100%; height:125px;}
   #d_menu{width:100%; height:40px; font-size:12px; font-weight:bold;}
   #d_mid{font-size: 12px;}
   #d_box{display: none;}
}

@media screen and (min-width:451px) and (max-width:900px){
/*    타블렛 */
   #d_title{font-size: 12px; width:100%; height:125px;}
   #d_menu{width:100%; height:40px;
         font-size:14px; font-weight:bold;}
   #d_mid{font-size: 12px;}
   #d_box{display: none;}
}

@media screen and (min-width:901px){
/*  데스크탑*/

   #d_title{margin-left:100px; width:200px; font-size: 12px; height:125px; display: inline-block;}
   #d_menu{width: 580px   ; height:130px; display: inline-block;
          font-size:16px; font-weight:bold;}
   #d_mid{font-size: 12px;}
   #d_box{display:block; margin-left:100px; width:188px; height:650px; overflow:hidden;}
}

DOM파싱 수정, 삭제

DOM파싱 수정, 삭제

XML파일

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no”?>
<sawon>
    <list>
        <sabun>1</sabun>
        <name>홍길동</name>
        <dept>영업부</dept>
        <loc>서울</loc>
        <hiredate>2010-05-02</hiredate>
    </list>
    <list>
        <sabun>2</sabun>
        <name>심청이</name>
        <dept>기획부</dept>
        <loc>서울</loc>
        <hiredate>2010-05-02</hiredate>
    </list>
    <list>
        <sabun>3</sabun>
        <name>박문수</name>
        <dept>개발부</dept>
        <loc>서울</loc>
        <hiredate>2010-05-02</hiredate>
    </list>

</sawon>

 

클래스 선언과 생성자

package com.xml;

import java.util.*;
import java.io.*;
import java.text.*;//날짜변환

import javax.xml.parsers.*;//파싱
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

import org.w3c.dom.*;//돔

import com.sun.org.apache.xalan.internal.xsltc.cmdline.Transform;

public class SawonXML {

  //                 > Sawon    > list    >   sabun  >
  // Document > Element > Element > Element > text
  private Document doc; //전역 DB. 파싱된 위치를 도큐먼트라고 한다. DB로 따지면 ORCL이다. (전역 데이터베이스가 ORCL이다)
  private Element root; //테이블. 테이블명을 엘리먼트라고 한다.
  private String path=”C:\\webDev2\\workspace\\XMLProject2\\WebContent\\WEB-INF\\data\\sawon.xml”;//XML위치
  private static SawonXML xml;//싱글턴 패턴. static을 쓴다. 메모리를 하나만 써야 하기 때문에 쓴다.

 

   public SawonXML(){
  try{
   // ■파서기 생성
   // 파서: xml을 읽어서 트리 형태로 메모리에 저장(파싱:xml->doc)
   //HTML, XML, WML 등을 파싱할 수 있다.
   //파서기: 인터페이스로 되어있다
   DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
   
   //DocumentBuilder는 인터페이스이다.
   //인터페이스는 추상클래스의 일종이므로, 스스로 new를 할 수 없기에 DocumentBuilderFactory를 이용해서 메모리 할당한다.
   DocumentBuilder db=dbf.newDocumentBuilder();
   
   // ■저장공간 확보
   doc = db.parse(new File(path));
   //doc가 xml 정보를 다 가진다.
   
   // ■테이블(최상위 태그) 가져옴    역파싱(doc->xml file로 바꿀 수 있다) 다시 말해, 돔은 crud가 가능하다.
   root=doc.getDocumentElement();
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
}

 public static SawonXML newInstance(){
  if(xml==null)
   xml=new SawonXML();
  return xml;
 }

 

   ……….. //이 부분에 DOC 제어에 관한 것들을 넣는다.

}

 

DOC 제어(SawonXML 내에 작성)

xml의 데이터 삭제

public class SawonXML {

   (중략)………..

 public void sawonDelete(int sabun){
  try{
   NodeList list=root.getElementsByTagName(“list”);
   for(int i=0;i<list.getLength();i++){
    list=root.getElementsByTagName(“sabun”);
    String sa=list.item(i).getFirstChild().getNodeValue();
    list=root.getElementsByTagName(“list”);
    if(sabun==Integer.parseInt(sa)){
     Element listElem=(Element)list.item(i);
     root.removeChild(listElem);
     xmlSave();
     break;
    }//if 
   }//for
  }//try
  catch(Exception ex){System.out.println(ex.getMessage());}
 }

   (중략)………..

}

 

xml에 데이터 추가

public class SawonXML {

   (중략)………..

public void sawonInsert(SawonVO vo){
  try{
   //리스트 노드 만든다
   Element list=doc.createElement(“list”);
   // <list></list>까지 한 쌍을 만들어준다.
   
   //나머지 노드 만든다
   Element sabun=doc.createElement(“sabun”);
   // <sabun></sabun> => 사이에 넣는걸 어펜드 차일드라고 함
   Text stxt=doc.createTextNode(String.valueOf(sawonMax()));//텍스트 노드를 만들어서 넣어야 함
   sabun.appendChild(stxt);
   
   Element name=doc.createElement(“name”);
   Text ntxt=doc.createTextNode(vo.getName());
   name.appendChild(ntxt);
   
   Element dept=doc.createElement(“dept”);
   Text dtxt=doc.createTextNode(vo.getDept());
   dept.appendChild(dtxt);
   
   Element loc=doc.createElement(“loc”);
   Text ltxt=doc.createTextNode(vo.getLoc());
   loc.appendChild(ltxt);
   
   Element hiredate=doc.createElement(“hiredate”);
   SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-mm-dd”);
   Text htxt=doc.createTextNode(sdf.format(new Date()));
   hiredate.appendChild(htxt);
   
   //5개 노드를 사원 밑에 다 붙인다
   list.appendChild(sabun);
   list.appendChild(name);
   list.appendChild(dept);
   list.appendChild(loc);
   list.appendChild(hiredate);
   
   root.appendChild(list);
   
   xmlSave();
   
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
 }

   (중략)………..
}

 

xml을 저장 (DOC를 XML로 변환):

※추가/삭제한 것을 반영

public class SawonXML {

   (중략)………..

  public void xmlSave(){
  
  try{
   TransformerFactory tff=TransformerFactory.newInstance();
   Transformer tf=tff.newTransformer();
   tf.setOutputProperty(OutputKeys.INDENT,”yes”);//들여쓰기
   tf.setOutputProperty(OutputKeys.ENCODING,”UTF-8″);
   DOMSource dom=new DOMSource(doc);
   StreamResult sr=new StreamResult(path);//XML파일로 보냄
   
   tf.transform(dom, sr);
   
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }

   (중략)………..
}

 

XML 내에서 검색

public class SawonXML {

   (중략)………..

 public SawonVO sawonFindData(int sabun){
  SawonVO vo=new SawonVO();
  try{
   NodeList node=root.getElementsByTagName(“list”);
   for(int i=0;i<node.getLength();i++){
    node=root.getElementsByTagName(“sabun”);
    String sa=node.item(i).getFirstChild().getNodeValue();//사번값 첫번째 값을 가져온다
    node=root.getElementsByTagName(“name”);
    String name=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“dept”);
    String dept=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“loc”);
    String loc=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“hiredate”);
    String hiredate=node.item(i).getFirstChild().getNodeValue();
    
    if(sabun==Integer.parseInt(sa)){
     vo.setSabun(Integer.parseInt(sa));
     vo.setName(name);
     vo.setDept(dept);
     vo.setLoc(loc);
     vo.setHiredate(hiredate);
     break;
    }
   }
   
  }
  catch(Exception ex){System.out.println(ex.getMessage());}
  return vo;
 }

   (중략)………..
}

 

XML내에서 읽기1(목록 출력) (오라클의 SELECT)

public class SawonXML {

   (중략)………..

 public ArrayList<SawonVO> sawonAllData(){
  ArrayList<SawonVO> list=new ArrayList<SawonVO>();
  try{
   //노드 리스트로 묶는다.
   //루트부터 시작해서 값을 가져온다.
   NodeList node=root.getElementsByTagName(“list”);
   for(int i=0;i<node.getLength();i++){
    node=root.getElementsByTagName(“sabun”);
    String sabun=node.item(i).getFirstChild().getNodeValue();//사번값 첫번째 값을 가져온다
    node=root.getElementsByTagName(“name”);
    String name=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“dept”);
    String dept=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“loc”);
    String loc=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“hiredate”);
    String hiredate=node.item(i).getFirstChild().getNodeValue();
    SawonVO vo=new SawonVO();
    vo.setSabun(Integer.parseInt(sabun));
    vo.setName(name);
    vo.setDept(dept);
    vo.setLoc(loc);
    vo.setHiredate(hiredate);
    list.add(vo);
   }
  }catch(Exception ex){ex.getMessage();}
  return list;
 }

   (중략)………..
}

 

XML내에서 읽기2 (오라클의 SELECT)

public class SawonXML {

   (중략)………..

  public int sawonMax(){
  int sabun=0;
  try{
   NodeList list=root.getElementsByTagName(“list”);
   for(int i=0;i<list.getLength();i++){
    // 1 2 3
    list=root.getElementsByTagName(“sabun”);
    String sa=list.item(i).getFirstChild().getNodeValue();
    if(sabun<Integer.parseInt(sa)){
     sabun=Integer.parseInt(sa);
     
    }
   }
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
  return sabun+1;
 }

   (중략)………..
}

 

어노테이션(구분자)

어노테이션(구분자)

골뱅이가 붙은 것. 구분자, 라고도 부른다.

스트링은 “컨트롤러” 라는 인터페이스가 있다. ex)listController
스트러츠는 “액션”이라는 인터페이스가 있다. ex)listAction

클래스를 부를때는 XML, 메소드를 부를 때는 어노테이션을 쓴다.
(게시판 기능 8개를 부를 때, 8개 클래스를 만드는게 아니라, 어노테이션으로 8개 메소드를 부른다)

<bean id=”list” class=”com.model.ListModel”/>

를 아래처럼 대체한다.

Controller(“list”)
class ListModel ……..

bean의 class는 패키지 단위로 한 번에 메모리 할당하지만, bean의 id를 구분해둘 수가 없다.
그래서 쓰는게 어노테이션이다. ‘구분자’ 라고 한다.

스태틱, 콜 바이 밸류, 콜 바이 레퍼런스

스태틱, 콜 바이 밸류, 콜 바이 레퍼런스

스태틱: 메모리 공간을 한 개만 쓴다는 뜻.

콜 바이 레퍼런스: “주소 넘기고 값 채워라.” 주소값을 넘겨주기 때문에 한 개의 메모리에서 값을 바꾼다.

   콜 바이 레퍼런스는 두 가지 방법 밖에 없다.

     방법1: 클래스 객체
     방법2: 배열
  주소를 갖고 있는 애가 클래스 객체와 배열 밖에 없기 때문이다.

콜 바이 밸류: “복사본”. 값만 넘겨주기 때문에 복사본을 넘겨주는 것과 같다. 두 개 이상의 메모리.

인터페이스 선언

인터페이스 선언

Interface I

class A implements I
class B implements I
class C implements I

A a=new A();
B b=new B();
C c=new C();

I i=new A();
i=new B();
i=new C();

//클래스는 인터페이스 안에 들어갈 수 있다. 상속에서 자식과 부모와의 관계와 비슷하다.

댓글형 게시판

댓글형 게시판

— 댓글 게시판
DROP TABLE mvcReply;
DROP TABLE mvcBoard;
CREATE TABLE mvcBoard(
 no NUMBER,
 name VARCHAR2(20) CONSTRAINT mvcb_nn_name NOT NULL,
 subject VARCHAR2(1000) CONSTRAINT mvcb_nn_sub NOT NULL,
 content CLOB CONSTRAINT mvcb_nn_cont NOT NULL,
 pwd VARCHAR2(20) CONSTRAINT mvcb_nn_pwd NOT NULL,
 regdate DATE DEFAULT SYSDATE,
 hit NUMBER DEFAULT 0,
 CONSTRAINT mvcb_pk_no PRIMARY KEY(no));

CREATE TABLE mvcReply(
 no NUMBER,
 bno NUMBER,
 id VARCHAR2(20) CONSTRAINT mvcr_nn_id NOT NULL,
 name VARCHAR2(20) CONSTRAINT mvcr_nn_name NOT NULL,
 msg VARCHAR2(1000) CONSTRAINT mvcr_nn_msg NOT NULL,
 regdate DATE DEFAULT SYSDATE,
 group_id NUMBER,
 group_step NUMBER,
 group_tab NUMBER,
 root NUMBER,
 depth NUMBER,
 CONSTRAINT mvcr_pk_no PRIMARY KEY(no),
 CONSTRAINT mvcr_fk_bno FOREIGN KEY(bno) REFERENCES mvcBoard(no));

INSERT INTO mvcBoard(no,name,subject,content,pwd)
VALUES ((SELECT NVL(MAX(no)+1,1) FROM mvcBoard),’김’,’댓글형 게시판’,’댓글형 게시판 만들기 내용’,’1234′);

INSERT INTO mvcBoard(no,name,subject,content,pwd)
VALUES ((SELECT NVL(MAX(no)+1,1) FROM mvcBoard),’박’,’댓글형 게시판’,’댓글형 게시판 만들기 내용’,’1234′);

시퀀스

시퀀스

CREATE SEQUENCE db_no_seq
   START WITH 1 INCREMENT BY 1 NOCYCLE NOCACHE;
insert into databoard values(db_no_seq.nextval,’홍길동’,’파일이 없습니다’,’파일무’,’1234′,SYSDATE,0,”,0);
COMMIT;

자료실 테이블

자료실 테이블

— 2015.04.07
CREATE TABLE databoard(
  no NUMBER,
  name VARCHAR2(34) CONSTRAINT db_nn_name NOT NULL,
  subject VARCHAR2(1000) CONSTRAINT db_nn_subject NOT NULL,
  content CLOB CONSTRAINT db_nn_content NOT NULL,
  pwd VARCHAR2(10) constraint db_nn_pwd NOT NULL,
  regdate DATE default sysdate,
  hit number default 0,
  filename VARCHAR2(260),
  filesize NUMBER,
  CONSTRAINT db_no_pk PRIMARY KEY(no)
);

COMMIT;

라이브러리와 프레임워크의 차이

라이브러리와 프레임워크의 차이

라이브러리는 자바 소스를 고칠 수 없게 되어 있다.

프레임워크는 자바 소스를 고칠 수 있으며, 레고 라고 한다.

리플렉션(reflection)

리플렉션(reflection)

String aaaa=”class”;

Class clsName=Class.forName(aaaa);

이름만 갖고 메모리 할당할 때 forName을 쓴다. 리플렉션은 클래스 이름만 알면 클래스를 제어할 수 있다.

ex) 이름으로 클래스 정보를 얻어온다. (메소드, 멤버변수, 생성자 제어 가능)

리플렉션이란 Runtime시 가상 머신 내부의 객체들을 조사할 수 있는 기능

—–

 

리플렉션에는 3가지가 있다.

클래스 리플렉션, 메소드 리플렉션, 멤버변수 리플렉션.

VBA 익스플로러로 창전환(익스플로러 클래스네임)

VBA 익스플로러로 창전환(익스플로러 클래스네임)

 

‘익스플로러 클래스네임: “IEFrame”

Dim ihwnd As Long
‘//ihwnd = FindWindow(vbNullString, “공시시스템 | 기업개황 “)
ihwnd = FindWindow(“IEFrame”, vbNullString)

If ihwnd = 0 Then
    MsgBox “현재 해당 윈도우를 찾을 수 없습니다”

Else
    Call SetForegroundWindow(ihwnd)
End If

자바 동적배열 선언

자바 동적배열 선언

 

     //선언
     int[] a=null;
     for(int i=0;i<3;i++)//0부터 2까지 동적 배열만들기
     {
      a=new int[i];
     }
     System.out.println(“배열갯수:”+a.length);//배열 갯수: 2개
     
     //출력
     for(int i=0;i<3-1;i++)
     {
      a[i]=i;
      System.out.println(i+”번째 배열: ” +a[i]);
     }

DOM 역파싱 (doc를 xml로 변환)

DOM 역파싱 (doc를 xml로 변환)

혼자 해본 것이기 때문에 정석 방법이 아닐 수 있다.

 

company.xml

<?xml version=”1.0″ encoding=”EUC-KR”?>
<company>
      <product>
            <no>1</no>
            <name>비누</name>
            <price>2000</price>
      </product>

      <product>
            <no>2</no>
            <name>샴푸</name>
            <price>5000</price>
      </product>
      <product>
            <no>3</no>
            <name>폼클렌징</name>
            <price>4000</price>
      </product> 
</company>

 

MainClass.class

package dom;

import java.io.File;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class MainClass {

      public static void main(String[] args) {
            Document doc;
            Element root;

       //1. xml문서를 doc변수에 전부 기억시킴
       try{
  
       DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
       DocumentBuilder db=dbf.newDocumentBuilder();
       doc=db.parse(new File(“src\\company.xml”));
       root=doc.getDocumentElement();
  
       //2. 노드리스트-엘리먼트-아이템-차일드의 밸류값 바꾸기
       NodeList node;

       node=root.getElementsByTagName(“no”); node.item(2).getFirstChild().setNodeValue(“99”);
       node=root.getElementsByTagName(“name”); node.item(2).getFirstChild().setNodeValue(“입욕제”);
       node=root.getElementsByTagName(“price”); node.item(2).getFirstChild().setNodeValue(“10000”);
   
       //3. 역파싱 (doc -> xml)
       TransformerFactory transformerFactory = TransformerFactory.newInstance();
       Transformer transformer = transformerFactory.newTransformer();
  
       DOMSource source = new DOMSource(doc);//저장할 도큐먼트  
       StreamResult result = new StreamResult(new File(“src\\company.xml”));//저장위치 지정 (파일로 저장)
                      // StreamResult result = new StreamResult(System.out);//(테스트용으로 콘솔창에 뿌리기)
       transformer.setOutputProperty(OutputKeys.ENCODING, “EUC-KR”);//한글로 인코딩

       transformer.transform(source, result);//저장
       System.out.println(“파일이 저장되었습니다”);
       
       }catch(Exception ex){System.out.println(ex.getMessage());}
  
      } 
}

 


DOM 파싱 (Document Object Model)

DOM 파싱

 

DOM 파싱은 xml을 전부 읽어서 메모리에 올려두는 방식이다. 한 줄씩 읽는 SAX파싱과 다르게 수정/삭제가 가능하다.

 

company.xml

<?xml version=”1.0″ encoding=”EUC-KR”?>
<company>  <!–company 엘리먼트. 최상위 태그. ‘루트’ 라고 부른다.–>
      <product> <!–product 엘리먼트–>
            <no>1</no>               <!– no 엘리먼트    –>
            <name>비누</name>  <!– name 엘리먼트  –>
            <price>2000</price>   <!– price 엘리먼트 –>
      </product>

 

      <product>
            <no>2</no>
            <name>샴푸</name>
            <price>5000</price>
           </product>
 
      <product>
            <no>3</no>
            <name>폼클렌징</name>
            <price>4000</price>
      </product> 
</company>

 

 

package dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NodeList;

 

public class MainClass {

 

    public static void main(String[] args) {

 

    Document doc//도큐먼트 선언. xml 문서 전범위를 도큐먼트라고 한다.

    Element root;  //루트 선언. <>로 묶인 것을 ‘엘리먼트’라고 하는데 가장 최상위 태그를 ‘루트’ 라고 한다.

    String i1,i2,i3;

 

    try{

        //1. xml문서를 doc변수에 전부 기억시킴

        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); //”도큐먼트 빌더 팩토리”생성

        DocumentBuilder db=dbf.newDocumentBuilder();//”도큐먼트 빌더”생성 

        doc=db.parse(new File(src\\company.xml”)); //도큐먼트 빌더로 xml파싱(다 읽었음.)

        root=doc.getDocumentElement(); //도큐먼트의 첫번째 엘리먼트를 가져와서 root로 설정

 

        //2. 출력하기

​             NodeList node//노드리스트 선언

        //node=root.getElementsByTagName(product”);

        node=root. getElementsByTagName(“no”); // no엘리먼트를 가져와서 노드리스트로 만들기

        i1=node.item(2).getFirstChild().getNodeValue(); //2번째 아이템 가져오기

                                                                                                       //cf) 0번째: 1, 1번째: 2, 3번째: 3

 

        node=root. getElementsByTagName(name”); //name엘리먼트를 가져와서 노드리스트로 만들기 

        i2=node.item(2).getFirstChild().getNodeValue(); //2번째 아이템 가져오기

                                                                                                    //cf) 0번째: 비누, 1번째: 샴푸, 3번째: 폼클렌징

        node=root. getElementsByTagName(value”); //value엘리먼트 가져오기 

        i3=node.item(2).getFirstChild().getNodeValue(); //cf) 0번째: 2000, 1번째: 5000, 3번째: 4000

        System.out.println(i1+“===”+i2+“===”+i3); //3===폼클렌징===4000

        }catch(Exception ex){System.out.println(ex.getMessage());}

    }

}