728x90

Directive 문법 <%@ include file="파일 위치" %> 와

Action Tag <jsp:include page="파일위치" /> 의 차이점



예> main.jsp  sub_1.jsp  sub2.jsp 가 있다고 가정

Directive 문법을 이용한 include 는 main.jsp 에 sub1.jsp sub2.jsp 이 함께 합쳐져서 컴파일되므로 중복된 변수를 쓸수없다.


하지만


Action Tag 문법을 이용한 include는 모든페이지가 따로 컴파일되고 메인에서 필요할때마다 가져다 쓰는것이기때문에 중복된 변수 사용이 가능하다.




    main.jsp
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
<%@ 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>
</head>
<body>
<%
    int i;
    i = 10;
%>
 
<!-- Directive 문법을 통한 include -->
<%@ include file="../includes/header.jsp" %>
 
<hr/>
<h1>include 액션태그 예제1</h1>
이 페이지는 액션태그를 이용한 인클루드를 사용하고 있습니다.
<hr/>
 
<!-- Action Tag를 통한 include -->
<jsp:include page="../includes/footer.jsp"/>
 
</body>
</html>





  header.jsp
1
2
3
4
5
6
7
8
9
10
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h2>여기는 헤더의 내용입니다.</h2>
<b>작성 : 홍길동</b>
<br/>
 
<!-- 만약 i변수를 새로 주면 에러가 남 main.jsp에서 header.jsp를 
    Directive 문법으로 include 했기때문 -->
<!-- i를 출력 -->
i = <%=i%>



    footer.jsp
1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h2>여기는 푸터의 내용입니다.</h2>
<div align="right">&copy;Copyright reserved</div>
 
<!-- main.jsp 에서 footer.jsp를 Action Tag로 include 를 했기때문에 
    같은 i변수로 지정이 가능하다 -->
<%
    int i;
    i= 20;
%>
i = <%= i %>



Posted by 앗뜨거
,
728x90

1. session과 application의 차이점

session은 각 개인 클라이언트만 사용할 수 있는 전용 메모리

application은 서버가 처음동작할 때 딱 하나 만들어져서 모든사용자가 공동으로 사용할수있는 메모리 


세션 저장
1
2
3
<%
         session.setAttribute("sessionVal""이것은 세션변수에 값을 저장한 내용입니다.");    
%>

세션사용

1

<%=    session.getAttribute("sessionVal") %>


application저장
1
2
3
<%
         application.setAttribute("sessionVal""이것은 세션변수에 값을 저장한 내용입니다.");    
%>

application사용

1

<%=    application.getAttribute("sessionVal") %>


사용 방법은 비슷하지만 세션은 다른컴퓨터에서는 저장된값을 불러올 수 없다.
반면 application에서는 저장된것을 불러올 수 있다



2. application의 다른 사용방법 web.xml의 <context-param> 

application객체를 통해서 꺼내 쓸수있는 그런 데이터를 저장하는 엘리먼트


web.xml 파일에 설정
1
2
3
4
5
<context-param>
      <param-name>adminEmail</param-name>
      <param-value>admin@admin.com</param-value>
  </context-param>
 



   JSP 파일에서 사용
1
<%=application.getInitParameter("adminEmail") %>





웹에서 세션(session)의 사용


1. 세션(session)의 개요


쿠키가 웹 브라우저에 사용자의 상태를 유지하기 위한 정보를 저장했다면, 세션(session)은 웹 서버 쪽의 웹 컨테이너에 상태를 유지하기 위한 정보를 저장한다.


세션은 사용자의 정보를 유지하기 위해 javax.servlet.http 패키지의 HttpSession 인터페이스를 구현해서 사용한다. 쿠키는 사용자의 상태 유지를 위한 정보를 웹 브라우저에 저장해서 웹 서버가 쿠키 정보를 읽어서 사용한다.

이것은 웹 브라우저에 저장된 쿠키는 웹 서버에서 열어볼 수 있다는 점에서 보안상 문제가 발생할 수 있다.

따라서 사용자의 정보를 유지하기 위해서는 쿠키를 사용하는 것보다 세션을 사용한 웹 브라우저와 웹 서버의 상태 유지가 훨씬 안정적이고, 보안상의 문제도 해결할 수 있다.


세션은 웹 브라우저 당 1개씩 생성되어 웹 컨테이너에 저장된다.




웹 서버는 각각의 웹 브라우저로부터 발생한 요청에 대해서 특별한 식별자를 부여한다. 이후에 이 식별자를 웹 브라우저에서 발생한 요청들과 비교해서 같은 식별인지를 구별하게 된다. 이 특별한 식별자에 특정한 값을 넣을 수 있으며, 이것을 사용해서 세션을 유지하게 된다.



2. 세션(Session) 메소드 리스트


 메소드 이름

리턴 타입 

설명 

getAttribute(String name) 

 java.lang.Object

 세션 속성명이 name인 속성의 값을 Object 타입으로 리턴한다. 해당 되는 속성명이 없을 경우에는 null 값을 리턴한다.

getAttributeNames() 

java.util.Enumeration 

 세션 속성의 이름들을 Enumeration 객체 타입으로 리턴한다.

getCreationTime() 

long 

1970년 1월 1일 0시 0초를 기준으로 하여 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 리턴한다. 

getId() 

java.lang.String 

세션에 할당된 고유 식별자를 String 타입으로 리턴한다. 

getMaxInactiveInterval()

int 

현재 생성된 세션을 유지하기 위해 설정된 세션 유지시간을 int형으로 리턴한다.

invalidate() 

void 

현재 생성된 세션을 무효화 시킨다.

removeAttribute(String.name)

void 

세션 속성명이 name인 속성을 제거한다. 

setAttribute(String name, Object value)

void 

세션 속성명이 name인 속성에 속성값으로 value를 할당한다. 

setMaxInactiveInterval(int interval) 

void 

세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다. 





3. 세션(Session)의 속성


- 세션의 속성 설정은 session 객체의 setAttribute() 메소드를 사용한다.


session.setAttribute("id", "value");


이때 주의할 사항은 세션의 속성 값은 객체 형태만 올 수 있다는 것이다.

session 객체는 웹 브라우저와 매핑되므로 해당 웹 브라우저를 닫지 않는 한 같은 창에서 열려진 페이지는 모두 같은 session 객체를 공유하게 된다. 따라서 session 객체의 setAttribute() 메소드를 사용해서 세션의 속성을 지정하게 되면 계속 상태를 유지하는 기능을 사용할 수 있게 된다.



- 세션의 속성을 사용하려면 session 객체의 getAttribute() 메소드를 사용한다.


String id = (String)session.getAttribute("id");


getAttribute() 메소드는 리턴 타입이 Object 타입이므로 사용 시 실제 할당된 객체 타입으로 형변환(casting)을 해야 한다.


- 세션의 속성을 삭제하려면 session 객체의 removeAttribute() 메소드를 사용한다.


session.removeAttribute("id");


- 세션의 모든 속성을 삭제할 때는 session 객체의 invalidate() 메소드를 사용한다.


session.invalidate();







4. 세션(Session) 사용 예제


- 세션(Session) 설정 (로그인 성공시에 로그인 아이디를 세션에 저장한다.)


<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>


<% request.setCharacterEncoding("euc-kr");%>


<%

String id = request.getParameter("id");                        // request에서 id 파라미터를 가져온다

String passwd = request.getparameter("passwd");      // request에서 passwd 파라미터를 가져온다.


--- 로그인 처리 ...   로그인 성공시 check 는 TRUE --


if(check){                                                        // 로그인 성공시


session.setAttribute("id", id);                 // 세션에 "id" 이름으로 id 등록

response.sendRedirect("main.jsp");               // 로그인 성공 메인페이지 이동


}else{%>                                                        // 로그인 실패

<script>

alert("로그인 실패");

history.go(-1);                                    // 이전 페이지로 이동

</script>

<%}%>


- 세션(Session) 가져오기 (세션에서 아이디를 가져와 로그인 상태를 인증하고, 값이 없을 경우 로그인 페이지로 넘긴다.)


<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>


<% request.setCharacterEncoding("euc-kr");%>


<%


String id = "";


try{

id = (String)session.getAttribute("id");            // request에서 id 파라미터를 가져온다


if(id==null||id.equals(""){                            // id가 Null 이거나 없을 경우

response.sendRedirect("loginform.jsp");    // 로그인 페이지로 리다이렉트 한다.

}

<%}%>


- 세션(Session) 제거하기 (로그아웃 시 현재의 세션 정보를 제거한다.)


<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>


<% session.invalidate(); %>                         // 세션 정보 제거


<script>

alert("로그아웃 되었습니다.");

location.href="logout.jsp";                                    // 로그아웃 페이지로 이동

</script>



'공부 > DevlecJSP' 카테고리의 다른 글

자바 정규 표현식 표현 방법  (0) 2014.08.05
02_JSP 기본 문법4 - Action Tag -include  (0) 2014.08.05
Posted by 앗뜨거
,
728x90

출처:http://manfromearth.tistory.com/79


cafe24에 64bit JSP를 신청한 상태여야 한다.


개발용 PC에서 톰캣을 설치할 때 6.0 버전으로 설치하도록 하자. cafe24는 톰캣6.0을 사용하기 때문에 안그러면 cafe24내에서 Java소스 파일을 다시 컴파일해주어야 한다. 본 글에서는 cafe24내에서 컴파일하는 것까지 해보겠다.


이클립스 EE버전에서 완성된 프로젝트를 패키지 익스플로러에서 우클릭하여 익스포트한다. 이때 Web -> WAR file 을 선택하여 접근하도록 한다. 그 다음 다이얼로그에서는 파일이 생성될 경로와 이름 톰캣의 버전을 지정해주는데, 적절한 버전을 지정해주고 적절한 경로르 지정해준다. 단, 파일명은 www.war 로 한다. 파일명은 www 확장자는 war이다.


 putty한글.exe


 FileZilla_3.5.3_win32-setup.exe


그 후 서버에 명령을 내리고 파일을 수월하게 관리하기 위해 putty와 FileZilla를 다운받아 설치하자.


먼저 putty를 이용해 내 서버에 들어가보도록 하자.

yourId부분에는 각자의 cafe24 아이디를 써주자.

그리고 아래쪽에 열기를 클릭하면 cafe24와 연결된다.

연결된 후에 다시 cafe24아이디를 쳐주고 ex:id가 yourId이면 yourId만

그리고 이어서 나오는 패스워드를 쳐준다. 패스워드를 타이핑해도 커서가 이동하지 않기 때문에 커서가 이동하지 않아도 이상하게 생각하지 말고 패스워드를 입력 후 엔터를 쳐주자.

로그인하면 아래화면과 같이 뜬다. 본인의 아이디는 killroad이다.

ls 명령을 타이핑하면 ROOT, tomcat, www라는 3개의 폴더가 보일 것이다.

일단 현재 동작하는 서버를 정지시키자.

정지시키는 명령은 현재 폴더에서

./tomcat/bin/shutdown.sh

이다.

그리고 파일질라를 실행시켜 보자.

위의 처럼 실행 시킨 후 호스트, 사용자명, 비밀번호를 putty에 입력했던 것처럼 입력 후 빠른 연결을 누르면 정상적으로 연결 된다. 파일질라의 우측은 연결된 원격지, 좌측은 로컬을 의미한다.

우측의 원격지에서 ..폴더를 눌러 상위 폴더로 나가면 아까 putty에서 봤던 그 폴더구조가 보일 것이다. 아까 putty에서 봤던 것과는 다르게 3개의 폴더만이 아니라 다른 파일 여러개가 보일 수도 있으나 그냥 놔두어도 무방하다.

아까 추출한 www.war 파일을 좌측 로컬창에서 찾아서 드래그&드랍으로 현재 폴더로 전송시킨다.

위의 사진 우측에 제일 아래 파일을 보면 www.war파일이 전송된 것을 볼 수 있다. 그리고 파일질라에서 www폴더를 지우자. 우리가 만든 www.war파일은 톰캣이 다시 실행되면 자동으로 압축이 풀리며, www폴더를 생성하게 된다. 기존의 www폴더는 필요없기 때문이다.

www.war파일도 전송하고 www폴더도 삭제했으면 이제 putty로 가보자.

putty로 가서 이제 톰캣을 켜보자.

명령창에 입력해라.

./tomcat/bin/startup.sh

이렇게 입력하면 톰캣은 다시 실행되고 www.war파일의 압축이 자동으로 풀리며 www폴더를 만든다.

이러면 완료....이겠지만 만약 war파일을 추출할 때 톰캣 6.0버전이 아니었다면 정상동작하지 않을 것이다. 톰캣 6.0에 맞게 다시 Java파일을 컴파일해주어야 한다. 일단 shutdown.sh로 다시 한번 톰캣을 정시지키자.

파일질라에서 www폴더 -> WEB-INF폴더 -> classes폴더 순으로 들어가보자.

여기에 로컬에서 Java파일을 찾아서 복사해 넣도록 하자. 그 후 putty로 컴파일하면 되는데 컴파일하기 전에 classes폴더보다 더 하위폴더로 들어가서 기존의 class파일을 지워주도록 하자.

그리고 putty도 www폴더 -> WEB-INF폴더 -> classes폴더 로 들어가자.

들어갈때는 cd www 입력 그리고 cd WEB-INF 입력 그리고 cd classes 입력

탭키를 이용하면 자동완성이 되기 때문에 유용하니 자주 써먹자.

classes폴더 내에서 putty로 아래 명령을 입력해주자.

javac -d . -classpath /home/hosting_users/USER_ID/tomcat/lib/servlet-api.jar 자바파일이름.java 

그러면 class파일이 각각의 패키지에 해당하는 폴더에 맞게 자동으로 생성될 것이다. 만약 컴파일할 java파일이 여러개라면 

javac -d . -classpath /home/hosting_users/USER_ID/tomcat/lib/servlet-api.jar 여러개중1.java 여러개중2.java 여러개중3.java 여러개중4.java

처럼 공백으로 구분하고 뒤에 쭉 나열해주면 된다.

그리고 다시 cd.. 명령을 이용해 ROOT,tomcat,www 폴더가 보이는 디렉토리까지 올라간다.

그리고 다시 startup.sh명령을 이용해 톰캣을 실행시켜주면 서버는 정상 동작하게 된다.

글을 작성하다보니 후반부에는 귀차니즘으로 스샷을 거의 안찍고 글로 썼다 -_-;

사진많이올리는 블로거들이 대단해보인다.


아래쪽에 서블릿 맵핑을 하는 스샷을 두개 올리고 끝내야겠다. 이 부분도 처음하면 헷갈리는 부분이니까..





Posted by 앗뜨거
,
728x90

[호스팅] cafe24 Tomcat 재시작 명령어

- putty 프로그램을 다운받아 실행한다.(카페24에가면 있다)

putty.exe




ptty나 telnet으로 접속한 후

-tomcat 정지
./tomcat/bin/shutdown.sh

-tomcat 시작
./tomcat/bin/startup.sh


Posted by 앗뜨거
,
728x90

데이터베이스 리스트 조회

ContextWrapper.databaseList();

ContextWrapper == ConText

 

데이터베이스 삭제

ContextWrapper.deleteDatabase("삭제할 데이터베이스명");

 

예)

if (Arrays.binarySearch(databaseList(), DATABASE_NAME) >= 0) {

   deleteDatabase(DATABASE_NAME);

}

 

어플리케이션내에 데이터베이스 열거나 생성

ContextWrapper.openOrCreateDatabase("데이터베이스명.db", 데이터베이스모드<읽기,쓰기전용 또는 기존에 파일있으면 열어라등.. 모드지정>, 쿼리가호출되는 커서를 선택<커서객체를 만들어 사용할지에입력 그렇지 않으면 null>);

 

예) SQLiteDatabase mydb=openOrCreateDatabase(DATABASE_NAME, SQLiteDatabase.CREATE_IF_NECESSARY, null);  조회해보고 없으면 생성해주는 상수값

 

 

데이터베이스 위치 설정

SQLiteDatabase.setLocale(Locale.getDefault()); 

 

데이터베이스 접근권한 설정

SQLiteDatabase.setLockingEnabled(true); 

 

데이터베이스 버전 설정

SQLiteDatabase.setVersion(1);

 

 

데이터베이스 위치 추출

SQLiteDatabase.getPath());

 

데이터베이스 버전

SQLiteDatabase.getVersion();

 

현재 데이터베이스  페이지사이즈

SQLiteDatabase.getPageSize();

 

데이터베이스의 최대크기

SQLiteDatabase.getMaximumSize();

 

데이터베이스가 열려 있는지

SQLiteDatabase.isOpen();

 

 

데이터베이스가 읽기 전용 인지

SQLiteDatabase.isReadOnly();

 

현재 쓰레드에 의해 데이터베이스가 잠겨 있는지

SQLiteDatabase.isDbLockedByCurrentThread();

 

 

쿼리문 실행메서드

SQLiteDatabase.execSQL("쿼리문");

예)

SQLiteDatabase.execSQL("CREATE TABLE tbl_authors (id INTEGER PRIMARY KEY AUTOINCREMENT , firstname TEXT, lastname TEXT);");

 

 

테이블에 데이터를 삽입할 경우

ContentValues values = new ContentValues();

ContentValues.put("필드명", 데이터);       (어디에 필드명)과 ( 데이터) 한묶음으로

//long id = SQLiteDatabase.insert(테이블명, null, ContentValues);

long id  = SQLiteDatabase.insertOrThrow(테이블명, null, ContentValues);

* 두번째 인자에 null을 사용하는 이유 : 완전히 비어있는 행을 허용하지 않기 때문에 세번재 인자값이 null인 경우를 방지

 

예)

ContentValues values = new ContentValues();

values.put("title", newBook.mTitle); => values.put("title", "해리");

values.put("dateadded", newBook.mDateAdded.toLocaleString()); =>values.put("dateadded", "2011-06-23")

values.put("authorid", newBook.mAuthor.mAuthorId);

//long id = SQLiteDatabase.insert(TABLE_BOOK, null, values);

long id  = SQLiteDatabase.insertOrThrow(TABLE_BOOK, null, values); 필요에따라 

SQLiteDatabase.insertOrThrow(TABLE_BOOK, null, values);

 

 

테이블에 데이터를 수정할 경우

ContentValues values = new ContentValues();

ContentValues.put("필드명", 데이터);

SQLiteDatabase.update(테이블명, ContentValues, "조건필드=?", ?를 치환할 문자배열);

 

예)

ContentValues values = new ContentValues();

ContentValues.put("필드명", 데이터);

SQLiteDatabase.update(TABLE_BOOK, values, "id=?", new String[] { bookId.toString() });

 

 

테이블에 데이터를 삭제할 경우

SQLiteDatabase.delete(테이블명, "조건필드=?", ?를 치환할 문자배열);

 

예)

SQLiteDatabase.delete(TABLE_BOOK, "id=?", new String[] { bookId.toString() });

 

 

테이블에 데이터를 조회할 경우

Cursor c = mDatabase.query(테이블명, null, null, null, null, null, null);    select

 

Cursor.getCount(); 조회된 recode의 총갯수

Cursor.getColumnCount(); 조회된 필드 갯수

Cursor.getColumnName(); 이름

Cursor.getPosition(); 현재 커서 포인터위치

Cursor.getString(int columnIndex); 필드값

 

 

커서포인트 위치를 바꿔주는 메서드 처음 (Cursor 위치는 항상 0번 이기에 First를 해줘야함)

Cursor.moveToFirst(); 커서포인터위치를 첫번째 레코드 위치로

Cursor.moveToNext(); 커서포인터위치를 다음 레코드 위치로

Cursor.moveToPrevious();  커서포인터위치를 이전 레코드 위치로

Cursor.moveToLast(); 커서포인터위치를 마지막 레코드위치로

Cursor.moveToPosition(int position); 커서포인터위치를 지정한 레코드 위치로

Cursor.isAfterLast(); 현재 커서포인터위치에서 다음레코드가 있는지 확인  //, 마지막레코드인지 확인 //마지막 레코드이면 true

recode, id값은 무관...

  

public void LogCursorInfo(Cursor c) {

  Log.i(DEBUG_TAG, "*** Cursor Begin *** " + " Results:" + c.getCount() + " Columns: " + c.getColumnCount());

 

  // Print column names

  String rowHeaders = "|| ";

  for (int i = 0; i < c.getColumnCount(); i++) {

     rowHeaders = rowHeaders.concat(c.getColumnName(i) + " || ");

  }

  Log.i(DEBUG_TAG, "COLUMNS " + rowHeaders);

 

  // Print records

  c.moveToFirst();

  while (c.isAfterLast() == false) {

     String rowResults = "|| ";

     for (int i = 0; i < c.getColumnCount(); i++) {

        rowResults = rowResults.concat(c.getString(i) + " || ");

     }

     Log.i(DEBUG_TAG, "Row " + c.getPosition() + ": " + rowResults);

     c.moveToNext();

  }

  Log.i(DEBUG_TAG, "*** Cursor End ***");

}

 

 

예)

Cursor c = mDatabase.query(TABLE_BOOK, null, null, null, null, null, null);

public void LogCursorInfo(Cursor c) {

  Log.i(DEBUG_TAG, "*** Cursor Begin *** " + " Results:" + c.getCount() + " Columns: " + c.getColumnCount());

 

  // Print column names

  String rowHeaders = "|| ";

  for (int i = 0; i < c.getColumnCount(); i++) {

     rowHeaders = rowHeaders.concat(c.getColumnName(i) + " || ");

  }

  Log.i(DEBUG_TAG, "COLUMNS " + rowHeaders);

 

  // Print records

  c.moveToFirst();

  while (c.isAfterLast() == false) {

     String rowResults = "|| ";

     for (int i = 0; i < c.getColumnCount(); i++) {

        rowResults = rowResults.concat(c.getString(i) + " || ");

     }

     Log.i(DEBUG_TAG, "Row " + c.getPosition() + ": " + rowResults);

     c.moveToNext();

  }

  Log.i(DEBUG_TAG, "*** Cursor End ***");

}

 

Date today = new Date(java.lang.System.currentTimeMillis());

Posted by 앗뜨거
,
728x90

65+ 무료 풀, 잔디(Grass) 텍스쳐 모음

65+ Free High Resolution Grass Texture

grass texture 01 65+ Free High Resolution Grass TexturesDownload Grass texture

grass texture 02 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 03 65+ Free High Resolution Grass TexturesDownload Grass Textures (10 HD grass textures)

grass texture 04 65+ Free High Resolution Grass TexturesDownload Grass Textures (6 Grass textures)

grass texture 05 65+ Free High Resolution Grass TexturesDownload Grass Textures (5 grass textures)

grass texture 06 e1399398833905 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 07 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 08 e1399399154475 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 09 e1399399259226 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 10 e1399399340232 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 11 e1399399433859 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 12 e1399399596184 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 13 e1399399710376 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 14 e1399399899782 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 15 65+ Free High Resolution Grass TexturesDownload Grass Textures (6 Grass Textures)

grass texture 16 e1399400190997 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 17 65+ Free High Resolution Grass TexturesDownload Grass Textures (15 Grass Textures)

grass texture 18 e1399400728183 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 19 e1399400963764 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 20 e1399401099399 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 21 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 22 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 23 e1399401297681 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 24 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 26 e1399401420312 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 27 e1399401486621 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 28 e1399401614418 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 29 e1399401689861 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 30 e1399401787257 65+ Free High Resolution Grass TexturesDownload Grass Texture

grass texture 31 e1399401902328 65+ Free High Resolution Grass TexturesDownload Grass Texture

clovery grass texture tile by womblesmack d6islu4 e1399402503741 65+ Free High Resolution Grass TexturesDownload Grass Texture


출처: http://www.fbml.co.kr/2014/07/10/65-free-high-resolution-grass-textures/


Posted by 앗뜨거
,
728x90

이 세가지 방법 말고도 뭐 다른 방법이 있겠지만 대충 요 3가지 정도만 알고 있어도 충분하고도 넘칠것 같다.

이전까지는 제일 첫번째 방법으로만 Map 에 있는 것들을 꺼내서 썼었는데

세번째 방법도 꽤 간결하고 가독성도 좋은것 같아 앞으로 세번째 방법을 주로 써야 겠다는 생각을 해본다.


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
31
32
33
34
35
36
package com.tistory.stove99;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
 
public class MapIterationSample {
    public static void main(String[] agrs) {
        Map<String, String> map = new HashMap<String, String>();
         
        map.put("키1", "값1");
        map.put("키2", "값2");
        map.put("키3", "값3");
        map.put("키4", "값4");
        map.put("키5", "값5");
        map.put("키6", "값6");
         
         
        // 방법1
        Iterator<String> keys = map.keySet().iterator();
        while( keys.hasNext() ){
            String key = keys.next();
            System.out.println( String.format("키 : %s, 값 : %s", key, map.get(key)) );
        }
         
        // 방법2
        for( Map.Entry<String, String> elem : map.entrySet() ){
            System.out.println( String.format("키 : %s, 값 : %s", elem.getKey(), elem.getValue()) );
        }
         
        // 방법3
        for( String key : map.keySet() ){
            System.out.println( String.format("키 : %s, 값 : %s", key, map.get(key)) );
        }
    }
}

출처: http://stove99.tistory.com/96

Posted by 앗뜨거
,
728x90

Android Toast duration 조정하기..

안드로이드에서는 메세지를 보여주고 사라지는 용도로 Toast를 빈번하게 사용하고 있습니다.
하지만, 아쉬운 점이 하나 있다면, duration을 설정할 수 없습니다. 
그래서, 간단하게 duration을 변경하는 방법으로, Toast의 show()를 쓰레드로 원하는 시간 만큼 계속 보여주면 쉽게 해결할 수 있습니다.

간단하게, 안드로이드 Toast 클래스에서 제공하는 SHORT과 LONG의 기본 시간값입니다..

private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds

아래는 CountDownTimer를 이용해서 총 4초동안, 1초씩 줄어들면서 Toast의 show() 메소드를 호출해서, 총 6초(Toast.LENGTH_SHORT이 duration 이니)동안 메세지를 보여주는 코드입니다..

final Toast toast = Toast.makeText(context(), getString(R.string.login_error),Toast.LENGTH_SHORT);
toast.show();
new CountDownTimer(4000, 1000) {
  public void onTick(long millisUntilFinished) {toast.show();}
  public void onFinish() {toast.show();}
}.start();

또 다른 방법으로 https://github.com/quiqueqs/Toast-Expander/blob/master/src/com/thirtymatches/toasted/ToastExpander.java 에서 쓰레드로 시간을 빼면서 루프를 돌리는 방법도 있습니다.

출처 : http://sjava.net/?p=360

Posted by 앗뜨거
,
728x90

4.4 킷캣 에뮬레이터에서는 한글이 제대로 보이지 않습니다.

이는 4.3 에서도 마찬가지이며 4.2.2의 경우에는 CPU/ABI 타입을 MIPS로 하는 경우에만 한글이 보입니다.

 

원인은 한글 글꼴이 들어가 있지 않거나 제대로 설정되지 않아서이며,

한글을 보이도록 하는 방법으로는 첨부된 system.img 파일에 한글 글꼴을 추가해 두었으니, 이 파일을 SDK 매니저를 이용해 설치한 폴더 아래에 있는 system.img 파일 대신 사용하면 됩니다.

 

하지만 이 이미지 파일은 업데이트되는 경우 제대로 동작하지 않을 수 있으므로 직접 추가하는 방법을 사용해야 할 수도 있습니다.

 

아래 두 가지 방법에 대해 설명해 두었습니다.

 

===== 아래 =====

 

1. 시스템 이미지를 한글 글꼴이 들어간 것으로 바꾸는 방법

    (1) 안드로이드 SDK가 설치된 폴더(SDK 매니저를 실행하고 상단에 어떤 폴더가 표시되는지 확인하면 알 수 있습니다.)

         아래에 있는 폴더 중 킷캣의 ARM 타입에 해당하는 폴더로 들어가 보면 system.img 파일을 볼 수 있습니다.

         ex) C:\Documents and Settings\michael\android-sdks\system-images\android-19\armeabi-v7a 폴더

    (2) 원래의 system.img 파일을 system.img.old 로 이름을 바꾸고 첨부된 system.img 파일을 동일한 폴더에 내려받습니다.

    (3) 이클립스를 실행하고 에뮬레이터를 4.4 버전으로 만든 후 실행합니다. (CPU/ABI 타입은 ARM 으로 함)

    (4) 에뮬레이터가 실행되면 설정의 Custom Locale 앱을 실행한 후 ko-KR을 선택하고 하단의 'Select ko-KR' 버튼을 클릭하면 한글 단말이 됩니다.

 

    * 안드로이드 시스템 이미지 라이센스는 구글에 있습니다.

 

2. 직접 시스템 이미지에 한글 글꼴을 추가하는 방법

 

    - SDK 매니저로 설치한 시스템 이미지를 에뮬레이터로 마운트하여 한글 폰트를 추가한 후 새로운 시스템 이미지로 만든다.

    (1) 4.4 버전의 시스템 이미지를 복사한다.
         시스템 이미지는 아래 폴더(윈도우 버전마다 폴더가 다르며, SDK 매니저의 상단에 보이는 SDK 설치 위치를 참조한다.)
         C:\Documents and Settings\michael\android-sdks\system-images\android-19\armeabi-v7a
         여기에서는 system.img 를 system_orig.img 로 복사한다.         
     (2) 이클립스에서 4.4 버전의 에뮬레이터를 실행한다.
     (3) 이클립스에서 DDMS의 File Explorer를 열고 /storage/sdcard 폴더로 system_orig.img 파일을 복사해 넣는다.
         (약 30분 - 1시간 소요됨)
     (4) 명령 프롬프트 창을 열고 아래 폴더로 이동한다.
         cd C:\Documents and Settings\michael\android-sdks\platform-tools
     (5) 아래 명령을 실행하면 에뮬레이터의 쉘을 실행한다.
         adb -s emulator-5554 shell
     (6) 쉘 안에서 sdcard 폴더로 이동한다.
         cd /storage/sdcard
     (7) 새로운 폴더를 하나 만들고 system_orig.img 파일을 이 폴더로 마운트한다.
         mkdir kitkat
         mount -t ext4 -o loop system-ori.img kitkat/
     (8) 이클립스의 DDMS의 File Explorer에서 /storage/sdcard/kitkat/fonts 폴더 안에 NanumGothic.ttf와 NanumGothic_Bold.ttf 파일을 복사해 넣는다.
     (9) 명령 프롬프트의 쉘 안에서 새로 복사한 두 개의 ttf 파일의 권한을 변경한다.
         cd kitkat/fonts
         chmod 644 NanumGothic.ttf
         chmod 644 NanumGothic_Bold.ttf
     (10) 마운트했던 폴더를 언마운트하고 쉘을 종료한다.
         cd ../..
         umount kitkat/
         exit
     (11) 이클립스의 DDMS의 File Explorer에서 system_orig.img 파일을 복사하여 원래의 폴더로 가져온다.
         C:\Documents and Settings\michael\android-sdks\system-images\android-19\armeabi-v7a
         (약 20분-50분 소요됨)
     (12) 원래의 system.img 파일을 system.img.old와 같이 바꾸고 새로 복사해 온 system_orig.img 파일을 system.img 파일로 바꾼다.
     (13) 이클립스에서 새로 4.4 버전의 에뮬레이터를 만들고 실행한다.
     (14) 에뮬레이터가 실행되면 설정으로 들어가 Custom Locale 앱을 눌러 보이는 창에서 ko-KR Korean 을 선택하고 아래쪽의 'Select ko-KR' 버튼을 누른다.
     (15) 이제 한글이 정상적으로 보이면 성공한 것이다.
    

  



'프로그래밍 > 안드로이드' 카테고리의 다른 글

[Android]SQLite 기본 명령어 정리  (0) 2014.07.24
Android Toast duration 조정하기  (0) 2014.07.16
Posted by 앗뜨거
,
728x90



이클립스에서 안드로이드 용 apk 파일 생성하기

출처 : http://coronasdk.tistory.com/636


요즘 Phonegap 을 이용한 프로젝트를 하나 시작하기 위해 Research 를 하고 있습니다.

샘플을 하나 구해서 이걸 이클립스에 설치 한 다음에 시뮬레이터로 동작하는건 완료 했는데요.


갑자기 이걸 apk 로 만들려고 하니까 생각이 하나도 안 나네요.


뭐든지 다 정리 해 놔야 될 것 같습니다.


첫번째 단계만 보니까 알겠던데... ;;


어쨌든 제일 처음으로 이클립스에서 File > Export 를 선택합니다.



그러면 아래와 같은 화면이 나오는데요. Android > Export Android Application 을 선택하신 후 Next 버튼을 누르세요.


다음엔 Export 할 프로젝트를 선택하시면 됩니다. 프로젝트 이름을 직접 Type 해 넣으셔도 되구요.



다음엔 자기가 사용하는 안드로이드 빌드용 key 를 선택하시면 됩니다. 없으신 분은 Create new keystore 를 선택하셔서 다음 단계 진행하시면 됩니다. 이 새로운 keystore를 만드는 방법은 구글링해서 찾으셔도 되구요. 아니면 그냥 이클립스에서 시키는 대로 따라 하시면 될 겁니다.

해당 key를 선택하신 후 비밀번호를 넣고 Next 버튼을 누르세요.


그러면 아래와 같이 Alias 를 넣는 칸이 나올 텐데요. keystore 생성할 때 만들었던 Alias 선택하고비밀번호 넣고 다음 버튼 누르시면 됩니다.



그러면 마지막 단계로 apk 파일을 생성할 폴더만 선택하시면 됩니다. 선택하신 후 Finish 버튼을 누르세요.




그러면 위에서 지정한 경로에 apk 파일이 생겼을 겁니다. 

이걸 안드로이드폰에 복사해서 인스톨 하셔도 되구요.

안드로이드 마켓에 올리셔도 됩니다.


간단하게 이클립스에서 안드로이드 용 apk 파일 만드는 방법 정리했습니다.





Posted by 앗뜨거
,