System.out.println("Hello, World");

public class SoundExampleView extends View{
 SoundPool m_SoundPool;
 int m_Sound_id_1;
 int m_Sound_id_2;
 
 MediaPlayer m_Sound_Background;//배경음악
 MediaPlayer m_sound_1;
 MediaPlayer m_sound_2;
 public SoundExampleView(Context context){
  super(context);
  m_SoundPool = new SoundPool(5,AudioManager.STREAM_MUSIC,0);
  m_Sound_Background = MediaPlayer.create(context, R.raw.background2);
  m_sound_1 = MediaPlayer.create(context, R.raw.effect1);
  m_sound_2 = MediaPlayer.create(context, R.raw.effect2);
  m_Sound_Background.start();
  m_Sound_id_1 = m_SoundPool.load(context, R.raw.effect1,1);
  m_Sound_id_2 = m_SoundPool.load(context, R.raw.effect2,2);
  m_Sound_Background.start();
  setFocusable(true);
  
 }
 
 public boolean onKeyDown(int keyCode, KeyEvent event){
  if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT)
   //m_sound_1.start();
   m_SoundPool.play(m_Sound_id_1, 1, 1, 0, 0, 1);
  
  if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
   //m_sound_2.start();
   m_SoundPool.play(m_Sound_id_2, 1, 1, 0, 0, 1);
  if(keyCode == KeyEvent.KEYCODE_SPACE){
   if(m_Sound_Background.isPlaying())
   m_Sound_Background.pause();
   else
    m_Sound_Background.start();
   //화면을 갱신시켜준다.
   invalidate();
  }
 
  
  return super.onKeyDown(keyCode, event);
 }
 
 
 protected void onDraw(Canvas canvas){
  Paint p = new Paint();
  p.setTextSize(20);
  p.setColor(Color.WHITE);
  String str;
  //isPlaying 메서드를 통해 현재 상태를 얻어옵니다.
  if(m_Sound_Background.isPlaying())
   str="재생중";
  else
   str = "일시 정지줗ㅇ";
  canvas.drawText("배경음악 : "+ str, 0, 20,p);
   
 }
  
 }

 

 

 

public class SoundExample extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SoundExampleView(this));
    }
}

 

Posted by 김마농

테이블 생성 - 게시판(board)

속성

no : number - primary key : 글번호

title : varchar2(150) - not null : 글제목

writer : varchar2(30) - not null : 글 작성자

content : varchar2(4000) - not null : 글 내용 

writedate : varchar2(14) - not null : 글 작성(수정) 일시 yyyyMMddHHmmss 총 14자리

viewcount : number - not null : 조회수(최초 입력 : 0, 조회시 마다 1씩 증가)

=============답변과 관련된 속성들=========

refamilly : number = not null : 원본글 기분으로 그 답변 글들을 묶은 그룹 번호

기준글(최초 원본글) - 새로운 값(글번호)

답변글 : 답변하는 글의 refamilly값

restep : number - not null : 같은 refamilly 묶인 글들 사이에서의 정렬 순서

 기준글 : 0

 답변글 : 답변하는 글의 restep값 +1

relevel : number - not null : 답변 레벨

  기준글 : 0

  답변글 : 답변하는 글의 relevel값에 +1

 

  

시퀀스 - 게시판 글 번호를 위한 자동증가 시퀸스

이름 : board_no_sql : 0~무한대, 1씩 증가한다.


create table board(

no number,

title varchar2(150) not null,

writer varchar2(30) not null,

content varchar2(4000) not null,

writedate varchar2(14) not null,

viewcount number not null,

refamilly number not null,

restep number not null,

relevel number not null,

constraint board_no primary key(no)

)


create sequence board_no_seq

Posted by 김마농

Model1방식의 ID 검색하기

 - DAO는 DB관련 업무처리를 하는 놈들이다. 


<Test_select.jsp>


<Test_result.jsp>


<TestDAO>







Posted by 김마농

Model2 방식의 계산기 만들기

<calc_form.jsp>


<CalculatorServlet>


<CalculatorService>


<error.jsp>


<calc_result.jsp>





Posted by 김마농

Model1

 - JSP 파일내에서 뷰와 컨트롤러 모두 실행되어 지는 구조



○ 장점

- 개발 기간 단축(단순한 페이지 흐름)

- 팀원의 수준이 높이 않아도 된다. 즉 초보자도 쉽게 배울 수 있다.

- 중소형 프로젝트에 적합


○ 단점

- 웹 어플리케이션이 복잡해질수록 유지보수가 어렵다.

- 디자이너와 개발자간의 의사소통이 필요하다.(비니니스 로직과 뷰 사이의 구분이 미비하다.)


Model2

 - Controller(servlet)을 통해 비지니스 로직과 뷰가 분리된 형태

 - JSP에서는 뷰를 담당하고, 자바 클래스에서 비지니스 로직을 담당한다.



○ 장점

- 비지니스 로직과 뷰의 분리로 유지보수와 확장이 용이하다.

- 개발자와 디자이너의 작업이 분리되어 분업이 편리하다.


○ 단점

- 구조 설계를 위한 시간이 많이 소요되므로 개발 기간이 증가한다.

- 개발자들이 구조에 대한 이해가 필요하기 때문에 팀원의 높은 수준이 요구된다.


원문 : http://kiringun.egloos.com/660489


Posted by 김마농

Connection Pool

2012. 5. 10. 10:53 : 프로그래밍/JDBC

Connection Pool

Connection Pool의 필요성

- DBMS로의 연결이 오래걸린다.

- DB 작업을 할 때마다 Connection ~ Close 까지의 반복 작업이 비효율적

- Connection Pool에 Connection 객체를 생성해 놓고 DB 작업시 Pool에서 빌려 사용후 다시 반납


Connection Pool의 개념

- Connection을 관리하는 객체 Pool

- Connection들을 미리 생성하여 Pool에 저장한 뒤 필요시 빌려쓰는 개념

- 사용 후에는 다시 Connection Pool에 반납


Connection Pool의 사용

- 직접 제작하여 사용 / 제공되는 API를 이용

- 대표적인 API : org.apache.tomcat.dbcp.dbcp.BasicDataSource


DataSource

- Connection Pool을 구현하기 위한 스펙을 정해놓은 Interface

- Connection Factory (Connection 객체를 생성해 주는 역할)

- javax.sql.DataSource를 import 해서 사용


DataSource의 장점

- Connection Pool 지원

- 객체가 DB 연결에 필요한 정보를 알고 있어 DB연결시 URL, ID, Password를 입력해야 하는 번거로움 해소

Posted by 김마농

MVC 패턴

○ GUI기반 Application 설계 패턴

○ 클라이언트의 요청을 받아 처리하여 응답하는 로직을 세개의 로직(Model, View, Controller)로 나누어 개발


-Model

  >Business Logic(클라이언트 요청에 대한 업무 처리)을 담당

  >Business Service와 Data Access Object로 분리

   >Business Service

    ◇ Business 로직의 일의 흐름을 관리

    ◇ #DB 관련된 작업을 제외한 로직을 처리

   >Data Access Object(DAO)

    ◇ Database 관련된 로직만 처리

    ◇ DB 관련 로직을 제외한 어떠한 업무처리도 가지지 않는다.


-View

 >처리 결과를 응답하는 로직을 담당(Presentation Logic)


-Controller

 > Client의 요청을 처리하는 전체 흐름을 control하는 역할을 담당


 처리내용

 1. client의 요청을 받는다.

  1-1 client가 요청시 입력한 내용을 읽는다.

  1-2 client로 부터 받은 값을 검증한다.

 2. Business 로직을 호출한다. - Model 호출

 3. 응답처리 로직을 호출한다. - View 호출


Model2 -> Web Application에 MVC 패턴 적용

Model - java bean -> java class

view - JSP

Controller - Servlet


<calculator를 MVC 패턴으로 만들기>

controller는 servlet으로 만들며, View는 JSP, Model은 Java를 이용하여 만들도록 한다. 


[컨트롤러]CalculatorServlet


[Model]CalculatorService


[클라이언트가 입력하는 페이지]Calculator_form.jsp


[View]Calculator_Servlet.jsp




Posted by 김마농

Filter

- 클라이언트의 요청을 받은 component(Servlet, JSP)가 일하기 전 처리, 일한 후 처리를 담당하는 컴포넌트

 - 구현

> javax.servlet.Filter를 implments

> callback(liftcycle) 메소드 재정의

-init(FilterConfig)

-destroy()

-doFileter(ServletRequest, ServletResponse, FilterChain)

> web.xml에 filter 등록

<filter>태그 : filter 객체 등록

<filter-mapping>태그 : 필터가 호출될 url 설정



<예제>

EncodingFilter

web.xml

웹서버가 실행되면 클라이언트의 요청 전에 Filter를 거친다음에 응답한다. 그래서 클라이언트의 요청전에 

한글처리가 되어 서블릿에 한글처리르를 안해도 한글처리되어 값이 넘어간다.


Posted by 김마농
id

뷰를 칭하는 고유한 이름을 정의한다. 코드나 XML 문서에서 이 뷰를 참조할때 id를 사용하므로 의미를 잘 설명할 수 있는 직관적인 이름을 붙인다. XML 문서에 id를 지정해 놓으면 이 이름이 R.java에 정수 상수로 정의된다. 코드에서 이 뷰를 참조할 때는 findViewById라는 메서드를 호출하며 인수로 참조할 뷰의 id를 전달한다.


layout_width, layout_height


위젯은 보통 부모의 크기를 가득 채우거나 아니면 자신의 내용물 크기에 맞추거나 둘 중 하나의 방식으로 배치된다. 예를 들어 "start"라는 캡션을 가지는 버튼을 배치할때 수평, 수직 각 방향에 대해 어떤 크기를 지정하는가에 따라 버튼의 크기가 달라진다.


Posted by 김마농

방향 설정

 - LinearLayout은 차일드 뷰를 일렬로 배치하는 레이아웃이다. XML 문서에 나타나는 순서대로 뷰가 차곡 차곡 배치된다. 별도의 지정이 없는 한 뷰 사이의 공백은 없으며 다닥 다닥 붙어서 배치된다. 가장 단순해 보이지만 직관적이어서 사용 빈도가 높다. 또한 응용의 묘미가 있어서 활용도가 높으며, 리이너 몇개만 조합해도 왠만한 화면 모양은 거의 만들 수 있다.


 리니어의 가장 중요한 속성은 뷰의 배치 방향을 결정하는 orentation이다. 차일드를 일렬로 배치하는 방법은 수평, 수직 두 가지가 있다. vertical은 차일드를 위에서 아래로 수직으로 배열하고, horizontal은 차일드를 왼쪽에서 오른쪽으로 수평배열한다. 이 속성을 별도로 지정하지 않을때는 dafault인 수평으로 적용된다.


 리니어 레이아웃을 적용시키기 위해서는 android:orientatin="horizontal"을 적용시키면 된다.


 만약 텍스트의 속성이에서 android:layout_width="fill_parent"로 지정해놓으면 부모의 폭 전체를 모두 차지해버리기 때문에 나머지 텍스트들은 보이지가 않는다. 그리하여 fill_parent를 android:layout_width="wrap_content"로 바꿔야 한다.


 바꾼후 실행해보면 각 문자열이 자신의 폭만큼만 차지하여 나란히 배열될 것이다. 수평으로 배치할려면 차일드가 꼭 필요한만큼의 폭만 사용해야 한다. 단 화면 폭이 좁아 마지막 문자열은 자동 개행되어 표시된다. 만약 앞쪽 두 문자열이 레이아웃의 폭을 다 써버렸다면 마지막 문자열은 화면 밖으로 밀려나 보이지 않을 것이다.


리니어는 무조건 차일드를 일렬로 배치하기만 할 뿐 자동 개행기능은 제공하지 않는다. 위쪽에서 자동 개행되는 것은 텍스트 뷰의 기능이지 리니어의 기능이 아니다. 


정렬 지정

뷰의 영역이 충분히 크면 상하좌우에 넓은 여백이 생긴다. 하지만 뷰가 커진다고 해서 내용물도 같이 커지는게 아니기 때문에 어느족에 배치할 것인지의 문제가 생긴다. 내용물을 뷰의 어느쪽에 배치할 것인가는 gravity 속성으로 지정한다. 수평, 수직 방향에 대해 정렬 방식을 각각 지정할 수 있으며 | 연산자로 두 개의 속성을 묶어서 지정할 수 있다.





Posted by 김마농