### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도
... : 같은 목차 내에 구분 기호
...................................
목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제
...................................
###################################
1. 이론 및 정보
-----------------------------------
* 자주 사용되던 프레임워크 조합

예전 Spring + Struts
중소기업 주로 MIFlatform (유료)

국내에서 인기 있는 DB 프레임워크
Hibernate(포크레인), MyBatis(삽)
Hibernate는 복잡한 연결 가능하나, 어렵고 복잡
MyBatis(예전 IBatis)는 단순 맵핑만 가능, 쉽고 직관적

스프링과 조합이 잘 맞는 프레임워크
Spring 3.0 이상 + MyBatis
-----------------------------------
* IBatis - 아파치 재단
구글에게 스카웃 제의를 받음 -> MyBatis
IBatis 2.0 까지는 아파치
MyBatis 3.0 부터 시작
-----------------------------------
* MyBatis
사용방법이 여러가지 있음

고전적인 방법으로 세가지 파일이 필요
1. 환경설정을 위한 파일, 컨트롤 파일, XML
2. DB작업을 하기위한 SQL 작업(DML)을 위한 파일, XML
3. 2번 파일을 실제 자바클래스로 맵핑시키는,
     reflection 해주는 자바 클래스 파일
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
* mybatis
mvnrepository.com/artifact/org.mybatis/mybatis/3.3.0
<dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>3.3.0</version>
</dependency>

/BoardApp/pom.xml
에 추가

기존에는
/BoardApp/src/main/java/board/repository
/BoardApp/src/main/java/member/repository
에서 DAO를 했는데

새로운 패키지에서 MyBatis를 준비하겠음
/BoardApp/src/main/java/mybatis

Mybatis 환경 설정 파일
/BoardApp/src/main/java/mybatis/mybatis_config.xml

mybatis.github.io/mybatis-3/ko/getting-started.html
에서 설계도 복사, 붙여넣기

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

/BoardApp/src/main/webapp/WEB-INF/applicationContext.xml
에 있던 JNDI가 필요 없음, MyBatis에서 자동 제공하지만, 주석처리는 하지 않음

/BoardApp/src/main/java/mybatis/mybatis_config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
     <environments default="development">
          <environment id="development">
               <transactionManager type="JDBC" />
               <dataSource type="POOLED">
                    <property name="driver" value="oracle.jdbc.OracleDriver" />
                    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
                    <property name="username" value="scott" />
                    <property name="password" value="1111" />
               </dataSource>
          </environment>
     </environments>
     <mappers>
          <mapper resource="mybatis/board_mapper.xml" />
          <mapper resource="mybatis/member_mapper.xml" />
     </mappers>
</configuration>



Mybatis SQL 파일
/BoardApp/src/main/java/mybatis/board_mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.board_mapper">
     <select id="getList" resultType="board.domain.BoardDto">
          select * from tblSpringBoard order by b_seq desc
     </select>
     <insert id="write" parameterType="board.domain.BoardDto">
          insert into tblSpringBoard(
          b_seq,b_title,b_content,b_writer,
          b_regdate,b_hitcount,b_password)
          values(seq_.nextVal,
          #{b_title},#{b_content},#{b_writer},sysdate,0,'1111')
     </insert>
</mapper>

에서 mapper는 반드시 namespace를 지정해야한다. 보통 패키지 이름을 넣음
<select id=""></select> 이런 ID에는 메서드 이름을 넣는 게 좋음
<select id="getList" resultType="board.domain.BoardDto">에서
resultType은 최소단위인 Dto를 넣어줌

Mybatis SQL 파일을 reflection 시켜주는 자바 파일
/BoardApp/src/main/java/mybatis/BoardManager.java


/BoardApp/src/main/java/mybatis/member_mapper.xml
/BoardApp/src/main/java/mybatis/MemberManager.java
-----------------------------------

/BoardApp/src/main/java/mybatis/mybatis_config.xml
의 설정을 분리 및 typeAlias로 긴 패키지 이름은 간단하게 사용하게 해줌

/BoardApp/src/main/java/mybatis/oracle.properties
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password="1111"

/BoardApp/src/main/java/mybatis/mybatis_config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
     <properties resource="mybatis/oracle.properties"></properties>
     <environments default="development">
          <environment id="development">
               <transactionManager type="JDBC" />
               <dataSource type="POOLED">
                    <property name="driver" value=${driver} />
                    <property name="url" value=${url} />
                    <property name="username" value=${username} />
                    <property name="password" value=${password} />
               </dataSource>
          </environment>
     </environments>
     <mappers>
          <mapper resource="mybatis/board_mapper.xml" />
          <mapper resource="mybatis/member_mapper.xml" />
     </mappers>
</configuration>
-----------------------------------
###################################
3. 소스코드 또는 실습
-----------------------------------
3-1
Workspace : ~\study\SpringWork
...................................
/BoardApp/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>BoardApp</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>BoardApp Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
          </dependency>
          <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
               <version>1.1.2</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-jdbc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>org.mybatis</groupId>
               <artifactId>mybatis</artifactId>
               <version>3.3.0</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>BoardApp</finalName>
     </build>
</project>
...................................
/BoardApp/src/main/java/mybatis/mybatis_config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
     <properties resource="mybatis/oracle.properties"></properties>
     <typeAliases>
          <typeAlias type="board.domain.BoardDto" alias="boardDto" />
          <typeAlias type="member.domain.UserDto" alias="userDto" />
     </typeAliases>
     <environments default="development">
          <environment id="development">
               <transactionManager type="JDBC" />
               <dataSource type="POOLED">
                    <property name="driver" value="${driver}" />
                    <property name="url" value="${url}" />
                    <property name="username" value="${username}" />
                    <property name="password" value="${password}" />
               </dataSource>
          </environment>
     </environments>
     <mappers>
          <mapper resource="mybatis/board_mapper.xml" />
          <mapper resource="mybatis/member_mapper.xml" />
     </mappers>
</configuration>
...................................
/BoardApp/src/main/java/mybatis/board_mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.board_mapper">
     <select id="getList" resultType="boardDto">
          select * from tblSpringBoard order by b_seq desc
     </select>
     <insert id="write" parameterType="boardDto">
          insert into tblSpringBoard(
          b_seq,b_title,b_content,b_writer,
          b_regdate,b_hitcount,b_password)
          values (seq_user.nextVal,
          #{b_title},#{b_content},#{b_writer},sysdate,0,'1111')
     </insert>
</mapper>
...................................
/BoardApp/src/main/java/mybatis/member_mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.member_mapper">
     <select id="getIdPw" resultType="member.domain.UserDto" parameterType="member.domain.UserDto">
          select * from tblSpringMember where u_id=#{u_id} and u_pw=#{u_pw}
     </select>
</mapper>
...................................
-----------------------------------
3-2
Workspace : ~\study\SpringWork
...................................
/BoardApp/src/main/java/board/repository/BoardDaoImpl.java

package board.repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;

import board.domain.BoardDto;
import mybatis.BoardManager;

public class BoardDaoImpl implements BoardDao {

     private JdbcTemplate jdbcTemplate;

     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
          this.jdbcTemplate = jdbcTemplate;
          // System.out.println("BoardDaoImpl - jdbcTemplate" + jdbcTemplate);
     }

     public List getList() throws SQLException {
          // String sql = "select * from tblSpringBoard order by b_seq desc";
          //
          // RowMapper rm = new BoardRowMapper();
          // List result = new ArrayList();
          //
          // // 반복문이 포함되어 있어서
          // // 자동으로 result에 결과 값이 누적된다
          // result = jdbcTemplate.query(sql, rm);
          // System.out.println("BoardDaoImpl - result size : " + result.size());
          //
          // return result;
          return BoardManager.getList();
     }

     class BoardRowMapper implements RowMapper {
          public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
               // (ResultSet arg0, int arg1)
               // arg0은 전달되는 데이터
               // arg1은 몇번째 데이터 인지
               BoardDto dto = new BoardDto();
               dto.setB_seq(arg0.getInt("b_seq"));
               dto.setB_title(arg0.getString("b_title"));
               dto.setB_content(arg0.getString("b_content"));
               dto.setB_writer(arg0.getString("b_writer"));
               dto.setB_regdate(arg0.getString("b_regdate"));
               dto.setB_hitcount(arg0.getInt("b_hitcount"));
               dto.setB_password(arg0.getString("b_password"));
               return dto;
          }
     }

     public BoardDto findBySeq(int seq) throws SQLException {
          // ResultsetExtractor
          String sql = "select * from tblSpringBoard where b_seq = " + seq;
          // ResultSetExtractor rse = new BoardResultSet();

          ResultSetExtractor rse = new ResultSetExtractor() {
               public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
                    BoardDto dto = new BoardDto();
                    if (rs.next()) {
                         dto.setB_seq(rs.getInt("b_seq"));
                         dto.setB_title(rs.getString("b_title"));
                         dto.setB_content(rs.getString("b_content"));
                         dto.setB_writer(rs.getString("b_writer"));
                         dto.setB_regdate(rs.getString("b_regdate"));
                         dto.setB_hitcount(rs.getInt("b_hitcount"));
                         dto.setB_password(rs.getString("b_password"));
                    }
                    return dto;
               }
          };
          BoardDto dto = jdbcTemplate.query(sql, rse);
          System.out.println("BoardDaoImpl - findBySeq - dto.getB_writer() : " + dto.getB_writer());
          return dto;
     }

     class BoardResultSet implements ResultSetExtractor {
          public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
               BoardDto dto = new BoardDto();
               if (rs.next()) {
                    dto.setB_seq(rs.getInt("b_seq"));
                    dto.setB_title(rs.getString("b_title"));
                    dto.setB_content(rs.getString("b_content"));
                    dto.setB_writer(rs.getString("b_writer"));
                    dto.setB_regdate(rs.getString("b_regdate"));
                    dto.setB_hitcount(rs.getInt("b_hitcount"));
                    dto.setB_password(rs.getString("b_password"));
               }
               return dto;
          }
     }

     public void write(BoardDto dto) throws SQLException {

          // String sql = "insert into tblSpringBoard(b_seq,b_title,b_content,"
          // + "b_writer,b_regdate,b_hitcount,b_password) " + " values
          // (seq_board.nextVal, ?,?,?,sysdate,0,'1111')";
          //
          // Object[] values = new Object[] { dto.getB_title(),
          // dto.getB_content(), dto.getB_writer() };
          //
          // // DB에 전달
          // jdbcTemplate.update(sql, values);

          BoardManager.write(dto);
     }

     public void update(BoardDto dto) throws SQLException {

     }

     public void delete(int seq) throws SQLException {

     }

}
...................................
/BoardApp/src/main/java/mybatis/BoardManager.java

package mybatis;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import board.domain.BoardDto;
import member.domain.UserDto;

public class BoardManager {
     private static SqlSessionFactory sqlMapper;

     // 반드시 static 블럭 사용
     static {
          try {
               // 환경설정 XML 읽어 와야함
               Reader reader = Resources.getResourceAsReader("mybatis/mybatis_config.xml");
               sqlMapper = new SqlSessionFactoryBuilder().build(reader);
          } catch (IOException e) {
               throw new RuntimeException("SqlSessionFactory 인스턴스 생성 실패");
          }
     }
     
     // 내가 마음대로 만든 메서드, 반드시 static
     public static List getList(){
          List list = null;
          SqlSession session = sqlMapper.openSession();
          
          // 내가 만들어 놓은 맵퍼의 id명을 넣음
          // List로 전달 받겠다는 메서드 사용
          list = session.selectList("getList");
          return list;
     }
     
     public static void write(BoardDto dto){
          System.out.println("BoardManager : dto : "+dto);
          SqlSession session = sqlMapper.openSession();
          session.insert("write", dto);
          // 반드시 insert, update, delete가 해야할 코드
          session.commit();
     }
     
     public static UserDto getIdPw(UserDto dto){
          UserDto user = null;
          SqlSession session = sqlMapper.openSession();
          user = session.selectOne("getIdPw",dto);
          return user;
     }
}
...................................
/BoardApp/src/main/webapp/WEB-INF/views/board/write.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
     <h1>글쓰기</h1>
     <form action="board_write.board" method="post">
          제목 : <input type="text" name="b_title"/><br/><br/>
          작성자 : <input type="text" name="b_writer"/><br/><br/>
          내용 : <textarea rows="5" cols="50" name="b_content"></textarea>
          <br/><br/>
          <input type="submit" value="저장"/>
          <input type="button" value="리스트 페이지" onclick="location.href='board_list.board'"/>
     </form>
</body>
</html>
...................................
-----------------------------------
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
-----------------------------------
-----------------------------------


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day89  (0) 2015.07.20
오픈프레임워크_Day88  (0) 2015.07.17
오픈프레임워크_Day87  (0) 2015.07.16
오픈프레임워크_Day86  (0) 2015.07.16
오픈프레임워크_Day85  (0) 2015.07.14
,

### : 목차 구분 기호

--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
... : 같은 목차 내에 구분 기호
................................... 
목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제
................................... 
###################################
1. 이론 및 정보
-----------------------------------
* 스프링 설정파일 변경방법

web.xml 
필요한 정보를 스프링에 전달할때?
다른이름으로 설정 파일을 만들고 싶을때?

초기값을 설정하는 태그를 이용
<init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/totalsite.xml</param-value>
</init-param>

설정파일의 위치와 이름을 따로 지정할 수 있다.

여러개의 설정파일도 사용가능함

<param-value>
     /WEB-INF/totalsite.xml
     /WEB-INF/test1.xml
     /WEB-INF/test2.xml
</param-value>

설정이 복잡해지면 분산시킬 필요가 있음
또는 개발할때 설정파일하고 배포할때 설정파일이 달라질 수 있음

보통은 개발하는 단계에 따라서 설정파일을 만드는데
이번에는 기능 별로 분리해서 설정파일을 만들어 봅시다
----------------------------------- 
* ContextLoaderListener 사용
하나의 사이트가 다양한 기능을 가질 수 있음
보통 한가지 주제를 가지고 사이트를 만드는데
여러가지 주제를 가진 사이트가 가질수 있음
이럴때 어떻게 할 수 있을까?

DispatcherServlet을 여러개 만들 수 있음
각각의 DispatcherServlet은 각각 독립된 공간임!
서로 다른 프로젝트이기 때문에 접근 불가능!

그런데 만약 같은 DB에 같은 테이블을 쓰는데
DB에 접근하는 객체가 따로 생긴다면????
만약 서로 다른 DispatcherServlet이 같은 객체를
공유하고 싶으면 어떻게 할까?

DispatcherServlet 보다 먼저 처리는 객체가 있음
ContextLoaderListener 객체를 이용해서 공유를 하면 됨
ContextLoaderListener 는 서블릿이 아니라 리스너로 등록
----------------------------------- 
* 인코딩을 설정파일에서 하기
filter class
기본 클래스에 기능 추가 - filter class
-----------------------------------
* Spring에서 DB연결  

1. 기본 제공 DB 연결 가능
     - Connection Pool을 제공하지 않음

2. 다른 객체로 DB 연결 가능

JNDI 방식으로 연결해서 쓸 예정
-----------------------------------
* sql문을 처리해주는 인터페이스

PerpareStatementSetter 인터페이스
- 재활용 할 수 있음, 복잡합, 서브 클래싱을 해줘야함

Ojbcet[] 배열 이용
- 간단하고 쉽게 사용 가능, 재활용 불가능, 특정 위치에서만 사용 가능
- 배열이 아닌 단 한개의 인자라도 Object 배열을 이용해야함


ResultSetExtractor 인터페이스는 한개의 결과를 가져오는데 적합
-----------------------------------
* 연결된 DB에 접근할 수 있게 해주는 클래스
JdbcTemplate - 실제 DB와 연결해서 사용하는 
가장 직접적인 클래스

RowMapper - DB의 결과값을 가져옴
반복문도 필요없음 자동으로 돌아줌
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
Workspace : ~\study\SpringWork  
/BoardApp/src/main/webapp/WEB-INF/web.xml
<!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>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/totalsite.xml
                    /WEB-INF/test1.xml
                    /WEB-INF/test2.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
</web-app>


/BoardApp/src/main/webapp/WEB-INF/board-servlet.xml
/BoardApp/src/main/webapp/WEB-INF/totalsite.xml
로 이름 변경

/BoardApp/src/main/webapp/WEB-INF/conf
폴더 만들고 설정 파일 이동
/BoardApp/src/main/webapp/WEB-INF/conf/totalsite.xml
위 설정 파일의 이름을 바꾸면서 설정파일에서 설정도 바꿈

/BoardApp/src/main/webapp/WEB-INF/web.xml
<!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>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
</web-app>

/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.xml
빈을 생성하는 설정 파일로 사용할 예정으로 만듬

/BoardApp/src/main/webapp/WEB-INF/conf/viewresolver-config.xml
/BoardApp/src/main/webapp/WEB-INF/conf/handlermapping-config.xml

----------------------------------- 
3-2
Workspace : ~\study\SpringWork  

dispatcher servlet을 여러개 만들 수 있음

/BoardApp/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>

     <servlet>
          <servlet-name>webservice</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>webservice</servlet-name>
          <url-pattern>/webservice/</url-pattern>
     </servlet-mapping>
</web-app>


서로다른 디스패처 공유를 위해 ContextLoaderListener 를 사용

/BoardApp/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>

     <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>

     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
     <!-- <servlet> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet -->
     <!-- </servlet-class> -->
     <!-- </servlet> -->
     <!-- <servlet-mapping> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <url-pattern>/webservice/</url-pattern> -->
     <!-- </servlet-mapping> -->
</web-app>


ContextLoaderListener 를 위한 설정파일 준비
/BoardApp/src/main/webapp/WEB-INF/applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>    
</beans>

수정
/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <bean id="listController" class="board.controller.ListController"></bean>
</beans>
----------------------------------- 
3-3
Workspace : ~\study\SpringWork 
문자 인코딩 설정 , Request에만 해당하는 내용
UTF-8로 설정함

/BoardApp/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>

     <filter>
          <filter-name>filterEncoding</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
          <init-param>
               <param-name>encoding</param-name>
               <param-value>UTF-8</param-value>
          </init-param>
          <init-param>
               <param-name>forceEncoding</param-name>
               <param-value>true</param-value>
          </init-param>
     </filter>

     <filter-mapping>
          <filter-name>filterEncoding</filter-name>
          <url-pattern>/*</url-pattern>
     </filter-mapping>

     <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>

     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
     <!-- <servlet> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet -->
     <!-- </servlet-class> -->
     <!-- </servlet> -->
     <!-- <servlet-mapping> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <url-pattern>/webservice/</url-pattern> -->
     <!-- </servlet-mapping> -->
</web-app>
----------------------------------- 
3-4
Workspace : ~\study\SpringWork
JNDI 를 위한 톰캣 서버 설정 및 연결 테스트

/Servers/Tomcat v7.0 Server at localhost-config/server.xml
추가
<Context docBase="BoardApp" path="/BoardApp" reloadable="true"
     source="org.eclipse.jst.j2ee.server:BoardApp">
     <Resource name="jdbc/springDB" auth="Container" type="javax.sql.DataSource"
          driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:orcl"
          username="scott" password="1111" maxTotal="20" maxIdle="10"
          maxWaitMillis="-1" />
</Context>


/Servers/Tomcat v7.0 Server at localhost-config/context.xml
<Resource name="jdbc/springDB" auth="Container" type="javax.sql.DataSource" />


/BoardApp/src/main/webapp/JNDITest.jsp

<%@page import="java.sql.Connection"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.naming.InitialContext"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>JNDI를 이용한 DBCP 사용 테스트</h1>
<%
     try{
          Context ctx = new InitialContext();
          DataSource ds =
                    (DataSource)ctx.lookup("java:comp/env/jdbc/springDB");
          Connection con = ds.getConnection();
         
          if(con != null){
               out.println("연결 성공");
               con.close();
          }
     }
     catch(Exception err){
          System.out.println("연결 실패 : " + err);
     }
%>
</body>
</html>
----------------------------------- 
3-5 
Workspace : ~\study\SpringWork

/BoardApp/src/main/java/board/controller
/BoardApp/src/main/java/member/controller
폴더는 컨트롤러를 사용할 폴더(패키지)

/BoardApp/src/main/java/board/repository
/BoardApp/src/main/java/member/repository
폴더는 DAO 패턴을 사용할 폴더(패키지)

/BoardApp/src/main/java/board/domain
/BoardApp/src/main/java/member/domain
폴더는 DTO 패턴을 사용할 폴더(패키지)
----------------------------------- 
3-6 
Workspace : ~\study\SpringWork
/BoardApp/src/main/webapp/WEB-INF/applicationContext.xml
DB 관련 생성

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>    
    
     <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName">
               <value>oracle.jdbc.OracleDriver</value>
          </property>
         
          <property name="url">
               <value>jdbc:oracle:thin:@localhost:1521:orcl</value>
          </property>
         
          <property name="username" value="scott"></property>
          <property name="password" value="1111"></property>
     </bean>
</beans>

빠르고 편리하나 웹에서 쓰기에는 적합하지 않음
주로 테스트 용이나 응용프로그램에서 쓰면 됨
스프링에서 기본 제공하는 DB연결 클래스

----------------------------------- 
3-7 
Workspace : ~\study\SpringWork

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"></bean>
관련 라이브러리를 추가

http://mvnrepository.com/artifact/org.springframework/spring-jdbc/4.1.7.RELEASE
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-jdbc</artifactId>
     <version>4.1.7.RELEASE</version>
</dependency>

/BoardApp/pom.xml
에 추가
----------------------------------- 
3-8 
Workspace : ~\study\SpringWork

스프링에서 JNDI를 지원하는 객체 사용
만들어져 있든 jdbc/springDB를 연결 시켜줌
/BoardApp/src/main/webapp/WEB-INF/applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>    
    
<!--      <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> -->
<!--           <property name="driverClassName"> -->
<!--                <value>oracle.jdbc.OracleDriver</value> -->
<!--           </property> -->
         
<!--           <property name="url"> -->
<!--                <value>jdbc:oracle:thin:@localhost:1521:orcl</value> -->
<!--           </property> -->
         
<!--           <property name="username" value="scott"></property> -->
<!--           <property name="password" value="1111"></property> -->
<!--      </bean> -->
    
    
     <bean id="datasource" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName" value="jdbc/springDB"></property>
          <property name="resourceRef" value="true"></property>
     </bean>
</beans>
-----------------------------------  
3-9
Workspace : ~\study\SpringWork
게시판 만들기 위한 작업 진행

/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.xml
/BoardApp/src/main/webapp/WEB-INF/conf/handlermapping-config.xml

/BoardApp/src/main/java/board/controller/ListController.java
/BoardApp/src/main/java/board/controller/WriteController.java
/BoardApp/src/main/java/board/domain/BoardDto.java
/BoardApp/src/main/java/board/repository/BoardDao.java
/BoardApp/src/main/java/board/repository/BoardDaoImpl.java

/BoardApp/src/main/webapp/WEB-INF/views/board/list.jsp
/BoardApp/src/main/webapp/WEB-INF/views/board/write.jsp

----------------------------------- 
3-10
Workspace : ~\study\SpringWork
로그인 구현

/BoardApp/src/main/webapp/WEB-INF/views/member/login.jsp
/BoardApp/src/main/webapp/WEB-INF/views/member/login_success.jsp

/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.xml
/BoardApp/src/main/webapp/WEB-INF/conf/handlermapping-config.xml
/BoardApp/src/main/resources/member_viewresolver.properties
/BoardApp/src/main/webapp/WEB-INF/conf/viewresolver-config.xml

/BoardApp/src/main/java/member/domain/UserDto.java
/BoardApp/src/main/java/member/repository/UserDao.java
/BoardApp/src/main/java/member/repository/UserDaoImpl.java

-----------------------------------
3-11
Workspace : ~\study\SpringWork

모든 코드 정리

...................................
/Servers/Tomcat v7.0 Server at localhost-config/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
     license agreements. See the NOTICE file distributed with this work for additional
     information regarding copyright ownership. The ASF licenses this file to
     You under the Apache License, Version 2.0 (the "License"); you may not use
     this file except in compliance with the License. You may obtain a copy of
     the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
     by applicable law or agreed to in writing, software distributed under the
     License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
     OF ANY KIND, either express or implied. See the License for the specific
     language governing permissions and limitations under the License. --><!-- Note: A "Server" is not itself a "Container", so you may not define
     subcomponents such as "Valves" at this level. Documentation at /docs/config/server.html --><Server port="8005" shutdown="SHUTDOWN">
     <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
     <!-- Security listener. Documentation at /docs/config/listeners.html <Listener
          className="org.apache.catalina.security.SecurityListener" /> -->
     <!--APR library loader. Documentation at /docs/apr.html -->
     <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
     <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
     <Listener className="org.apache.catalina.core.JasperListener"/>
     <!-- Prevent memory leaks due to use of particular java/javax APIs -->
     <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
     <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
     <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

     <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html -->
     <GlobalNamingResources>
          <!-- Editable user database that can also be used by UserDatabaseRealm
               to authenticate users -->
          <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
     </GlobalNamingResources>

     <!-- A "Service" is a collection of one or more "Connectors" that share
          a single "Container" Note: A "Service" is not itself a "Container", so you
          may not define subcomponents such as "Valves" at this level. Documentation
          at /docs/config/service.html -->
     <Service name="Catalina">

          <!--The connectors can use a shared executor, you can define one or more
               named thread pools -->
          <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150"
               minSpareThreads="4"/> -->


          <!-- A "Connector" represents an endpoint by which requests are received
               and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html
               (blocking & non-blocking) Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP)
               Connector: /docs/apr.html Define a non-SSL HTTP/1.1 Connector on port 8080 -->
          <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
          <!-- A "Connector" using the shared thread pool -->
          <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000" redirectPort="8443" /> -->
          <!-- Define a SSL HTTP/1.1 Connector on port 8443 This connector uses the
               BIO implementation that requires the JSSE style configuration. When using
               the APR/native implementation, the OpenSSL style configuration is required
               as described in the APR/native documentation -->
          <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false"
               sslProtocol="TLS" /> -->

          <!-- Define an AJP 1.3 Connector on port 8009 -->
          <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>


          <!-- An Engine represents the entry point (within Catalina) that processes
               every request. The Engine implementation for Tomcat stand alone analyzes
               the HTTP headers included with the request, and passes them on to the appropriate
               Host (virtual host). Documentation at /docs/config/engine.html -->

          <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine
               name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> -->
          <Engine defaultHost="localhost" name="Catalina">

               <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html
                    (simple how to) /docs/config/cluster.html (reference documentation) -->
               <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> -->

               <!-- Use the LockOutRealm to prevent attempts to guess user passwords
                    via a brute-force attack -->
               <Realm className="org.apache.catalina.realm.LockOutRealm">
                    <!-- This Realm uses the UserDatabase configured in the global JNDI resources
                         under the key "UserDatabase". Any edits that are performed against this UserDatabase
                         are immediately available for use by the Realm. -->
                    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
               </Realm>

               <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">

                    <!-- SingleSignOn valve, share authentication between web applications
                         Documentation at: /docs/config/valve.html -->
                    <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn"
                         /> -->

                    <!-- Access log processes all example. Documentation at: /docs/config/valve.html
                         Note: The pattern used is equivalent to using pattern="common" -->
                    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/>

                    <Context docBase="FirstWebApp" path="/FirstWebApp" reloadable="true" source="org.eclipse.jst.j2ee.server:FirstWebApp"/>
                    <Context docBase="SpringWebApp1" path="/SpringWebApp1" reloadable="true" source="org.eclipse.jst.j2ee.server:SpringWebApp1"/>
                    <Context docBase="SpringWebApp2" path="/SpringWebApp2" reloadable="true" source="org.eclipse.jst.j2ee.server:SpringWebApp2"/>
                    <Context docBase="SpringWebApp3" path="/SpringWebApp3" reloadable="true" source="org.eclipse.jst.j2ee.server:SpringWebApp3"/>
                    <Context docBase="BoardApp" path="/BoardApp" reloadable="true" source="org.eclipse.jst.j2ee.server:BoardApp">
                         <Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver" maxIdle="10" maxTotal="20" maxWaitMillis="-1" name="jdbc/springDB" password="1111" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:orcl" username="scott"/>
                    </Context>
               <Context docBase="Uticle" path="/Uticle" reloadable="true" source="org.eclipse.jst.j2ee.server:Uticle"/></Host>
          </Engine>
     </Service>
</Server>
...................................
/Servers/Tomcat v7.0 Server at localhost-config/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
     license agreements. See the NOTICE file distributed with this work for additional
     information regarding copyright ownership. The ASF licenses this file to
     You under the Apache License, Version 2.0 (the "License"); you may not use
     this file except in compliance with the License. You may obtain a copy of
     the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
     by applicable law or agreed to in writing, software distributed under the
     License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
     OF ANY KIND, either express or implied. See the License for the specific
     language governing permissions and limitations under the License. --><!-- The contents of this file will be loaded for each web application -->
<Context>

     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>

     <!-- Uncomment this to disable session persistence across Tomcat restarts -->
     <!-- <Manager pathname="" /> -->

     <!-- Uncomment this to enable Comet connection tacking (provides events
          on session expiration as well as webapp lifecycle) -->
     <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve"
          /> -->
     <Resource name="jdbc/springDB" auth="Container" type="javax.sql.DataSource" />
</Context>
...................................
/BoardApp/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>BoardApp</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>BoardApp Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
          </dependency>
          <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
               <version>1.1.2</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-jdbc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>BoardApp</finalName>
     </build>
</project>
...................................
/BoardApp/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>

     <filter>
          <filter-name>filterEncoding</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
          <init-param>
               <param-name>encoding</param-name>
               <param-value>UTF-8</param-value>
          </init-param>
          <init-param>
               <param-name>forceEncoding</param-name>
               <param-value>true</param-value>
          </init-param>
     </filter>

     <filter-mapping>
          <filter-name>filterEncoding</filter-name>
          <url-pattern>/*</url-pattern>
     </filter-mapping>

     <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>

     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
     <!-- <servlet> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet -->
     <!-- </servlet-class> -->
     <!-- </servlet> -->
     <!-- <servlet-mapping> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <url-pattern>/webservice/</url-pattern> -->
     <!-- </servlet-mapping> -->
</web-app>
...................................
/BoardApp/src/main/webapp/WEB-INF/applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>    
    
<!--      <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> -->
<!--           <property name="driverClassName"> -->
<!--                <value>oracle.jdbc.OracleDriver</value> -->
<!--           </property> -->
         
<!--           <property name="url"> -->
<!--                <value>jdbc:oracle:thin:@localhost:1521:orcl</value> -->
<!--           </property> -->
         
<!--           <property name="username" value="scott"></property> -->
<!--           <property name="password" value="1111"></property> -->
<!--      </bean> -->
    
    
     <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName" value="jdbc/springDB"></property>
          <property name="resourceRef" value="true"></property>
     </bean>
    
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
          <property name="dataSource" ref="dataSource"/>
     </bean>
    
     <bean id="boardDao" class="board.repository.BoardDaoImpl">
          <property name="jdbcTemplate" ref="jdbcTemplate"/>
     </bean>
    
          <bean id="userDao" class="member.repository.UserDaoImpl">
          <property name="jdbcTemplate" ref="jdbcTemplate"/>
     </bean>
</beans>
...................................
/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <bean id="listController" class="board.controller.ListController">
          <property name="boardDao" ref="boardDao"></property>
     </bean>    
    
     <bean id="writeController" class="board.controller.WriteController">
          <property name="boardDao" ref="boardDao"></property>
     </bean>
    
     <bean id="loginController" class="member.controller.LoginController">
          <property name="userDao" ref="userDao"></property>
     </bean>
</beans>
...................................
/BoardApp/src/main/webapp/WEB-INF/conf/handlermapping-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <property name="mappings">
               <props>
                    <prop key="/board_list.board">listController</prop>
                    <prop key="/board_write.board">writeController</prop>
                    <prop key="/login.member">loginController</prop>
                    <prop key="/login_process.member">loginController</prop>                             
               </props>
          </property>
     </bean>    
</beans>
...................................
/BoardApp/src/main/webapp/WEB-INF/conf/viewresolver-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <bean
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="viewClass">
               <value>org.springframework.web.servlet.view.JstlView</value>
          </property>
          <property name="prefix">
               <value>/WEB-INF/views/board/</value>
          </property>
          <property name="suffix">
               <value>.jsp</value>
          </property>

          <property name="order" value="2"></property>
     </bean>

     <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"
          p:basename="member_viewresolver" p:order="1" />
</beans>
...................................
/BoardApp/src/main/resources/member_viewresolver.properties

login.(class)=org.springframework.web.servlet.view.JstlView
login.url=/WEB-INF/views/member/login.jsp

login_success.(class)=org.springframework.web.servlet.view.JstlView
login_success.url=/WEB-INF/views/member/login_success.jsp
...................................
/BoardApp/src/main/webapp/WEB-INF/views/board/list.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
     <h1>리스트 페이지</h1>
     <a href="board_write.board">글쓰기</a>
     <br/><br/>
     <table border="1">
          <tr>
               <th>번호</th><th>제목</th><th>등록자</th><th>등록일</th><th>조회수</th>
          </tr>
          <c:forEach var="dto" items="${list}">
          <tr>
               <td>${dto.b_seq }</td>
               <td>${dto.b_title }</td>
               <td>${dto.b_writer }</td>
               <td>${dto.b_regdate }</td>
               <td>${dto.b_hitcount }</td>                   
          </tr>
          </c:forEach>
     </table>
</body>
</html>
...................................
/BoardApp/src/main/webapp/WEB-INF/views/board/write.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
     <h1>글쓰기</h1>
     <form action="board_write.board" method="post">
          제목 : <input type="text" name="b_title"/><br/><br/>
          작성자 : <input type="text" name="b_writer"/><br/><br/>
          내용 : <textarea type="text" name="content"></textarea>
          <br/><br/>
          <input type="submit" value="저장"/>
          <input type="button" value="리스트 페이지" onclick="location.href='board_list.board'"/>
     </form>
</body>
</html>
...................................
/BoardApp/src/main/webapp/WEB-INF/views/member/login.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
     <h1>로그인</h1>
     <form action="login_process.member" method="post">
          아이디 : <input type="text" name="u_id"/><br/><br/>
          패스워드 : <input type="password" name="u_pw"/><br/><br/>
          <input type="submit" value="로그인"/>
     </form>
</body>
</html>
...................................
/BoardApp/src/main/webapp/WEB-INF/views/member/login_success.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
     <h1>님 로그인에 성공하였습니다.</h1>
</body>
</html>
...................................
/BoardApp/src/main/java/board/controller/ListController.java

package board.controller;

import java.sql.SQLException;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import board.repository.BoardDao;

@Controller
public class ListController {
     private BoardDao boardDao;

     public void setBoardDao(BoardDao boardDao) {
          this.boardDao = boardDao;
     }

     @RequestMapping("/board_list.board")
     public ModelAndView handleRequest() throws SQLException {
          ModelAndView mv = new ModelAndView("list");
          List result = boardDao.getList();
          // boardDao.findBySeq(1);
          mv.addObject("list", result);
          return mv;
     }
}
...................................
/BoardApp/src/main/java/board/controller/WriteController.java

package board.controller;

import java.sql.SQLException;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import board.domain.BoardDto;
import board.repository.BoardDao;

@Controller
public class WriteController {
     private BoardDao boardDao;

     public void setBoardDao(BoardDao boardDao) {
          this.boardDao = boardDao;
     }

     @RequestMapping(value = "/board_write.board", method = RequestMethod.GET)
     public ModelAndView handleRequest() throws SQLException {
          ModelAndView mv = new ModelAndView("write");
          return mv;
     }

     @RequestMapping(value = "/board_write.board", method = RequestMethod.POST)
     public ModelAndView handleRequest2(@ModelAttribute BoardDto boardDto) throws SQLException {
          boardDao.write(boardDto);

          // 이것만 쓰면 디스패쳐를 통과하지 않음!
          // 서버에서 페이지 이동을 하기만 함
          // ModelAndView mv = new ModelAndView("list");
         
          // 리다이렉트 쉐도우 프로토콜
          ModelAndView mv = new ModelAndView("redirect:board_list.board");
          return mv;
     }
}
...................................
/BoardApp/src/main/java/board/domain/BoardDto.java

package board.domain;

public class BoardDto {
     private int b_seq;
     private String b_title;
     private String b_content;
     private String b_writer;
     private String b_regdate;
     private int b_hitcount;
     private String b_password;
     public int getB_seq() {
          return b_seq;
     }
     public void setB_seq(int b_seq) {
          this.b_seq = b_seq;
     }
     public String getB_title() {
          return b_title;
     }
     public void setB_title(String b_title) {
          this.b_title = b_title;
     }
     public String getB_content() {
          return b_content;
     }
     public void setB_content(String b_content) {
          this.b_content = b_content;
     }
     public String getB_writer() {
          return b_writer;
     }
     public void setB_writer(String b_writer) {
          this.b_writer = b_writer;
     }
     public String getB_regdate() {
          return b_regdate;
     }
     public void setB_regdate(String b_regdate) {
          this.b_regdate = b_regdate;
     }
     public int getB_hitcount() {
          return b_hitcount;
     }
     public void setB_hitcount(int b_hitcount) {
          this.b_hitcount = b_hitcount;
     }
     public String getB_password() {
          return b_password;
     }
     public void setB_password(String b_password) {
          this.b_password = b_password;
     }
}
...................................
/BoardApp/src/main/java/board/repository/BoardDao.java

package board.repository;

import java.sql.SQLException;
import java.util.List;

import board.domain.BoardDto;

public interface BoardDao {
     public List getList() throws SQLException;
     public BoardDto findBySeq(int seq) throws SQLException;
     public void write(BoardDto dto) throws SQLException;
     public void update(BoardDto dto) throws SQLException;
     public void delete(int seq) throws SQLException;

}
...................................
/BoardApp/src/main/java/board/repository/BoardDaoImpl.java

package board.repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;

import board.domain.BoardDto;

public class BoardDaoImpl implements BoardDao {

     private JdbcTemplate jdbcTemplate;

     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
          this.jdbcTemplate = jdbcTemplate;
          // System.out.println("BoardDaoImpl - jdbcTemplate" + jdbcTemplate);
     }

     public List getList() throws SQLException {
          String sql = "select * from tblSpringBoard order by b_seq desc";

          RowMapper rm = new BoardRowMapper();
          List result = new ArrayList();

          // 반복문이 포함되어 있어서
          // 자동으로 result에 결과 값이 누적된다
          result = jdbcTemplate.query(sql, rm);
          System.out.println("BoardDaoImpl - result size : " + result.size());

          return result;
     }

     class BoardRowMapper implements RowMapper {
          public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
               // (ResultSet arg0, int arg1)
               // arg0은 전달되는 데이터
               // arg1은 몇번째 데이터 인지
               BoardDto dto = new BoardDto();
               dto.setB_seq(arg0.getInt("b_seq"));
               dto.setB_title(arg0.getString("b_title"));
               dto.setB_content(arg0.getString("b_content"));
               dto.setB_writer(arg0.getString("b_writer"));
               dto.setB_regdate(arg0.getString("b_regdate"));
               dto.setB_hitcount(arg0.getInt("b_hitcount"));
               dto.setB_password(arg0.getString("b_password"));
               return dto;
          }
     }

     public BoardDto findBySeq(int seq) throws SQLException {
          // ResultsetExtractor
          String sql = "select * from tblSpringBoard where b_seq = "+seq;
//          ResultSetExtractor rse = new BoardResultSet();
         
          ResultSetExtractor rse = new ResultSetExtractor() {
               public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
                    BoardDto dto = new BoardDto();
                    if(rs.next()){
                         dto.setB_seq(rs.getInt("b_seq"));
                         dto.setB_title(rs.getString("b_title"));
                         dto.setB_content(rs.getString("b_content"));
                         dto.setB_writer(rs.getString("b_writer"));
                         dto.setB_regdate(rs.getString("b_regdate"));
                         dto.setB_hitcount(rs.getInt("b_hitcount"));
                         dto.setB_password(rs.getString("b_password"));                   
                    }
                    return dto;
               }
          };
          BoardDto dto = jdbcTemplate.query(sql, rse);
          System.out.println("BoardDaoImpl - findBySeq - dto.getB_writer() : "+dto.getB_writer());
          return dto;
     }
    
     class BoardResultSet implements ResultSetExtractor{
          public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
               BoardDto dto = new BoardDto();
               if(rs.next()){
                    dto.setB_seq(rs.getInt("b_seq"));
                    dto.setB_title(rs.getString("b_title"));
                    dto.setB_content(rs.getString("b_content"));
                    dto.setB_writer(rs.getString("b_writer"));
                    dto.setB_regdate(rs.getString("b_regdate"));
                    dto.setB_hitcount(rs.getInt("b_hitcount"));
                    dto.setB_password(rs.getString("b_password"));                   
               }
               return dto;
          }         
     }

     public void write(BoardDto dto) throws SQLException {
         
          String sql = "insert into tblSpringBoard(b_seq,b_title,b_content,"
                    + "b_writer,b_regdate,b_hitcount,b_password) "
                    + "values(seq_user.nextVal, ?,?,?,sysdate,0,'1111')";
         
          Object[] values = new Object[]{
                    dto.getB_title(),dto.getB_content(),dto.getB_writer()
                    };
         
          // DB에 전달
          jdbcTemplate.update(sql, values);
     }

     public void update(BoardDto dto) throws SQLException {
         

     }

     public void delete(int seq) throws SQLException {
         

     }

}
...................................
/BoardApp/src/main/java/member/controller/LoginController.java

package member.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import member.domain.UserDto;
import member.repository.UserDao;

@Controller
public class LoginController {
     private UserDao userDao;

     public void setUserDao(UserDao userDao) {
          this.userDao = userDao;
     }
    
     @RequestMapping("/login.member")
     public String goLogin() {
          return "login";
     }
    
     @RequestMapping("login_process.member")
     public String LoginProcess(@ModelAttribute UserDto userDto, HttpServletRequest req){
          System.out.println("LoginController : userDto : "+userDto);
          UserDto user = userDao.getIdPw(userDto, req);
          String value = "";
          if(user != null){
               value = "login_success";
          }else{
               value = "login";
          }
          return value;
     }
}
...................................
/BoardApp/src/main/java/member/domain/UserDto.java

package member.domain;

public class UserDto {
     private int u_seq;
     private String u_id;
     private String u_pw;
     private String u_email;

     public int getU_seq() {
          return u_seq;
     }

     public void setU_seq(int u_seq) {
          this.u_seq = u_seq;
     }

     public String getU_id() {
          return u_id;
     }

     public void setU_id(String u_id) {
          this.u_id = u_id;
     }

     public String getU_pw() {
          return u_pw;
     }

     public void setU_pw(String u_pw) {
          this.u_pw = u_pw;
     }

     public String getU_email() {
          return u_email;
     }

     public void setU_email(String u_email) {
          this.u_email = u_email;
     }

     @Override
     public String toString() {
          return "UserDto [u_seq=" + u_seq + ", u_id=" + u_id + ", u_pw=" + u_pw + ", u_email=" + u_email + "]";
     }
}
...................................
/BoardApp/src/main/java/member/repository/UserDao.java

package member.repository;

import javax.servlet.http.HttpServletRequest;

import member.domain.UserDto;

public interface UserDao {
     UserDto getIdPw(UserDto dto, HttpServletRequest req);
}
...................................
/BoardApp/src/main/java/member/repository/UserDaoImpl.java

package member.repository;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;

import member.domain.UserDto;

public class UserDaoImpl implements UserDao{
     private JdbcTemplate jdbcTemplate;
    
     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
          this.jdbcTemplate = jdbcTemplate;         
     }

    
     public UserDto getIdPw(UserDto dto, HttpServletRequest req) {
          String sql = "select * from tblSpringMember where u_id=? and u_pw=?";
         
          Object[] values = new Object[]{
                    dto.getU_id(), dto.getU_pw()
          };
         
          ResultSetExtractor rse = new ResultSetExtractor() {
               public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
                    UserDto dto = new UserDto();
                    if(rs.next()){                        
                         dto.setU_seq(rs.getInt("u_seq"));
                         dto.setU_id(rs.getString("u_id"));
                         dto.setU_pw(rs.getString("u_pw"));
                         dto.setU_email(rs.getString("u_email"));                        
                    }else{
                         dto = null;
                    }
                    return dto;
               }
          };
          UserDto user = jdbcTemplate.query(sql, values, rse);
          System.out.println("UserDaoImpl - getIdPw : "+user);
          return user;
     }
}
...................................
-----------------------------------
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
-----------------------------------

'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day90  (0) 2015.07.21
오픈프레임워크_Day88  (0) 2015.07.17
오픈프레임워크_Day87  (0) 2015.07.16
오픈프레임워크_Day86  (0) 2015.07.16
오픈프레임워크_Day85  (0) 2015.07.14
,

---------

### : 목차 구분 기호

--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도
... : 같은 목차 내에 구분 기호
...................................
목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제
...................................
###################################
1. 이론 및 정보
-----------------------------------
* 스프링은 숙달
스프링은 이미 다 만들어져 있는 것이기 때문에
여러번 연습을 해봐야함

또한 여러각도에서 다양한 테스트가 필요
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
* 새로운 프로젝트 생성
Maven Project , WebApp 1.0
ArtifactId : SpringWebApp3, BoardApp
-----------------------------------
* SpringWebApp2에 준비 안된 라이브러리 추가했음
/SpringWebApp2/pom.xml
<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>3.1.0</version>
</dependency>
-----------------------------------
###################################
3. 소스코드 또는 실습
-----------------------------------
3-1
어제까지의 내용

Workspace : ~\study\SpringWork 

/SpringWebApp2/src/main/java/controller/ForthController.java

핸들러
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
첫번째 부터 세번째 까지 기본 핸들러를 사용하였음

네번째 부터 어노테이션 핸들러 맵핑 사용
@RequestMapping("/forth.action")

세번째 실습까지는 기본값인 핸들러를 안쓰다가
네번째 실습부터는 어노테이션 핸들러 맵핑을 사용을 해서
기본 값 핸들러를 다시 적어주었음

그래서
/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml
에서
<bean name="/forth.action" class="controller.ForthController"></bean>
<bean name="/fifth.action" class="controller.ForthController"></bean>
를 생략하면

기본값인 핸들러로 동작하기 때문에 문제가 없음

다른 핸들러 맵핑을 사용하면 기본 핸들러 맵핑이 동작하지 않으니
사용하고 싶으면 명시해주어야함

자바 생성자와 비슷한 개념

어노테이션의 단점은 가독성이 떨어진다.
어설프게 알고 있을때 사용하면 혼란스러움
-----------------------------------
3-2
Workspace : ~\study\SpringWork
여섯번째 요청 - sixth.action

코드
/SpringWebApp2/src/main/webapp/index.jsp
/SpringWebApp2/src/main/java/controller/ForthController.java
/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml


// 어노테이션에 인자를 여러개 쓸 수 있음
// POST 방식만 허용
@RequestMapping(value="/sixth.action",method=RequestMethod.POST)
-----------------------------------
3-3
Workspace : ~\study\SpringWork
일곱번째 요청 - seventh.action
같은 이름의 요청을 파라미터로 구별하는 방식

/SpringWebApp2/src/main/webapp/index.jsp
/SpringWebApp2/src/main/java/controller/ForthController.java
의 메서드 리턴값이 void

요청은 디스패처 서블릿으로 가고 핸들러 맵핑에게 물어보고
해당 컨트롤러로 전달하고 결과를 디스패처 서블릿에 전달하고(View의 가상경로까지 전달)
결과를 누구에게 전달할지 뷰 리졸버한테 물어보고(가상경로를 실제 경로로) 결과를 받아서 view에게 전달


그런데 void로 하면 뷰 리졸버의 리턴값(가상경로)이 없으니
404에러

이런식으로 하는 이유는 별도 페이지로 이동하기 위해서 사용

파라미터에 구분방식은 아래와 같음
@RequestMapping(value="/seventh.action",params={"user=tom","id=tiger"})
이런 파라미터가 전달되면 아래 메서드를 호출하라!는 의미
-----------------------------------
3-4
Workspace : ~\study\SpringWork
여덟번째 요청 - eighth.action

1번째 방법
/SpringWebApp2/src/main/webapp/index.jsp
/SpringWebApp2/src/main/java/controller/ForthController.java
@RequestMapping(value="/eighth.action")
public ModelAndView eighthHandler(HttpServletRequest req){
     System.out.println(req.getParameter("name"));
     ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
     mv.addObject("msg","여덟번째 요청에 대한 응답입니다.");
     return mv;
}


HttpServletRequest를 import 시킬 수 없어서
준비 안된 라이브러리 추가했음
/SpringWebApp2/pom.xml
<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>3.1.0</version>
</dependency>
...................................
2번째 방법
/SpringWebApp2/src/main/java/controller/ForthController.java
@RequestMapping(value="/eighth.action")
public ModelAndView eighthHandler(@RequestParam("name") String name, @RequestParam("age") int age, @RequestParam("point") int point){
     System.out.println(name+", "+age+", "+point);
     ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
     mv.addObject("msg","여덟번째 요청에 대한 응답입니다.");
     return mv;
}
...................................
3번째 방법 - 두번째 방법에서 어노테이션 생략 방법, 파라미터 이름과 똑같이 쓰면 됨
/SpringWebApp2/src/main/java/controller/ForthController.java
@RequestMapping(value="/eighth.action")
public ModelAndView eighthHandler(HttpServletRequest req,String name, int age, int point) throws UnsupportedEncodingException{
     req.setCharacterEncoding("UTF-8");        
     System.out.println(name+", "+age+", "+point);
     ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
     mv.addObject("msg","여덟번째 요청에 대한 응답입니다.");
     return mv;
}
문제 있음 한글 깨짐
...................................
4번째 방법 - DTO의 이름과 같으면 자동 맵핑 되는 기능
@ModelAttribute 를 사용, 다양한 방법으로 사용되는 것이라 공부가 필요

@RequestMapping(value="/eighth.action")
public ModelAndView eighthHandler(@ModelAttribute UserDto dto){        
     System.out.println(dto.getName()+", "+dto.getAge()+", "+dto.getPoint());
     ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
     mv.addObject("msg","여덟번째 요청에 대한 응답입니다.");
     return mv;
}

만약에
/SpringWebApp2/src/main/webapp/index.jsp
에서 dto로 받는 내용외에 다른 내용이 있으면 별도로 받아라
public ModelAndView eighthHandler(@ModelAttribute UserDto dto, String chk){
...................................
관리자 메뉴 - 새로운 폴더에 jsp 파일을 보관할 예정임
/SpringWebApp2/src/main/webapp/WEB-INF/admin 폴더 만듬
/SpringWebApp2/src/main/webapp/WEB-INF/admin/shoppingmall 폴더 만듬
/SpringWebApp2/src/main/webapp/WEB-INF/admin/shoppingmall/index.jsp
/SpringWebApp2/src/main/webapp/WEB-INF/views/shop_admin.jsp - 최종 종착지

/SpringWebApp2/src/main/java/controller/ShoppingController.java
...................................
항상 루트에서 시작페이지가 있을 수 있는 건 아니라는 점
/SpringWebApp2/src/main/webapp/shop 폴더 만듬
/SpringWebApp2/src/main/webapp/shop/index.jsp
이곳을 시작 위치로 옮겨 보겠음

이를 컨트롤러가 받을 수 있게 수정

/SpringWebApp2/src/main/java/controller/ShoppingController.java
//@RequestMapping("/shop/shop_admin.action")
@RequestMapping("/**/shop_admin.action")
public String shopHandler2() throws Exception {
     return "/WEB-INF/views/shop_admin.jsp";
}

<a href="../shop_admin.action">쇼핑몰 관리자</a>
로 수정해도 됨
-----------------------------------
3-5
Workspace : ~\study\SpringWork

새로운 프로젝트 - SpringWebApp3
핸들러 맵핑과 뷰 리졸버에 대해서 알아보는 시간

/SpringWebApp3/pom.xml 에 라이브러리 추가

/SpringWebApp3/src/main/webapp/index.jsp
/SpringWebApp3/src/main/webapp/WEB-INF/views/result.jsp
/SpringWebApp3/src/main/java/controller/FirstController.java
/SpringWebApp3/src/main/java/controller/SecondController.java
/SpringWebApp3/src/main/java/controller/ThirdController.java
/SpringWebApp3/src/main/webapp/WEB-INF/webapp3-servlet.xml

SimpleUrlHandlerMapping 를 사용할 예정
한번에 URL을 묶어서 관리하는 클래스

핸들러가 여러개 있을 때에는 핸들러마다
작성된 순서대로 한번씩 실행을 하면서 맵핑된 내용을 찾음
이러한 순서 때문에 핸들러의 우선순위를 정해야하는 경우가 생김
그래서 아래와 같은 프로퍼티를 핸들러 안에 넣어준다
<property name="order" value="1"></property>
값(value)이 낮을 수록 우선순위가 높음


ViewResolover
기본 뷰 리졸버는 InternalResourceView
/SpringWebApp3/src/main/java/controller/ViewController.java
/SpringWebApp3/src/main/webapp/WEB-INF/webapp3-servlet.xml

첫번째 ~ 세번째 컨트롤러는 InternalResourceView가 안되는 문제가 생김
이유는 첫번째 ~ 세번째 컨트롤러는 InternalResourceView에서 설정한 프로퍼티 대로
가상경로를 설정하지 않았다
이러한 경우 기존 가상경로를 그대로 쓰고 싶으면 다른 뷰 리졸버를 쓰면 된다

ResourceBundleViewResolver를 사용할 것임
이 리졸버는 별로로 파일을 저장해서 읽어 들임, 경로를 따로 지정
.properties로 저장하면 읽기 좋음
위 파일을 /SpringWebApp3/src/main/resources 폴더에 파일을 넣어놓으면
/WEB-INF/classes 폴더 안에 알아서 나중에 들어감

/SpringWebApp3/src/main/resources/bundleView.properties
를 생성

InternalResourceView는 자신이 찾다가 없으면 null을 리턴해서 끝내버림
그래서 여러 리졸버가 있을 때에는 우선순위를 맨 마지막으로 해야함

/SpringWebApp3/src/main/webapp/WEB-INF/webapp3-servlet.xml
namespace에 P 추가
p:basename="bundleView" p:order="1"
-----------------------------------
3-6
Workspace : ~\study\SpringWork

새로운 프로젝트 - 스프링으로 게시판 만들기
maven project - webapp

/BoardApp/pom.xml

Oracle 드라이버 준비

라이브러리를 pom.xml로 다운 받은게 아니라
Spring으로 넣은 방식이 아닌 예전 /WEB-INF/lib/ 폴더 안에 라이브러리를 넣음
그리고 해당 라이브러리를 프로젝트 프로퍼티에서 Build Path 설정하였음



/BoardApp/src/main/webapp/WEB-INF/web.xml
에서 여러 접미사를 가진 요청을 받기 위해서
<url-pattern>/</url-pattern>
와 같이 만든다
-----------------------------------
3-7
Workspace : ~\study\SpringWork
/SpringWebApp2/src/main/webapp/index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<a href="first.action">첫번째 요청</a>
<br/><br/>
<a href="second.action?param1=food&param2=fruit">두번째 요청</a>
<br/><br/>
<form action="third.action" method="post">
     <input type="text" name="name"/><br/><br/>
     <input type="submit" value="세번째 요청"/>
</form>
<br/><br/>
<a href="forth.action">네번째 요청</a>
<br/><br/>
<a href="fifth.action">다섯번째 요청</a>
<br/><br/>
<form action="sixth.action" method="post">
     <input type="submit" value="여섯번째 요청(post)"/>
</form>
<br/><br/>
<a href="seventh.action">일곱번째 요청</a>
<br/><br/>
<a href="seventh.action?user=tom&id=tiger">일곱번째 요청(파라미터)</a>
<br/><br/>
<a href="seventh.action?user=tom">일곱번째 요청(id 없는 파라미터)</a>
<br/><br/>
<form action="eighth.action" method="post">
     이름 : <input type="text" name="name"/><br/><br/>
     나이 : <input type="text" name="age"/><br/><br/>
     점수 : <input type="text" name="point"/><br/><br/>
     <input type="checkbox" name="chk" value="test"/><br/><br/>
     <input type="submit" value="여덟번째 요청"/>
</form>
<br/><br/>
<a href="admin.action">관리자</a>
</body>
</html>
-----------------------------------
3-8
Workspace : ~\study\SpringWork
/SpringWebApp2/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>SpringWebApp2</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>SpringWebApp2 Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
          </dependency>
          <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
               <version>1.1.2</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>SpringWebApp2</finalName>
     </build>
</project>
-----------------------------------
3-9
Workspace : ~\study\SpringWork
/SpringWebApp2/src/main/java/controller/ForthController.java

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import dto.UserDto;

@Controller
public class ForthController {
     @RequestMapping("/forth.action")
     public String handler() throws Exception {
          return "/WEB-INF/views/forthResult.jsp";
     }
     @RequestMapping("/fifth.action")
     public ModelAndView fifthHandler(){
          ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
          mv.addObject("msg","다섯번째 요청에 대한 응답입니다.");
          return mv;
     }
     // POST 방식만 허용하겠다
     @RequestMapping(value="/sixth.action",method=RequestMethod.POST)
     public ModelAndView sixthHandler(){
          ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
          mv.addObject("msg","여섯번째 요청에 대한 응답입니다.");
          return mv;
     }
     @RequestMapping(value="/seventh.action")
     public void seventhHandler(){
          System.out.println("일곱번째 요청 성공");
     }
     @RequestMapping(value="/seventh.action",params={"user=tom","id=tiger"})
     public void seventhHandler2(){
          System.out.println("일곱번째 요청 성공(파라미터)");
     }
//     @RequestMapping(value="/seventh.action",params={"user=tom"})
     @RequestMapping(value="/seventh.action",params={"user=tom","!id"})
     public void seventhHandler3(){
          System.out.println("일곱번째 요청 성공(id 없는 파라미터)");
     }
     // 첫번째 방법
//     @RequestMapping(value="/eighth.action")
//     public ModelAndView eighthHandler(HttpServletRequest req){
//          System.out.println(req.getParameter("name"));
//          ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
//          mv.addObject("msg","여덟번째 요청에 대한 응답입니다.");
//          return mv;
//     }
     // 두번째 방법
//     @RequestMapping(value="/eighth.action")
//     public ModelAndView eighthHandler(@RequestParam("name") String ㅜ, @RequestParam("age") int ㅁ, @RequestParam("point") int ㅔ){
//          System.out.println(n+", "+a+", "+p);
//          ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
//          mv.addObject("msg","여덟번째 요청에 대한 응답입니다.");
//          return mv;
//     }
     // 세번째 방법 - 두번째 방법에서 어노테이션 생략 방법, 파라미터 이름과 똑같이 쓰면 됨
//     @RequestMapping(value="/eighth.action")
//     public ModelAndView eighthHandler(HttpServletRequest req,String name, int age, int point) throws UnsupportedEncodingException{
//          req.setCharacterEncoding("UTF-8");         
//          System.out.println(name+", "+age+", "+point);
//          ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
//          mv.addObject("msg","여덟번째 요청에 대한 응답입니다.");
//          return mv;
//     }
     // 네번째 방법
     @RequestMapping(value="/eighth.action")
     public ModelAndView eighthHandler(@ModelAttribute UserDto dto, String chk){         
          System.out.println(dto.getName()+", "+dto.getAge()+", "+dto.getPoint()+", "+chk);
          ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
          mv.addObject("msg","여덟번째 요청에 대한 응답입니다.");
          return mv;
     }
}
-----------------------------------
3-10
Workspace : ~\study\SpringWork
/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="controller"></context:component-scan>
    
<!--      @RequestMapping("/forth.action") 을 쓰면서 다른 anno 명시에 따른 문제를 아래 코드로 해결-->
<!--      <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> -->
    
     <bean name="/first.action" class="controller.FirstController"></bean>
     <bean name="/second.action" class="controller.SecondController"></bean>
     <bean name="/third.action" class="controller.ThirdController">
<!--           어노테이션으로 변경 -->
<!--           <property name="userDao" ref="userDao"></property> -->         
          <property name="supportedMethods" value="POST"></property>
     </bean>
     <bean id="userDao" class="dao.UserDao"></bean>
    
<!--      @RequestMapping("/forth.action") 을 써서 삭제 -->
<!--      <bean name="/forth.action" class="controller.ForthController"></bean> -->

<!--      <bean name="/forth.action" class="controller.ForthController"></bean> -->
<!--      <bean name="/fifth.action" class="controller.ForthController"></bean> -->
<!--      <bean name="/sixth.action" class="controller.ForthController"></bean> -->
</beans>
 
-----------------------------------
3-11
Workspace : ~\study\SpringWork
/SpringWebApp2/src/main/webapp/WEB-INF/admin/shoppingmall/index.jsp
/SpringWebApp2/src/main/webapp/shop/index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<a href="shop_admin.action">쇼핑몰 관리자</a>
</body>
</html>
-----------------------------------
3-12
Workspace : ~\study\SpringWork
/SpringWebApp3/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>SpringWebApp3</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>SpringWebApp3 Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
          </dependency>
          <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
               <version>1.1.2</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>SpringWebApp3</finalName>
     </build>
</project>
-----------------------------------
3-13
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/webapp/index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>HandlerMapping!</h2>
<a href="first.do">첫번째 요청</a><br/><br/>
<a href="second.do">두번째 요청</a><br/><br/>
<a href="third.do">세번째 요청</a><br/><br/>
<hr/>
<h2>ViewResolover!</h2>
<a href="forth.do">네번째 요청</a><br/><br/>
<a href="fifth.do">다섯번째 요청</a><br/><br/>
</body>
</html>
-----------------------------------
3-14
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>
       <servlet>
          <servlet-name>webapp3</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>webapp3</servlet-name>
          <url-pattern>*.do</url-pattern>
     </servlet-mapping>
</web-app>
-----------------------------------
3-15
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/webapp/WEB-INF/webapp3-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="controller"></context:component-scan>
<!--      <bean name="/first.do" class="controller.FirstController"></bean> -->
<!--      <bean name="/second.do" class="controller.SecondController"></bean> -->
<!--      <bean name="/third.do" class="controller.ThirdController"></bean> -->
     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
          <property name="order" value="2"></property>
     </bean>
     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <property name="order" value="1"></property>
          <property name="mappings">
               <props>
<!--                     <prop key="/first.do">firstController</prop> -->
                    <prop key="/third.do">thirdController</prop>    
                    <prop key="/forth.do">viewController</prop>
                    <prop key="/fifth.do">viewController</prop>                        
               </props>
          </property>
     </bean>
<!--      <bean id="firstController" class="controller.FirstController"></bean> -->
     <bean name="/first.do" class="controller.FirstController"></bean>
     <bean name="/second.do" class="controller.SecondController"></bean>
     <bean id="thirdController" class="controller.ThirdController"></bean>
     <bean id="viewController" class="controller.ViewController"></bean>
    
<!--      기본 view resolver -->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="viewClass">
               <value>org.springframework.web.servlet.view.JstlView</value>
          </property>
          <property name="prefix">
               <value>/WEB-INF/views/</value>
          </property>
          <property name="suffix">
               <value>.jsp</value>
          </property>         
          <property name="order">
               <value>2</value>
          </property>
     </bean>
    
     <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:basename="bundleView" p:order="1"/>
    
</beans>
-----------------------------------
3-16
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/webapp/WEB-INF/views/result.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
<h2>first,second,third 요청에 대한 응답</h2>
${msg}
</body>
</html>
-----------------------------------
3-17
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/java/controller/FirstController.java

package controller;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class FirstController  {

     @RequestMapping("/first.do")
     public ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
          arg0.setCharacterEncoding("UTF-8");
          //ModelAndView mv = new ModelAndView("/WEB-INF/views/result.jsp");
          ModelAndView mv = new ModelAndView("first");
          mv.addObject("msg", "FirstController");
          return mv;
     }

}
-----------------------------------
3-18
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/java/controller/SecondController.java

package controller;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class SecondController extends AbstractController {

     @Override
     protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
          arg0.setCharacterEncoding("UTF-8");
          ModelAndView mv = new ModelAndView("/WEB-INF/views/result.jsp");
          mv.addObject("msg", "SecondController");
          return mv;
     }

}
-----------------------------------
3-19
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/java/controller/ThirdController.java

package controller;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class ThirdController extends AbstractController {

     @Override
     protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
          arg0.setCharacterEncoding("UTF-8");
          ModelAndView mv = new ModelAndView("/WEB-INF/views/result.jsp");
          mv.addObject("msg", "ThirdController");
          return mv;
     }

}
-----------------------------------
3-20
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/java/controller/ViewController.java

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ViewController {
     @RequestMapping("/forth.do")
     public ModelAndView forthCall() {
          ModelAndView mv = new ModelAndView("result");
          mv.addObject("msg","네번째 요청입니다.");
          return mv;
     }
     @RequestMapping("/fifth.do")
     public ModelAndView fifthCall() {
          ModelAndView mv = new ModelAndView("result");
          mv.addObject("msg","다섯번째 요청입니다.");
          return mv;
     }
}
-----------------------------------
3-21
Workspace : ~\study\SpringWork
/SpringWebApp3/src/main/resources/bundleView.properties

first.(class)=org.springframework.web.servlet.view.JstlView
first.url=/WEB-INF/views/result.jsp
-----------------------------------
3-22
Workspace : ~\study\SpringWork
/BoardApp/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>BoardApp</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>BoardApp Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
          </dependency>
          <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
               <version>1.1.2</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>BoardApp</finalName>
     </build>
</project>
-----------------------------------
3-23
Workspace : ~\study\SpringWork
/BoardApp/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
</web-app>
-----------------------------------
3-24
Workspace : ~\study\SpringWork
/BoardApp/src/main/webapp/WEB-INF/board-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>
     <bean id="listController" class="board.controller.ListController"></bean>
     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <property name="mappings">
               <props>
                    <prop key="/board_list.board">listController</prop>                        
               </props>
          </property>
     </bean>

     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="viewClass">
               <value>org.springframework.web.servlet.view.JstlView</value>
          </property>
          <property name="prefix">
               <value>/WEB-INF/views/board/</value>
          </property>
          <property name="suffix">
               <value>.jsp</value>
          </property>
     </bean>
</beans>
-----------------------------------
3-25
Workspace : ~\study\SpringWork
/BoardApp/board.sql

CREATE TABLE tblSpringBoard(
     b_seq          number          primary key,
     b_title          varchar2(50),
     b_content     varchar2(4000),
     b_writer     varchar2(50),
     b_regdate     varchar2(50),
     b_hitcount     number,
     b_password     varchar2(10)
);

CREATE SEQUENCE seq_board;

CREATE TABLE tblSpringMember(
     u_seq          number               primary key,
     u_id          varchar2(20)     unique,
     u_pw          varchar2(10),
     u_email          varchar2(50)
);

CREATE SEQUENCE seq_user;

INSERT INTO TBLSPRINGMEMBER values(seq_user.nextVal, 'aaa', 'aaa', 'aaa@aaa.net');
INSERT INTO TBLSPRINGMEMBER values(seq_user.nextVal, 'bbb', 'bbb', 'bbb@bbb.net');
-----------------------------------
3-26
Workspace : ~\study\SpringWork
/BoardApp/src/main/webapp/index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
     <h1>Main Page</h1>
     <ul>
          <li><a href="login.member">로그인</a><br /></li>
          <li><a href="board_list.board">게시판</a><br /></li>
     </ul>
</body>
</html>
-----------------------------------
3-27
Workspace : ~\study\SpringWork
/BoardApp/src/main/webapp/WEB-INF/views/board/list.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
     <h1>리스트 페이지</h1>
     <a href="">글쓰기</a>
     <br/><br/>
     <table border="1">
          <tr>
               <th>번호</th><th>제목</th><th>등록자</th><th>등록일</th><th>조회수</th>
          </tr>
     </table>
</body>
</html>
-----------------------------------
3-28
Workspace : ~\study\SpringWork
/BoardApp/src/main/java/board/controller/ListController.java

package board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ListController {
     @RequestMapping("/board_list.board")
     public ModelAndView handleRequest() {
          ModelAndView mv = new ModelAndView("list");         
          return mv;
     }
}
-----------------------------------
###################################

'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day90  (0) 2015.07.21
오픈프레임워크_Day89  (0) 2015.07.20
오픈프레임워크_Day87  (0) 2015.07.16
오픈프레임워크_Day86  (0) 2015.07.16
오픈프레임워크_Day85  (0) 2015.07.14
,

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도
... : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제
###################################
1. 이론 및 정보
-----------------------------------
* Web MVC
Spring안에 Web안에 포함된 모듈
MVC 패턴이 만들어져 있던 모듈임

1. DispatcherServlet - FrontController

MVC의 규모?
규모가 커지면 FrontController가 감당하기 힘들어짐
서브 컨트롤러가 페이지 이동을 처리함

web.xml에서 <servlet-name>의 내용 + "-servlet.xml"로 설정파일을 만듬

dispatcher-servlet.xml
<bean name 에서 name은 URL

사용자 요청은 Dispatcher Servlet


2. HandlerMapping(org.springframework.web.servlet.handler
          - BeanNameUrlHandlerMapping(기본, 생략가능)
          - SimpleUrlHandlerMapping
          - DefaultAnnotationHandlerMapping
          ...

3. Controller - servlet 패키지 안에 들어있음(org.springframework.web.servlet)
          - Controller : 가장 최소한의 기능만 가지고 있음
          - AbstractController : GET, POST 방식을 알려주는 메서드 supportedMethods
          - AbstractCommandController
          - SimpleFormController
          - MultiActionController
          ...

3버전 부터 컨트롤러를 골라서 쓰지 말고 어노테이션을 쓰라고 권장!


4. ViewResolver
          - InternalResourceViewResolver(기본, 생략가능)
          - ResourceBundleViewResolver
          - XmlViewResolver
          - VelocityViewResolver

5. View
          - InternalResourceView(기본, 생략가능)
          - JstlView
          - VelocityView
          ...


-----------------------------------
* Controller 의 Request, Response 자동 포워딩 됨

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

isELIgnored="false" 를 쓰면 포워딩이 안됨
-----------------------------------
* Spring -> IOC, AOP, DI 라는 이름으로도 불림
다양한 디자인 패턴을 지원하기 때문에
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
Workspace : ~\study\SpringWork
샘플로 웹 프로젝트 만듬

Maven Project - web app
groub id : com.study.myproject
artifact id : FirstWebApp

...................................
/FirstWebApp/src/main/webapp/index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<%=request.getRemoteAddr()%>
<a href="myservlet">서블릿으로 이동</a>
</body>
</html>
...................................
를 실행시켜보면


톰캣과 사용방법이 비슷(Pivotal)

톰캣을 쓰기로 함




웹서버 동작 확인

localhost:8080/FirstWebApp/index.jsp


Servlet Lib 없으나 동작은 되었음
...................................
mvnrepository.com/artifact/javax.servlet/javax.servlet-api/3.1.0

<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>3.1.0</version>
</dependency>
...................................
위 dependency를 /FirstWebApp/pom.xml 에 복사

Servlet 만들기

프로젝트 우클릭 폴더 생성
src/main/java 라는 이름으로 생성

/FirstWebApp/src/main/java 우클릭 클래스 생성
...................................
/FirstWebApp/src/main/java/myservlet/ServletTest.java

package myservlet;

import java.io.IOException;
import java.io.PrintWriter;

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

public class ServletTest extends HttpServlet {

     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
               throws ServletException, IOException {
          doPost(req, resp);
     }

     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
               throws ServletException, IOException {
          PrintWriter out = resp.getWriter();
          out.println("<html><body>");
          out.println("<h1>Servlet Test...</h1>");
          out.println("</body></html>");
          out.close();
     }

}
...................................
/FirstWebApp/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>

     <servlet>
          <servlet-name>myservlet</servlet-name>
          <servlet-class>myservlet.ServletTest</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>myservlet</servlet-name>
          <url-pattern>/myservlet</url-pattern>
     </servlet-mapping>
</web-app>
...................................
-----------------------------------
3-2
Workspace : ~\study\SpringWork

/SpringWebApp1 프로젝트 생성, 3-1과 똑같이 만듬
3-1은 평범한 웹 프로젝트
이번에는 Spring안에서 돌아가는 웹프로젝트를 만들예정


라이브러리 필요, 웹 모듈 받음, 기본 준비  Spring Web MVC Module
mvnrepository.com/artifact/org.springframework/spring-webmvc/4.1.7.RELEASE

<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>4.1.7.RELEASE</version>
</dependency>


/SpringWebApp1/pom.xml 추가

/SpringWebApp1/src/main/webapp/index.jsp
/SpringWebApp1/src/main/webapp/result.jsp
/SpringWebApp1/src/main/webapp/WEB-INF/web.xml


스프링이 준비한 MVC 아키텍쳐에 맞게 사용해야함

/SpringWebApp1/src/main/java 폴더 만듬

/SpringWebApp1/src/main/java/controller/ResultController.java

Spring Bean Configuration File 만듬



/SpringWebApp1/src/main/webapp/WEB-INF/dispatcher-servlet.xml
...................................
/SpringWebApp1/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>SpringWebApp1</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>SpringWebApp1 Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>SpringWebApp1</finalName>
     </build>
</project>
...................................
/SpringWebApp1/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>dispatcher</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>dispatcher</servlet-name>
          <url-pattern>*.do</url-pattern>
     </servlet-mapping>
</web-app>
...................................
/SpringWebApp1/src/main/webapp/index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<a href="result.do">여기를 눌러주세요.</a>
</body>
</html>
...................................
/SpringWebApp1/src/main/webapp/result.jsp

<%@ 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>당신이 이 페이지를 보고 있다면 스프링 설정은 성공한 것이다.</h2>
</body>
</html>
...................................
/SpringWebApp1/src/main/webapp/WEB-INF/dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
     <bean name="/result.do" class="controller.ResultController"></bean>
</beans>
...................................
/SpringWebApp1/src/main/java/controller/ResultController.java

package controller;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class ResultController implements Controller{

     public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
          // TODO Auto-generated method stub
          return new ModelAndView("result.jsp");
     }

}
...................................
-----------------------------------
3-3
Workspace : ~\study\SpringWork
/SpringWebApp2 프로젝트 생성

UTF-8 기본 코드
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

/SpringWebApp2/src/main/webapp/WEB-INF/views 폴더 만듬
사용자들이 직접 접근하지 못하도록 하기 위해서


first
/SpringWebApp2/src/main/webapp/WEB-INF/views/firstResult.jsp
/SpringWebApp2/src/main/java/controller/FirstController.java
/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml


second
/SpringWebApp2/src/main/webapp/WEB-INF/views/secondResult.jsp
/SpringWebApp2/src/main/java/controller/secondController.java


third - 집중해서 봐야할 부분
/SpringWebApp2/src/main/webapp/WEB-INF/views/thirdResult.jsp
/SpringWebApp2/src/main/java/controller/ThirdController.java
/SpringWebApp2/src/main/java/dao/UserDao.java
/SpringWebApp2/src/main/java/dto/UserDto.java

jstl 다운
mvnrepository.com/artifact/javax.servlet/jstl/1.2
<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
     <version>1.2</version>
</dependency>

mvnrepository.com/artifact/taglibs/standard/1.1.2
<dependency>
     <groupId>taglibs</groupId>
     <artifactId>standard</artifactId>
     <version>1.1.2</version>
</dependency>

/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml
<property name="supportedMethods" value="POST"></property>
추가 한뒤 - POST 방식만 전달하겠다는 의미

/SpringWebApp2/src/main/webapp/index.jsp
에서 form을 get으로 테스트 해보면 알 수 있음


forth - 어노테이션을 이용한 컨트롤러 사용
/SpringWebApp2/src/main/webapp/WEB-INF/views/forthResult.jsp
/SpringWebApp2/src/main/java/controller/ForthController.java


@Controller 를 쓰면 모든 컨트롤러를 쓰겠다는 의미로 쓰겠다?

fifth - forth 컨트롤러를 이용할 것임

비슷한 기능의 컨트롤러를 묶어 봅시다
MultiAction
컨트롤러는 한개, 여러개의 요청을 메서드로 분리


sixth - forth 컨트롤러 이용
하는데 기본 준비만 하였음
...................................
/SpringWebApp2/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>SpringWebApp2</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>SpringWebApp2 Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
          </dependency>
          <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
               <version>1.1.2</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>SpringWebApp2</finalName>
     </build>
</project>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/web.xml

<!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>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>webapp2</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>webapp2</servlet-name>
          <url-pattern>*.action</url-pattern>
     </servlet-mapping>
</web-app>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/webapp2-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="controller"></context:component-scan>
    
<!--      @RequestMapping("/forth.action") 을 쓰면서 다른 anno 명시에 따른 문제를 아래 코드로 해결-->
     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    
     <bean name="/first.action" class="controller.FirstController"></bean>
     <bean name="/second.action" class="controller.SecondController"></bean>
     <bean name="/third.action" class="controller.ThirdController">
<!--           어노테이션으로 변경 -->
<!--           <property name="userDao" ref="userDao"></property> -->         
          <property name="supportedMethods" value="POST"></property>
     </bean>
     <bean name="userDao" class="dao.UserDao"></bean>
    
<!--      @RequestMapping("/forth.action") 을 써서 삭제 -->
<!--      <bean name="/forth.action" class="controller.ForthController"></bean> -->

     <bean name="/forth.action" class="controller.ForthController"></bean>
     <bean name="/fifth.action" class="controller.ForthController"></bean>
    
     <bean name="/sixth.action" class="controller.ForthController"></bean>
</beans>
...................................
/SpringWebApp2/src/main/webapp/index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<a href="first.action">첫번째 요청</a>
<br/><br/>
<a href="second.action?param1=food&param2=fruit">두번째 요청</a>
<br/><br/>
<form action="third.action" method="post">
     <input type="text" name="name"/><br/><br/>
     <input type="submit" value="세번째 요청"/>
</form>
<br/><br/>
<a href="forth.action">네번째 요청</a>
<br/><br/>
<a href="fifth.action">다섯번째 요청</a>
<br/><br/>
<form action="sixth.action" method="post">
     <input type="submit" value="여섯번째 요청(post)"/>
</form>

</body>
</html>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/views/firstResult.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h1>firstResult.jsp</h1>
</body>
</html>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/views/secondResult.jsp

<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
<h1>secondResult.jsp</h1>
<h2>전달된 파라미터 값</h2>
param1 : <%=request.getAttribute("p1") %><br/>
param2 : ${p2}<br/>
<br/>
음식리스트<br/>
<ul>
<%
     ArrayList foodList = (ArrayList)request.getAttribute("foodList");
     if(foodList != null){
          for(int i=0;i<foodList.size();i++){
          %>
               <li><%=foodList.get(i)%></li>
          <%
          }
     }
%>
</ul>
<br/><br/>
과일 목록<br/>
${f1},${f2},${f3}
<br/><br/>
${day[0]},${day[1]},${day[2]}
</body>
</html>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/views/thirdResult.jsp

<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
<h1>thirdResult.jsp</h1>
<h2>검색 결과</h2>
이름 : ${item.name}<br/>
나이 : ${item.age}<br/>
점수 : ${item.point}<br/>
<hr/>
<h2>전체 리스트</h2>
<ul>
     <c:forEach items="${allItem}" var="item">
     <li>
     이름 : ${item.name}<br/>
     나이 : ${item.age}<br/>
     점수 : ${item.point}<br/>
     </li>
     </c:forEach>
</ul>
</body>
</html>
...................................
/SpringWebApp2/src/main/webapp/WEB-INF/views/forthResult.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
<h1>forthResult.jsp</h1>
${msg}
</body>
</html>
...................................
/SpringWebApp2/src/main/java/controller/FirstController.java

package controller;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class FirstController implements Controller{

     public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
          // ModelAndView는 View로 이동과 데이터 전달까지 가능함
          ModelAndView mv = new ModelAndView();
          mv.setViewName("/WEB-INF/views/firstResult.jsp");
          return mv;
     }

}
...................................
/SpringWebApp2/src/main/java/controller/SecondController.java

package controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class SecondController extends AbstractController {

     @Override
     protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
          String param1 = arg0.getParameter("param1");
          String param2 = arg0.getParameter("param2");

          ArrayList list = new ArrayList();
          list.add("삼계탕");
          list.add("반계탕");
          list.add("추어탕");
          list.add("영양탕");
         
          Map map = new HashMap();
          map.put("f1", "사과");
          map.put("f2", "배");
          map.put("f3", "감");
         
          ArrayList list2 = new ArrayList();
          list2.add("월요일");
          list2.add("화요일");
          list2.add("수요일");
         
          Map map2 = new HashMap<String, ArrayList>();
          map2.put("day", list2);
         
          ModelAndView mv = new ModelAndView("/WEB-INF/views/secondResult.jsp");
          mv.addObject("p1", param1);
          mv.addObject("p2", param2);
          mv.addObject("foodList", list);
          mv.addAllObjects(map);
          mv.addAllObjects(map2);
          return mv;
     }

}
...................................
/SpringWebApp2/src/main/java/controller/ThirdController.java

package controller;

import java.util.List;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

import dao.UserDao;
import dto.UserDto;

public class ThirdController extends AbstractController {
     @Autowired // 여기에 붙이면 setter 역할까지 함
     private UserDao userDao;
    
//     @Autowired
//     public void setUserDao(UserDao userDao){
//          this.userDao = userDao;
//     }

     @Override
     protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
          arg0.setCharacterEncoding("UTF-8");
          String name = arg0.getParameter("name");
         
          // DI 패턴 적용
          // UserDao dao = new UserDao();
          List allDto = userDao.getItems();
         
          UserDto dto = userDao.getItem(name);
          ModelAndView mv = new ModelAndView("/WEB-INF/views/thirdResult.jsp");         
          mv.addObject("item",dto);
          mv.addObject("allItem",allDto);
          return mv;
     }

}
...................................
/SpringWebApp2/src/main/java/controller/ForthController.java

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ForthController {
     @RequestMapping("/forth.action")
     protected String handle() throws Exception {
          return "/WEB-INF/views/forthResult.jsp";
     }
     @RequestMapping("/fifth.action")
     public ModelAndView fifthHandle(){
          ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
          mv.addObject("msg","다섯번째 요청에 대한 응답입니다.");
          return mv;
     }
     @RequestMapping("/sixth.action")
     public ModelAndView sixthHandle(){
          ModelAndView mv = new ModelAndView("/WEB-INF/views/forthResult.jsp");
          mv.addObject("msg","여섯번째 요청에 대한 응답입니다.");
          return mv;
     }
}
...................................
/SpringWebApp2/src/main/java/dto/UserDto.java

package dto;

public class UserDto {
     private String name;
     private int age;
     private double point;
     public String getName() {
          return name;
     }
     public void setName(String name) {
          this.name = name;
     }
     public int getAge() {
          return age;
     }
     public void setAge(int age) {
          this.age = age;
     }
     public double getPoint() {
          return point;
     }
     public void setPoint(double point) {
          this.point = point;
     }
    
}
...................................
/SpringWebApp2/src/main/java/dao/UserDao.java

package dao;

import java.util.ArrayList;
import java.util.List;

import dto.UserDto;

public class UserDao {
     private List items = new ArrayList();
     private UserDto[] userDto = new UserDto[3];
     public UserDao(){
          userDto[0] = new UserDto();
          userDto[0].setName("홍길동");
          userDto[0].setAge(20);
          userDto[0].setPoint(3.14);
         
          userDto[1] = new UserDto();
          userDto[1].setName("강감찬");
          userDto[1].setAge(30);
          userDto[1].setPoint(4.1);
         
          userDto[2] = new UserDto();
          userDto[2].setName("이순신");
          userDto[2].setAge(40);
          userDto[2].setPoint(5.1);
         
          items.add(userDto[0]);
          items.add(userDto[1]);
          items.add(userDto[2]);
     }
    
     public UserDto getItem(String name){
          for (int i = 0; i < items.size(); i++) {
               if(((UserDto)items.get(i)).getName().equals(name)){
                    return (UserDto)items.get(i);
               }
          }
          return null;
     }

     public List getItems() {
          return items;
     }
    
}
...................................
-----------------------------------
###################################
4. 과제
-----------------------------------
4-1
-----------------------------------
###################################


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day89  (0) 2015.07.20
오픈프레임워크_Day88  (0) 2015.07.17
오픈프레임워크_Day86  (0) 2015.07.16
오픈프레임워크_Day85  (0) 2015.07.14
오픈프레임워크_Day84  (0) 2015.07.13
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* AOP(Aspect Oriented Programming) - Spring을 대표하는 기능
... 이어서

4) 구현 방법
          ㄱ) 스프링에서 제공하는 객체
                    MethodBeforeAdvice
                    AfterReturningAdvice
                    ThrowsAdvice
                    MethodInterceptor

          ㄴ) POJO - 일반클래스 이용
                    ProceedingJoinPoint
                    org.aspectj.aspectweaver

          ㄷ) Annotation
                    @Aspect, @Around, ...
                    org.aspectj.aspectweaver
          
-----------------------------------
* JUnit : 단위 테스트 프레임워크

TDD : Test Driven Develop - 테스트 주도 개발 방식

소프트웨어 개발론
1. 폭포수 개발
2. Agile
     - XP : agile, xp를 융합해서 많이 씀
          ㄱ. pair coding 짝코딩 : 한명이 없어도 일을 개발할 수 있음
          ㄴ. TDD : 테스트를 먼저함, 테스트 코드를 만드는데 JUnit을 사용

왜 TDD를 써야하나?
1. 고전적인 개발 방식에서 나타날 수 있는 문제
          - 특정 모듈 개발 기간이 길어질 수록 개발자의 목표의식이 흐려진다.
          - 작업 분량이 늘어날 수록 확인이 어려워진다.
          - 개발자의 집중력이 필요해진다.
          - 논리적인 오류를 찾기가 힘들다.
          - 코드의 사용법과 변경 이력을 개발자의 기억력에 의존하게 되는 경우가 많다.
          - 코드 수정시에 기존 코드의 정상 동작에 대한 보장이 어렵다.

어록? Test the program before you write it. - kent back
=> 테스트에 맞춰서 코드를 짜라

Clean code that works - Ron Jeffries
=> 테스트 하면서 코드도 리팩토링해 가는 방식
테스트 -> 코드 수정 -> 리팩토링 -> 테스트 -> ...

-----------------------------------
* TDD 예제1 시나리오 - first 패키지

메서드명 : sum
Argument : int a, int b
Return Type : int
Condition : a와 b를 더한 값을 결과로 돌려 줌
-----------------------------------
* TDD Cycle

1. 질문 - 코드가 맞는지 질문을 함
2. 응답 - 질문에 해결책
3. 정제 - 리팩토링

이 흐름을 계속 반복해 나가는 과정 TDD

-----------------------------------
* TDD 예제2 시나리오 - 실습 3-6, bank 패키지

기본 시나리오
          은행 계좌 클래스
               - 계좌 잔고 조회
               - 입급 / 출금
               - 예상 복리 이자(추가)
               ...

          첫번째 질문 : 계좌 생성 테스트
               class name : Account
               function
                    - 잔고 조회
                    - 입금
                    - 출금
                    ...
               desc : 금액은 원 단위(예 : 천원 = 1000)

          첫번째 응답 : 계좌 생성 구현

          첫번째 정제 :
                    - 소스의 가독성이 적절한가?
                    - 중복된 코드는 없는가?
                    - 이름이 잘 못 부여된 메서드나 변수는 없는가?
                    - 구조의 개선이 필요한 부분은 없는가?

          두번째 질문 - JUnit을 사용
                    - 잔고 조회 기능 작성을 위한 테스트 케이스(@Test 붙여라) 작성
                    - 테스트 수행 결과가 errors로 표시된 항목은 failures로 만든다.

          class name : Account
          function
                    - 잔고 조회
                              10000원 계좌 생성
                              잔고 조회 결과 일치

          두번째 응답 : 잔고 조회 기능 구현

          두번째 정제
                    - 변수명 고침 : i 변수를 money로 교체
                    - JUnit에서 제공하는 메서드 사용 : if문 대신 assertEquals()로 교체


          세번째 질문
                    - 입금
                              10000원으로 계좌 생성
                              1000원 입금
                              잔고가 11000원 확인
                    - 출금
                              10000원으로 계좌 생성
                              1000원 출금
                              잔고가 9000원 확인


          세번째 응답 : 입금과 출금 기능 구현
          
          세번째 정제
                    변수명을 의미있게 수정

                              
-----------------------------------
* 예전 개발방식의 문제점
폭포수 개발 방식에서는 절반 이상에 테스트와 디버깅 하는데 씀
TDD는 이러한 시간을 소비를 줄일 수 있음
-----------------------------------
* 하나의 테스트는 반드시 하나의 기능만 테스트를 하라!!
-----------------------------------
* JUnit 사용
버전 3, 버전 4 있는데
3버전이 오래쓰임

두 버전의 차이?
version 3 : 상속 사용, 메서드 접두사로 'test'가 들어갔음
version 4 : annotation 사용

테스트 케이스 : 테스트 할 수 있는 클래스

JUnit도 git, maven처럼 cmd 명령으로 사용할 수 있는데
이클립스에 내장되어 있음, 많이 사용하니까

내장은 되어있으나 프로젝트에 빌드path를 연결해줘야 한다
or @Test 적고 에러난 부분에서 Alert Icon을 이용해서 자동 추가


JUnit Errors의 문제는 개발자의 능력에 문제? 코드의 문제
JUnit Failures 를 많이 찾아내는게 JUnit을 가장 큰 사용 목적

JUnit에서 에러 발생 시킬때 사용하는 메서드
fail();
-----------------------------------
* TDD 장점
1) 개발의 방향을 잃지 않도록 유지해 준다.
2) 품질 높은 소프트웨어 모듈을 보유
3) 자동화된 단위 테스트를 갖게 된다.
4) 사용설명서 & 의사소통의 수단
5) 설계 개선
6) 보다 자주 성공
-----------------------------------
* JUnit의 사용법을 익혀서 이력서에 넣을 정도가 되어라
-----------------------------------
* Spring의 Mock 객체(유사한, Sample)
DB가 있는 것처럼 제공
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성
Maven Project
Group ID - com.study.myproject
Artifact ID - AopTest
-----------------------------------
* 패키지 생성
스프링의 도움으로 만들 패키지
/AopTest/src/main/java/myaop

스프링 도움없이 만들 패키지
/AopTest/src/main/java/mypojo
/AopTest/src/main/java/myanno
-----------------------------------
* 프로젝트 생성
Java Project
/TDDPractice
-----------------------------------
###################################
3. 소스코드 또는 실습
-----------------------------------
3-1

프로젝트 생성 및 라이브러리 설정

Workspace : ~\study\SpringWork  

/AopTest/pom.xml

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <groupId>com.study.myproject</groupId>
     <artifactId>AopTest</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <name>AopTest</name>
     <url>http://maven.apache.org</url>
 
     <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-context</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.annotation</groupId>
               <artifactId>jsr250-api</artifactId>
               <version>1.0</version>
          </dependency>
     </dependencies>
</project>

    

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

3-2

/AopTest/src/main/java/myaop 패키지

AOP를 SPRING을 이용해서 구현

 

Workspace : ~\study\SpringWork

/AopTest/src/main/java/myaop/myaop_config.xml

Spring Bean Configuration File로 만듬

 

/AopTest/src/main/java/myaop/App.java

/AopTest/src/main/java/myaop/MessageBean.java

/AopTest/src/main/java/myaop/MessageBeanImpl.java

 

메서드 성능테스트 구현할 예정

시간을 측정하는 코드가 기존 코드에 삽입이 될 예정

그런데 이 코드들이 수십,수백개의 메서드에서 쓰이니까

코드를 분리 할텐데, 분리한 코드를 다시 불러서 쓰게 됨

또한 시간을 측정해야하는 메서드들이 지금 사용중인지

모니터링을 해야하는데 이점이 어려움

 

이러한 어려움을 AOP로 해결할 것임

 

Advice로 사용할 클래스 만듬, MethodInterceptor를 씀 Around Advice를 써야 하니까

/AopTest/src/main/java/myaop/LoggingAdvice.java

 

 

LoggingAdvice가 MessageBeanImpl의 sayHello()를 감시할 것임

 

 

포인트컷이 어디인지 알려줘야함 -> 설정 파일에서 설정을 함

/AopTest/src/main/java/myaop/myaop_config.xml

 

이번에 예제의 Target Class는 MessageBeanImpl

 

 

 
/AopTest/src/main/java/myaop/App.java
 
package myaop;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("myaop/myaop_config.xml");
        
        MessageBean bean = ctx.getBean("proxy", MessageBean.class);
        bean.sayHello();
    }
}
 
 
/AopTest/src/main/java/myaop/LoggingAdvice.java
 
package myaop;
 
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.util.StopWatch;
 
public class LoggingAdvice implements MethodInterceptor{
    
//    invoke() 메서드가 두번 실행 되는 메서드
//    매개변수에 가로채고자 하는 것이 전달됨    
    public Object invoke(MethodInvocation arg0) throws Throwable {
        StopWatch watch = new StopWatch();
        String methodName = arg0.getMethod().getName();
        
        // 시계 구별 용도를 설정하면서 시작
        watch.start(methodName);
        System.out.println("[LOG]Method : "+methodName+" 시작됨");
        
        // 중지된 메서드 다시 실행, 정상진행이 되는지 결과값을 받음
        // 결과값을 반드시 리턴해야 진행이 됨
        Object obj = arg0.proceed();
        
        // 중지된 메서드의 내용이 전부 실행 되고, 시간 측정
        watch.stop();
        System.out.println("[LOG]Method : "+methodName+" 종료");        
        
        System.out.println("[LOG]처리시간 : "+watch.getTotalTimeSeconds()+"초");
        return obj;
    }
}
 
 
/AopTest/src/main/java/myaop/MessageBean.java
 
package myaop;
 
public interface MessageBean {
    void sayHello();
}
 
 
/AopTest/src/main/java/myaop/MessageBeanImpl.java
 
package myaop;
 
public class MessageBeanImpl implements MessageBean {
    private String name;
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void sayHello() {
        // 시작시간을 측정하여 로그에 기록하고 화면에 출력
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("안녕하세요~~" + name + "님!");
        // 끝나는시간을 측정하여 로그에 기록하고 화면에 출력
        // 총 걸린 시간을 로그에 기록하고 화면출력
    }
 
}

    

 
/AopTest/src/main/java/myaop/myaop_config.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="messageBean" class="myaop.MessageBeanImpl">
        <property name="name" value="홍길동"></property>
    </bean>
    <bean id="loggingAdvice" class="myaop.LoggingAdvice"></bean>
    <bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
        <property name="pointcut">
            <bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
                <property name="pattern">
                    <value>.*sayHello.*</value>
                </property>
            </bean>
        </property>
        <property name="advice" ref="loggingAdvice"/>
    </bean>
    
    <bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="messageBean"/>
        <property name="interceptorNames">
            <list>
                <value>advisor</value>
            </list>
        </property>
    </bean>
</beans>

    

 

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

3-3

/AopTest/src/main/java/mypojo 패키지

에서 스프링에서 지원하지 않는 AOP 실습

 

Workspace : ~\study\SpringWork

 

다운로드 받아야함

 

/AopTest/pom.xml 추가

<dependency>

     <groupId>org.aspectj</groupId>

     <artifactId>aspectjweaver</artifactId>

     <version>1.8.6</version>

</dependency>

 

기존의 코드는 수정하지 않아도 됨

/AopTest/src/main/java/mypojo/MessageBean.java

/AopTest/src/main/java/mypojo/MessageBeanImpl.java

 

아래 파일들은 수정

/AopTest/src/main/java/mypojo/LoggingAdvice.java

/AopTest/src/main/java/mypojo/mypojo_config.xml

AOP Namespaces에서 AOP 추가

 

<bean id="loggingAdvice" class="myaop.LoggingAdvice"></bean>

를 지우고 어노테이션으로 함

 

/AopTest/src/main/java/mypojo/App.java
 
package mypojo;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("mypojo/mypojo_config.xml");
        
        MessageBean bean = ctx.getBean("messageBean", MessageBean.class);
        bean.sayHello();
    }
}
 
 
/AopTest/src/main/java/mypojo/LoggingAdvice.java
 
package mypojo;
 
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
 
@Component
public class LoggingAdvice {
    
//    invoke() 메서드가 두번 실행 되는 메서드
//    매개변수에 가로채고자 하는 것이 전달됨    
    public Object invoke(ProceedingJoinPoint arg0) throws Throwable {
        StopWatch watch = new StopWatch();
        String methodName = arg0.getSignature().getName();
        
        // 시계 구별 용도를 설정하면서 시작
        watch.start(methodName);
        System.out.println("[LOG]Method : "+methodName+" 시작됨");
        
        // 중지된 메서드 다시 실행, 정상진행이 되는지 결과값을 받음
        // 결과값을 반드시 리턴해야 진행이 됨
        Object obj = arg0.proceed();
        
        // 중지된 메서드의 내용이 전부 실행 되고, 시간 측정
        watch.stop();
        System.out.println("[LOG]Method : "+methodName+" 종료");        
        
        System.out.println("[LOG]처리시간 : "+watch.getTotalTimeSeconds()+"초");
        return obj;
    }
}
 
/AopTest/src/main/java/mypojo/MessageBean.java
 
package mypojo;
 
public interface MessageBean {
    void sayHello();
}
 
 
/AopTest/src/main/java/mypojo/MessageBeanImpl.java
 
package mypojo;
 
public class MessageBeanImpl implements MessageBean {
    private String name;
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void sayHello() {
        // 시작시간을 측정하여 로그에 기록하고 화면에 출력
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("안녕하세요~~" + name + "님!");
        // 끝나는시간을 측정하여 로그에 기록하고 화면에 출력
        // 총 걸린 시간을 로그에 기록하고 화면출력
    }
 
}

    

/AopTest/src/main/java/mypojo/mypojo_config.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
    <context:component-scan base-package="mypojo"/>
    <bean id="messageBean" class="mypojo.MessageBeanImpl">
        <property name="name" value="임꺽정"></property>
    </bean>
        
    <aop:config>
        <aop:aspect id="logging" ref="loggingAdvice">
            <aop:pointcut expression="execution(* sayHello())" id="logPointcut"/>
            <aop:around method="invoke" pointcut-ref="logPointcut"/>
        </aop:aspect>
    </aop:config>
</beans>

    

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

3-4

/AopTest/src/main/java/myanno 패키지

가장 간단하게 코드를 줄일 수 있는 AOP 실습

 

Workspace : ~\study\SpringWork

 

mypojo 패키지에서 다운 받은 라이브러리를 사용할 것임

 

 

이번 예제에서도 mypojo 처럼 수정할 것만 수정하면 됨

/AopTest/src/main/java/myanno/LoggingAdvice.java

/AopTest/src/main/java/myanno/App.java

/AopTest/src/main/java/myanno/myanno_config.xml

 

/AopTest/src/main/java/myanno/App.java
 
package myanno;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("myanno/myanno_config.xml");
        
        MessageBean bean = ctx.getBean("messageBean", MessageBean.class);
        bean.sayHello();
    }
}
 
/AopTest/src/main/java/myanno/LoggingAdvice.java
 
package myanno;
 
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
 
@Component
@Aspect
public class LoggingAdvice {
    
//    invoke() 메서드가 두번 실행 되는 메서드
//    매개변수에 가로채고자 하는 것이 전달됨
    @Around("execution(* sayHello())")
    public Object invoke(ProceedingJoinPoint arg0) throws Throwable {
        StopWatch watch = new StopWatch();
        String methodName = arg0.getSignature().getName();
        
        // 시계 구별 용도를 설정하면서 시작
        watch.start(methodName);
        System.out.println("[LOG]Method : "+methodName+" 시작됨");
        
        // 중지된 메서드 다시 실행, 정상진행이 되는지 결과값을 받음
        // 결과값을 반드시 리턴해야 진행이 됨
        Object obj = arg0.proceed();
        
        // 중지된 메서드의 내용이 전부 실행 되고, 시간 측정
        watch.stop();
        System.out.println("[LOG]Method : "+methodName+" 종료");        
        
        System.out.println("[LOG]처리시간 : "+watch.getTotalTimeSeconds()+"초");
        return obj;
    }
}
 
/AopTest/src/main/java/myanno/MessageBean.java
 
package myanno;
 
public interface MessageBean {
    void sayHello();
}
 
/AopTest/src/main/java/myanno/MessageBeanImpl.java
 
package myanno;
 
public class MessageBeanImpl implements MessageBean {
    private String name;
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void sayHello() {
        // 시작시간을 측정하여 로그에 기록하고 화면에 출력
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("안녕하세요~~" + name + "님!");
        // 끝나는시간을 측정하여 로그에 기록하고 화면에 출력
        // 총 걸린 시간을 로그에 기록하고 화면출력
    }
 
}

    

/AopTest/src/main/java/myanno/myanno_config.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
    <context:component-scan base-package="myanno"/>
    
    <bean id="messageBean" class="myanno.MessageBeanImpl">
        <property name="name" value="신돌석"></property>
    </bean>    
    
    <aop:aspectj-autoproxy/>
</beans>

    

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

3-5

/TDDPractice TDD 연습

/TDDPractice/first 패키지

 

Workspace : ~\study\SpringWork

 

/TDDPractice/src/first/Calculator.java

 

 
/TDDPractice/src/first/Calculator.java
 
package first;
 
public class Calculator {
    public int sum(int a, int b){
        return 0;
    }
    
    public static void main(String[] args) {
        Calculator cal = new Calculator();
        System.out.println(cal.sum(10, 20)==30);
        System.out.println(cal.sum(1, 2)==3);
        System.out.println(cal.sum(-10, 20)==10);
        System.out.println(cal.sum(0, 0)==0);
    }
}
 

    

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

3-6

TDD 예제2 시나리오 - 첫번째 질문

 

Workspace : ~\study\SpringWork

 

코드(main 패키지)와 테스트(test 패키지) 코드를 분리시키는게 관리에 유리

 

/TDDPractice/bank/main

/TDDPractice/bank/test

패키지 생성

 

/TDDPractice/src/bank/test/AccountTest.java

/TDDPractice/src/bank/main/Account.java

 

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

3-7

TDD 예제2 시나리오 - 두번째 질문 - JUnit

Workspace : ~\study\SpringWork

 

JUnit을 사용하면 main 메서드를 만들 필요 없음

/TDDPractice/src/bank/test/AccountTest.java

 

기존 main지우고 testAccount()에 @Test 어노테이션 붙임

에러아이콘 눌러서 Build Path에 JUnit 4 추가

 

 

실행방법

menu - run - run as - junit test

프로젝트 우클릭 - run as - junit

 

Green Light가 나오면 성공임

 

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

3-8

TDD 예제2 시나리오 - 세번째 질문

 

Workspace : ~\study\SpringWork

 

중복된 변수(account) 우클릭 - Quick Fix or Refactor - Covert local to Field

 

중복된 인스턴스 생성을 메서드로 뺀다 account

account = new Account(10000); 를 블록 잡고 우클릭

Refactor - extract method

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

/TDDPractice/src/bank/test/AccountTest.java

 

package bank.test;
 
import static org.junit.Assert.assertEquals;
 
import org.junit.Test;
 
import bank.main.Account;
 
public class AccountTest {
    private Account account;
    @Test
    public void testAccount() throws Exception {
        setup();
    }
    @Test
    public void testGetBalance(){
        setup();
        assertEquals(10000, account.getBalance());
        
        account = new Account(1000);
        assertEquals(1000, account.getBalance());
        
        account = new Account(100);
        assertEquals(100, account.getBalance());
    }
    @Test
    public void testDeposit(){
        setup();
        account.deposit(1000);
        assertEquals(11000, account.getBalance());        
    }
    public void setup() {
        account = new Account(10000);
    }
    @Test
    public void testWithdraw(){
        setup();
        account.widthdraw(1000);
        assertEquals(9000, account.getBalance());
    }
}
 
// 3-8 정제
//package bank.test;
//
//import static org.junit.Assert.assertEquals;
//
//import org.junit.Test;
//
//import bank.main.Account;
//
//public class AccountTest {
//    private Account account;
//    @Test
//    public void testAccount() throws Exception {
//        setup();
//    }
//    @Test
//    public void testGetBalance(){
//        setup();
//        assertEquals(10000, account.getBalance());
//        
//        account = new Account(1000);
//        assertEquals(1000, account.getBalance());
//        
//        account = new Account(100);
//        assertEquals(100, account.getBalance());
//    }
//    @Test
//    public void testDeposit(){
//        setup();
//        account.deposit(1000);
//        assertEquals(11000, account.getBalance());        
//    }
//    public void setup() {
//        account = new Account(10000);
//    }
//    @Test
//    public void testWithdraw(){
//        setup();
//        account.widthdraw(1000);
//        assertEquals(9000, account.getBalance());
//    }
//}
 
// 3-8 errors, 3-8 Failures , 3-8 Success
//package bank.test;
//
//import static org.junit.Assert.assertEquals;
//
//import org.junit.Test;
//
//import bank.main.Account;
//
//public class AccountTest {
//    @Test
//    public void testAccount() throws Exception {
//    }
//    @Test
//    public void testGetBalance(){
//        Account account = new Account(10000);
//        assertEquals(10000, account.getBalance());
//        
//        account = new Account(1000);
//        assertEquals(1000, account.getBalance());
//        
//        account = new Account(100);
//        assertEquals(100, account.getBalance());
//    }
//    @Test
//    public void testDeposit(){
//        Account account = new Account(10000);
//        account.deposit(1000);
//        assertEquals(11000, account.getBalance());        
//    }
//    @Test
//    public void testWithdraw(){
//        Account account = new Account(10000);
//        account.widthdraw(1000);
//        assertEquals(9000, account.getBalance());
//    }
//}
 
// 3-7 assertEquals
//package bank.test;
//
//import static org.junit.Assert.assertEquals;
//
//import org.junit.Test;
//
//import bank.main.Account;
//
//public class AccountTest {
//    @Test
//    public void testAccount() throws Exception {
//    }
//    @Test
//    public void testGetBalance(){
//        Account account = new Account(10000);
//        assertEquals(10000, account.getBalance());
//        
//        account = new Account(1000);
//        assertEquals(1000, account.getBalance());
//        
//        account = new Account(100);
//        assertEquals(100, account.getBalance());
//    }
//}
 
 
// 3-7 테스트 여러개 늘림, 3-7 여러 테스트를 만족시킴
//package bank.test;
//
//import static org.junit.Assert.fail;
//
//import org.junit.Test;
//
//import bank.main.Account;
//
//public class AccountTest {
//    @Test
//    public void testAccount() throws Exception {
//    }
//    @Test
//    public void testGetBalance(){
//        Account account = new Account(10000);
//        if (account.getBalance() != 10000) {
//            fail();
//        }
//        
//        account = new Account(1000);
//        if (account.getBalance() != 1000) {
//            fail();
//        }
//        
//        account = new Account(100);
//        if (account.getBalance() != 100) {
//            fail();
//        }
//    }
//}
 
// 3-7 Failures 발생시키기, 3-7 성공
//package bank.test;
//
//import static org.junit.Assert.fail;
//
//import org.junit.Test;
//
//import bank.main.Account;
//
//public class AccountTest {
//    @Test
//    public void testAccount() throws Exception {
//    }
//    @Test
//    public void testGetBalance(){
//        Account account = new Account(10000);
//        if (account.getBalance() != 10000) {
            // JUnit에서 에러 발생 시킬때 사용하는 메서드
//            fail();
            // throw new Exception();
//        }
//    }
//}
 
// 3-7 Errors 발생시키기
//package bank.test;
//
//import org.junit.Test;
//
//import bank.main.Account;
//
//public class AccountTest {
//    @Test
//    public void testAccount() throws Exception {
//    }
//    @Test
//    public void testGetBalance(){
//        Account account = new Account(10000);
//        if(account.getBalance() != 10000){
//            throw new Exception();
//        }
//    }
//}
 
// 3-6 실습
//package bank.test;
//import bank.main.Account;
//public class AccountTest {
//    public void testAccount() throws Exception {
//        Account account = new Account();
//        if (account == null) {
//            throw new Exception("계좌 생성 실패");
//        }
//    }
//    public static void main(String[] args) {
//        AccountTest test = new AccountTest();
//        try {
//            test.testAccount();
//        } catch (Exception e) {
//            System.out.println("실패(X)");
//            return;
//        }
//        System.out.println("성공(O)");
//    }
//}

    

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

/TDDPractice/src/bank/main/Account.java

package bank.main;
 
public class Account {
    private int balance;
    public Account(int money) {
        balance = money;
    }
 
    public int getBalance() {
        return balance;
    }
 
    public void deposit(int money) {
        balance += money;
    }
 
    public void widthdraw(int money) {
        balance -= money;
    }
}
// 3-8 Success, 3-8 정제
//package bank.main;
//
//public class Account {
//    private int balance;
//    public Account(int money) {
//        balance = money;
//    }
//
//    public int getBalance() {
//        return balance;
//    }
//
//    public void deposit(int money) {
//        balance += money;
//    }
//
//    public void widthdraw(int money) {
//        balance -= money;
//    }
//}
 
// 3-8 Failures
//package bank.main;
//
//public class Account {
//    private int balance;
//    public Account(int money) {
//        balance = money;
//    }
//
//    public int getBalance() {
//        return balance;
//    }
//
//    public void deposit(int money) {
//    }
//
//    public void widthdraw(int money) {
//    }
//}
// 3-7 여러 테스트를 만족시킴, 3-8 errors
//package bank.main;
//
//public class Account {
//    private int balance;
//    public Account(int i) {
//        balance = i;
//    }
//
//    public int getBalance() {
//        return balance;
//    }
//}
 
// 3-7 성공, 3-7 테스트 여러개 늘림
//package bank.main;
//
//public class Account {
//
//    public Account(int i) {
//        // TODO Auto-generated constructor stub
//    }
//
//    public int getBalance() {
//        // TODO Auto-generated method stub
//        return 10000;
//    }
//}
 
// 3-7 Failures 발생시키기
//package bank.main;
//
//public class Account {
//
//    public Account(int i) {
//        // TODO Auto-generated constructor stub
//    }
//
//    public int getBalance() {
//        // TODO Auto-generated method stub
//        return 0;
//    }
//}
 
//3-6 실습, 3-7 Errors 발생시키기
//package bank.main;
//public class Account {
//}
 

    

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

###################################


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day88  (0) 2015.07.17
오픈프레임워크_Day87  (0) 2015.07.16
오픈프레임워크_Day85  (0) 2015.07.14
오픈프레임워크_Day84  (0) 2015.07.13
오픈프레임워크_Day83  (0) 2015.07.10
,

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
모듈, 컴퍼넌트, 빈 - 큰 단위의 모듈
모듈은 분리된 단위
모듈의 최소 단위 메서드
----------------------------------- 
라이프 사이클
5. BeanPostProcessor - bean 실행 되기 전
          Object postProcessAfterInitializer(Object bean, String beanName) - 8번
          Object postProcessBeforeInitializer(Object bean, String beanName) - 6번

상속을 받아서 서브클래싱을 해줘야 사용가능

DefaultListableBeanFactory 방식으로 현재 사용중

따로 만든 class CustomBeanPostProcessor implements BeanPostProcessor 를 
생성해서 라이프 사이클에 붙여 줄 수 있는 메서드를 DefaultListableBeanFactory 가
가지고 있음

----------------------------------- 
* Bean 생성 방법

1. XML에 등록
          <bean>
          ------
          <bean id="" class="" />
          인스턴스 주소 값을 id값이 참조한다
               <property name="setter의 set빼고 소문자로 시작" [value="" | ref=""]>
                    <value>...</value>
                    or
                    <ref bean="id 값이 들어감" or local=""/> - 대부분 bean을 사용
                    or
                    <ref bean="bean.Test"/> -> Bean을 생성하면서 넣음, 내부 Bean
               </property>

               <constructor-arg value="" [index=""][type=""]></constructor-arg>
          </bean>

          생성자는 매개변수를 여러개 받을 수 있지만
          Bean의 setter 메서드는 한개의 매개변수만 받을 수 있음

2. XML에 등록
          <네임스페이스명:태그명 .../>

          <aop:config></aop:config> - 특별한 목적으로 bean을 만들때 사용
          <bean></bean> - 범용적
          둘의 차이가 있음

          또한 aop 사용하려면 
          xmlns:aop="http://www.springframework.org/schema/aop"
          필요함

          이러한 태그들을 전용태그라고 함
          <aop:config></aop:config>
          <context:annotation-config></context:annotation-config>
          <bean></bean>  

3. 자동인식을 이용한 빈 생성 : 스테레오 타입의 어노테이션(자바코드를 축약)과 빈 스캐너

4. 자바코드에 의한 Bean 생성 - XML이 하던 일을 대신하게 만듬 : @Configuration(클래스), @Bean(메서드)
     Configuration은 환경설정을 할 수 있는 클래스가 되도록 만들어 줌

5. 자바코드에 의한 Bean 생성 : 일반클래스(Pojo-Plain old java object), @Bean(메서드)
     pojo는 싱글톤이 아님
 
----------------------------------- 
* Namespace 
Java에서 패키지를 의미
----------------------------------- 
* JDK에 따른 어노테이션 문제

JDK 5.0에서 어노테이션이 불안정
인터페이스에서 물려받은 것은 @Override를 안쓰고
클래스에서 물려받은 것만 @Override를 씀
JDK 6.0에서는 인터페이스에서 물려받은 것은 @Override를 쓰임

그래서 5.0에 문제가 되는 @Override를 전부 지워야 함


프로젝트 프로퍼티 설정




이런식으로 변경 가능

----------------------------------- 
@Component
클래스 위에 적어 놓으면
Component로 자동으로 스캐너가 읽는다
이름을 지어주지 않으면 자동으로 이름을 짓는데
클래스 명으로 하는데 단! 첫글자는 소문자
이름을 지정하는 방법 @Component("msgEn")


빈 스캐너가 필요

스캐너 만드는 방법 2가지

1. 기본적인 방식 
     메인에서 applicationcontext를 이용

2. XML에 스캔 범위를 지정
     <context:component-scan base-package="basic08"></context:component-scan>

----------------------------------- 
* Servlet 3.0 부터는 web.xml이 필요없게 만들어 줌

이유는 web.xml 내용이 다시 reflection으로 인해
자바 코드로 바뀌는데 애당초 xml말고 자바 클래스로 바꾸자가 취지임

그래서 3.0 부터는 안만들어도 됨

----------------------------------- 
* Bean은 기본적으로 SingleTon으로 생성됨
Attribute : scope
The scope of this bean: typically "singleton"

/basic/src/main/java/basic09/App.java
를 실행 시켜 보면
new FileOutputter() 를 두번 호출해서 두개가 생성되야 하는데
한개만 생성 되는 것을 확인 할 수 있음

----------------------------------- 
* Bean의 의존 관계 설정 방법(DI 패턴 설정)

1) XML에 등록해서 설정 (Bean 생성 방법의 1번)
2) 자동 와이어링 방식
     a) Attribute
          - 둘 중에 한개만 사용가능!
          i) byName 
               - 관례를 이용한 방식, bean의 이름과 property의 이름이 동일할 때 자동 연결해주는 방식
               - basic10의 xml에 설정을 넣으면 변수의 이름과 같은 bean id를 찾아서 연결
          ii) byType
               - 같은 타입의 변수를 찾아서 가도록 연결


     b) Annotation
          - 아래 두개의 기능은 똑같음
          - 연결하기 위해서는 필요한 스캐너가 있음, 아래는 예시 
          (<context:component-scan base-package="basic10"/>)
          i) @Resource
               - JSR-250(Java 문법 규칙) 스펙에 정의가 되어있음, 자바 문법 어디서든 사용가능
               - 기본값이 bean의 이름으로 연결(byName), 이름이 똑같지 않아도 선택된 것과 최대한 연결하려고함
               - 같은 이름이 없으면 같은 타입을 찾으려고 함
               - 변수 선언부 위에 있으면 setter없이도 가능
          ii) @Autowired
               - Spring에 스펙에 정의가 되어있음, 스프링에서만 쓰일 수 있음
               - 기본값이 bean의 타입으로 연결(byType)
               - spring 전용이라서 많은 도움을 받을 수 있음

----------------------------------- 
* Java Lib 중앙 저장소

mvnrepository.com
annotation 검색
http://mvnrepository.com/artifact/javax.annotation/jsr250-api/1.0

<dependency>
     <groupId>javax.annotation</groupId>
     <artifactId>jsr250-api</artifactId>
     <version>1.0</version>
</dependency>

복사해서 pom.xml 

----------------------------------- 
* AOP(Aspect Oriented Programming) - Spring을 대표하는 기능
다른 언어에서 지원되던 내용을 추가함

AOP에 대한 관심을 충분히 이끌어냈음

관점지향프로그래밍 방식?
객체지향방식을 도와주는 방식
객체지향의 한계를 커버해줌

OOP를 뛰어넘는 개발방식이 나오지는 않았음

OOP로 인해 나온 개발방식? CBD (컴포넌트 기반 개발, component-based development, 모듈 단위로 개발)


OOP는 모듈단위로 개발이 가능하기 때문에 큰 장점이 됨
OOP의 한계? 부족한점? 최소한의 단위로 나누려고 하는데
더 이상 쪼개지지 않는 단위까지 가게됨(클래스 단위의 모듈 - 컴퍼넌트)

예를 들어 은행업무를 모듈 단위로 작성하게 될 때
로그, 트랜잭션, 보안의 코드들이 예금, 보험, 여신 과 같은 모듈에 
중복되어서 작성하게되는데 이를 따로 모듈로 만들어 놓을 수 있다
하지만 따로만든 모듈도 결론적으로 각각의 모듈에서 쓰이기 된다
이러한 중복되는 코드들을 극복하게 해주는 것이 AOP이다



AOP는 중복되는 특정 기능을 코드에 작성하지 않고
필요한 시점에 알아서 실행이 되도록 해준다
이는 AOP의 인터셉터 기능을 통해서 해줌


AOP - 횡단관심사, 종단관심사

1) 정의
          기능을 핵심 비지니스 로직과 공통 모듈로 구분하고,
          핵심 로직에 영향을 미치지 않고 사이사이에 공통모듈을 효과적으로
          잘 끼워 넣도록 하는 개발 방법

2) 용도
          ㄱ) 간단한 메서드 성능 검사
          ㄴ) 트랜젝션 처리
          ㄷ) 예외처리 반환
          ㄹ) 아키텍쳐 검증
          ㅁ) 기타...(로깅, 인증, 권한 등등)

3) 구성요소
          a) JoinPoint - 코드가 삽입될 실제 위치
          b) Pointcut - 같은 기능의 JoinPoint의 묶음(예)로그 JoinPoint, 보안 JoinPoint ...
          c) Advice - 기능 구현을 위해 만든 코드
          d) Advisor - Pointcut + Advice 두개를 쉽게 관리할 수 있게 하는 단위
          e) Weaving - 행동대장, Advisor를 필요할 때 끼워넣는 행위
                     -> Weaving을 당하는 대상을 Target Class 라고 한다



----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 패키지 만듬 - /basic/src/main/java/basic08 
/basic02 패키지 내용을 전부 복사 해옴
----------------------------------- 
* xml 만듬


beans는 기본값으로 선택을 안해도 선택이 된다


Finish

만약 만들어진 내용 중에 Namespace추가하고 싶으면




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

* 패키지 생성 - /basic/src/main/java/basic09
basic08의 설정파일(xml)을 제외한 내용 복사
basic06의 FileOutputter.java, Outputter.java 복사
----------------------------------- 
* 패키지 생성 - /basic/src/main/java/basic10
basic09의 설정 클래스를 제외한 내용 복사
----------------------------------- 
* java에서 필요한 어노테이션 라이브러리가 필요함
/basic/src/main/java/basic10/MessageBeanImpl.java
에서 @Resource를 쓸 때 아래 주소의 maven 사용
http://mvnrepository.com/artifact/javax.annotation/jsr250-api/1.0
-----------------------------------
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
Workspace : ~\study\SpringWork 
Content : Bean Life Cycle 
/basic/src/main/java/basic07/CustomBeanPostProcessor.java

package basic07;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class CustomBeanPostProcessor implements BeanPostProcessor {

     public Object postProcessAfterInitialization(Object arg0, String arg1) 
               throws BeansException {
          System.out.println("8. 초기화 후 빈에 대한 처리 설정" 
               + arg0.toString() + ", " + arg1.toString());
          // null이 리턴 되면 라이프사이클이 끝남
          return arg0;
     }

     public Object postProcessBeforeInitialization(Object arg0, String arg1) 
               throws BeansException {
          System.out.println("5. 초기화 전 빈에 대한 처리 설정" 
               + arg0.toString() + ", " + arg1.toString());
          // null이 리턴 되면 라이프사이클이 끝남
          return arg0;
     }

}
----------------------------------- 
3-2
Workspace : ~\study\SpringWork
Content : Bean Life Cycle
/basic/src/main/java/basic07/App.java

package basic07;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class App {
     public static void main(String[] args) {
          // DefaultListableBeanFactory에 메서드로 라이프사이클에 넣기 위해서
          // 전에는 BeanFactory로 만들었으나 부모 클래스로 받음
          // BeanFactory factory = new DefaultListableBeanFactory();
          // DefaultListableBeanFactory factory = new
          // DefaultListableBeanFactory();
          //
          // new XmlBeanDefinitionReader(((BeanDefinitionRegistry) factory))
          // .loadBeanDefinitions(new FileSystemResource("basic07_config.xml"));

          // 라이프사이클에 동참시키기 위해서 넣음
          // factory.addBeanPostProcessor(new CustomBeanPostProcessor());
          // 위 코드를 XML에서 생성하는 방법? DI를 적용시키기 위해
          // 인스턴스 생성은 XML에서 할 수 있지만 DefaultListableBeanFactory에서 가져올 수 없음

          // 하지만 XML에서 생성된 것을 가져다 쓸 수 있는 클래스가 있음
          ApplicationContext factory = new FileSystemXmlApplicationContext("basic07_config.xml");          

          MessageBean bean = factory.getBean("msgKr", basic07.MessageBean.class);
          bean.sayHello();
     }
}
----------------------------------- 
3-3
Workspace : ~\study\SpringWork
Content : Bean Life Cycle
/basic/basic07_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     <bean id="msgKr" class="basic07.MessageBeanImpl" init-method="init">
          <constructor-arg value="홍길동"></constructor-arg>
          <constructor-arg value="40"></constructor-arg>
          <constructor-arg value="새해 복 많이 받으세요"></constructor-arg>
          <property name="greeting">
               <value>안녕하십니까</value>               
          </property>                    
     </bean>
     
     <bean id="beanPostProcess" class="basic07.CustomBeanPostProcessor"/>
</beans>
----------------------------------- 
3-4
Workspace : ~\study\SpringWork
Content : Bean 생성 방법
/basic/src/main/java/basic08/basic08_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
     
<!--      <bean id="msgKr" class="basic08.MessageBeanImpl"> -->
<!--           <property name="name" value="홍길동" /> -->
<!--           <property name="age" value="20" /> -->
<!--      </bean> -->
<!--      <bean id="msgEn" class="basic08.MessageBeanImplEn"> -->
<!--           <property name="name" value="Tom" /> -->
<!--           <property name="age" value="21" /> -->
<!--      </bean> -->

          <context:component-scan base-package="basic08"></context:component-scan>
</beans>
----------------------------------- 
3-5 
Workspace : ~\study\SpringWork
Content : Bean 생성 방법
/basic/src/main/java/basic08/MessageBean.java

package basic08;

public interface MessageBean {
     public void sayHello();
}
----------------------------------- 
3-6
Workspace : ~\study\SpringWork
Content : Bean 생성 방법
/basic/src/main/java/basic08/MessageBeanImpl.java

package basic08;

import org.springframework.stereotype.Component;

@Component
public class MessageBeanImpl implements MessageBean {
     private String name;
     private int age;

     public String getName() {
          return name;
     }

     public void setName(String name) {
          this.name = name;
     }

     public int getAge() {
          return age;
     }

     public void setAge(int age) {
          this.age = age;
     }

     @Override
     public void sayHello() {
          System.out.println("안녕하세요~~~" + name + "(" + age + ")님!");
     }
}
----------------------------------- 
3-7 
Workspace : ~\study\SpringWork
Content : Bean 생성 방법
/basic/src/main/java/basic08/MessageBeanImplEn.java

package basic08;

import org.springframework.stereotype.Component;

@Component("msgEn")
public class MessageBeanImplEn implements MessageBean{
     private String name;
     private int age;

     public String getName() {
          return name;
     }

     public void setName(String name) {
          this.name = name;
     }

     public int getAge() {
          return age;
     }

     public void setAge(int age) {
          this.age = age;
     }

     @Override
     public void sayHello() {
          System.out.println("Hello~~~" + name + "(" + age + ")님!");
     }
}
----------------------------------- 
3-8 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic09/App.java

package basic09;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
     public static void main(String[] args) {
          // 파일로 부터 읽어드리는 클래스를 사용
          ApplicationContext factory = new
          AnnotationConfigApplicationContext(ApplicationContextConfigure.class);

          MessageBean bean = factory.getBean("getMessageKr", basic09.MessageBean.class);
          bean.sayHello();

          bean = factory.getBean("getMessageEn", basic09.MessageBean.class);
          bean.sayHello();
     }
}
----------------------------------- 
3-9 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic09/ApplicationContextConfigure.java

package basic09;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationContextConfigure {
     @Bean
     public MessageBean getMessageKr(){
          MessageBeanImpl bean = new MessageBeanImpl();
          bean.setName("홍길동");
          bean.setAge(25);
          bean.setOutputter(getOutput());
          return bean;
     }
     
     @Bean
     public MessageBean getMessageEn(){
          MessageBeanImplEn bean = new MessageBeanImplEn();
          bean.setName("Johnson");
          bean.setAge(30);
          bean.setOutputter(getOutput());
          return bean;
     }
     
     @Bean
     public Outputter getOutput(){
          return new FileOutputter();
     }
}

----------------------------------- 
3-10 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic09/MessageBeanImpl.java

package basic09;

public class MessageBeanImpl implements MessageBean {
     private String name;
     private int age;
     private Outputter outputter;

     public Outputter getOutputter() {
          return outputter;
     }

     public void setOutputter(Outputter outputter) {
          this.outputter = outputter;
     }

     public String getName() {
          return name;
     }

     public void setName(String name) {
          this.name = name;
     }

     public int getAge() {
          return age;
     }

     public void setAge(int age) {
          this.age = age;
     }

     @Override
     public void sayHello() {
          System.out.println("안녕하세요~~~" + name + "(" + age + ")님!");
          System.out.println("한글 : "+outputter.toString());
     }
}
----------------------------------- 
3-11 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic09/MessageBeanImplEn.java

package basic09;

public class MessageBeanImplEn implements MessageBean{
     private String name;
     private int age;
     private Outputter outputter;

     public String getName() {
          return name;
     }

     public void setName(String name) {
          this.name = name;
     }

     public int getAge() {
          return age;
     }

     public void setAge(int age) {
          this.age = age;
     }
     
     public void setOutputter(Outputter outputter) {
          this.outputter = outputter;
     }

     @Override
     public void sayHello() {
          System.out.println("Hello~~~" + name + "(" + age + ")님!");
          System.out.println("English : "+outputter.toString());
     }
}
----------------------------------- 
3-12 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic10/App.java

package basic10;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class App {
     public static void main(String[] args) {
          // 파일로 부터 읽어드리는 클래스를 사용
          ApplicationContext factory = 
                    new FileSystemXmlApplicationContext("classpath:/basic10/basic10_config.xml");

          MessageBean bean = factory.getBean("msgKr", basic10.MessageBean.class);
          bean.sayHello();
     }
}
----------------------------------- 
3-13 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic10/MessageBeanImpl.java

package basic10;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;

public class MessageBeanImpl implements MessageBean {
     private String name;
     private int age;
     
     @Autowired
     private Outputter outputter;

     public Outputter getOutputter() {
          return outputter;
     }
     
//     @Autowired
//     public void setOutputter1(Outputter outputter) {
//          this.outputter = outputter;
//     }
     
//     public void setOutputter1(Outputter outputter) {
//          this.outputter = outputter;
//     }

     public String getName() {
          return name;
     }

     public void setName(String name) {
          this.name = name;
     }

     public int getAge() {
          return age;
     }

     public void setAge(int age) {
          this.age = age;
     }

     public void sayHello() {
          System.out.println("안녕하세요~~~" + name + "(" + age + ")님!");
          try{
               outputter.output("10번째 예제입니다-10.");
          }catch(Exception e){e.getStackTrace();}
     }
}
----------------------------------- 
3-14 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic10/basic10_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="basic10" />
     <bean id="msgKr" class="basic10.MessageBeanImpl">
          <property name="name">
               <value>홍길동</value>
          </property>
          
          <property name="age" value="20"/>
          
<!--           <property name="outputter"> -->
<!--                <ref bean="outputter"/>     -->
<!--           </property> -->
     </bean>

     <bean id="outputter" class="basic10.FileOutputter">
          <property name="filePath" value="d:\out10.txt"></property>
     </bean>
</beans>
----------------------------------- 
3-15 
Workspace : ~\study\SpringWork
/basic/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>

     <groupId>com.study.myproject</groupId>
     <artifactId>basic</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <packaging>jar</packaging>

     <name>basic</name>
     <url>http://maven.apache.org</url>

     <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>

     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-context</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.annotation</groupId>
               <artifactId>jsr250-api</artifactId>
               <version>1.0</version>
          </dependency>
     </dependencies>
</project>
----------------------------------- 
###################################
4. 과제
-----------------------------------
4-1
/basic/src/main/java/basic10 에서 
코드를 많이 수정하면서 테스트를 하였음 
이 부분 확인 필요
----------------------------------- 
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 

'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day87  (0) 2015.07.16
오픈프레임워크_Day86  (0) 2015.07.16
오픈프레임워크_Day84  (0) 2015.07.13
오픈프레임워크_Day83  (0) 2015.07.10
오픈프레임워크_Day82  (0) 2015.07.09
,

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* MANEN
pom.xml
<version>1.0-SNAPSHOT</version>
snapshot은 개발 중임을 알려줌

<dependencies> 가 필요한 라이브러리의 정보를 넣어 주면
별도의 로컬 레파지토리에 알아서 다운을 받아 준다

보통 자동으로 다운을 받는데 특별히 따로 받고 싶은게 있을때
수동으로 넣어주면 자동으로 다운을 받아준다
----------------------------------- 
* groupId는 하나로 묶어주고, 중복되지 않는 도메인 이름으로 많이 씀
----------------------------------- 
* Spring에서 반드시 해야하는 부분

1. DI - 응용프로젝트로 실습
2. AOP - 응용프로젝트로 실습
3. WebMVC - 웹 프로젝트로 실습
----------------------------------- 
* Spring 장점

1. DI(Dependency Injection) 패턴을 지원 - 스프링에서 매우 적극적으로 지원
IoC를 구체화 시켜주는 도구
IoC를 먼저 알아야 함

IoC(Inversion of Control) 
제어하는 입장을 바꿔주겠다는 의미
내가 제어하던 것을 상대방이 제어할 수 있게 바꾼다
-> 콜백메서드에서 많이 반영되었음

-----------------------------------  
* Spring은 라이브러리 + 디자인패턴
-----------------------------------   
* Spring에서는 패키지를 추가하는 방식으로 진행 할 예정
프로젝트를 새로 만들면서 하지는 않겠음

-----------------------------------  
* 의존성을 약화시키는 방법 - Interface

/basic/src/main/java/basic01/MessageBean.java
이 클래스를 많은 곳에서 사용 한다고 가정해 봅시다

그래서 중간에 인터페이스를 두어
클래스와 클래스 사이에 직접적인 연관관계를 줄여준다.

basic02 패키지에서 이 방법을 사용함
-----------------------------------   
* 스프링 모듈

스프링은 처음에 아무것도 없는데 

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#overview-modules
에 있는 모듈들을 있음

그 중에 core container를 다운받음
-----------------------------------
* DI

DI는 내가 직접 인스턴스를 생성하지 않겠다.
앞으로는 의존성 주입을 위해 다른 곳에서 인스턴스를 생성   

XML파일을 이용, 실행시 인스턴스로 객체화 시킴(reflexion)
추상적인 것을 구체화 시킴

내가 필요로 하는 것을 외부로 부터 분리시키고 분어화됨
다른데서 만들어진 것을 가져옴
-----------------------------------   
* basic04.MessageBean.class
에서 .class는 사용할 수 있게 준비해주는 의미임
클래스라는 의미는 아님
-----------------------------------    
* <bean id="msgKr" name="msg msgkr" class="basic04.MessageBeanImpl"></bean>
에서 name은 별명과 같이 쓰일 수 있음
여러개 쓸 수 있음, 공백이나 콤마로 구분
-----------------------------------    
* MessageBean, Outter의 활용

MessageBean은 어떤 언어로 출력? 한글, 영어
Outter은 어떤 방식으로 출력? 파일, 네트워크, XML
-----------------------------------    
* <property name="name"></property>
메서드르 호출한다
-----------------------------------    
* 생성자를 통한 DI 패턴
/basic/src/main/java/basic06/basic06_config.xml
-----------------------------------    
* Spring은 거의 대부분 Bean으로 이루어져 있음
Bean의 Life Cycle이 필요함

핵심 인터페이스를 통해서 Life Cycle이 결정이 된다
1. BeanNameAware
          void setBeanName(String name)
2. BeanFactoryAware
          void setBeanFactory(BeanFactory beanfactory)
3. InitializerBean
          void afterPropertiesSet()
4. DisposableBean
          void destroy()
5. BeanPostProcessor - bean 실행 되기 전
          Object postProcessAfterInitializer(Object bean, String beanName)
          Object postProcessBeforeInitializer(Object bean, String beanName)

초기화 메서드
- 모든 준비를 다 마친 상태의 초기화를 말함
- 7번째로 호출 되는 메서드임
- 별도로 만들 수 있음, callback 메서드로 
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 이름이 'MavenWork' 인 폴더를 만듬
----------------------------------- 
* spring-tool-suite-3.7.0.RELEASE-e4.5-win32.zip 압축 품

~\study\sts-bundle

sts-3.7.0.RELEASE
은 우리가 쓸 폴더

pivotal-tc-server-developer-3.1.1.RELEASE 
은 톰캣 대신, 이거를 안쓰고 톰캣 써도 됨

~\study\sts-bundle\sts-3.7.0.RELEASE\STS.exe
를 실행

Workspace를 ~\study\SpringWork
로 설정

----------------------------------- 
* Spring STS의 Server 삭제

/Servers/Pivotal tc Server Developer Edition v3.1-config
preference 안에 서버 내용 지움

----------------------------------- 
* Spring STS - 새로운 프로젝트 만들기

File - new - other

예전에는 spring 요즘은 maven


com.study.myproject
basic

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

* STS JRE 수정

Menu - Window - preference -


개발용 jre로 설정

JRE home : C:\Program Files\Java\jdk1.8.0_40


결과 아래와 같음


----------------------------------- 
* basic01 패키지를 복사해서 basic02를 만듬
의존성 interface를 통한 의존성 해결 
-----------------------------------  
* basic02 패키지를 복사해서 basic03를 만듬
팩토리 패턴 적용
----------------------------------- 
* basic02 패키지를 복사해서 basic04를 만듬
팩토리 패턴 spring을 이용
수동으로 했던 코드를 프레임워크의 도움을 받겠음
-----------------------------------  
* 스프링 doc

대부분의 서적들이 이 내용을 번역함
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/
-----------------------------------  
* 스프링 패키지 패턴 관련해서 기본적인 라이브러리 다운로드

http://projects.spring.io/spring-framework/

이곳의 Quick Start - Maven 내용을 복사해서

/basic/pom.xml
에 맨 아래 복사

C:\Users\jhta\.m2\repository\
에 자동으로 라이브러리 다운 받음
-----------------------------------  
* Spring DI에서 쓸 XML 만들기

같은 패키지안에?
아니면 루트 안에?

어디에 만들까?

이번엔 루트에 만들자. pom.xml과 같은 위치에
프로젝트 우클릭 - New - Other


basic04_config.xml


/basic/basic04_config.xml
생성됨
----------------------------------- 
* basic04 패키지를 복사해서 basic05를 만듬 

xml 가져오는 부분 수정

설정 파일을 패키지 안에 저장 하겠음
-----------------------------------
* basic05 패키지를 복사해서 basic06를 만듬 
DI 패턴 사용
파일 출력 인터페이스 추가
-----------------------------------
* basic04 패키지를 복사해서 basic07를 만듬 
Bean LifeCycle
-----------------------------------
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
MAVEN 웹 프로젝트를 만들어 보자

~\study\maven>mvn archetype:generate -DgroupId=com.study -DartifactId=myproject2 -DarchetypeArtifactId=maven-archtype-webapp

아래 ':' 가 나올 때 그냥 두번 다 엔터

Define value for property 'version':  1.0-SNAPSHOT: :
[INFO] Using property: package = com.study
Confirm properties configuration:
groupId: com.study
artifactId: myproject2
version: 1.0-SNAPSHOT
package: com.study
Y: :

결과를 확인
~\study\maven>tree myproject2
로컬 디스크 볼륨에 대한 폴더 경로의 목록입니다.
볼륨 일련 번호가 00000002 9E60:D826입니다.
~\STUDY\MAVEN\MYPROJECT2
└─src
    └─main
        ├─resources
        └─webapp
            └─WEB-INF


이 위치를 톰캣에 등록시켜 봅시다

F:\study\maven\myproject2>mvn package

F:\study\maven\myproject2\target\myproject2.war
패키징 된 파일을 복사해서
F:\study\apache-tomcat-8.0.21\webapps

톰캣 실행
F:\study\apache-tomcat-8.0.21\bin\startup.bat

아래 주소 
http://localhost:8080/myproject2



F:\study\maven\myproject2\pom.xml
보면 패키징이 달라진 것을 확인
<packaging>war</packaging>

별도로 파일이름을 지정 할 수 있음
<finalName>myproject2</finalName>


어플리케이션 프로젝트 처럼(myprojec1) 
F:\study\maven\myproject2\src\main
에 java 폴더 만듬

F:\study\maven\myproject2\src\main\java\TestDao.java
package co.kr.test;
public class TestDao{
     public void Connect(){
     }
}


다시 패키징
F:\study\maven\myproject2>mvn package

기존에 있던 것을 지우고 새로 패키징은 

F:\study\maven\myproject2>mvn clean package


F:\study\maven\myproject2\target\myproject2.war
파일을 확인해 보면 패키징 된 것을 확인 할 수 있음
----------------------------------- 
3-2
~\study\maven\myproject2\src\main\resources
안에 파일이 들어가면 어떻게 패키징 되는지 확인

~\study\maven\myproject2\src\main\resources\test.properties
app.name=test
내용은 임의로 넣음

다시 패키징
~\study\maven\myproject2>mvn clean package

패키징 된 war파일을 보면
WEB-INF\classes\ 안에 저장이 된다.
----------------------------------- 
3-3
Workspace : ~\study\SpringWork
Project : /basic
프로젝트 우클릭 - Run As - Maven install
----------------------------------- 
3-4
Workspace : ~\study\SpringWork
Project : /basic
/basic/src/main/java 우클릭 - New - Package - basic01


/basic/src/main/java/com/study/myproject/basic/App.java
/basic/src/main/java/basic01/App.java
로 복사

/basic/src/main/java/basic01/MessageBean.java
----------------------------------- 
3-5 
Workspace : F:\study\SpringWork
Project : /basic
/basic/src/main/java/basic01/App.java

package basic01;

/**
* Hello world!
*
*/
public class App {
     public static void main(String[] args) {
          MessageBean bean = new MessageBean();
          bean.sayHello("홍길동");
     }
}
----------------------------------- 
3-6
Workspace : F:\study\SpringWork
Project : /basic
/basic/src/main/java/basic01/MessageBean.java

package basic01;

public class MessageBean {
     public void sayHello(String name){
          System.out.println("Hello~~"+name+"!");
     }
}

이 클래스를 많은 곳에서 사용 한다고 가정해 봅시다

----------------------------------- 
3-7 
Workspace : ~\study\SpringWork
Project : /basic

STS JRE 수정한뒤 

프로젝트 우클릭 - Run As - Maven install
BUILD SUCCESS


F:\study\SpringWork\basic\target\basic-0.0.1-SNAPSHOT.jar
C:\Users\jhta\.m2\repository\com\study\myproject\basic\0.0.1-SNAPSHOT\basic-0.0.1-SNAPSHOT.jar
의 레파지토리에 복사됨


----------------------------------- 
3-8 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic02/MessageBean.java

package basic02;

public interface MessageBean {
     public void sayHello(String name);
}
----------------------------------- 
3-9 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic02/MessageBeanImpl.java

package basic02;

public class MessageBeanImpl implements MessageBean{
     public void sayHello(String name) {
          System.out.println("안녕하세요~~~"+name+"님!");         
     }
}
----------------------------------- 
3-10 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic02/MessageBean.java

package basic02;

public interface MessageBean {
     public void sayHello(String name);
}
----------------------------------- 
3-11 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic02/App.java

package basic02;

public class App {
     public static void main(String[] args) {
          MessageBean bean = new MessageBeanImpl();
          bean.sayHello("홍길동");
         
          bean = new MessageBeanImplEn();
          bean.sayHello("Tom");
     }
}
----------------------------------- 
3-12 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic03/App.java

package basic03;

public class App {
     public static void main(String[] args) {
          MessageBeanFactory factory = MessageBeanFactory.newInstance();
          MessageBean bean = factory.createMessage("kr");
          bean.sayHello("홍길동");         
          bean = factory.createMessage("en");
          bean.sayHello("Tom");
     }
}
----------------------------------- 
3-13 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic03/MessageBean.java

package basic03;

public interface MessageBean {
     public void sayHello(String name);
}
----------------------------------- 
3-14 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic03/MessageBeanFactory.java

package basic03;

public class MessageBeanFactory {
     private MessageBeanFactory() {}
     private static MessageBeanFactory factory = new MessageBeanFactory();
    
     public static MessageBeanFactory newInstance(){
          return factory;
     }    
    
     public MessageBean createMessage(String nation){
          if(nation.equals("kr")){
               return new MessageBeanImpl();
          }else{
               return new MessageBeanImplEn();
          }
     }
}
----------------------------------- 
3-15 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic03/MessageBeanImpl.java

package basic03;

public class MessageBeanImpl implements MessageBean{
     public void sayHello(String name) {
          System.out.println("안녕하세요~~~"+name+"님!");         
     }
}
----------------------------------- 
3-16 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic03/MessageBeanImplEn.java

package basic03;

public class MessageBeanImplEn implements MessageBean{
     public void sayHello(String name) {
          System.out.println("Hellow~~~"+name+"!");    
     }
}
----------------------------------- 
3-17 
Workspace : ~\study\SpringWork
/basic/basic04_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     <bean id="msgKr" class="basic04.MessageBeanImpl"></bean>
     <bean id="msgEn" class="basic04.MessageBeanImplEn"></bean>

</beans>
----------------------------------- 
3-18 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic04/App.java

package basic04;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.FileSystemResource;

public class App {
     public static void main(String[] args) {
          // 아래 코드 deprecated 되어 있으나 사용가능
          // BeanFactory factory = new XmlBeanFactory(new FileSystemResource("basic04_config.xml"));

          BeanFactory factory = new DefaultListableBeanFactory();
          new XmlBeanDefinitionReader(((BeanDefinitionRegistry) factory))
                    .loadBeanDefinitions(new FileSystemResource("basic04_config.xml"));

          MessageBean bean = factory.getBean("msgKr", basic04.MessageBean.class);
          bean.sayHello("홍길동");

          bean = factory.getBean("msgEn", basic04.MessageBean.class);
          bean.sayHello("Tom");
         
         
          bean = factory.getBean("msg", basic04.MessageBean.class);
          bean.sayHello("임꺽정");
         
          bean = factory.getBean("msgkr", basic04.MessageBean.class);
          bean.sayHello("강감찬");
         
          bean = factory.getBean("kr", basic04.MessageBean.class);
          bean.sayHello("이순신");         
     }
}
----------------------------------- 
3-19 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic04/MessageBean.java

package basic04;

public interface MessageBean {
     public void sayHello(String name);
}
----------------------------------- 
3-20 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic04/MessageBeanImpl.java

package basic04;

public class MessageBeanImpl implements MessageBean{
     public void sayHello(String name) {
          System.out.println("안녕하세요~~~"+name+"님!");         
     }
}
----------------------------------- 
3-21 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic04/MessageBeanImplEn.java

package basic04;

public class MessageBeanImplEn implements MessageBean{
     public void sayHello(String name) {
          System.out.println("Hellow~~~"+name+"!");    
     }
}
----------------------------------- 
3-22 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic05/App.java

package basic05;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class App {
     public static void main(String[] args) {
          // 가장 현명하고 권장하는 방법
          // 패키지 안에서 쓰려면 아래 경로를 씀
          ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:/basic05/basic05_config.xml");
         
          // 설정파일들이 여러개 있을때 어떤식으로? *.xml로 적음
          // ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:/basic05/*.xml");
         
          // 폴더 이름을 대신하는 와일드 카드, Ant 표기법에 의해 쓰임
          // ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:/**/*.xml");
         
          MessageBean bean = ctx.getBean("msgKr", basic05.MessageBean.class);
          bean.sayHello("홍길동");

          bean = ctx.getBean("msgEn", basic05.MessageBean.class);
          bean.sayHello("Tom");         
         
          bean = ctx.getBean("msg", basic05.MessageBean.class);
          bean.sayHello("임꺽정");
         
          bean = ctx.getBean("msgkr", basic05.MessageBean.class);
          bean.sayHello("강감찬");
         
          bean = ctx.getBean("kr", basic05.MessageBean.class);
          bean.sayHello("이순신");         
     }
}
----------------------------------- 
3-23 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic05/MessageBean.java

package basic05;

public interface MessageBean {
     public void sayHello(String name);
}
----------------------------------- 
3-24 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic05/MessageBeanImpl.java

package basic05;

public class MessageBeanImpl implements MessageBean{
     public void sayHello(String name) {
          System.out.println("안녕하세요~~~"+name+"님!");         
     }
}
----------------------------------- 
3-25 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic05/MessageBeanImplEn.java

package basic05;

public class MessageBeanImplEn implements MessageBean{
     public void sayHello(String name) {
          System.out.println("Hellow~~~"+name+"!");    
     }
}
----------------------------------- 
3-26 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic05/basic05_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     <bean id="msgKr" name="msg msgkr kr" class="basic05.MessageBeanImpl"></bean>
     <bean id="msgEn" class="basic05.MessageBeanImplEn"></bean>

</beans>
----------------------------------- 
3-27 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic06/App.java

package basic06;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class App {
     public static void main(String[] args) {
          ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:/basic06/basic06_config.xml");
         
          MessageBean bean = ctx.getBean("msg",MessageBean.class);
          bean.sayHello();
     }
}
----------------------------------- 
3-28 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic06/FileOutputter.java

package basic06;

import java.io.FileWriter;
import java.io.IOException;

public class FileOutputter implements Outputter{
     private String filePath;
    
     public void setFilePath(String filePath) {
          this.filePath = filePath;
     }

     public void output(String msg) throws IOException {
          FileWriter writer = new FileWriter(filePath);
          writer.write(msg);
          writer.close();
     }
}
----------------------------------- 
3-29 
Workspace : ~\study\SpringWork
/basic/src/main/java/basic06/MessageBean.java

package basic06;

public interface MessageBean {
     public void sayHello(String name);
     public void sayHello();
}
----------------------------------- 
3-30
Workspace : ~\study\SpringWork
/basic/src/main/java/basic06/MessageBeanImpl.java

package basic06;

public class MessageBeanImpl implements MessageBean{
     private String name;
     private int age;
     private String greeting;
    
     private Outputter outputter;
    
     public void setName(String name) {
          this.name = name;
     }
    
     public void setAge(int age) {
          this.age = age;
     }
    
     public void setGreeting(String greeting) {
          this.greeting = greeting;
     }
    
     public void setOutputter(Outputter outputter) {
          this.outputter = outputter;
     }
         
     public MessageBeanImpl(String name, int age, String greeting) {
          this.name = name;
          this.age = age;
          this.greeting = greeting;
     }
    
     public MessageBeanImpl(){}

     public void sayHello(String name) {
          // TODO Auto-generated method stub
         
     }
     public void sayHello() {
          // TODO Auto-generated method stub
          String msg = greeting + "~~" + name + "님!!! " + "이제 당신은 "
               + age + "살 입니다.";
         
          System.out.println(msg);
         
          try{
               outputter.output(msg);
          }
          catch(Exception err){}
     }    
}



----------------------------------- 
3-31
Workspace : ~\study\SpringWork
/basic/src/main/java/basic06/Outputter.java

package basic06;

import java.io.IOException;

public interface Outputter {
     void output(String msg) throws IOException;
}
----------------------------------- 
3-32
Workspace : ~\study\SpringWork
/basic/src/main/java/basic06/basic06_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     <bean id="msgKr" name="msg msgkr kr" class="basic06.MessageBeanImpl">
<!--           <property name="name" value="홍길동"></property> -->
<!--           <property name="greeting"> -->
<!--                <value>안녕하십니까</value> -->
<!--           </property> -->
<!--           <property name="age" value="25"></property> -->

<!--           <constructor-arg index="0" value="임꺽정"></constructor-arg> -->
<!--           <constructor-arg index="1" value="30"></constructor-arg> -->
<!--           <constructor-arg index="2" value="안녕하신가"></constructor-arg> -->
         
          <constructor-arg type="String" value="강감찬"></constructor-arg>
          <constructor-arg type="int" value="30"></constructor-arg>
          <constructor-arg type="String" value="안녕하신가"></constructor-arg>
         
          <property name="outputter" ref="outputter"></property>
     </bean>
    
     <bean id="outputter" class="basic06.FileOutputter">
          <property name="filePath" value="d:\out.txt"></property>
     </bean>
</beans>
----------------------------------- 
3-33
Workspace : ~\study\SpringWork
/basic/src/main/java/basic07/App.java

package basic07;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.FileSystemResource;

public class App {
     public static void main(String[] args) {
          BeanFactory factory = new DefaultListableBeanFactory();
          new XmlBeanDefinitionReader(((BeanDefinitionRegistry) factory))
                    .loadBeanDefinitions(new FileSystemResource("basic07_config.xml"));

          MessageBean bean = factory.getBean("msgKr", basic07.MessageBean.class);
          bean.sayHello();         
     }
}
----------------------------------- 
3-34
Workspace : ~\study\SpringWork
/basic/src/main/java/basic07/MessageBean.java

package basic07;

public interface MessageBean {
     public void sayHello();
}
----------------------------------- 
3-35
Workspace : ~\study\SpringWork
/basic/src/main/java/basic07/MessageBeanImpl.java

package basic07;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class MessageBeanImpl implements MessageBean,
          BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
     private String name;
     private int age;
     private String greeting;

     public MessageBeanImpl() {}
    
     public void setGreeting(String greeting) {
          this.greeting = greeting;
          System.out.println("2. 빈의 setter메서드 호출");
     }

     public MessageBeanImpl(String name, int age, String greeting) {
          this.name = name;
          this.age = age;
          this.greeting = greeting;
          System.out.println("1. 빈의 생성자 호출");
     }

     public void sayHello() {
          System.out.println(greeting+"~~"+ name + "("+age+")"+"님!");
     }

     public void destroy() throws Exception {
          // TODO Auto-generated method stub

     }

     public void afterPropertiesSet() throws Exception {
          // 맵핑 완료
          System.out.println("6. 프로퍼티 지정 완료 : ");
     }

     public void setBeanFactory(BeanFactory arg0) throws BeansException {
          System.out.println("4. 빈의 factory 지정 : "+arg0.getClass());
     }

     public void setBeanName(String arg0) {
          // bean의 이름을 참조하기 위해 넘겨 주는 메서드
          // /basic/basic07_config.xml 에서 ID 값이 넘어옴
          System.out.println("3. 빈의 이름 지정 : "+arg0);
     }
    
     public void init(){
          System.out.println("7. 초기화 메서드 호출");
     }
}
----------------------------------- 
3-36
Workspace : ~\study\SpringWork
/basic/basic07_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

     <bean id="msgKr" class="basic07.MessageBeanImpl" init-method="init">
          <constructor-arg value="홍길동"></constructor-arg>
          <constructor-arg value="40"></constructor-arg>
          <constructor-arg value="새해 복 많이 받으세요"></constructor-arg>
          <property name="greeting">
               <value>안녕하십니까</value>
          </property>                   
     </bean>
</beans>
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 

'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day86  (0) 2015.07.16
오픈프레임워크_Day85  (0) 2015.07.14
오픈프레임워크_Day83  (0) 2015.07.10
오픈프레임워크_Day82  (0) 2015.07.09
오픈프레임워크_Day81  (0) 2015.07.08
,

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* Android DB는 별도 다운로드 받게 해주는게
마켓에 올리기 좋음
----------------------------------- 
* Android 공부하는데 책보다 인터넷에 노하우가 많음
----------------------------------- 
@@@ 안드로이그 끝, android end
----------------------------------- 
@@@ 스프링 시작, spring start
----------------------------------- 
* 프레임워크 vs 라이브러리

라이브러리는 내 코드가 주가 되어 특정 기능을 도움 받는 것이 라이브러리
그에 비해서
프레임워크는 전체 틀이 짜여있고 그 틀에 내가 넣은 코드를 끼워 넣는 것임

장점 매우 빠름
단점 익히는데 시간이 걸림, 원리 이해를 하기 힘듬
-----------------------------------
* Spring vs EJB

EJB는 J2EE 기술 - 자바로 할 수 있는 거의 모든 기술이 들어가 있음

EJB는 어마어마한 기능, 무게를 가지고 있는 클래스(컴퍼넌트)를 가지는 평범한 플랫폼
Spring은 평범한 기능을 가진 클래스(컴퍼넌트, POJO)를 가지는 어마어마한 플랫폼

같은 결과를 내는 거라면 적은 비용이 드는 스프링을 씀
-----------------------------------  
* Struts
미리 MVC 패턴으로 만들어 놓은 웹 프로젝트

스프링과 스트러츠를 같이 쓰다가
요즘은 스프링을 더 쓰는 추세
이유는 스트러츠를 웹에서만 쓰이는 한정성
그리고 스프링이 워낙 치고 올라와서 
-----------------------------------  
* 스프링을 쓰는 대표적인 이유
전자 정부 프레임워크로 스프링으로 하라고 함

이유는 정부 입장에서 제각각 프로젝트를 하는 것을 막기 위해서
방식을 제공하는데 적합한게 스프링이었음
-----------------------------------  
* Maven
프로젝트 관리 도구, 버전 관리 등등
Ant는 빌드 전용

프로젝트를 제대로 관리는 하는 회사인지 아닌지
확인이 가능한 도구가 됨

Maven을 추격하는 Gradle
구글에서 적극 지원하는 안드로이드 스튜디오에서 Gradle을 씀

1) 빌드 절차를 간소화 ( Ant도 가지는 특징)
2) Best Practice (노하우 제공)
3) 모듈간의 의존성을 관리 *** 
     - 알아서 라이브러리를 자동 다운로드 해줌
     - 중복되는 라이브러리 없게 통합 저장소를 씀
4) 소스코드의 디렉토리 구조를 표준화 
     - 디렉토리 구조의 틀을 유지할 수 있음
...
앞으로는 Maven으로 모든 프로젝트를 만듬

Maven 사용법
1. 명령어
2. Eclipse 내장 되어있음

goal이 콜론 다음에 나오는 단어
mvn archetype:generate -DgroupId=com.myproject1 -DarchetypeArtifactId=maven-archetype-quickstart 


* 명령어 lifecycle - 여러개의 goal을 합친 것임
...
1) compile
...
2) test - 테스트 코드를 실행
3) package - 개발이 끝나고 고객에게 넘겨줄때, 패키징(jar, war, apk)
...
4) install - local repository에 올려놓고 서버에 올릴 준비
5) deploy - 원격 서버에 올릴 때 많이 씀
6) clean - 기존의 프로젝트를 지울 때 , 타겟이 없어지고 원본 소스만 남음

숫자가 커질수록 그 전에 있는 모든 명령어가 실행됨
예를 들어 test 명령어를 넣으면 그전 compile 명령어를 한 뒤에 test 명령을 함

자주쓰는 명령어
mvn clean package
-----------------------------------  
* 버전 용어
1) Alpha Version - 개발자끼리 테스트 해보기 위한 버전
2) Beta Version - 테스터들에게 테스트 하기 위한 버전
3) M(Milestone) 특정 기능을 했을 때마다 하나씩 붙음
     1.0-M1
     1.0-M2
     ...
4) RC(Release Candidate)  - 정식 판의 후보, 문제가 없으면 정식판이 됨
               1.0-RC1
               1.0-RC2
5) GA(General Availability) - 정식 버전
               1.0 -GA
-----------------------------------    
###################################
2. 설정 및 그 밖에
----------------------------------- 
* Maven 다운

https://maven.apache.org/download.cgi
Binary zip archive
http://mirror.apache-kr.org/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.zip
압축 풀기
~\apache-maven-3.3.3\bin
를 path 걸어 주면 됨


변수이름 : M2_HOME
변수 값 : F:\study\utils\apache-maven-3.3.3

PATH에 %M2_HOME%\bin; 추가

다 되면 cmd에서 mvn 되는지 확인
-----------------------------------
* Maven 핵심 - pom.xml

이 파일이 있는 곳에서 mvn 이라는 프로그램을 실행 할 수 있음
pom.xml을 알면 maven의 70%를 알 수 있음
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork  
/DBApp/src/com/example/dbapp/SecondActivity.java 

package com.example.dbapp;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends Activity {
     private TextView tvResult;
     private SQLiteDatabase database;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_first);
          tvResult = (TextView) findViewById(R.id.tvResult);
     }

     public void onBtnDb(View v) {
          // 마지막 인자가 버전 번호라서 버전 번호를 바꾸면
          // public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 메서드가 호출 됨
          DbHelper dbhelper = new DbHelper(this, "testdb2.db", null, 3);
          database = dbhelper.getWritableDatabase();
     }

     public void onBtnTable(View v) {
          String sql = "Create Table if not exists tbltest1(id integer, name text,age integer)";
          database.execSQL(sql);
          tvResult.append("table is created successful!\n");
         
          database.execSQL("insert into tbltest1 values(1, 'tom', 20)");
          database.execSQL("insert into tbltest1 values(2, 'jane', 22)");
          database.execSQL("insert into tbltest1 values(3, 'jerry', 23)");
          tvResult.append("insert data successful!\n");
     }

     public void onBtnSelect(View v) {
//          String sql = "select * from tbltest1 where age >= ?";
//          String[] args = {"21"};
//          Cursor cursor = database.rawQuery(sql, args);
         
          // 조회할 컬럼
          String colums[] = {"id","name","age"};
          String[] args = {"21"};
          // 필요한 부분만 전달 가능, 조립하는 느낌
          Cursor cursor = database.query("tbltest1",colums,"age >= ?",args,null,null,null);
         

          if (cursor != null) {
               int count = cursor.getCount();
               tvResult.append("count : " + count + "\n");
               for(int i = 0; i<count;i++){
                    cursor.moveToNext();
                    String msg = cursor.getInt(0) + ", " +cursor.getString(1);
                    tvResult.append(msg+"\n");
               }
          }
     }
    
     class DbHelper extends SQLiteOpenHelper{

          // 생성자를 호출해야지만 DB가 생성 됨
          public DbHelper(Context context, String name, CursorFactory factory,
                    int version) {
               super(context, name, factory, version);
          }

          @Override
          public void onCreate(SQLiteDatabase db) {
               // 생성 될때 호출 되는 메서드 , 한번만 호출 되는 듯
               tvResult.append("Database is Created successful!\n");              
          }


          @Override
          public void onOpen(SQLiteDatabase db) {
               super.onOpen(db);
               tvResult.append("Database is Connected successful!\n");    
          }
         
          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
               // DB에 버전이 바뀔 때 사용 할 수 있음 ,
               // DB 스키마 변경 가능
               // 시나리오
               // 기존 DB 삭제하고 새로 들어갈 수 있도록 준비 해보겠음
               tvResult.append("Database is upgrade : "+oldVersion+" , "+newVersion+"\n");
              
              
               // DB 삭제, 존재 할 때에만 삭제
               db.execSQL("drop table if exists tbltest1");
              
               String sql = "Create Table if not exists tbltest1(id integer primary key autoincrement, name text,age integer)";
               db.execSQL(sql);
               tvResult.append("table is created successful!\n");
              
               db.execSQL("insert into tbltest1(name, age) values('tom', 20)");
               db.execSQL("insert into tbltest1(name, age) values('jane', 22)");
               db.execSQL("insert into tbltest1(name, age) values('jerry', 23)");
               tvResult.append("insert data successful!\n");
          }
     }
}
----------------------------------- 
3-2
MavenWork 폴더 만들고 아래 명령 실행 해봄
mvn archetype:generate -DgroupId=com.myproject1 -DartifactId=myproject1 -DarchetypeArtifactId=maven-archetype-quickstart 

C:\Users\jhta\.m2\repository
안에 다운받은 라이브러리가 있음
----------------------------------- 
3-3
F:\study\maven>tree
로컬 디스크 볼륨에 대한 폴더 경로의 목록입니다.
볼륨 일련 번호가 00000200 9E60:D826입니다.
F:.
└─myproject1
    └─src
        ├─main
        │  └─java
        │      └─myproject1
        └─test
            └─java
                └─myproject1

내가 작성한 코드를 테스트 하기 위한 테스트 코드가 test에 있음
Junit을 이용해서 테스트를 수월하게 해주는데 필요한 폴더

groupId가 자동으로 패키지 이름으로 넘어감
----------------------------------- 
3-4
~\maven\myproject1\src\main\java\myproject1\App.java
수정

컴파일도 maven이 해줌
해당 프로젝트의 pom.xml이 있는 폴더로 가서 
mvn compile 명령어로 컴파일 됨
target 폴더가 생김
배포시에는 target 폴더를 쓰면 됨
----------------------------------- 
3-5 
mvn package

target 안에 jar가 만들어짐
----------------------------------- 
3-6
mvn install 하면
C:\Users\jhta\.m2\repository\myproject1\myproject1
안에 로컬 repository가 생김
여기까지가 내 컴퓨터에서 하는 작업
----------------------------------- 
3-7 
mvn site
라이프 사이클에 맨 마지막에 부분에 존재함

F:\study\maven\myproject1\target\site
----------------------------------- 
3-8 
pom.xml
version 에 snapshot은 개발하는 동안에만 씀
-----------------------------------
###################################
4. 과제
-----------------------------------
4-1
Maven 첫 수업 시간 상담으로 인해서 제대로 수업을 못들음
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 

'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day85  (0) 2015.07.14
오픈프레임워크_Day84  (0) 2015.07.13
오픈프레임워크_Day82  (0) 2015.07.09
오픈프레임워크_Day81  (0) 2015.07.08
오픈프레임워크_Day80  (0) 2015.07.07
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* 안드로이드 DataBase
sqlite

1. SharedPreference - 자체적으로 파일로 저장, 환경설정시 많이 이용
2. 파일 저장(내부 메모리, 외장 메모리)
3. 네트워크를 이용하는 방법, Upload 해서
4. 데이터베이스를 이용

Sqlite은 디비 파일만 복사해서 다른 곳에서 쓸 수 있음

sqlite.org
----------------------------------- 
* 어제 받은 구글 키는 개발용 키임
실제 배포할때 쓰는 배포용 키는 어떻게 만들까?
배포용 키는 프로젝틀 완성을 해서 증명을 해야함
완성은 apk파일로 만들어야함
-----------------------------------
* DDMS에서 File Explorer 에서 Data안에 Data를 들어 가면 어플이 있음
contacts 어플 안에는 database 파일이 있음 
----------------------------------- 
* 안드로이드 디비 생성 방법
외부에서 만들어서 넣기
코드에서 만드는 방법 - 보통 이걸 이용
-----------------------------------  
* adb.exe 안드로이드 시스템을 관리하는 프로그램 
혹시나 문제가 생기면 이 프로그램을 강제로 끄면 됨

위치 
~\android-sdk\platform-tools\adb.exe

F:\study\android-sdk\platform-tools>adb shell
sqlite3 /data/data/com.android.providers.contacts/databases/contacts2.db

-----------------------------------   
* 문제 발생

F:\study\android-sdk\platform-tools>adb shell
error: more than one device/emulator
-----------------------------------   
###################################
2. 설정 및 그 밖에
-----------------------------------
* 이미지 복사
/LbsApp/res/drawable-ldpi/pin.png
----------------------------------- 
* 프로젝트 생성 
DBApp
----------------------------------- 
* 배포용 어플 만들기, 배포키 만들기

LbsApp 우크릭 - Export 



111111




F:\study\LbsAppProject>keytool -list -v -alias Lbs -keystore LbsApp.keystore
키 저장소 비밀번호 입력:
별칭 이름: Lbs
생성 날짜: 2015. 7. 9
항목 유형: PrivateKeyEntry
인증서 체인 길이: 1
인증서[1]:
소유자: CN=study, L=seoul, C=ko
발행자: CN=study, L=seoul, C=ko
일련 번호: 60facf88
적합한 시작 날짜: Thu Jul 09 10:34:42 KST 2015, 종료 날짜: Sat Jun 15 10:34:42 KST 2115
인증서 지문:
         MD5: 11:61:D9:43:2F:68:CC:B9:45:1D:15:79:C3:54:62:15
         SHA1: 92:8B:85:22:FB:63:B4:05:E1:B1:19:D0:FA:F6:3F:2A:30:25:AB:2D
         SHA256: A9:41:10:DC:C0:EE:62:23:1F:88:88:71:2F:C1:48:D5:F6:AF:B8:FA:E8:75:C4:8D:6E:7A:9B:B2
:4D:5C:64:B2
         서명 알고리즘 이름: SHA256withRSA
         버전: 3

확장:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 42 70 C1 DD D2 F7 17 E2   5B B3 87 E5 4C 9B D3 D6  Bp......[...L...
0010: D6 4F 5A 17                                        .OZ.
]
----------------------------------- 
* sqlite 좀 더 편하게 쓸 수 있는 프로그램 준비
sqlitebrowser.org
https://github.com/sqlitebrowser/sqlitebrowser/releases/download/v3.7.0/sqlitebrowser-3.7.0-win32.exe
-----------------------------------  
* 스프링 준비
spring.io
Learn more about STS
http://dist.springsource.com/release/STS/3.7.0.RELEASE/dist/e4.5/spring-tool-suite-3.7.0.RELEASE-e4.5-win32.zip
-----------------------------------   
* DDMS에서 contacts2.db 를 꺼내옴

-----------------------------------  
* 안드로이드에서 DB 1MB 이상이라면 배포시 한번에 넣지 말고
따로 다운 받는게 좋음 
-----------------------------------   
* DB 생성 확인

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

###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork  
/LbsApp/src/com/uticleTest1/lbsapp/GoogleMapActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;

public class GoogleMapActivity extends Activity {
     private GoogleMap map;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_googlemap);

          map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
                    .getMap();

          if (map != null) {
               Toast.makeText(getApplicationContext(), "map avaliable",
                         Toast.LENGTH_SHORT).show();
          }
          LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
          locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    100000, 5, new LocationListener() {
               public void onStatusChanged(String provider, int status, Bundle extras) {}
               public void onProviderEnabled(String provider) {}
               public void onProviderDisabled(String provider) {}
               public void onLocationChanged(Location location) {
                    Double lat = location.getLatitude();
                    Double lon = location.getLongitude();
                   
                    // 위 두개를 묶는 DTO
                    LatLng curPoint = new LatLng(lat, lon);
                   
                    // 위치 이동 및 확대
                    map.animateCamera(CameraUpdateFactory.newLatLngZoom(curPoint, 15));
                   
                    // 인공위성 실제 사진으로 보기
                    map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                   
               }
          });
     }

}
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork 
/LbsApp/src/com/uticleTest1/lbsapp/ItemOverlayActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class ItemOverlayActivity extends Activity {
     private GoogleMap map;
    
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_googlemap);

          map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
                    .getMap();

          if (map != null) {
               Toast.makeText(getApplicationContext(), "map avaliable",
                         Toast.LENGTH_SHORT).show();
          }
         
          /*
          // 지도 위에 이미지를 띄울 수 있게 해주는 객체
          // 띄울 이미지 갯수 마다 만들어 주면 됨
          MarkerOptions marker = new MarkerOptions();
         
          // 띄울 이미지 불러옴
          marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.pin));
         
          // 코드 절약을 위해 위도 경도를 정함
          LatLng curPoint = new LatLng(37.5729043,126.9920667);
         
          // 위치를 구한다
          marker.position(curPoint);
         
          map.animateCamera(CameraUpdateFactory.newLatLngZoom(curPoint, 15));
          map.addMarker(marker);
          */
         
          // 지도 터치시에 해당 부분에 이미지 띄우기
          map.setOnMapClickListener(new OnMapClickListener() {
               public void onMapClick(LatLng arg0) {
                    MarkerOptions marker = new MarkerOptions();
                    marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.pin));
                    marker.position(arg0);
                    // 기본에 있던 내용 삭제
                    map.clear();
                    map.animateCamera(CameraUpdateFactory.newLatLngZoom(arg0, 15));
                    map.addMarker(marker);                   
               }
          });
     }

}
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork 
/DBApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dbapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="FirstActivity"></activity>
        <activity android:name="SecondActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork 
/DBApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnFirst"
        android:text="First Exam" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnSecond"
        android:text="Second Exam" />

</LinearLayout>
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork
/DBApp/src/com/example/dbapp/MainActivity.java 

package com.example.dbapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void onBtnFirst(View v) {
          startActivity(new Intent(MainActivity.this, FirstActivity.class));
     }

     public void onBtnSecond(View v) {
          startActivity(new Intent(MainActivity.this, SecondActivity.class));
     }
}
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork 
/DBApp/res/layout/activity_first.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnDb"
        android:text="Create Or Open Database" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnTable"
        android:text="Create Table" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnSelect"
        android:text="Select" />

    <TextView
        android:id="@+id/tvResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp" />

</LinearLayout>
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork 
/DBApp/src/com/example/dbapp/FirstActivity.java

package com.example.dbapp;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

/*
* openOrCreateDatabase - 매우 기본적인 방식, 수작업이 많음
* SqliteOpenHelper - 대부분 이걸 씀
*/
public class FirstActivity extends Activity {
     private TextView tvResult;
     private SQLiteDatabase database;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_first);
          tvResult = (TextView) findViewById(R.id.tvResult);
     }

     public void onBtnDb(View v) {
          // DB 생성, 처음에 한번만 만들어짐
          database = openOrCreateDatabase("testDB1.db", MODE_PRIVATE, null);
          tvResult.setText("DB is connected");
     }

     public void onBtnTable(View v) {
          try {
               String sql = "Create Table tbltest1(id integer, name text)";
               database.execSQL(sql);
               tvResult.setText("Table is created Successful!\n");
          } catch (Exception e) {
          }
     }

     public void onBtnSelect(View v) {
          String sql = "select * from tbltest1 where id = 2";
          Cursor cursor = database.rawQuery(sql, null);

          if (cursor != null) {
               int count = cursor.getCount();
               tvResult.append("count : " + count + "\n");
               for(int i = 0; i<count;i++){
                    cursor.moveToNext();
                    String msg = cursor.getInt(0) + ", " +cursor.getString(1);
                    tvResult.append(msg+"\n");
               }
          }

     }

}
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork 
/DBApp/src/com/example/dbapp/SecondActivity.java

package com.example.dbapp;

import android.app.Activity;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends Activity {
     private TextView tvResult;
     private SQLiteDatabase database;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_first);
          tvResult = (TextView) findViewById(R.id.tvResult);
     }

     public void onBtnDb(View v) {
          DbHelper dbhelper = new DbHelper(this, "testdb2.db", null, 1);
          dbhelper.getWritableDatabase();
     }

     public void onBtnTable(View v) {
     }

     public void onBtnSelect(View v) {
     }
    
     class DbHelper extends SQLiteOpenHelper{

          // 생성자를 호출해야지만 DB가 생성 됨
          public DbHelper(Context context, String name, CursorFactory factory,
                    int version) {
               super(context, name, factory, version);
          }

          @Override
          public void onCreate(SQLiteDatabase db) {
               // 생성 될때 호출 되는 메서드 , 한번만 호출 되는 듯
               tvResult.append("Database is Created successful!\n");              
          }

          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
               // TODO Auto-generated method stub
              
          }

          @Override
          public void onOpen(SQLiteDatabase db) {
               super.onOpen(db);
               tvResult.append("Database is Connected successful!\n");    
          }
         
     }
}
-----------------------------------  
###################################
4. 과제
-----------------------------------
* 금일 한 내용중 전체적으로 안되는 부분이 많아서 제대로 못함
adb.exe로 sqlite 못들어감
-----------------------------------
###################################


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day84  (0) 2015.07.13
오픈프레임워크_Day83  (0) 2015.07.10
오픈프레임워크_Day81  (0) 2015.07.08
오픈프레임워크_Day80  (0) 2015.07.07
오픈프레임워크_Day79  (0) 2015.07.06
,

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* 안드로이드에서 Log는 자동으로 지워짐?
----------------------------------- 
* LBS
- 인공위성을 통해 알아내는 방법 - GPS
- 기지국 이용하는 방식 - Wifi, 3G 이용
----------------------------------- 
* 쉽게 위도, 경도를 찾아주는 사이트
http://mygeoposition.com/
----------------------------------- 
* 구글 맵 v1, v2 있음
v2만 지원함
MapView -> Fragment 
-----------------------------------
* 구글 맵 서비스 이용하려면 아래 내용 설치 되어 있어야함


프로젝트 Import



~\android-sdk\extras\google\google_play_services\libproject\google-play-services_lib


프로젝트로 배포가 되어 있음


이를 쓰고자하는 프로젝트가 참조를 해야함

프로젝트 우클릭 - 프로퍼티 

적당한 버전 클릭






아래와 같이 API와 Private Lib가 추가 되어있는지 확인

----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성 
LbsApp
프로젝트 생성시에 Package 절대 중복되지 않는 걸로 하기
com.uticleTest1.lbsapp
----------------------------------- 
* GPS, Wifi(3G) 퍼미션 추가

android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
----------------------------------- 
* 에뮬레이터에서 GPS 테스트는 DDMS의 Location Controls를 이용

위도, 경도를 미리 DDMS에 사이트에서 찾아서 넣어주고
나오는지 확인
----------------------------------- 
* jar가 아닌 파일들 projct 
-----------------------------------  
* 구글 Map 쓰기위한 Permission 만들어야함

-----------------------------------  
* 구글 계정이 있어야함 키값
cloud.google.com/console
console.developers.google.com


로그인 하고
play.google.com/apps/publish/signup/
들어감 


code.google.com/apis/console
create 하고 
왼쪽에 API 및 인증 - 사용자 인증 정보 - 새 키 만들기 - 안드로이드 키 

상자 안에 내가 프로젝트 만들었다는 것을 증명을 해야함 

C:\Users\jhta\.android
위 폴더에 모든 환경 설정이 저장이 됨

C:\Users\jhta\.android\debug.keystore
를 구글에 알려주면 됨

해당 위치의 cmd 에서 
C:\Users\jhta\.android>keytool -list -v -keystore debug.keystore
비밀번호 없음 그냥 엔터

C:\Users\jhta\.android>keytool -list -v -keystore debug.keystore
키 저장소 비밀번호 입력:

*****************  WARNING WARNING WARNING  *****************
* 키 저장소에 저장된 정보의 무결성이  *
* 확인되지 않았습니다! 무결성을 확인하려면, *
* 키 저장소 비밀번호를 제공해야 합니다.                  *
*****************  WARNING WARNING WARNING  *****************

키 저장소 유형: JKS
키 저장소 제공자: SUN

키 저장소에 1개의 항목이 포함되어 있습니다.

별칭 이름: androiddebugkey
생성 날짜: 2015. 6. 23
항목 유형: PrivateKeyEntry
인증서 체인 길이: 1
인증서[1]:
소유자: CN=Android Debug, O=Android, C=US
발행자: CN=Android Debug, O=Android, C=US
일련 번호: 51d2317b
적합한 시작 날짜: Tue Jun 23 10:37:13 KST 2015, 종료 날짜: Thu Jun 15 10:37:13 KST 2045
인증서 지문:
         MD5: EE:40:01:A1:1C:F1:D2:4B:42:FA:DB:2E:25:B4:BE:9F
         SHA1: FC:2D:7E:C5:E8:EE:08:8E:A6:3A:E5:A5:7F:28:D0:33:C5:EF:32:10
         SHA256: 15:9C:1F:55:32:41:DA:1C:F1:32:84:DB:C2:FE:61:47:67:00:03:59:5C:32:9C:81:67:AC:A1:2D
:FD:11:D8:8D
         서명 알고리즘 이름: SHA256withRSA
         버전: 3

확장:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E3 85 A0 03 63 48 DD 06   42 B6 C0 AB 9C D9 18 B7  ....cH..B.......
0010: E3 BD 85 15                                        ....
]
]

*******************************************
*******************************************

혹은 아래에도 있음


결국은 구글에서 필요로 하는 값이 아래와 같음

FC:2D:7E:C5:E8:EE:08:8E:A6:3A:E5:A5:7F:28:D0:33:C5:EF:32:10;com.uticleTest1.lbsapp


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

* 에뮬레이터 새로 만듬 - 
Target,CPU가 Google API여야함



----------------------------------- 
Error



Window - Preferences - General - show heap status 체크



~\AndroidEclipse\eclipse.ini

맨 밑에

-Xms40m
-Xmx512m

아래로 변경

-Xms1024m
-Xmx1024m
 
-----------------------------------  
* 안드로이드 구글에서 필요한 설정

console.developers.google.com


아래 버튼 클릭



설정은 아래와 같이 되어 있으면 된다.


-----------------------------------
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork 
/WebApp/src/com/example/webapp/HtmlParserList.java

package com.example.webapp;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class HtmlParserList extends ListActivity {
     String listName[] = { "Gyeongju National Park", "Soklisan National Park",
               "Bukhansan National Park" };
     String listId[] = { "121900", "120500", "121500" };

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, listName);
          setListAdapter(adapter);

          ListView lv = getListView();
          lv.setOnItemClickListener(new OnItemClickListener() {
               @Override
               public void onItemClick(AdapterView<?> parent, View view,
                         int position, long id) {
                    Intent intent = new Intent(getApplicationContext(),
                              HtmlParserDetail.class);
                    intent.putExtra("parkId", listId[position]);
                    startActivity(intent);
               }
          });
     }

}
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork
/WebApp/src/com/example/webapp/HtmlParserDetail.java

package com.example.webapp;

import java.net.URL;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.Source;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.TextView;

public class HtmlParserDetail extends Activity {
     private TextView tv;
     private String parkId;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          tv = new TextView(this);
          parkId = getIntent().getExtras().getString("parkId");
          tv.setText(getHtmlData());
          setContentView(tv);
     }
     
     // 실제로 HTML 파싱을 하는 메서드
     private String getHtmlData(){
          // 서버 주소 준비
          String url = "http://knps.or.kr/front/portal/visit/visitCourseMain.do?parkId=" + parkId;
          
          // 결과 담을 변수
          String src = "";
          
          try {
               // 안드로이드 정책상 네트워크는 Thread로 구현해야 하나 이번에는 임의로 
               // Thread 안만들어도 네트워크를 할 수 있겠끔 정책
               // 아래 코드 대신에 Thread로 만들어 보시오. Thread에 대한 이해를 파악 할 수 있음
               StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
               StrictMode.setThreadPolicy(policy);
               
               // URL 접속하기, 전부 긁어옴, DOM Api로 접근하기는 힘듬
               URL parkUrl = new URL(url);
               
               // jericho를 사용하기 위해서 준비, 제리코 source를 사용
               Source source = new Source(parkUrl);
               
               // div 태그 전부 가져오기
               List tagName = source.getAllElements(HTMLElementName.DIV);
               
               // Log.d(getLocalClassName(), "태그 갯수 : "+tagName.size());
               
               // 그대로 출력
               for (int i = 0; i < tagName.size(); i++) {
                    Element e = (Element)tagName.get(i);
                    if("f_text".equals(e.getAttributes().getValue("class"))){
                         src = e.getContent().toString();
                         // 태그 안에 내용들만 보여주고 싶으면 정규표현식이 편함
                         Pattern p = Pattern.compile("<(?:.|\\s)*?>");
                         Matcher m = p.matcher(src);
                         src = m.replaceAll(" ");
                    }
               }
               
               
               
          } catch (Exception e) {
               Log.e(getLocalClassName(), "getHtmlData() 오류 : " + e);
          }
          return src;
     }

}
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork
/LbsApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.uticleTest1.lbsapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <permission android:name="com.uticleTest1.lbsapp.permission.MAPS_RECEIVE"></permission>
    <uses-permission android:name="com.uticleTest1.lbsapp.permission.MAPS_RECEIVE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <meta-data android:name="com.google.android.gms.version" 
            android:value="@integer/google_play_services_version"/>
        
        <meta-data android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyDm0JLM-CgGNBdTXJaOrUK0u-gbTwLGPQs"/>
        
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="LbsActivity"></activity>
        <activity android:name="GoogleMapActivity"></activity>
        <activity android:name="ItemOverlayActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork
/LbsApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnLbs"
        android:text="LBS" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnGoogleMap"
        android:text="GoogleMap" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnItemoverlay"
        android:text="Item OverLay" />

</LinearLayout>
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork
/LbsApp/src/com/uticleTest1/lbsapp/MainActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void onBtnLbs(View v) {
          startActivity(new Intent(MainActivity.this,LbsActivity.class));
     }

     public void onBtnGoogleMap(View v) {
          startActivity(new Intent(MainActivity.this,GoogleMapActivity.class));
     }

     public void onBtnItemoverlay(View v) {
          startActivity(new Intent(MainActivity.this,ItemOverlayActivity.class));
     }
}
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork
/LbsApp/src/com/uticleTest1/lbsapp/LbsActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class LbsActivity extends Activity {
     private TextView tv;
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         tv = new TextView(this);
         setContentView(tv);
         
         LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
         
         // 에뮬은 GPS 가능
         // 실제 기기는 Wifi, 3G에서 가능
         
         LocHandler handler = new LocHandler();
         // GPS 서비스 , 1/1000 초 단위 , 미터 단위(얼마나 움직이냐),
          // locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,10000,0,handler);
         
         // 3G, Wifi 사용시
         locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,10000,0,handler);
         
         // 가장 최근에 갱신된 정보를 가져오기
         try{
              // 어떤 장치를 통해서 알아냈는지 장치를 지정해줌
              Location loc = locManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
              
              if(loc != null){                   
                    Double lat = loc.getLatitude();
                    Double lon = loc.getLongitude();
                    Toast.makeText(getApplicationContext(), "latitude : "+lat+", "+"longitude : "+lon , Toast.LENGTH_SHORT);
              }
         }catch(Exception e){
              
         }
     }
     
     private class LocHandler implements LocationListener{

          @Override
          public void onLocationChanged(Location location) {
               // 위도
               Double lat = location.getLatitude();
               
               // 경도
               Double lon = location.getLongitude();
               
               tv.setText("latitude : "+lat+", "+"longitude : "+lon);
               
          }

          @Override
          public void onStatusChanged(String provider, int status, Bundle extras) {
               // TODO Auto-generated method stub
               
          }

          @Override
          public void onProviderEnabled(String provider) {
               // TODO Auto-generated method stub
               
          }

          @Override
          public void onProviderDisabled(String provider) {
               // TODO Auto-generated method stub
               
          }
          
     }

}
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork
/LbsApp/src/com/uticleTest1/lbsapp/GoogleMapActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.os.Bundle;

public class GoogleMapActivity extends Activity {

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_googlemap);
     }

}
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork
/LbsApp/src/com/uticleTest1/lbsapp/ItemOverlayActivity.java

package com.uticleTest1.lbsapp;

import android.app.Activity;
import android.os.Bundle;

public class ItemOverlayActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
     
         // TODO Auto-generated method stub
     }

}
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork
/LbsApp/res/layout/activity_googlemap.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day83  (0) 2015.07.10
오픈프레임워크_Day82  (0) 2015.07.09
오픈프레임워크_Day80  (0) 2015.07.07
오픈프레임워크_Day79  (0) 2015.07.06
오픈프레임워크_Day78  (0) 2015.07.03
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* XML, JSON, HTML 파싱
주로 SAX를 씀
서버로 부터 필요한 데이터를 받아옴

DOM
SAX
XmlPullParser - 
SAX를 좀 더 쉽게

버스노선 정보 등 LBS
공공기관 API - data.go.kr
----------------------------------- 
* 데이터 제공을 목적으로 하는 웹서버가 아닌 곳에서
Data를 가져오려면 어떻게 해야할 까?
HTML로 가져옴 
----------------------------------- 
* XML 연습 - 신문사 XML, xml.dgcsc.org(전세계 금시세 site)
----------------------------------- 
* HTML 파싱 라이브러리 - Jericho
-----------------------------------  
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성
WebApp - Android Project
WebTest - Dynamic Web Project
웹서버에서 파싱해 올 예정이기 때문에 

/WebTest/WebContent/WEB-INF/lib/servlet-api.jar
복사해옴
----------------------------------- 
Jericho 다운

http://jericho.htmlparser.net/docs/index.html

다운 
http://sourceforge.net/projects/jerichohtml/files/latest/download?source=files

압축 풀고
~\jericho-html-3.3\dist\jericho-html-3.3.jar

붙여 넣기
/WebApp/libs/jericho-html-3.3.jar

설정
프로젝트 우클릭

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

* 국립공원 경로 구분자
parkId 로 되어 있음
http://knps.or.kr/front/portal/visit/visitCourseMain.do?parkId=120700 
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork   
/WebApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.webapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="WebViewActivity"></activity>
        <activity android:name="ReadXmlActivity"></activity>
        <activity android:name="GoldActivity"></activity>
        <activity android:name="JsonActivity"></activity>
        <activity android:name="HtmlParserList"></activity>
        <activity android:name="HtmlParserDetail"></activity>
    </application>

</manifest>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork 
/WebApp/res/layout/activity_main.xml 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnWebView"
        android:text="WebView" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnXml"
        android:text="read xml" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnGold"
        android:text="Gold" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnJson"
        android:text="Json" />
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnHtml"
        android:text="Html Parsing" />

</LinearLayout>
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork  
/WebTest/WebContent/index.jsp

<%@ 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>
<h1>index.jsp</h1>
</body>
</html>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork  
/WebApp/src/com/example/webapp/MainActivity.java

package com.example.webapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void onBtnWebView(View v) {
          startActivity(new Intent(MainActivity.this, WebViewActivity.class));
     }
     
     public void onBtnXml(View v){
          startActivity(new Intent(MainActivity.this, ReadXmlActivity.class));
     }
     
     public void onBtnGold(View v){
          startActivity(new Intent(MainActivity.this, GoldActivity.class));
     }
     
     public void onBtnJson(View v){
          startActivity(new Intent(MainActivity.this, JsonActivity.class));
     }
     
     public void onBtnHtml(View v){
          startActivity(new Intent(MainActivity.this, HtmlParserList.class));
     }
}
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork  
/WebApp/src/com/example/webapp/WebViewActivity.java

package com.example.webapp;

import java.util.Date;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class WebViewActivity extends Activity {
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_webview);

          WebView wv = (WebView) findViewById(R.id.webView1);
          wv.getSettings().setJavaScriptEnabled(true);
          wv.getSettings().setDefaultTextEncodingName("UTF-8");
          
          // wv.loadUrl("http://developer.android.com");
          Date today = new Date();
          String html = "<html><body>";
          html += "<div align = 'center'>";
          html += "<h2>Hello~ Android!<br/><br/>";
          html += "현재 시간은 "+ today + "입니다</h2></div>";
          html += "</body></html>";
          
//          wv.loadData(html, "text/html", "UTF-8");
          wv.loadUrl("http://192.168.10.160:8080/WebTest/index.jsp");
     }

}
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork  
/WebApp/res/layout/activity_webview.xml

<WebView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/webView1"/>
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork  
/WebApp/res/raw/test.xml

<?xml version="1.0" encoding="UTF-8"?>
<order>
    <item Maker="samsung" Price="23000">Mouse</item>
    <item Maker="Lgg" Price="12000">Keyboard</item>
    <item Maker="wd" Price="156000">Hdd</item>
</order>
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork  
/WebApp/src/com/example/webapp/ReadXmlActivity.java

package com.example.webapp;

import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class ReadXmlActivity extends Activity {
     TextView tvResult;
     String result = "";

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_readxml);
          tvResult = (TextView) findViewById(R.id.tvResult);
     }

     public void onBtnDom(View v) {
          result = "";
          try {
               DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
               DocumentBuilder builder = factory.newDocumentBuilder();
               
               InputStream stream = getResources().openRawResource(R.raw.test);
               Document doc =  builder.parse(stream);
               
               Element root = doc.getDocumentElement();
               NodeList items = root.getElementsByTagName("item");
               
               for (int i = 0; i < items.getLength(); i++) {
                    Node item = items.item(i);
                    Text data = (Text)item.getFirstChild();
                    result += data.getData()+"\n";
                    NamedNodeMap attrs = item.getAttributes();
                    for (int j = 0; j < attrs.getLength(); j++) {
                         Node attr = attrs.item(j);
                         result += attr.getNodeName();
                         result += "=";
                         result += attr.getNodeValue()+"\n";                         
                    }
                    result +="\n";
               }
               result += "\n DOM";
               tvResult.setText(result);
          } catch (Exception e) {
               Log.e(getLocalClassName(), "DOM 읽기 실패" + e);
          }
     }

     public void onBtnSax(View v) {
          result = "";
          try {
               SAXParserFactory factory = SAXParserFactory.newInstance();
               SAXParser parser = factory.newSAXParser();
               
               InputStream stream = getResources().openRawResource(R.raw.test);
               parser.parse(stream, new SaxHandler());
               result += "\n SAX";
               tvResult.setText(result);
          } catch (Exception e) {
               Log.e(getLocalClassName(), "SAX 읽기 실패" + e);
          }
     }
     
     class SaxHandler extends DefaultHandler{
          boolean bItem = false;
          String strAttrs = "";
          
          @Override
          public void startElement(String uri, String localName, String qName,
                    Attributes attributes) throws SAXException {
               if(localName.equals("item")){
                    strAttrs = "";
                    bItem = true;
                    
                    for(int i=0; i<attributes.getLength(); i++){
                         strAttrs += attributes.getLocalName(i);
                         strAttrs += "=";
                         strAttrs += attributes.getValue(i);
                         strAttrs += "\n";
                    }
               }
          }

          @Override
          public void endElement(String uri, String localName, String qName)
                    throws SAXException {
               if(bItem == true)
                    bItem = false;
          }

          @Override
          public void characters(char[] ch, int start, int length)
                    throws SAXException {
               if(bItem == true){
                    result += new String(ch, start, length);
                    result += "\n";
                    result += strAttrs;
                    result += "\n";
               }
          }
     }

     public void onBtnXmlPullParser(View v) {
          result = "";
          try {

          } catch (Exception e) {
               Log.e(getLocalClassName(), "XmlPullParser 읽기 실패" + e);
          }
     }

}
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork
/WebApp/res/layout/activity_readxml.xml 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnDom"
        android:text="DOM" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnSax"
        android:text="SAX" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBtnXmlPullParser"
        android:text="XmlPullParser" />

    <TextView
        android:id="@+id/tvResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout> 
----------------------------------- 
3-10 
WorkSpace : ~\study\AndroidWork  
/WebApp/src/com/example/webapp/GoldActivity.java

package com.example.webapp;

import java.io.InputStream;
import java.net.URL;
import java.util.Vector;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.app.ListActivity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.ArrayAdapter;

public class GoldActivity extends ListActivity {
     private Vector goldVec;
     private String url = "http://xml.dgcsc.org/samples/GoldBAE.xml";
     private String result = "";

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1,getXmlData());
          
          setListAdapter(adapter);          
     }
     
     // xml 긁어 오는 메서드
     private Vector getXmlData(){
          try {
               goldVec = new Vector();
               goldVec.add("nation     ask      bid");
               
               StrictMode.ThreadPolicy policy =
                         new StrictMode.ThreadPolicy.Builder().permitAll().build();
               StrictMode.setThreadPolicy(policy);
               
               URL goldUrl = new URL(url);
               InputStream stream = goldUrl.openStream();
               
               // XmlPullParser 
               XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
               XmlPullParser parser = factory.newPullParser();
               parser.setInput(stream, "utf-8");
               
               int eventType = parser.getEventType();
               while(eventType != XmlPullParser.END_DOCUMENT){
                    if(eventType == XmlPullParser.START_TAG){
                         if(parser.getDepth() == 2){
                              result += parser.getName() + "     ";
                         }
                         
                    }else if(eventType == XmlPullParser.END_TAG){
                         if(parser.getDepth() == 2){
                              goldVec.add(result);
                              result = "";
                         }
                         
                    }else if(eventType == XmlPullParser.TEXT){
                         if(parser.getDepth() == 3){
                              result += parser.getText() + "     ";
                         }
                    }
                    eventType = parser.next();
               }
          } catch (Exception e) {
               Log.e(getLocalClassName(), "Gold 읽기 실패" + e);
          }
          return goldVec;
     }

}
----------------------------------- 
3-11 
WorkSpace : ~\study\AndroidWork  
/WebApp/src/com/example/webapp/JsonActivity.java

package com.example.webapp;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class JsonActivity extends Activity {
     TextView tvJsonResult;
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_json);
         tvJsonResult = (TextView)findViewById(R.id.tvJsonResult);
     }
     
     public void onbtnFirst(View v){
          String jsonData = "["
                    + "{\"Product\":\"Mouse\", \"Maker\":\"Samsong\",\"Price\":3000 },"
                    + "{\"Product\":\"Keyboard\", \"Maker\":\"Lggg\",\"Price\":16000 },"
                    + "{\"Product\":\"HDD\", \"Maker\":\"WD\",\"Price\":156000 }"
                    + "]";
          try {
               String result = "Order List\n";
               JSONArray jarr = new JSONArray(jsonData);
               for (int i = 0; i < jarr.length(); i++) {
                    JSONObject obj = jarr.getJSONObject(i);
                    result += "Product Name : "+obj.getString("Product") + ", ";
                    result += "Company Name : "+obj.getString("Maker") + ", ";
                    result += "Price Name : "+obj.getString("Price") + "\n";
               }
               tvJsonResult.setText(result);
          } catch (Exception e) {
               Log.e(getLocalClassName(), "Json First 실패" + e);
          }
          
     }
     
     public void onbtnSecond(View v){
          try {

          } catch (Exception e) {
               Log.e(getLocalClassName(), "Json Second 실패" + e);
          }
     }

}
----------------------------------- 
3-12 
WorkSpace : ~\study\AndroidWork  
/WebApp/res/layout/activity_json.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onbtnFirst"
        android:text="First Exam" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onbtnSecond"
        android:text="Second Exam" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tvJsonResult" />

</LinearLayout>
----------------------------------- 
3-13 
WorkSpace : ~\study\AndroidWork  
/WebApp/src/com/example/webapp/HtmlParserList.java

package com.example.webapp;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class HtmlParserList extends ListActivity {
     String listName[] = { "Gyeongju National Park", "Soklisan National Park",
               "Bukhansan National Park" };
     String listId[] = { "121900", "120500", "121500" };

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, listName);
          setListAdapter(adapter);

          ListView lv = getListView();
          lv.setOnItemClickListener(new OnItemClickListener() {
               @Override
               public void onItemClick(AdapterView<?> parent, View view,
                         int position, long id) {
                    Intent intent = new Intent(getApplicationContext(),
                              HtmlParserDetail.class);
                    startActivity(intent);
               }
          });
     }

}
----------------------------------- 
3-14 
WorkSpace : ~\study\AndroidWork 
/WebApp/src/com/example/webapp/HtmlParserDetail.java 

package com.example.webapp;

import android.app.Activity;
import android.os.Bundle;

public class HtmlParserDetail extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
     
         // TODO Auto-generated method stub
     }

}
----------------------------------- 
###################################
4. 과제
-----------------------------------
7/14, 7/15 안드로이드 발표
한루에 7시간 수업할 예정
----------------------------------- 
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day82  (0) 2015.07.09
오픈프레임워크_Day81  (0) 2015.07.08
오픈프레임워크_Day79  (0) 2015.07.06
오픈프레임워크_Day78  (0) 2015.07.03
오픈프레임워크_Day77  (0) 2015.07.02
,

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* Activity 실행시  반드시 무언가 실행 시키고 싶으면
LifeCycle에 따라 onResume() 
----------------------------------- 
앞으로 배울 내용은?
브로드케스트 리시버, Content Provider, xml파싱, db?
----------------------------------- 
* Main View에 Thread가 접근을 못하게 막아 둠
동기화 문제가 발생하기 때문에
그래서 아래와 같은 해결방법이 있음

핸들러



루퍼



1. handler
2. post - 핸들러를 생략해서 만들 수 있는 거, runnable 상속
3. looper - Run 메서드 안에서만 쓰임, 자식 쓰레드에는 만들어져 있지 않음, Main 쓰레드에는 있음
4. AsyncTask - 복잡한 Thread 코드를 간단하게 구현할 수 있게 해줌, 어려움

-----------------------------------  
Broadcast Receiver
모두에게 전달해주는데 받고 싶은 사람이 받음
이러한 방송 메시지를 직접 만들어서 사용가능

ACTION_XXX 메시지 들이 있음
이런 메시지들이 안드로이드 시스템에서 준비해 놓은 메시지

이런거 말고 직접 만드는게 가능

-----------------------------------  
* XML 파싱
주로 SAX를 씀
서버로 부터 필요한 데이터를 받아옴

DOM
SAX
SAX를 좀 더 쉽게

버스노선 정보 등 LBS
공공기관 API - data.go.kr
-----------------------------------  
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성 - BroadCastReceiverApp
----------------------------------- 
* Receiver 생성


----------------------------------- 
* Permission 추가



android.permission.RECEIVE_SMS
----------------------------------- 
* 에뮬레이터에서 메시지 전송

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

3. 소스코드 또는 실습 
-----------------------------------

3-1
WorkSpace : ~\study\AndroidWork  
/ThreadApp/AndroidManifest.xml 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.threadapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="FirstActivity"></activity>
        <activity android:name="SecondActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork  
/ThreadApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onNext"
        android:text="First Example" />
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onSecond"
        android:text="Second Example" />

</LinearLayout>
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork  
/ThreadApp/res/layout/activity_second.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvMainValue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="MainValue : 0" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onIncrement"
        android:text="Increment" />

    <EditText
        android:id="@+id/etNumber"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numeric="integer"
        android:text="5" />

    <TextView
        android:id="@+id/tvBackValue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="BackValue : 0" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onSquare"
        android:text="Square" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onRoot"
        android:text="Root" />

</LinearLayout>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork  
/ThreadApp/res/layout/activity_first.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onViewCounter"
        android:text="View Counter" />

    <TextView
        android:id="@+id/tvViewCounter"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textSize="30dp" />

</LinearLayout>
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork  
/ThreadApp/src/com/example/threadapp/MainActivity.java

package com.example.threadapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void onNext(View v) {
          startActivity(new Intent(getApplicationContext(), FirstActivity.class));
     }
     
     public void onSecond(View v){
          startActivity(new Intent(getApplicationContext(), SecondActivity.class));
     }
}
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork  
/ThreadApp/src/com/example/threadapp/FirstActivity.java

package com.example.threadapp;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;

public class FirstActivity extends Activity {
     private int value = 0;
     private boolean isRunning = false;
     private TextView tvViewCounter;
     Handler handler = null;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_first);
          tvViewCounter = (TextView) findViewById(R.id.tvViewCounter);
          handler = new counterHandler();
     }

     // 택배회사인 핸들러를 만듬
     // 무명 클래스로 바꿀 수 있음
     class counterHandler extends Handler {
          @Override
          public void handleMessage(Message msg) {
               // 매개변수 Message msg가 메시지 큐임
               // 꺼내온 값이 msg임
               // super.handleMessage(msg);
               if (msg.what == 0) {
                    tvViewCounter.setText("Current Counter : " + value);
               }
          }
     }

     @Override
     protected void onResume() {
          super.onResume();
          CounterThread ct = new CounterThread();
          isRunning = true;
          ct.start();
     }

     public void onViewCounter(View v) {

     }

     @Override
     protected void onPause() {
          super.onPause();
          isRunning = false;
          value = 0;
     }

     @Override
     protected void onStop() {
          super.onStop();
     }

     class CounterThread extends Thread {
          @Override
          public void run() {
               while (isRunning) {
                    try {
                         sleep(1000);
                         value++;
                         // 여기에 코딩하면 에러가 남
                         // 이런 문법이 지원이 안됨, 시스템 문제임
                         // 이유는? 서로 다른 클래스가 View에는 접근할 수 없음
                         // tvViewCounter.setText("Current Counter : " + value);

                         // 메시지 큐에서 빈 상자를 하나 받아옴
                         // Message msg = Message.obtain();

                         // 값을 증가했다는 소식만 알려주면되, 값은 FirstActivity에 인스턴스 변수라 안넘겨도됨

                         // 이 메시지가 어떤 메시지인지 구별하기 위한 변수
                         // msg.what = 0;

                         // 전달할 값이 있다면, 최대 2개의 값을 전달 가능
                         // msg.arg1 = 1;
                         // msg.arg2 = 3;

                         // 메시지 큐에 다시 돌려보내기
                         // 핸들러에게 물건을 가져가라고 알려줌
                         // handler.sendMessage(msg);

                         // 간단하게 보낼때, Empty의 내용을 보냄
                         handler.sendEmptyMessage(0);
                    } catch (Exception e) {
                         e.printStackTrace();
                    }
               }
          }
     }
}
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork  
/ThreadApp/src/com/example/threadapp/SecondActivity.java

package com.example.threadapp;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class SecondActivity extends Activity {
     private int m_MainValue;
     private TextView tvMain, tvBack;
     private EditText etNum;
     private SquareRootThread thread;
     public Handler m_mainHandler = new Handler() {
          @Override
          public void handleMessage(Message msg) {
               // super.handleMessage(msg);
               if (msg.what == 0) {
                    tvBack.setText("Square Result : " + msg.arg1);
               } else if (msg.what == 1) {
                    // tvBack.setText("Root Result : "+msg.obj.toString());
                    tvBack.setText("Root Result : " + ((Double)msg.obj).doubleValue());
               }
          }
     };

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_second);
          tvMain = (TextView) findViewById(R.id.tvMainValue);
          tvBack = (TextView) findViewById(R.id.tvBackValue);
          etNum = (EditText) findViewById(R.id.etNumber);
          thread = new SquareRootThread(m_mainHandler);
          thread.start();
     }

     public void onIncrement(View v) {
          m_MainValue++;
          tvMain.setText("MainValue : " + m_MainValue);
     }

     public void onSquare(View v) {
          Message msg = Message.obtain();
          msg.what = 0;
          msg.arg1 = Integer.parseInt(etNum.getText() + "");
          thread.m_backHandler.sendMessage(msg);
     }

     public void onRoot(View v) {
          Message msg = Message.obtain();
          msg.what = 1;
          msg.arg1 = Integer.parseInt(etNum.getText().toString());
          thread.m_backHandler.sendMessage(msg);
     }

}
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork  
/ThreadApp/src/com/example/threadapp/SquareRootThread.java

package com.example.threadapp;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;

public class SquareRootThread extends Thread {
     private Handler m_mainHandler;
     public Handler m_backHandler;
     public SquareRootThread(Handler hMain) {
          this.m_mainHandler = hMain;
     }

     @Override
     public void run() {
          // 루퍼 준비
          Looper.prepare();
          
          m_backHandler = new Handler() {
               @Override
               public void handleMessage(Message msg) {
                    Message sendMsg = Message.obtain();
                    if (msg.what == 0) {
                         int result = msg.arg1 * msg.arg1;
                         sendMsg.what = 0;
                         sendMsg.arg1 = result;

                    } else if (msg.what == 1) {
                         double result = Math.sqrt((double) msg.arg1);
                         sendMsg.what = 1;
                         sendMsg.obj = new Double(result);
                    }
                    m_mainHandler.sendMessage(sendMsg);
               }
          };
          
          // 반복되는 코드 뒤에
          Looper.loop();
     }
     
//  Thread가 필요 없는 상황에서는 루퍼가 필요 없는 듯
//     public Handler m_backHandler = new Handler() {
//          @Override
//          public void handleMessage(Message msg) {
//               Message sendMsg = Message.obtain();
//               // super.handleMessage(msg);
//               if (msg.what == 0) {
//                    int result = msg.arg1 * msg.arg1;
//                    sendMsg.what = 0;
//                    sendMsg.arg1 = result;
//
//               } else if (msg.what == 1) {
//                    double result = Math.sqrt((double) msg.arg1);
//                    sendMsg.what = 1;
//                    sendMsg.obj = new Double(result);
//               }
//               m_mainHandler.sendMessage(sendMsg);
//          }
//     };
}
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork  
/BroadCastReceiverApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastreceiverapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="TestReceiver" >
            <intent-filter>
                <action android:name="com.study.GOGOGO" />
            </intent-filter>
        </receiver>
        <receiver android:name="SmsReceiver" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
----------------------------------- 
3-10 
WorkSpace : ~\study\AndroidWork  
/BroadCastReceiverApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Broadcast send from App"
        android:onClick="onSend" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="SMS Arraived..." />

</LinearLayout>
----------------------------------- 
3-11 
WorkSpace : ~\study\AndroidWork  
/BroadCastReceiverApp/src/com/example/broadcastreceiverapp/MainActivity.java

package com.example.broadcastreceiverapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          SmsReceiver rev = new SmsReceiver();
     }
     
     public void onSend(View v){
          Intent intent = new Intent("com.study.GOGOGO");
          sendBroadcast(intent);          
     }

     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.main, menu);
          return true;
     }

     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
          // Handle action bar item clicks here. The action bar will
          // automatically handle clicks on the Home/Up button, so long
          // as you specify a parent activity in AndroidManifest.xml.
          int id = item.getItemId();
          if (id == R.id.action_settings) {
               return true;
          }
          return super.onOptionsItemSelected(item);
     }
}
----------------------------------- 
3-12 
WorkSpace : ~\study\AndroidWork  
/BroadCastReceiverApp/src/com/example/broadcastreceiverapp/TestReceiver.java

package com.example.broadcastreceiverapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class TestReceiver extends BroadcastReceiver {

     @Override
     public void onReceive(Context context, Intent intent) {
          String name = intent.getAction();
          if (name.equals("com.study.GOGOGO")) {
               Toast.makeText(context.getApplicationContext(), "receive success",
                         Toast.LENGTH_SHORT).show();
          }
     }

}
----------------------------------- 
3-13 
WorkSpace : ~\study\AndroidWork  
/BroadCastReceiverApp/src/com/example/broadcastreceiverapp/SmsReceiver.java

package com.example.broadcastreceiverapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.sax.StartElementListener;
import android.util.Log;
import android.widget.Toast;

public class SmsReceiver extends BroadcastReceiver {

     @Override
     public void onReceive(Context context, Intent intent) {
          // TODO Auto-generated method stub
          // Log.i("SmsReceiver", "sms receive success");
          
          // 만약 다른 앱에게 방송이 가지 않게 하려면
          abortBroadcast();
          
          if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
               Intent myIntent = new Intent(context, MainActivity.class);
               // 
               // 만약 어플이 종료되어있다면 새로 생성 하겠다
               myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               context.startActivity(myIntent);               
          }
     }

}
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
-----------------------------------

0512.pptx


0513.pptx


0520.xlsx


0527.pptx


0601.pptx


0601_test.pptx


0706.pptx


ActivityLifeCycle.pptx


프레젠테이션1.pptx



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

'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day81  (0) 2015.07.08
오픈프레임워크_Day80  (0) 2015.07.07
오픈프레임워크_Day78  (0) 2015.07.03
오픈프레임워크_Day77  (0) 2015.07.02
오픈프레임워크_Day76  (0) 2015.07.01
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* Pending Indent 
그전 까지는 즉시 전달을 하였음

이번에는 잠깐 보관 하다가 특정한 시점에 전달을 한다
주로 알림서비스에서 많이 사용됨
----------------------------------- 
* Android 알림의 종류

Toast
Notification
Dialog

----------------------------------- 
* Service (Thread와 매우 관련되어 있음)
Activity를 도와주거나 백그라운드로 계속 돌면서 사용가능

ex) 음악 앱을 실행 후 다른 어플 실행해도 노래가 계속 잘 나오게 해주는 기능

http://developer.android.com/guide/components/services.html

1) Started Service
     - 처음시작할때 서비스를 같이 시작하는 경우
     - startService()

2) Bound Service
     - 서비스를 다른 앱, 다른 장치...등에 연결 시켜줌
     - bindService()
     - IPC, RPC(CORBA, COM, COM+)와 비슷한 개념, 기능
          ex) 같은 PC에서 서로 다른 프로그램을 연결시켜줌 - IPC
          ex) 다른 PC에서 서로 다른 프로그램이나 기능을 연결시켜줌 - RPC

----------------------------------- 
* Android Thread (자바 Thread 사용 가능)

1) Handler 
2) Post
3) Looper
4) Asynctask

----------------------------------- 
* Thread는 Main UI에 접근할 수 없음 보안상
이를 해결하기 위해서 Handler가 등장
오늘까지는 안되는 경우를 확인
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성 - ToastDialogApp, ServiceApp, ThreadApp
----------------------------------- 
* /ToastDialogApp/res/drawable-ldpi/toastback.xml

----------------------------------- 
* Service 생성

----------------------------------- 
* 어플 강제 중지

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

###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork  
/IntentApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showSecond"
        android:text="Custom Action" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showThird"
        android:text="ThirdActivity of BasicWidgetApp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showWebpage"
        android:text="Show me the webpage" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showDial"
        android:text="Show me the Dial" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showCall"
        android:text="Show me the Call" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="sendData"
        android:text="Send Data to ThirdActivity" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="returnValue"
        android:text="Return value from ForthActivity" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="pendingIndent"
        android:text="Pending Indent" />

</LinearLayout>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork 
/IntentApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.intentapp"
    android:versionCode="1"
    android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.CALL_PHONE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="SecondActivity" >
            <intent-filter>
                <action android:name="com.study.SECOND_VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity android:name="ThirdActivity"></activity>
        <activity android:name="ForthActivity"></activity>
        <activity android:name="NotificationActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork 
/IntentApp/src/com/example/intentapp/NotificationActivity.java

package com.example.intentapp;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class NotificationActivity extends Activity {
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          TextView tv = new TextView(this);
          tv.setText("Here is NotificationActivity");
          tv.setTextSize(30);
          setContentView(tv);
     }
}
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork 
/IntentApp/src/com/example/intentapp/MainActivity.java

package com.example.intentapp;

import java.util.ArrayList;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
     private static final int REQUEST_CODE = 1;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void showSecond(View v) {
          Intent intent = new Intent("com.study.SECOND_VIEW");
          startActivity(intent);
     }

     public void showThird(View v) {
          Intent intent = new Intent("com.study.PROGRESS_VIEW");
          startActivity(intent);
     }

     public void showWebpage(View v) {
          Intent intent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("http://google.co.kr"));
          startActivity(intent);
     }

     public void showDial(View v) {
          Intent intent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("tel:111111111"));
          startActivity(intent);
     }

     public void showCall(View v) {
          Intent intent = new Intent(Intent.ACTION_CALL,
                    Uri.parse("tel:111111111"));
          startActivity(intent);
     }

     public void sendData(View v) {
          Intent intent = new Intent(MainActivity.this, ThirdActivity.class);
          intent.putExtra("1", "hong gil dong");
          intent.putExtra("id", "tiger");
          intent.putExtra("sum", 100);

          ArrayList<String> list = new ArrayList<String>();
          list.add("seoul");
          list.add("london");
          list.add("paris");
          list.add("newyork");
          intent.putExtra("list", list);
          startActivity(intent);
     }

     public void returnValue(View v) {
          Intent intent = new Intent(MainActivity.this, ForthActivity.class);
          startActivityForResult(intent, REQUEST_CODE);
     }

     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          // TODO Auto-generated method stub
          super.onActivityResult(requestCode, resultCode, data);

          if (requestCode == REQUEST_CODE) {
               if (resultCode == RESULT_OK) {
                    String name = data.getExtras().getString("name");
                    Toast.makeText(getApplicationContext(), name,
                              Toast.LENGTH_SHORT).show();
               }
          }

     }

     // 1. FLAG_CANCEL_CURRENT
     // PendingIntent가 이미 생성되어 있다면 취소하고 새로 PendingIntent를 만든다
     // 2. FLAG_NO_CREATE
     // 현재 사용중인 PendingIntent를 반환한다
     // 3. FLAG_ONE_SHOT
     // PendingIntent를 생성한다면 반환된 인스턴스는 한번만 사용
     // 4. FLAG_UPDATE_CURRENT
     // 이미생성된 PendingIntent가 있다면 새로 만들지 않고 기존에
     // 생성된 PendingIntent를 재사용한다.

     public void pendingIndent(View v) {
          // Intent 준비
          Intent intent = new Intent(MainActivity.this,
                    NotificationActivity.class);

          // 보관
          PendingIntent pIntent = PendingIntent.getActivity(
                    getApplicationContext(), 0, intent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

          // 알림서비스에서 이용할 아이콘 준비
          int noti_icon = R.drawable.front01;

          // 알림서비스에서 이용할 알림메시지
          CharSequence tickerText = "hello~~ how are you!";

          // 전송하는 시점, 알림서비스를 만듬
          // 생성자(아이콘, 알림메시지,0), 예전 방식
          // Notification noti = new Notification(noti_icon,tickerText,0);
          // 요즘 방식, 메서드 체인 방식
          Notification noti = new Notification.Builder(getApplicationContext())
                    .setTicker(tickerText).setSmallIcon(noti_icon)
                    .setContentText("Welcome to Android World")
                    .setContentTitle("new message").setContentIntent(pIntent)
                    .build();

          // 알림서비스를 시스템에 등록해서 실행 될 수 있도록 만들기
          // 시스템에게 허락 받기,대신 시스템 허락을 받는 대리인이 있음
          NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

          // 알림서비스 등록, 구별할 수 있는 값 넣음,
          manager.notify(1, noti);

     }
}
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork 
/IntentApp/res/drawable/front01.png
복사해옴
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork 
/ToastDialogApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.toastdialogapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork 
/ToastDialogApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onLocation"
        android:text="Location" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onStyle"
        android:text="style" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onDialog"
        android:text="call Dialog" />

</LinearLayout>
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork 
/ToastDialogApp/src/com/example/toastdialogapp/MainActivity.java

package com.example.toastdialogapp;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void onLocation(View v) {
          Toast toast = Toast.makeText(getApplicationContext(), "hello~~",
                    Toast.LENGTH_SHORT);

          // Toast의 위치를 지정, 상대적인 위치, 가운데를 기준으로 좌표 이동
          toast.setGravity(Gravity.CENTER, 20, 100);
          toast.show();
     }

     public void onStyle(View v) {
          Toast toast = new Toast(getApplicationContext());
          toast.setGravity(Gravity.CENTER, 0, 0);
          toast.setDuration(Toast.LENGTH_SHORT);

          // XML로 Toast를 디자인 불러오기
          LayoutInflater inf = getLayoutInflater();
          View layout = inf.inflate(R.layout.toast,
                    (ViewGroup) findViewById(R.id.toast_root));

          TextView tv = (TextView) layout.findViewById(R.id.tv1);
          tv.setText("Toast Example");
          toast.setView(layout);
          toast.show();
     }

     public void onDialog(View v) {
          AlertDialog.Builder dialog = new AlertDialog.Builder(this);
          dialog.setTitle("Infomation");
          dialog.setMessage("Test Dialog");
          dialog.setIcon(R.drawable.ic_launcher);

          dialog.setPositiveButton("yes", new OnClickListener() {
               public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(getApplicationContext(), "Yes is presseed",
                              Toast.LENGTH_SHORT).show();
               }
          });

          dialog.setNegativeButton("no", new OnClickListener() {
               public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(getApplicationContext(), "No is presseed",
                              Toast.LENGTH_SHORT).show();
               }
          });

          dialog.setNeutralButton("cancel", new OnClickListener() {
               public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(getApplicationContext(), "Cancel is presseed",
                              Toast.LENGTH_SHORT).show();
               }
          });

          dialog.create().show();
     }
}
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork 
/ToastDialogApp/res/layout/toast.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/toast_root" 
    >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/toastback"
        android:padding="20dp" />

</LinearLayout>
----------------------------------- 
3-10 
WorkSpace : ~\study\AndroidWork 
/ToastDialogApp/res/drawable-ldpi/toastback.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:width="4dp"
        android:color="#FFFFFF00" />

    <solid android:color="#FF883300" />

    <padding
        android:bottom="20dp"
        android:left="20dp"
        android:right="20dp"
        android:top="20dp" />

    <corners android:radius="15dp" />

</shape>
----------------------------------- 
3-11 
WorkSpace : ~\study\AndroidWork 
/ServiceApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.serviceapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name="MusicService" >
            <intent-filter>
                <action android:name="com.study.MUSIC_SERVICE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>
    </application>

</manifest>
----------------------------------- 
3-12 
WorkSpace : ~\study\AndroidWork 
/ServiceApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onMusicStart"
        android:text="Music Start" />


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onMusicStop"
        android:text="Music Stop" />

</LinearLayout>
----------------------------------- 
3-13 
WorkSpace : ~\study\AndroidWork 
/ServiceApp/src/com/example/serviceapp/MainActivity.java

package com.example.serviceapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void onMusicStart(View v) {
          // Intent intent = new Intent(MainActivity.this,MusicService.class);

          // 암시적 인텐트 사용
          Intent intent = new Intent("com.study.MUSIC_SERVICE");
          startService(intent);
     }

     public void onMusicStop(View v) {
          Intent intent = new Intent("com.study.MUSIC_SERVICE");
          stopService(intent);
     }
}
----------------------------------- 
3-14 
WorkSpace : ~\study\AndroidWork 
/ServiceApp/res/raw/kalimba.mp3
음악 샘플 복사
이름 소문자로 변경
----------------------------------- 
3-15 
WorkSpace : ~\study\AndroidWork 
/ServiceApp/src/com/example/serviceapp/MusicService.java

package com.example.serviceapp;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

public class MusicService extends Service {
     MediaPlayer player;

     @Override
     public void onCreate() {
          super.onCreate();
          Log.i("MusicService", "onCreate 호출");

          // 미디어 플레이어 연결
          player = MediaPlayer.create(this, R.raw.kalimba);

          // 반복 실행 할지 여부 설정
          player.setLooping(true);
     }

     // 1. START_STICKY
     // service가 강제 종료되었을 때 시스템이 다시 service를 재시작 시켜준다
     // 단 Intent값을 NULL로 초기화 시키게 된다
     //
     // 2. START_NOT_STICKY
     // 강제로 종료로된 service가 재시작하지 않는다
     //
     // 3. START_REDELIVER_INTENT
     // service가 강제 종료되었을 때 시스템이 다시 service를 재시작 시켜준다
     // 단 Intent값을 계속 유지시키게 된다

     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
          Log.i("MusicService", "onStartCommand 호출");

          // 미디어 플레이어 재생
          player.start();

          // super.onStartCommand(intent, flags, startId) == START_STICKY 같은 값
          return START_NOT_STICKY;
     }

     @Override
     public IBinder onBind(Intent intent) {
          Log.i("MusicService", "onBind 호출");
          return null;
     }

     @Override
     public boolean onUnbind(Intent intent) {
          Log.i("MusicService", "onUnbind 호출");
          return super.onUnbind(intent);
     }

     @Override
     public void onDestroy() {
          Log.i("MusicService", "onDestroy 호출");

          // 미디어 플레이어 멈춤
          player.stop();

          super.onDestroy();
     }

}
----------------------------------- 
3-16 
WorkSpace : ~\study\AndroidWork 
/ThreadApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.threadapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="FirstActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-17 
WorkSpace : ~\study\AndroidWork 
/ThreadApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onNext"
        android:text="First Example" />

</LinearLayout>
----------------------------------- 
3-18 
WorkSpace : ~\study\AndroidWork 
/ThreadApp/src/com/example/threadapp/MainActivity.java

package com.example.threadapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void onNext(View v) {
          startActivity(new Intent(getApplicationContext(), FirstActivity.class));
     }
}
----------------------------------- 
3-19 
WorkSpace : ~\study\AndroidWork 
/ThreadApp/src/com/example/threadapp/FirstActivity.java

package com.example.threadapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class FirstActivity extends Activity {
     private int value = 0;
     private boolean isRunning = false;
     private TextView tvViewCounter;

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_first);
          tvViewCounter = (TextView) findViewById(R.id.tvViewCounter);
     }

     public void onViewCounter(View v) {
          CounterThread ct = new CounterThread();
          isRunning = true;
          ct.start();
     }

     class CounterThread extends Thread {
          @Override
          public void run() {
               while (isRunning) {
                    try {
                         sleep(1000);
                         value++;
                         tvViewCounter.setText("Current Counter : " + value);
                    } catch (Exception e) {     e.printStackTrace(); }
               }
          }
     }
}
----------------------------------- 
3-20 
WorkSpace : ~\study\AndroidWork 
/ThreadApp/res/layout/activity_first.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onViewCounter"
        android:text="View Counter" />

    <TextView
        android:id="@+id/tvViewCounter"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textSize="30dp" />

</LinearLayout>
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day80  (0) 2015.07.07
오픈프레임워크_Day79  (0) 2015.07.06
오픈프레임워크_Day77  (0) 2015.07.02
오픈프레임워크_Day76  (0) 2015.07.01
오픈프레임워크_Day75  (0) 2015.06.30
,

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* Activity Life Cycle 
onStop()에서 onRestart()로 가려면

/ActivityLifeCycle/src/com/example/activitylifecycle/MainActivity.java
에서
/ActivityLifeCycle/src/com/example/activitylifecycle/SecondActivity.java
로 클릭해서 넘어간뒤
ESC, 백 버튼 으로 뒤로 가면 확인 가능

위 상태에서 ESC 한번 더 누르면 앱 종료 되서
onDestroy()까지 호출 됨


앱 다시 실행 후 메인에서 HOME 버튼으로 나간뒤
다시 어플에 들어오면 onRestart()


onPause() -> onResume()
/ActivityLifeCycle/src/com/example/activitylifecycle/SecondActivity.java
를 투명하게 만들어서 실행시킨다
메인에서 Second로 이동 하면 onPause()가 되고
그 때 ESC를 누르면 onResume()이 됨 
----------------------------------- 
* Intent - 컴퍼넌트들 사이에 정보 전달시 사용됨(그릇)
안드로이드를 구성하는 4대 컴퍼넌트들이 서로 호출, 메시지, 데이터등을 주고
받게 할 수 있는 역할을 수행하기 위한 도구
이동 할때 어디로 이동할지 정보 전달을 같이 함
Actvity
Service
Broadcast Receiver
Content Provider

종류
1) 명시적 Intent
          - 호출하거나 메시지를 보낼 대상의 컴퍼넌트 이름이 지정되어 있는 Intent
          - 지금까지 방식으로 누구한테 넘어가는지 적어주는 방식
2) 암시적(묵시적) Intent
          - 지정된 곳을 호출해서 이동하는 것이 아니라 
            Intent에 Action을 추가해서 보내고 싶은 명령을 보내는 방법
          - 주로 다른 앱에 기능을 사용하고 싶을 때 씀
          - 모든 앱들은 BroadCast로 인텐트를 전달 받는데 intent-filter를 통해서 자신을 호출 했는지 필터링함

구성요소
1) 컴퍼넌트 이름 - 주로 명시적 인텐트에서 사용

2) Action - 주로 암시적 인텐트에서 사용
     - 하나의 인텐트는 단 하나의 Action만 가질 수 있다.
     - 서로간의 약속으로 만든 메시지
     ex) android.intent.action.CALL
         android.intent.action.EDIT         
         android.intent.action.BATTERY_LOW
         android.intent.action.SCREEN_ON
         android.intent.action.MAIN
         ...

3) Category 주로 암시적 인텐트에서 사용
     - Action과 함께 컴퍼넌트의 특징을 나타내는 항목
     - 여러개의 Category 사용 가능
     - 기본 카테고리 android.intent.category.DEFAULT

4) Data - 부가적으로 필요할때 사용, Extra

----------------------------------- 
* Activity에서의 이동
          1) startActivity() - 그냥 건너감
          2) startActivityForResult() - 건너갔다가 돌아올때 리턴값을 가져올 수 있음
----------------------------------- 
* Android VS IPhone

아이폰은 전화걸기 기능 모듈을 가져와서 사용
안드로이드는 전화걸기 기능이 있는 어플에 전화번호만 전달해서
전화걸기 기능이 있는 어플이 전화를 대신 걸어줌
-----------------------------------  
* Activity Stack 관리
1. Flag
2. 자신을 삭제 finish()

A,B 두개의 액티비티가 왔다 갔다 하면서 계속 생성이 되는 문제가 생김
이를 위해 해결 방법중 하나로 B에서 A로 갈때 자신을 Stack에서 삭제 
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* Activity Life Cycle 할때 filter 설정을 함
----------------------------------- 
* 에뮬레이터에서 백 버튼은 ESC 키보드 이용
ESC, HOME, 
----------------------------------- 
* 프로젝트 생성 - /IntentApp

/IntentApp/AndroidManifest.xml
에서 intent-filter 확인
-----------------------------------
* 권한 설정



위 문제가 아니라서 지움
위 기능 말고 CALL_PHONE을 넣음
----------------------------------- 
* URI vs URL
URI는 URL보다 상위 개념으로
URI의 한 종류에 URL이 있음 
----------------------------------- 
###################################
3. 소스코드 또는 실습
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork 
/ActivityLifeCycle/res/layout/activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.activitylifecycle.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:onClick="showSecond" 
        android:clickable="true"/>

</RelativeLayout>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork 
/ActivityLifeCycle/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitylifecycle"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="SecondActivity" android:theme="@android:style/Theme.Translucent"></activity>
    </application>

</manifest>
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork 
/IntentApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.intentapp"
    android:versionCode="1"
    android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.CALL_PHONE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="SecondActivity" >
            <intent-filter>
                <action android:name="com.study.SECOND_VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity android:name="ThirdActivity"></activity>
        <activity android:name="ForthActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork 
/IntentApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showSecond"
        android:text="Custom Action" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showThird"
        android:text="ThirdActivity of BasicWidgetApp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showWebpage"
        android:text="Show me the webpage" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showDial"
        android:text="Show me the Dial" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showCall"
        android:text="Show me the Call" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="sendData"
        android:text="Send Data to ThirdActivity" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="returnValue"
        android:text="Return value from ForthActivity" />

</LinearLayout>
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork 
/IntentApp/src/com/example/intentapp/MainActivity.java

package com.example.intentapp;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
     private static final int REQUEST_CODE = 1;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
     }

     public void showSecond(View v) {
          Intent intent = new Intent("com.study.SECOND_VIEW");
          startActivity(intent);
     }

     public void showThird(View v) {
          Intent intent = new Intent("com.study.PROGRESS_VIEW");
          startActivity(intent);
     }

     public void showWebpage(View v) {
          Intent intent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("http://google.co.kr"));
          startActivity(intent);
     }

     public void showDial(View v) {
          Intent intent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("tel:111111111"));
          startActivity(intent);
     }

     public void showCall(View v) {
          Intent intent = new Intent(Intent.ACTION_CALL,
                    Uri.parse("tel:111111111"));
          startActivity(intent);
     }

     public void sendData(View v) {
          Intent intent = new Intent(MainActivity.this, ThirdActivity.class);
          intent.putExtra("1", "hong gil dong");
          intent.putExtra("id", "tiger");
          intent.putExtra("sum", 100);

          ArrayList<String> list = new ArrayList<String>();
          list.add("seoul");
          list.add("london");
          list.add("paris");
          list.add("newyork");
          intent.putExtra("list", list);
          startActivity(intent);
     }

     public void returnValue(View v) {
          Intent intent = new Intent(MainActivity.this, ForthActivity.class);
          startActivityForResult(intent, REQUEST_CODE);
     }

     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          // TODO Auto-generated method stub
          super.onActivityResult(requestCode, resultCode, data);
          
          if(requestCode == REQUEST_CODE){
               if(resultCode == RESULT_OK){
                    String name = data.getExtras().getString("name");
                    Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT).show();
               }
          }
          
     }

}
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork 
/IntentApp/src/com/example/intentapp/SecondActivity.java

package com.example.intentapp;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          TextView tv = new TextView(this);
          tv.setText("Here is SecondActivity");
          tv.setTextSize(60);
          tv.setTextColor(Color.BLUE);

          setContentView(tv);

     }

}
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork 
/IntentApp/src/com/example/intentapp/ThirdActivity.java

package com.example.intentapp;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class ThirdActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
          TextView tv = new TextView(this);
//          tv.setText("Here is ThirdActivity");
          tv.setTextSize(20);
          tv.setTextColor(Color.BLUE);

          Intent intent = getIntent();
          String msg = "";
          if (intent != null){
               msg = intent.getStringExtra("1");
               msg += intent.getStringExtra("id");
               msg += intent.getIntExtra("sum", 0);
               ArrayList<String> list = intent.getStringArrayListExtra("list");
               Log.i(getLocalClassName(), list.toString());
          }
          
          tv.setText(msg);
          setContentView(tv);
     }

}
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork  
/BasicWidgetApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.basicwidgetapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="SecondAcitivity" >
        </activity>
        <activity android:name="ThirdActivity" >
            <intent-filter>
                <action android:name="com.study.PROGRESS_VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork 
/IntentApp/res/layout/activity_forth.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ForthActivity" />
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="move to main"
        android:onClick="moveMain" />

</LinearLayout>
----------------------------------- 
3-10 
WorkSpace : ~\study\AndroidWork 
/IntentApp/src/com/example/intentapp/ForthActivity.java

package com.example.intentapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class ForthActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_forth);
     }

     public void moveMain(View v) {
          Intent intent = new Intent();
          intent.putExtra("name", "scott");
          setResult(RESULT_OK, intent);
          finish();
     }
}
----------------------------------- 
###################################
4. 과제
-----------------------------------
4-1
프로젝트 만들때 
클래스 다이어 그램
시퀀스 다이어 그램

-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 

'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day79  (0) 2015.07.06
오픈프레임워크_Day78  (0) 2015.07.03
오픈프레임워크_Day76  (0) 2015.07.01
오픈프레임워크_Day75  (0) 2015.06.30
오픈프레임워크_Day74  (0) 2015.06.29
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* inflate
xml을 JAVA로 가져와서 객체로 inflate 시켜줌
setContentView() 전체 레이아웃을 inflate 시켜줬으나
이번에는 특정 부분만 따로 inflate를 시켜줄 예정

LayoutInflater inf = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout layout = (LinearLayout) inf.inflate(R.layout.activity_main, null);

위와 같은 코드를 setContentView(layout); 을 해주기 전에 써야 했으나
안적어 주어도 됨
----------------------------------- 
* 안드로이드에서 공부할 내용
XML parsing
LBS 기능 -> Map 서비스, 위치기반 서비스

----------------------------------- 
* 무명클래스도 엄연히 클래스 이기 때문에
사용되는 클래스의 지역변수를 쓸 수 없음
주의!
----------------------------------- 
* Menu

액션바에 ... 버튼은 Option Menu(풀 다운 메뉴, 고정)
화면을 오래 눌러서 나오는 메뉴 - Context Menu

----------------------------------- 
* Activity Life Cycle

http://developer.android.com/guide/components/activities.html



----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성 - /MenuInflaterApp, /ActivityLifeCycle
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork 
/AdapterApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.adapterapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="ListViewActivity"></activity>
        <activity android:name="SpinnerViewActivity"></activity>
        <activity android:name="AutoAcitivity"></activity>
        <activity android:name="GalleryActivity"></activity>
        <activity android:name="GridViewActivity"></activity>
        <activity android:name="FlipperActivity"></activity>
        <activity android:name="ImageViewListActivity"></activity>
        <activity android:name="InflateActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork 
/AdapterApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="How to use ListView" />

    <Button
        android:id="@+id/btnSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="How to use SpinnerView" />

    <Button
        android:id="@+id/btnAuto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="How to use AutoCompleteTextView" />

    <Button
        android:id="@+id/btnGallery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="How to use Gallery" />

    <Button
        android:id="@+id/btnGrid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="How to use GridView" />

    <Button
        android:id="@+id/btnFlipper"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="How to use ViewFlipper" />

    <Button
        android:id="@+id/btnImageList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="make Image List" />

    <Button
        android:id="@+id/btnInflate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Inflate Example" />

</LinearLayout>
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork 
/AdapterApp/res/layout/activity_inflate.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="Add Inflation"
        android:textColor="#FFAD6535" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="addInf"
        android:text="ADD" />

    <LinearLayout
        android:id="@+id/contentsLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="delInf"
        android:text="DEL" />

</LinearLayout>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork 
/AdapterApp/res/layout/item3.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnSelect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Select" />

    <RadioGroup
        android:id="@+id/rdoGroup1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingLeft="5dp"
        android:paddingRight="5dp" >

        <RadioButton
            android:id="@+id/rdoMale"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Male" />

        <RadioButton
            android:id="@+id/rdoFemale"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Female" />
    </RadioGroup>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical|center_horizontal"
        android:paddingTop="10dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="All Day"
            android:textSize="25dp" />

        <CheckBox
            android:id="@+id/chkAllday"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork 
/AdapterApp/res/layout/activity_flipper.xml

<ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flipper1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/image" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/img0" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/sample_0" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/sample_1" />

</ViewFlipper>
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork 
/AdapterApp/src/com/example/adapterapp/MainActivity.java

package com.example.adapterapp;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends Activity implements OnClickListener {
     Button btnList, btnSpinner, btnAuto, btnGallery, btnGrid, btnFlipper,
               btnImageList, btnInflate;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          // setContentView(R.layout.activity_main);

          LayoutInflater inf = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          LinearLayout layout = (LinearLayout) inf.inflate(R.layout.activity_main, null);
          setContentView(layout);

          btnList = (Button) findViewById(R.id.btnList);
          btnSpinner = (Button) findViewById(R.id.btnSpinner);
          btnAuto = (Button) findViewById(R.id.btnAuto);
          btnGallery = (Button) findViewById(R.id.btnGallery);
          btnGrid = (Button) findViewById(R.id.btnGrid);
          btnFlipper = (Button) findViewById(R.id.btnFlipper);
          btnImageList = (Button) findViewById(R.id.btnImageList);
          btnInflate = (Button) findViewById(R.id.btnInflate);

          btnList.setOnClickListener(this);
          btnSpinner.setOnClickListener(this);
          btnAuto.setOnClickListener(this);
          btnGallery.setOnClickListener(this);
          btnGrid.setOnClickListener(this);
          btnFlipper.setOnClickListener(this);
          btnImageList.setOnClickListener(this);
          btnInflate.setOnClickListener(this);
     }

     @Override
     public void onClick(View v) {
          Button b = (Button) v;
          Intent intent = null;
          switch (b.getId()) {
          case R.id.btnList:
               intent = new Intent(getApplicationContext(), ListViewActivity.class);
               break;
          case R.id.btnSpinner:
               intent = new Intent(getApplicationContext(),
                         SpinnerViewActivity.class);
               break;
          case R.id.btnAuto:
               intent = new Intent(getApplicationContext(), AutoActivity.class);
               break;
          case R.id.btnGallery:
               intent = new Intent(getApplicationContext(), GalleryActivity.class);
               break;
          case R.id.btnGrid:
               intent = new Intent(getApplicationContext(), GridViewActivity.class);
               break;
          case R.id.btnFlipper:
               intent = new Intent(getApplicationContext(), FlipperActivity.class);
               break;
          case R.id.btnImageList:
               intent = new Intent(getApplicationContext(),
                         ImageViewListActivity.class);
               break;
          case R.id.btnInflate:
               intent = new Intent(getApplicationContext(),
                         InflateActivity.class);
               break;
          }

          if (intent != null) {
               startActivity(intent);
          }
     }

     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.main, menu);
          return true;
     }

     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
          // Handle action bar item clicks here. The action bar will
          // automatically handle clicks on the Home/Up button, so long
          // as you specify a parent activity in AndroidManifest.xml.
          int id = item.getItemId();
          if (id == R.id.action_settings) {
               return true;
          }
          return super.onOptionsItemSelected(item);
     }

}
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork 
/AdapterApp/src/com/example/adapterapp/ImageViewListActivity.java

package com.example.adapterapp;

import java.util.ArrayList;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ImageViewListActivity extends ListActivity {
     ArrayList<ImageViewListDto> data;
     LayoutInflater inf;

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          data = new ArrayList<ImageViewListDto>();
          data.add(new ImageViewListDto(R.drawable.background, "JSP"));
          data.add(new ImageViewListDto(R.drawable.front_blue, "Java"));
          data.add(new ImageViewListDto(R.drawable.front_green, "Spring"));
          data.add(new ImageViewListDto(R.drawable.front_red, "Android"));
          data.add(new ImageViewListDto(R.drawable.android, "HTML"));
          inf = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          ImageViewListAdapter adapter = new ImageViewListAdapter();
          setListAdapter(adapter);
     }

     class ImageViewListAdapter extends BaseAdapter {
          @Override
          public int getCount() {
               return data.size();
          }

          @Override
          public Object getItem(int position) {
               return data.get(position);
          }

          @Override
          public long getItemId(int position) {
               return position;
          }

          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
               if (convertView == null) {
                    convertView = inf.inflate(R.layout.item2, null);
               }
               ImageViewListDto dto = data.get(position);
               
               ImageView icon = (ImageView) convertView.findViewById(R.id.imgHeader);
               icon.setImageResource(dto.getIcon());
               
               TextView text = (TextView) convertView.findViewById(R.id.tvBook);
               text.setText(dto.getBook());
               
               return convertView;
          }
     }
}
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork 
/AdapterApp/src/com/example/adapterapp/InflateActivity.java

package com.example.adapterapp;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;

//LayoutInflater
//MenuInflater
//...

public class InflateActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_inflate);
          
     }

     public void addInf(View v){
          LinearLayout linearLayout = (LinearLayout)findViewById(R.id.contentsLayout);
          LayoutInflater inf =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          LinearLayout layout = (LinearLayout) inf.inflate(R.layout.item3, linearLayout, true);
//          디자인 떨어뜨리기
//          LinearLayout layout = (LinearLayout) inf.inflate(R.layout.item3, linearLayout, false);
//          디자인 붙이기
//          LinearLayout layout = (LinearLayout) inf.inflate(R.layout.item3, linearLayout, true);
          
     }
     public void delInf(View v){
          LinearLayout linearLayout = (LinearLayout)findViewById(R.id.contentsLayout);
          LayoutInflater inf =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          LinearLayout layout = (LinearLayout) inf.inflate(R.layout.item3, linearLayout, false);
//          디자인 떨어뜨리기
//          LinearLayout layout = (LinearLayout) inf.inflate(R.layout.item3, linearLayout, false);
//          디자인 붙이기
//          LinearLayout layout = (LinearLayout) inf.inflate(R.layout.item3, linearLayout, true);
          
     }
}
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork 
/AdapterApp/src/com/example/adapterapp/FlipperActivity.java

package com.example.adapterapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ViewFlipper;

public class FlipperActivity extends Activity {
     ViewFlipper flipper;

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_flipper);
          flipper = (ViewFlipper) findViewById(R.id.flipper1);
          flipper.setOnClickListener(new OnClickListener() {
               @Override
               public void onClick(View v) {
                    int idx = flipper.getDisplayedChild();
                    int childCount = flipper.getChildCount();
                    
                    flipper.setAnimation(AnimationUtils.loadAnimation(FlipperActivity.this, android.R.anim.slide_in_left));

                    if (childCount == idx + 1) {
                         flipper.setDisplayedChild(0);
                    } else {
                         flipper.setDisplayedChild(idx + 1);
                         // flipper.showNext();
                         // flipper.startFlipping();
                    }
               }
          });
     }

}
----------------------------------- 
3-10 
WorkSpace : ~\study\AndroidWork 
/MenuInflaterApp/res/layout/activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.menuinflaterapp.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" 
        android:id="@+id/tv1"/>

</RelativeLayout>
----------------------------------- 
3-11 
WorkSpace : ~\study\AndroidWork 
/MenuInflaterApp/res/menu/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.menuinflaterapp.MainActivity" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_settings"/>
    <item
        android:id="@+id/action_twitter"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="twitter"/>
    <item
        android:id="@+id/action_facebook"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="facebook"/>

</menu>
----------------------------------- 
3-12 
WorkSpace : ~\study\AndroidWork 
/MenuInflaterApp/src/com/example/menuinflaterapp/MainActivity.java

package com.example.menuinflaterapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          TextView tv = (TextView) findViewById(R.id.tv1);
          registerForContextMenu(tv);
     }

     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          // getMenuInflater().inflate(R.menu.main, menu);
          menu.add(0, Menu.FIRST + 1, Menu.NONE, "New File");
          menu.add(Menu.NONE, Menu.FIRST + 2, Menu.NONE, "Copy");
          menu.add(0, Menu.FIRST + 3, Menu.NONE, "Paste");
          return true;
     }

     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
          // Handle action bar item clicks here. The action bar will
          // automatically handle clicks on the Home/Up button, so long
          // as you specify a parent activity in AndroidManifest.xml.
          String selected = "";
          int id = item.getItemId();
          if (id == Menu.FIRST + 1) {
               selected = "New File";
          } else if (id == Menu.FIRST + 2) {
               selected = "Copy";
          } else if (id == Menu.FIRST + 3) {
               selected = "Paste";
          }
          Toast.makeText(getApplicationContext(), selected + " is Selected",
                    Toast.LENGTH_SHORT).show();
          return super.onOptionsItemSelected(item);
     }

     @Override
     public void onCreateContextMenu(ContextMenu menu, View v,
               ContextMenuInfo menuInfo) {
          // TODO Auto-generated method stub
          super.onCreateContextMenu(menu, v, menuInfo);
          menu.add("Seoul");
          menu.add("Paris");
          menu.add("London");
     }

     @Override
     public boolean onContextItemSelected(MenuItem item) {
          // TODO Auto-generated method stub
          String selected = "";
          if (item.getTitle().equals("Seoul")) {
               selected = "Seoul";
          } else if (item.getTitle().equals("Paris")) {
               selected = "Paris";
          } else if (item.getTitle().equals("London")) {
               selected = "London";
          }
          Toast.makeText(getApplicationContext(), selected + " is Selected",
                    Toast.LENGTH_SHORT).show();
          return super.onContextItemSelected(item);
     }
}
----------------------------------- 
3-13 
WorkSpace : ~\study\AndroidWork 
/ActivityLifeCycle/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitylifecycle"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="SecondActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-14 
WorkSpace : ~\study\AndroidWork 
/ActivityLifeCycle/src/com/example/activitylifecycle/MainActivity.java

package com.example.activitylifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          Log.d(getLocalClassName(), "onCreate 호출됨");
     }

     @Override
     protected void onStart() {
          Log.d(getLocalClassName(), "onStart 호출됨");
          super.onStart();
     }

     @Override
     protected void onRestart() {
          Log.d(getLocalClassName(), "onRestart 호출됨");
          super.onRestart();
     }

     @Override
     protected void onResume() {
          Log.d(getLocalClassName(), "onResume 호출됨");
          super.onResume();
     }

     @Override
     protected void onPause() {
          Log.d(getLocalClassName(), "onPause 호출됨");
          super.onPause();
     }

     @Override
     protected void onStop() {
          Log.d(getLocalClassName(), "onStop 호출됨");
          super.onStop();
     }

     @Override
     protected void onDestroy() {
          Log.d(getLocalClassName(), "onDestroy 호출됨");
          super.onDestroy();
     }
}
----------------------------------- 
3-15 
WorkSpace : ~\study\AndroidWork 
/ActivityLifeCycle/src/com/example/activitylifecycle/SecondActivity.java

package com.example.activitylifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class SecondActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          Log.d(getLocalClassName(), "onCreate 호출됨");

          TextView tv = new TextView(this);
          tv.setText("Here is SecondActivity");
          setContentView(tv);
     }

}
----------------------------------- 
###################################
4. 과제
-----------------------------------
4-1
/AdapterApp/src/com/example/adapterapp/FlipperActivity.java 
에 xml을 어뎁터로 처리?
----------------------------------- 
4-2
/AdapterApp/src/com/example/adapterapp/InflateActivity.java
에서 떨어 뜨리기?
----------------------------------- 
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day78  (0) 2015.07.03
오픈프레임워크_Day77  (0) 2015.07.02
오픈프레임워크_Day75  (0) 2015.06.30
오픈프레임워크_Day74  (0) 2015.06.29
오픈프레임워크_Day73  (0) 2015.06.26
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* 어뎁터 - 데이터를 Activity에 잘 꾸며서 전달해줌
세가지 기술

특정 위젯에 맞춰져 있는 어뎁터
- ListViewAdapter, SpinnerAdapter
이미 만들어져 있는 어뎁터
BaseAdapter로 새로 만드는 어뎁터
----------------------------------- 
* ListActivity 상속 받음 - ListViewAcitivity.java
상속 받은 이유는 클래스 기본 레이아웃을
ListView가 자동으로 되도록 만들어줌
----------------------------------- 
* R class

1. 사용자 정의 클래스 
     - 내가만든 프로젝트에 의해 생성,내가 만든 패키지 안에 있음
     - 지금까지 알던 클래스

2. 안드로이드에서 제공하는 클래스 
     - Android.R 에 있음
     - 이클립스에서 소문자 r
                             
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 안드로이드 에러 해결
콘솔창에서 에러가 아래와 같이 나온다면
Error: Error parsing ~\study\android-sdk\~\~\~\~\devices.xml

인터넷에서 찾은 방법은 잘 되지 않았고 Virtual Device를 새로 만듬
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork 
/AdapterApp/src/com/example/adapterapp/ListViewAcitivity.java

package com.example.adapterapp;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class ListViewActivity extends ListActivity {
     public String books[] = { "JSP", "JAVA", "Oracle", "MySql",
               "HTML & CSS & JavaScript", "XML", "AJAX", "BootStrap",
               "Git & Github", "Ant", "Android", "Maven", "JUnit", "Spring",
               "UML", "JQuery" };

     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
          // android.R.layout.simple_list_item_1, books);

          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    R.layout.item1, books);
          setListAdapter(adapter);
          ListView lv = getListView();
          lv.setOnItemClickListener(new OnItemClickListener() {
               @Override
               public void onItemClick(AdapterView<?> parent, View view,
                         int position, long id) {
                    Toast.makeText(getApplicationContext(),
                              books[position] + " is selected!", Toast.LENGTH_LONG)
                              .show();
               }
          });
     }

}
// package com.example.adapterapp;
//
// import android.app.Activity;
// import android.os.Bundle;
// import android.view.View;
// import android.widget.AdapterView;
// import android.widget.AdapterView.OnItemClickListener;
// import android.widget.ArrayAdapter;
// import android.widget.ListView;
// import android.widget.Toast;
//
// public class ListViewActivity extends Activity {
// public String books[] = { "JSP", "JAVA", "Oracle", "MySql",
// "HTML & CSS & JavaScript", "XML", "AJAX", "BootStrap",
// "Git & Github", "Ant", "Android", "Maven", "JUnit", "Spring",
// "UML", "JQuery" };
//
// @Override
// public void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_listview);
//
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
// android.R.layout.simple_list_item_1, books);
// ListView lv = (ListView) findViewById(R.id.listview1);
// lv.setAdapter(adapter);
// lv.setOnItemClickListener(new OnItemClickListener() {
// @Override
// public void onItemClick(AdapterView<?> parent, View view,
// int position, long id) {
// Toast.makeText(getApplicationContext(),
// books[position] + " is selected!", Toast.LENGTH_LONG)
// .show();
// }
// });
// }
//
// }
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork
/AdapterApp/res/layout/activity_listview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listview1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</LinearLayout>
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork
/AdapterApp/res/layout/activity_spinnerview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Spinner Sample"
        android:textSize="20dp" />

    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/spinner_test" />

</LinearLayout>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork
/AdapterApp/src/com/example/adapterapp/SpinnerViewActivity.java

package com.example.adapterapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class SpinnerViewActivity extends Activity {
     String girlgroup[] = { "wonder girls", "girls generation", "kara", "tiara",
               "Space A", "Miss A", "AOA" };

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_spinnerview);

          ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_dropdown_item, girlgroup);

          Spinner spinner = (Spinner) findViewById(R.id.spinner1);
          spinner.setAdapter(adapter);

          spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
               @Override
               public void onItemSelected(AdapterView<?> parent, View view,
                         int position, long id) {
                    // TODO Auto-generated method stub
                    Toast.makeText(getApplicationContext(),
                              girlgroup[position] + " is selected!",
                              Toast.LENGTH_SHORT).show();
               }

               @Override
               public void onNothingSelected(AdapterView<?> parent) {
               }
          });
     }
}
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork
/AdapterApp/res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">AdapterApp</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>

    <string-array name="spinner_test">
        <item>Seoul</item>
        <item>London</item>
        <item>Paris</item>
        <item>Newyork</item>
    </string-array>

</resources>
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork
/AndroidWork/AdapterApp/res/layout/activity_item1.xml

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
        android:textSize="15dp"
        android:textColor="#0000FF" />


<!-- 
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <TextView 
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
             android:textSize="15dp"
             android:textColor="#0000FF" />
     <TextView 
         android:layout_width="match_parent"
         android:layout_height="match_parent"
             android:textSize="15dp"
             android:textColor="#FF0000"
             android:text="$10000" 
             android:layout_marginLeft="20dp"/>
</LinearLayout>
-->
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork
/AndroidWork/AdapterApp/res/layout/activity_auto.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <AutoCompleteTextView
        android:id="@+id/auto1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </AutoCompleteTextView>

</LinearLayout>
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork
/AdapterApp/res/layout/activity_gallery.xml

<Gallery xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gallery1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"/>
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork
/AdapterApp/src/com/example/adapterapp/GalleryActivity.java

package com.example.adapterapp;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class GalleryActivity extends Activity {
     Gallery gallery;
     int images[] = { R.drawable.sample_0, R.drawable.sample_1,
               R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4,
               R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7 };

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_gallery);
          gallery = (Gallery) findViewById(R.id.gallery1);

          ImageAdapter adapter = new ImageAdapter(this);
          gallery.setAdapter(adapter);
     }

     class ImageAdapter extends BaseAdapter {
          Context ctx;

          public ImageAdapter(Context ctx) {
               this.ctx = ctx;
          }

          @Override
          public int getCount() {
               return images.length;
          }

          @Override
          public Object getItem(int position) {
               return images[position];
          }

          @Override
          public long getItemId(int position) {
               return 0;
          }

          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
               ImageView imgView;
               if (convertView == null) {
                    imgView = new ImageView(GalleryActivity.this);
                    // imgView = new ImageView(getApplicationContext());
                    // imgView = new ImageView(ctx);
               } else {
                    imgView = (ImageView) convertView;
               }

               imgView.setImageResource(images[position]);
               imgView.setScaleType(ImageView.ScaleType.FIT_XY);
               imgView.setLayoutParams(new Gallery.LayoutParams(400, 300));
               return imgView;
          }
     }
}
----------------------------------- 
3-10 
WorkSpace : ~\study\AndroidWork
/AdapterApp/res/layout/activity_gridview.xml

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnWidth="60dp"
    android:gravity="center"
    android:horizontalSpacing="30dp"
    android:numColumns="auto_fit"
    android:padding="30dp"
    android:verticalSpacing="30dp" />
----------------------------------- 
3-11 
WorkSpace : ~\study\AndroidWork
/AdapterApp/src/com/example/adapterapp/GridViewActivity.java

package com.example.adapterapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class GridViewActivity extends Activity {
     int images[] = { R.drawable.sample_0, R.drawable.sample_1,
               R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4,
               R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7,
               R.drawable.image, R.drawable.duckling, R.drawable.img0,
               R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2,
               R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5,
               R.drawable.sample_6, R.drawable.sample_7, R.drawable.image,
               R.drawable.duckling, R.drawable.img0, R.drawable.sample_0,
               R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3,
               R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6,
               R.drawable.sample_7, R.drawable.image, R.drawable.duckling,
               R.drawable.img0, R.drawable.sample_0,
               R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3,
               R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6,
               R.drawable.sample_7, R.drawable.image, R.drawable.duckling,
               R.drawable.img0, R.drawable.sample_0,
               R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3,
               R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6,
               R.drawable.sample_7, R.drawable.image, R.drawable.duckling,
               R.drawable.img0, R.drawable.sample_0,
               R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3,
               R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6,
               R.drawable.sample_7, R.drawable.image, R.drawable.duckling,
               R.drawable.img0 };

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_gridview);
          ImageAdapter adapter = new ImageAdapter();
          GridView gv = (GridView) findViewById(R.id.gridview1);
          gv.setAdapter(adapter);
          
          gv.setOnItemClickListener(new OnItemClickListener() {

               @Override
               public void onItemClick(AdapterView<?> parent, View view,
                         int position, long id) {
                    // TODO Auto-generated method stub
                    
               }
          });
     }

     class ImageAdapter extends BaseAdapter {
          @Override
          public int getCount() {
               return images.length;
          }

          @Override
          public Object getItem(int position) {
               return images[position];
          }

          @Override
          public long getItemId(int position) {
               return 0;
          }

          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
               ImageView imgView;
               if (convertView == null) {
                    imgView = new ImageView(getApplicationContext());
                    imgView.setLayoutParams(new GridView.LayoutParams(75, 75));
               } else {
                    imgView = (ImageView) convertView;
               }
               imgView.setImageResource(images[position]);
               return imgView;
          }
     }

}
----------------------------------- 
3-12 
WorkSpace : ~\study\AndroidWork
/AdapterApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use ListView" />

    <Button
        android:id="@+id/btnSpinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use SpinnerView" />

    <Button
        android:id="@+id/btnAuto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use AutoCompleteTextView" />

    <Button
        android:id="@+id/btnGallery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use Gallery" />

    <Button
        android:id="@+id/btnGrid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use GridView" />

    <Button
        android:id="@+id/btnFlipper"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use ViewFlipper" />

    <Button
        android:id="@+id/btnImageList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="make Image List" />

</LinearLayout>
----------------------------------- 
3-13 
WorkSpace : ~\study\AndroidWork
/AdapterApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.adapterapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="ListViewActivity"></activity>
        <activity android:name="SpinnerViewActivity"></activity>
        <activity android:name="AutoAcitivity"></activity>
        <activity android:name="GalleryActivity"></activity>
        <activity android:name="GridViewActivity"></activity>
        <activity android:name="FlipperActivity"></activity>
        <activity android:name="ImageViewListActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-14 
WorkSpace : ~\study\AndroidWork
/AdapterApp/src/com/example/adapterapp/ImageViewListActivity.java

package com.example.adapterapp;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;

public class ImageViewListActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         ArrayList<ImageViewListDto> data = new ArrayList<ImageViewListDto>();
         data.add(new ImageViewListDto(R.drawable.background, "JSP"));
         data.add(new ImageViewListDto(R.drawable.front_blue, "Java"));
         data.add(new ImageViewListDto(R.drawable.front_green, "Spring"));
         data.add(new ImageViewListDto(R.drawable.front_red, "Android"));
         data.add(new ImageViewListDto(R.drawable.android, "HTML"));
     }

}
----------------------------------- 
3-15 
WorkSpace : ~\study\AndroidWork
/AdapterApp/res/layout/item2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imgHeader"
        android:layout_width="60dp"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/tvBook"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center" />

</LinearLayout>
----------------------------------- 
3-16 
WorkSpace : ~\study\AndroidWork
/AdapterApp/src/com/example/adapterapp/ImageViewListDto.java

package com.example.adapterapp;

public class ImageViewListDto {
     private int icon;
     private String book;

     public ImageViewListDto(int icon, String book) {
          this.icon = icon;
          this.book = book;
     }

     public int getIcon() {
          return icon;
     }

     public String getBook() {
          return book;
     }

}
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day77  (0) 2015.07.02
오픈프레임워크_Day76  (0) 2015.07.01
오픈프레임워크_Day74  (0) 2015.06.29
오픈프레임워크_Day73  (0) 2015.06.26
오픈프레임워크_Day72  (0) 2015.06.25
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* 안드로이드에서 간단한 파일 저장 클래스
SharedPreferences
----------------------------------- 
AndroidManifest.xml 에서 메인 변경

<intent-filter>를 가지고 있으면 메인이 됨
----------------------------------- 
android:visibility="gone"
gone은 객체 생성은 안함
invisible은 생성 되는데 안보이게
visible은 생성 되고 보이게
----------------------------------- 
* LogCat
안드로이드에서 사용하는 로그 확인 프로그램
-----------------------------------  
###################################
2. 설정 및 그 밖에
-----------------------------------
* LogCat
vervose - 모든 메세지
asset - 테스트 관련

로그캣 필터 만들기


----------------------------------- 
* 프로젝트 생성 - AdapterApp
----------------------------------- 
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork  
/BasicWidgetApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.basicwidgetapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
        </activity>
        <activity android:name="SecondAcitivity" >
        </activity>
        <activity android:name="ThirdActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork 
/BasicWidgetApp/res/layout/activity_second.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- autotext : 자동 철자 교정 기능 사용여부 (true, false) -->
    <!-- capitalize : 입력된 텍스트의 첫번째 글자를 대문자로 자동변경 -->
    <!-- numeric : 숫자만 입력 가능 -->
    <!-- digits : 특정 데이터만 입력 가능 -->
    <!-- ... -->

    <EditText
        android:id="@+id/et1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Input Here!..."
        android:maxLength="30"
        android:maxWidth="200sp"
        android:singleLine="true"
        android:textColor="#FF0000FF"
        android:textStyle="bold|italic" />

    <EditText
        android:id="@+id/et2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:digits="abc"
        android:hint="Input Here!..."
        android:maxWidth="200sp"
        android:textColor="#FF0000FF" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onBtnDisplay"
        android:text="EditText Content Display" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <CheckBox
            android:id="@+id/chk1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Student" />

        <CheckBox
            android:id="@+id/chk2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Salaryman" />

        <CheckBox
            android:id="@+id/chk3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Teacher" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <RadioGroup
            android:id="@+id/rg1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <RadioButton
                android:id="@+id/rdo1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="seoul" />

            <RadioButton
                android:id="@+id/rdo2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="paris" />

            <RadioButton
                android:id="@+id/rdo3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="london" />
        </RadioGroup>
    </LinearLayout>

    <ToggleButton
        android:id="@+id/toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOff="Turn off..."
        android:textOn="Turn on..." />

    <RatingBar
        android:id="@+id/rBar"
        style="?android:attr/ratingBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:isIndicator="false"
        android:numStars="5"
        android:rating="1.5"
        android:stepSize="0.5" />

</LinearLayout>
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork 
/BasicWidgetApp/res/layout/activity_third.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ProgressBar
        android:id="@+id/progress1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone" />

    <ToggleButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="progressCircle"
        android:textOff="Circle Start"
        android:textOn="Circle Exit" />

    <ProgressBar
        android:id="@+id/progress2"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="50"
        android:progress="10" />

    <ToggleButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="progressHorizontal"
        android:textOff="Horizontal Start"
        android:textOn="Horizontal Exit" />

    <SeekBar
        android:id="@+id/seek1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:max="20"
        android:progress="5" />

    <TextView
        android:id="@+id/tvSeek"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="5" />

</LinearLayout>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork 
/BasicWidgetApp/src/com/example/basicwidgetapp/SecondAcitivity.java

package com.example.basicwidgetapp;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.RatingBar;
import android.widget.RatingBar.OnRatingBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class SecondAcitivity extends Activity {
     EditText et1, et2;
     TextView tv1, tv2;
     CheckBox c1, c2, c3;
     RadioGroup rg;
     SharedPreferences shared;
     ToggleButton tButton;
     RatingBar rBar;

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_second);
          et1 = (EditText) findViewById(R.id.et1);
          et2 = (EditText) findViewById(R.id.et2);
          tv1 = (TextView) findViewById(R.id.tv1);
          tv2 = (TextView) findViewById(R.id.tv2);
          c1 = (CheckBox) findViewById(R.id.chk1);
          c2 = (CheckBox) findViewById(R.id.chk2);
          c3 = (CheckBox) findViewById(R.id.chk3);
          CheckHandler ch = new CheckHandler();
          c1.setOnCheckedChangeListener(ch);
          c2.setOnCheckedChangeListener(ch);
          c3.setOnCheckedChangeListener(ch);
          rg = (RadioGroup) findViewById(R.id.rg1);
          rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
               @Override
               public void onCheckedChanged(RadioGroup group, int checkedId) {
                    if (group.getId() == R.id.rg1) {
                         String city = null;
                         if (checkedId == R.id.chk1) {
                              city = "seoul";
                         } else if (checkedId == R.id.chk2) {
                              city = "paris";
                         } else if (checkedId == R.id.chk3) {
                              city = "london";
                         }
                         Toast.makeText(getApplicationContext(),
                                   city + " is Checked", Toast.LENGTH_SHORT).show();
                    }
               }
          });

          // 무명클래스로 TextWatchr 사용
          TextWatcher tw = new TextWatcher() {
               @Override
               public void onTextChanged(CharSequence s, int start, int before,
                         int count) {
                    tv2.setText(String.valueOf(s.length()));
               }

               @Override
               public void beforeTextChanged(CharSequence s, int start, int count,
                         int after) {
               }

               @Override
               public void afterTextChanged(Editable s) {
               }
          };
          et1.addTextChangedListener(tw);
          tButton = (ToggleButton)findViewById(R.id.toggle);
          
          // SharedPreferences에서 값이 있는지 확인
          shared = getSharedPreferences("toggleOnOff", MODE_PRIVATE);
          if(shared.getString("onoff", "").equals("on")){
               tButton.setChecked(true);
          }else if(shared.getString("onoff", "").equals("off")){
               tButton.setChecked(false);
          }          
          
          tButton.setOnClickListener(new OnClickListener() {
               // SharedPreferences의 자격을 얻는 방법
               SharedPreferences.Editor editor = shared.edit();
               
               @Override
               public void onClick(View v) {
                    if(tButton.isChecked()==true){
                         editor.putString("onoff", "on");
                    }else{
                         editor.putString("onoff", "off");
                    }
                    // SharedPreferences에서 주의사항
                    // 뒷마무리, 반드시 해줘야함
                    editor.commit();
               }
          });
          
          rBar = (RatingBar) findViewById(R.id.rBar);
          rBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
               @Override
               public void onRatingChanged(RatingBar ratingBar, float rating,
                         boolean fromUser) {
                    Toast.makeText(getApplicationContext(),
                              String.valueOf(rating) + " 별 선택 됨", Toast.LENGTH_SHORT).show();
               }
          });
     }

     public void onBtnDisplay(View v) {
          tv1.setText(et1.getText());
     }

     class CheckHandler implements OnCheckedChangeListener {
          @Override
          public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
               CheckBox ck = (CheckBox) buttonView;
               if (isChecked == true) {
                    Toast.makeText(getApplicationContext(),
                              ck.getText() + " is Checked", Toast.LENGTH_SHORT).show();
               } else {
                    Toast.makeText(getApplicationContext(),
                              ck.getText() + " is unChecked", Toast.LENGTH_SHORT).show();
               }
          }
     }
}
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork 
/BasicWidgetApp/src/com/example/basicwidgetapp/ThirdActivity.java

package com.example.basicwidgetapp;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.ToggleButton;

public class ThirdActivity extends Activity {
     ProgressBar m_circle, m_horizontal;
     boolean isRunning = false;
     SeekBar seekBar;
     TextView tvSeek;

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_third);
          m_circle = (ProgressBar) findViewById(R.id.progress1);
          m_horizontal = (ProgressBar) findViewById(R.id.progress2);
          seekBar = (SeekBar) findViewById(R.id.seek1);
          tvSeek = (TextView) findViewById(R.id.tvSeek);

          seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
               @Override
               public void onStopTrackingTouch(SeekBar seekBar) {

               }

               @Override
               public void onStartTrackingTouch(SeekBar seekBar) {

               }

               @Override
               public void onProgressChanged(SeekBar seekBar, int progress,
                         boolean fromUser) {
                    tvSeek.setText("current : "+ progress);
               }
          });
     }

     public void progressCircle(View v) {
          Log.d("ThirdActivity", "progressCircle Method Call");
          ToggleButton t = (ToggleButton) v;
          if (t.isChecked()) {
               m_circle.setVisibility(View.VISIBLE);
          } else {
               m_circle.setVisibility(View.GONE);
          }
     }

     public void progressHorizontal(View v) {
          ToggleButton t = (ToggleButton) v;
          if (t.isChecked()) {
               // 쓰레드 교착상태로 안됨
               // for (int i = 11; i < 50; i++) {
               // try {
               // Thread.sleep(1000);
               // } catch (InterruptedException e) {
               // e.printStackTrace();
               // }
               // m_horizontal.incrementProgressBy(i);
               // }

               new HorizontalThread().start();
               isRunning = true;
          } else {
               isRunning = false;
          }
     }

     class HorizontalThread extends Thread {
          @Override
          public void run() {
               int i = 0;
               while (isRunning) {
                    try {
                         Thread.sleep(1000);
                    } catch (InterruptedException e) {
                         e.printStackTrace();
                    }
                    if (i == 50) {
                         i = 0;
                         m_horizontal.setProgress(i);
                    }
                    i += 10;
                    m_horizontal.incrementProgressBy(i);
               }
          }
     }
}
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork 
/AdapterApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.adapterapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="ListViewAcitivity"></activity>
        <activity android:name="SpinnerViewAcitivity"></activity>
        <activity android:name="AutoAcitivity"></activity>
        <activity android:name="GalleryAcitivity"></activity>
        <activity android:name="GridViewAcitivity"></activity>
        <activity android:name="FlipperAcitivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork 
/AdapterApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use ListView" />

    <Button
        android:id="@+id/btnSpinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use SpinnerView" />

    <Button
        android:id="@+id/btnAuto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use AutoCompleteTextView" />

    <Button
        android:id="@+id/btnGallery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use Gallery" />

    <Button
        android:id="@+id/btnGrid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use GridView" />

    <Button
        android:id="@+id/btnFlipper"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="How to use ViewFlipper" />

</LinearLayout>
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork 
/AdapterApp/src/com/example/adapterapp/MainActivity.java

package com.example.adapterapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
     Button btnList, btnSpinner, btnAuto, btnGallery, btnGrid, btnFlipper;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          btnList = (Button) findViewById(R.id.btnList);
          btnSpinner = (Button) findViewById(R.id.btnSpinner);
          btnAuto = (Button) findViewById(R.id.btnAuto);
          btnGallery = (Button) findViewById(R.id.btnGallery);
          btnGrid = (Button) findViewById(R.id.btnGrid);
          btnFlipper = (Button) findViewById(R.id.btnFlipper);

          btnList.setOnClickListener(this);
          btnSpinner.setOnClickListener(this);
          btnAuto.setOnClickListener(this);
          btnGallery.setOnClickListener(this);
          btnGrid.setOnClickListener(this);
          btnFlipper.setOnClickListener(this);
     }

     @Override
     public void onClick(View v) {
          Button b = (Button) v;
          Intent intent = null;
          switch (b.getId()) {
          case R.id.btnList:
               intent = new Intent(getApplicationContext(), ListViewAcitivity.class);
               break;
          case R.id.btnSpinner:
               intent = new Intent(getApplicationContext(), SpinnerViewAcitivity.class);
               break;
          case R.id.btnAuto:
               intent = new Intent(getApplicationContext(), AutoAcitivity.class);
               break;
          case R.id.btnGallery:
               intent = new Intent(getApplicationContext(), GalleryAcitivity.class);
               break;
          case R.id.btnGrid:
               intent = new Intent(getApplicationContext(), GridViewAcitivity.class);
               break;
          case R.id.btnFlipper:
               intent = new Intent(getApplicationContext(), FlipperAcitivity.class);
               break;
          }
          if (intent != null) {
               startActivity(intent);
          }
     }

     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
          // Inflate the menu; this adds items to the action bar if it is present.
          getMenuInflater().inflate(R.menu.main, menu);
          return true;
     }

     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
          // Handle action bar item clicks here. The action bar will
          // automatically handle clicks on the Home/Up button, so long
          // as you specify a parent activity in AndroidManifest.xml.
          int id = item.getItemId();
          if (id == R.id.action_settings) {
               return true;
          }
          return super.onOptionsItemSelected(item);
     }

}
-----------------------------------  
###################################
4. 과제
-----------------------------------
4-1
프로젝트 문서 만들기, 프로젝트 수정해서 말씀드리기
----------------------------------- 
4-2
----------------------------------- 
4-3
----------------------------------- 
4-4
----------------------------------- 
4-5
/BasicWidgetApp/src/com/example/basicwidgetapp/SecondAcitivity.java
에서 checkBox 안됨 
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day76  (0) 2015.07.01
오픈프레임워크_Day75  (0) 2015.06.30
오픈프레임워크_Day73  (0) 2015.06.26
오픈프레임워크_Day72  (0) 2015.06.25
오픈프레임워크_Day71  (0) 2015.06.24
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* Widgets -> AWT때의 Controll
----------------------------------- 
* TextWatcher - 입력하는 글자 감시(인터페이스)

http://developer.android.com/reference/android/text/TextWatcher.html
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 디자인 설정 중 화면 돌림과 Show Structure

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

* 프로젝트 생성 - /BasicWidgetApp

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

* 폴더 생성 및 이미지 복사

/BasicWidgetApp/res/drawable
resource.zip 다운 받고 모든 파일을 넣음
-> 넣은 파일들 때문에 문제가 생겨서 문제가 되는 파일들 삭제
-> Console에 나오는 문제 파일들 삭제
----------------------------------- 
* 가상 에뮬레이터의 키보드 설정

Hardware keyboard present

----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork 
/LayoutApp/res/layout/activity_grid.xml

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="4" >

    <TextView
        android:layout_columnSpan="4"
        android:layout_gravity="center_horizontal"
        android:text="Email Setup"
        android:textSize="32sp" />

    <TextView
        android:layout_columnSpan="4"
        android:layout_gravity="left"
        android:text="You can configure email in just a few steps : "
        android:textSize="16dp" />

    <TextView
        android:layout_gravity="right"
        android:text="Email Addess : " />

    <EditText android:ems="10" />

    <TextView
        android:layout_column="0"
        android:layout_gravity="right"
        android:text="Password : " />

    <EditText android:ems="10" />

    <Space
        android:layout_column="0"
        android:layout_columnSpan="3"
        android:layout_gravity="fill"
        android:layout_row="4" />

    <Button
        android:layout_row="5"

        android:text="Next" />

</GridLayout>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork 
/BasicWidgetApp/res/layout/activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbarStyle="outsideOverlay" >

    <LinearLayout
        android:id="@+id/layoutLinear"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <ImageButton
            android:id="@+id/imgBtn1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/duckling" />

        <ImageView
            android:layout_width="150dp"
            android:layout_height="100dp"
            android:background="#00FFFF"
            android:src="@drawable/sample_0" />

        <ImageView
            android:id="@+id/img2"
            android:layout_width="300dp"
            android:layout_height="300dp" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="moveSecond"
            android:text="Next" />
    </LinearLayout>

</ScrollView>
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork 
/BasicWidgetApp/src/com/example/basicwidgetapp/MainActivity.java

package com.example.basicwidgetapp;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          ImageButton imgBtn1 = (ImageButton) findViewById(R.id.imgBtn1);
          imgBtn1.setOnClickListener(new OnClickListener() {
               @Override
               public void onClick(View v) {
                    ImageView imgView = (ImageView) findViewById(R.id.img2);

                    // 이미지를 화면에 보여주는 방법 1
                    // imgView.setImageResource(R.drawable.image);

                    // 이미지를 화면에 보여주는 방법 2
                    // dupilcated 된 메서드 말고, getDrawable를 최신으로 사용하면 안드로이드 버전이 안맞음
                    // imgView.setImageDrawable(getResources().getDrawable(R.drawable.image));

                    // 이미지를 화면에 보여주는 방법 3
                    // 이미지를 보관해 놓고 보여주는 방법
                    // 이렇게 해놓으면 유연성있게 사용 가능
                    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                              R.drawable.image);
                    imgView.setImageBitmap(bitmap);
                    imgView.setBackgroundColor(Color.YELLOW);
                    imgView.setPadding(10, 10, 10, 10);
               }
          });

          // 이미지 뷰(XML에서 디자인할 것을)를 하나 만들기
          // getApplicationContext(), getBaseContext() 과 같은 부모의 주소를 넣어 준다
          // 또는 MainActivity.this 가 가능하나 좀 더 안전한 방법 사용
          ImageView newImg = new ImageView(getApplicationContext());
          newImg.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT));
          newImg.setMaxHeight(500);
          newImg.setMaxWidth(500);
          newImg.setImageResource(R.drawable.desert);

          LinearLayout layout = (LinearLayout) findViewById(R.id.layoutLinear);
          layout.addView(newImg, 3);
     }

     public void moveSecond(View v) {
          Intent intent = null;
          intent = new Intent(MainActivity.this, SecondAcitivity.class);
          if (intent != null) {
               startActivity(intent);
          }
     }
}
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork 
/BasicWidgetApp/src/com/example/basicwidgetapp/SecondAcitivity.java

package com.example.basicwidgetapp;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class SecondAcitivity extends Activity {
     EditText et1, et2;
     TextView tv1, tv2;

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_second);
          et1 = (EditText) findViewById(R.id.et1);
          et2 = (EditText) findViewById(R.id.et2);
          tv1 = (TextView) findViewById(R.id.tv1);
          tv2 = (TextView) findViewById(R.id.tv2);

          // 무명클래스로 TextWatchr 사용
          TextWatcher tw = new TextWatcher() {
               @Override
               public void onTextChanged(CharSequence s, int start, int before,
                         int count) {
                    tv2.setText(String.valueOf(s.length()));
               }

               @Override
               public void beforeTextChanged(CharSequence s, int start, int count,
                         int after) {
               }

               @Override
               public void afterTextChanged(Editable s) {
               }
          };

          et1.addTextChangedListener(tw);
     }

     public void onBtnDisplay(View v) {
          tv1.setText(et1.getText());
     }
}
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork 
/BasicWidgetApp/res/layout/activity_second.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- autotext : 자동 철자 교정 기능 사용여부 (true, false) -->
    <!-- capitalize : 입력된 텍스트의 첫번째 글자를 대문자로 자동변경 -->
    <!-- numeric : 숫자만 입력 가능 -->
    <!-- digits : 특정 데이터만 입력 가능 -->
    <!-- ... -->

    <EditText
        android:id="@+id/et1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Input Here!..."
        android:maxLength="30"
        android:maxWidth="200sp"
        android:singleLine="true"
        android:textColor="#FF0000FF"
        android:textStyle="bold|italic" />

    <EditText
        android:id="@+id/et2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:digits="abc"
        android:hint="Input Here!..."
        android:maxWidth="200sp"
        android:textColor="#FF0000FF" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onBtnDisplay"
        android:text="EditText Content Display" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <CheckBox
            android:id="@+id/chk1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Student" />

        <CheckBox
            android:id="@+id/chk2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Salaryman" />

        <CheckBox
            android:id="@+id/chk3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Teacher" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <RadioGroup
            android:id="@+id/rg1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <RadioButton
                android:id="@+id/rdo1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="seoul" />

            <RadioButton
                android:id="@+id/rdo2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="paris" />

            <RadioButton
                android:id="@+id/rdo3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="london" />
        </RadioGroup>
    </LinearLayout>

    <ToggleButton
        android:id="@+id/toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOff="Turn off..."
        android:textOn="Turn on..." />

</LinearLayout>
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day75  (0) 2015.06.30
오픈프레임워크_Day74  (0) 2015.06.29
오픈프레임워크_Day72  (0) 2015.06.25
오픈프레임워크_Day71  (0) 2015.06.24
오픈프레임워크_Day70  (0) 2015.06.23
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* 프로젝트를 관리해주는 툴
Maven - 별도 라이브러리를 복사하지 않아도 됨
Gradle - 최신 트랜드, 프로젝트 관리
----------------------------------- 
* TabLayout 대신에 FragmentLayout을 권장
----------------------------------- 
* TableLayout
한개의 View가 하나의 열이 됨, 따로 없음
----------------------------------- 
* GridLayout은 TableLayout을 보완한 Layout
----------------------------------- 
* GridLayout 참고 블로그 
http://android-developers.blogspot.kr/2011/11/new-layout-widgets-space-and-gridlayout.html
-----------------------------------  
###################################
2. 설정 및 그 밖에
-----------------------------------
* 안드로이드 스튜디오 설치
안드로이드 스튜디오가 인텔리제이(IntelliJ) 엔진을 쓰고 있음
----------------------------------- 
* 예전 버전 지원하는 라이브러리, 사용법
~\study\android-sdk\extras\android\support
TabActivity 사용하려는데 문제가 발생
activity_tab.xml에 ID를 주는데 문제였음

하지만 실제로 필요한 경우에는 Build Path에서
라이브러리 추가하는데, GridLayout 같은 경우 아래와 같은 경로로 찾는다
~\study\android-sdk\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat.jar
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork 
/LayoutApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.layoutapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="LinearActivity" >
        </activity>
        <activity android:name="RelativeActivity" >
        </activity>
        <activity android:name="FrameActivity" >
        </activity>
        <activity android:name="TabActivitiy" >
        </activity>
        <activity android:name="Sub1Activity" >
        </activity>
        <activity android:name="Sub2Activity" >
        </activity>
        <activity android:name="Sub3Activity" >
        </activity>
        <activity android:name="TableActivity" >
        </activity>
        <activity android:name="GridActivity" >
        </activity>
    </application>

</manifest>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/MainActivity.java

package com.example.layoutapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          Button btnLinear = (Button) findViewById(R.id.btnLinear);
          Button btnRelative = (Button) findViewById(R.id.btnRelative);
          Button btnFrame = (Button) findViewById(R.id.btnFrame);
          Button btnTab = (Button) findViewById(R.id.btnTab);
          Button btnTable = (Button) findViewById(R.id.btnTable);
          Button btnGrid = (Button) findViewById(R.id.btnGrid);

          btnLinear.setOnClickListener(this);
          btnRelative.setOnClickListener(this);
          btnFrame.setOnClickListener(this);
          btnTab.setOnClickListener(this);
          btnTable.setOnClickListener(this);
          btnGrid.setOnClickListener(this);
     }

     @Override
     public void onClick(View v) {
          Intent intent = null;
          switch (v.getId()) {
          case R.id.btnLinear:
               intent = new Intent(MainActivity.this, LinearActivity.class);
               break;
          case R.id.btnRelative:
               intent = new Intent(MainActivity.this, RelativeActivity.class);
               break;
          case R.id.btnFrame:
               intent = new Intent(MainActivity.this, FrameActivity.class);
               break;
          case R.id.btnTab:
               intent = new Intent(MainActivity.this, TabActivitiy.class);
               break;
          case R.id.btnTable:
               intent = new Intent(MainActivity.this, TableActivity.class);
               break;
          case R.id.btnGrid:
               intent = new Intent(MainActivity.this, GridActivity.class);
               break;
          }
          if (intent != null) {
               startActivity(intent);
          }
     }

}
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/activity_frame.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/tulips"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="FrameLayout Test"
        android:textSize="20dp" />
    <!--
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:onClick="showImage"
        android:text="Show Image" />
    -->

    <Button
        android:id="@+id/btnShow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Show Image"/>
   
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ImageView
            android:id="@+id/img1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/desert"
            android:visibility="visible" />

        <ImageView
            android:id="@+id/img2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/penguins"
            android:visibility="invisible" />
    </FrameLayout>

</LinearLayout>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/FrameActivity.java

package com.example.layoutapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class FrameActivity extends Activity {
     private Button btnShow;
     private ImageView img1, img2;
     private boolean toggle = true;

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_frame);
         img1 = (ImageView)findViewById(R.id.img1);
         img2 = (ImageView)findViewById(R.id.img2);        
         btnShow = (Button)findViewById(R.id.btnShow);
         btnShow.setOnClickListener(new OnClickListener() {
               @Override
               public void onClick(View v) {
                    toggle = !toggle;
                    if(toggle == true){
                         img1.setVisibility(View.VISIBLE);
                         img2.setVisibility(View.INVISIBLE);
                    }else{
                         img1.setVisibility(View.INVISIBLE);
                         img2.setVisibility(View.VISIBLE);
                    }    
               }
          });
     }
    
     public void showImage(View v){
//          Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_SHORT).show();
          toggle = !toggle;
          if(toggle == true){
               img1.setVisibility(View.VISIBLE);
               img2.setVisibility(View.INVISIBLE);
          }else{
               img1.setVisibility(View.INVISIBLE);
               img2.setVisibility(View.VISIBLE);
          }    
     }

}
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/activity_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="TabLayout Test"
        android:textSize="20dp" />

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>
    </TabHost>

</LinearLayout>
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/TabActivitiy.java

package com.example.layoutapp;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;

public class TabActivitiy extends TabActivity{

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_tab);
        
         TabHost tabhost = getTabHost();// TabHost의 주소를 가져옴
         TabHost.TabSpec spec = tabhost.newTabSpec("tab01");
         Intent intent = new Intent(getApplicationContext(),Sub1Activity.class);
         spec.setContent(intent);
         spec.setIndicator("First Tab");// tab 모양 지정
         tabhost.addTab(spec);
        
         spec = tabhost.newTabSpec("tab02");
         intent = new Intent(getApplicationContext(),Sub2Activity.class);
         spec.setContent(intent);
         spec.setIndicator("Second Tab");// tab 모양 지정
         tabhost.addTab(spec);
        
         spec = tabhost.newTabSpec("tab03");
         intent = new Intent(getApplicationContext(),Sub3Activity.class);
         spec.setContent(intent);
         spec.setIndicator("Third Tab");// tab 모양 지정
         tabhost.addTab(spec);
        
         tabhost.setCurrentTab(2);// 처음에 보여질 tab 설정, 0부터 시작
     }

}
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/tab_sub1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ff0000cc"
        android:gravity="center"
        android:text="First Page"
        android:textColor="#ffffffff"
        android:textSize="20dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="First Button"
        android:textStyle="bold" />

</LinearLayout>
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/tab_sub2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ff0000cc"
        android:gravity="center"
        android:text="Second Page"
        android:textColor="#ffffffff"
        android:textSize="20dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Second Button"
        android:textStyle="bold" />

</LinearLayout>
----------------------------------- 
3-9 
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/tab_sub3.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ff0000cc"
        android:gravity="center"
        android:text="Third Page"
        android:textColor="#ffffffff"
        android:textSize="20dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Third Button"
        android:textStyle="bold" />

</LinearLayout>
----------------------------------- 
3-10 
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/Sub1Activity.java

package com.example.layoutapp;

import android.app.Activity;
import android.os.Bundle;

public class Sub1Activity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.tab_sub1);
     }

}
----------------------------------- 
3-11 
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/Sub2Activity.java

package com.example.layoutapp;

import android.app.Activity;
import android.os.Bundle;

public class Sub2Activity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.tab_sub2);
     }

}
----------------------------------- 
3-12 
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/Sub3Activity.java

package com.example.layoutapp;

import android.app.Activity;
import android.os.Bundle;

public class Sub3Activity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.tab_sub3);
     }

}
----------------------------------- 
3-13 
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/TableActivity.java

package com.example.layoutapp;

import android.app.Activity;
import android.os.Bundle;

public class TableActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_table);
     }

}
----------------------------------- 
3-14 
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/activity_table.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="TableLayout Test"
        android:textSize="20dp" />

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="0,1,2" >

        <TableRow>

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="First Button" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Second Button" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Third Button" />
        </TableRow>

        <TableRow android:background="#00AA00" >

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Forth Button" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Fifth Button" />

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Sixth Button" />
        </TableRow>

        <TableRow>

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_span="3"
                android:text="Seventh Button" />
        </TableRow>
    </TableLayout>

</LinearLayout>
----------------------------------- 
3-15 
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/GridActivity.java

package com.example.layoutapp;

import android.app.Activity;
import android.os.Bundle;

public class GridActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_grid);
     }

}
----------------------------------- 
3-16 
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/activity_grid.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="GridLayout Test"
        android:textSize="20sp" />
   
</LinearLayout>
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day74  (0) 2015.06.29
오픈프레임워크_Day73  (0) 2015.06.26
오픈프레임워크_Day71  (0) 2015.06.24
오픈프레임워크_Day70  (0) 2015.06.23
오픈프레임워크_Day69  (0) 2015.06.22
,

### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* View - Activity 안에 들어가는 모든 요소는 View의 자식

http://developer.android.com/reference/android/view/View.html
위 사이트에서 View 메서드들을 확인함

View Group을 확인
http://developer.android.com/reference/android/view/ViewGroup.html
----------------------------------- 
Layout
http://developer.android.com/guide/topics/ui/declaring-layout.html

RelativeLayout은 상대적으로 배치를 해주는 역할
FragmentLayout은 한 화면에 넓은 화면에 메뉴와 내용을 같이 보여줌
----------------------------------- 
* 화면이동
Intent, 인텐트 이용
화면이동시 무언가를 들고갈 때 사용
화면이동을 어디로 할지에 대해서 정할 수 있음
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성 
/LayoutApp
WorkSpace : ~\study\AndroidWork
-----------------------------------
* Activity 추가 방법

안드로이드 프로젝트 모든 환경설정을 담당
/LayoutApp/AndroidManifest.xml

해당 내용을 추가 하면서 클래스를 만들어야하는데 쉬운 방법으로 해보겠음








/LayoutApp/src/com/example/layoutapp/LinearActivity.java
생성됨


/LayoutApp/res/layout 에 파일 추가




xml파일은 소문자만 가능



/LayoutApp/res/layout/activity_linear.xml
생성됨
----------------------------------- 
* Activity 추가 방법 2 - 수동

클래스 만듬
/LayoutApp/src/com/example/layoutapp/RelativeActivity.java


만들어 놓은 것을 신고해야함

/LayoutApp/AndroidManifest.xml
아래 태그를 추가
<activity android:name="RelativeActivity"></activity>

/LayoutApp/src/com/example/layoutapp/RelativeActivity.java
안에 onCreate 메서드 오버라이딩

/LayoutApp/res/layout/activity_relative.xml
xml파일은 /LayoutApp/res/layout/activity_main.xml 복사함


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

* XML Values File 추가


----------------------------------- 
* 폴더 만들고 이미지 넣음, 소문자 여야함
/LayoutApp/res/drawable
/LayoutApp/res/drawable/desert.jpg
/LayoutApp/res/drawable/penguins.jpg
/LayoutApp/res/drawable/tulips.jpg 
-----------------------------------  
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/activity_main.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
     
    <Button 
        android:text="LinearLayout"
        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:id="@+id/btnLinear"/>"
    
    <Button 
        android:text="RelativeLayout"
        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:id="@+id/btnRelative"/>
    
    <Button 
        android:text="FrameLayout"
        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:id="@+id/btnFrame"/>
    
    <Button 
        android:text="TableLayout"
        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:id="@+id/btnTable"/>
    
    <Button 
        android:text="GridLayout"
        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:id="@+id/btnGrid"/>
</LinearLayout>
----------------------------------- 
3-2
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/MainActivity.java

package com.example.layoutapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          
          Button btnLinear = (Button)findViewById(R.id.btnLinear);
          Button btnRelative = (Button)findViewById(R.id.btnRelative);
          Button btnFrame = (Button)findViewById(R.id.btnFrame);
          Button btnTable = (Button)findViewById(R.id.btnTable);
          Button btnGrid = (Button)findViewById(R.id.btnGrid);
          
          btnLinear.setOnClickListener(this);
          btnRelative.setOnClickListener(this);
          btnFrame.setOnClickListener(this);
          btnTable.setOnClickListener(this);
          btnGrid.setOnClickListener(this);
     }
     
     @Override
     public void onClick(View v) {
          Intent intent = null;
          switch(v.getId()){
          case R.id.btnLinear:
               intent = new Intent(MainActivity.this, LinearActivity.class);
               break;
          case R.id.btnRelative:
               intent = new Intent(MainActivity.this, RelativeActivity.class);
               break;
          case R.id.btnFrame:
               break;
          case R.id.btnTable:
               break;
          case R.id.btnGrid:
          }
          if(intent != null)
               startActivity(intent);
     }
}
----------------------------------- 
3-3
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/activity_linear.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="LinearLayout Test"
        android:textSize="20sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#AA0000"
            android:text="red" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#00AA00"
            android:text="green" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#0000AA"
            android:text="blue" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#AAAA00"
            android:text="yellow" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical" >

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="First" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Second" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Third" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Forth" />
    </LinearLayout>

</LinearLayout>
----------------------------------- 
3-4
WorkSpace : ~\study\AndroidWork
/LayoutApp/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.layoutapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="LinearActivity"></activity>
        <activity android:name="RelativeActivity"></activity>
    </application>

</manifest>
----------------------------------- 
3-5 
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/LinearActivity.java

package com.example.layoutapp;

import android.app.Activity;
import android.os.Bundle;

public class LinearActivity extends Activity {

     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_linear);
     }

}
----------------------------------- 
3-6
WorkSpace : ~\study\AndroidWork
/LayoutApp/src/com/example/layoutapp/RelativeActivity.java

package com.example.layoutapp;

import android.app.Activity;
import android.os.Bundle;

public class RelativeActivity extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_relative);
     }
}
----------------------------------- 
3-7 
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/layout/activity_relative.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="RelativeLayout Test"
        android:textSize="20sp"
        />

    <TextView
        android:id="@+id/tvTypeHere"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tvTitle"
        android:layout_marginTop="10dp"
        android:text="Type here : "
        />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tvTitle"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/tvTypeHere"
        android:id="@+id/etTypeHere"
         />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Cancel"
        android:layout_below="@id/etTypeHere"
        android:layout_alignParentRight="true"
        android:id="@+id/btnCancle"
        />
   
    <Button
        android:text="OK"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/etTypeHere"
        android:layout_toLeftOf="@id/btnCancle"
        />
    
    <Spinner
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:entries="@array/times"
        android:layout_below="@id/btnCancle"
        android:layout_alignParentLeft="true"
        android:id="@+id/sp1"
        />   
        
    <Spinner
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:entries="@array/dates"
        android:layout_below="@id/btnCancle"
        android:layout_toRightOf="@id/sp1"
        />   
</RelativeLayout>
----------------------------------- 
3-8 
WorkSpace : ~\study\AndroidWork
/LayoutApp/res/values/arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="times">
        <item>12:12 pm</item>
        <item>12:12 오후</item>
        <item>pm 12:12</item>
    </string-array>
   
    <string-array name="dates">
        <item>2015.06.24. 화요일</item>
        <item>6.24.2015.tue</item>
        <item>2015/06/15</item>
        <item>Tue 2015/06/15</item>
    </string-array>
</resources>
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day73  (0) 2015.06.26
오픈프레임워크_Day72  (0) 2015.06.25
오픈프레임워크_Day70  (0) 2015.06.23
오픈프레임워크_Day69  (0) 2015.06.22
오픈프레임워크_Day66  (0) 2015.06.17
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* Android 메시지 박스 -> Toast 메시지 박스
----------------------------------- 
* 이벤트 처리 방법 3가지

1. 직접 구현
2. 내부 클래스
3. 익명 클래스, 무명 클래스
4. 간편하게 쓰는 방법 - 메서드 만드는 조건이 있음
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 안드로이드를 위한 WorkSpace
~\study\AndroidWork
----------------------------------- 
* 안드로이드를 위한 새로운 Eclipse 실행


----------------------------------- 
* 이클립스와 SDK 연결 => ADT 설치

http://developer.android.com/sdk/installing/installing-adt.html

Download the ADT Plugin
의 내용으로 설치함


-----------------------------------
* 이클립스 플러그인 최신으로 업데이트


----------------------------------- 
* 이클립스 플러그인 관리


-----------------------------------
* 설치 내용 확인



만약 다른데서 가져오거나 가져갈때는 아래 부분에서 SDK 위치를 변경해 줘야함 


----------------------------------- 
* 추가 설정




바로위 설정을 하면  



아이콘이 생기고 위 두 아이콘이 아래 두 프로그램을 실행시키는 아이콘
~\study\android-sdk\SDK Manager.exe
~\study\android-sdk\AVD Manager.exe

----------------------------------- 
* 프로젝트 생성 /FirstApp




새 프로젝트 할 때 유의 사항

Application은 화면에 보여질 이름
프로젝트 이름은 내가 개발할 때 이름
반드시 패키지 이름을 넣어야함
패키지 이름은 절대 중복되어서는 안됨
마켓에 올려도 유지보수 할려면 
패키지 이름은 고유한 이름이 되어야함

젤리빈을 최하 버전으로 설정
L Preview -> Lolly Pop 체험 버전









에러
This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in

아래와 같이 버전을 낮춤






위 설정이 맞지 않아서 아래로 변경





에뮬레이터에 내가만든 어플 넣기 
 


----------------------------------- 
* 에뮬에 화면 전환 단축키

Ctrl + F11 
----------------------------------- 
* 에뮬에서 취소
ESC
----------------------------------- 
* 설치한 앱 제거 -> 기존 스마트폰에서 처럼 제거
-----------------------------------  
* 에뮬레이터에 전화 걸기 - 에뮬레이터 디버깅






-----------------------------------  
* 실제 안드로이드 폰에 연결
스마트폰 드라이버가 제대로 연결되어 있으면 실행시 선택 할 수 있음

개인 안드로이드 폰은 "디버깅 모드 허용" 으로 변경
-----------------------------------  
* 에뮬레이터 Intel Atom 문제 해결

에러 메시지
emulator: ERROR: x86 emulation currently requires hardware acceleration!
Please ensure Intel HAXM is properly installed and usable.
CPU acceleration status: HAX kernel module is not installed!


아래 프로그램을 실행해서 설치
~\study\android-sdk\extras\intel\Hardware_Accelerated_Execution_Manager\intelhaxm-android.exe
----------------------------------- 
* 프로젝트 생성 /SecondApp


 
-----------------------------------  
* 폴더 설명

리소스
/프로젝트명/res


이미지를 저장하는 폴더
/프로젝트명/res/drawable*


전체 틀을 만들어줌
/프로젝트명/res/layout
xml이 디자인을 처리




    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

여기서 "@"는 아래 파일에 hello_world 참조한다는 의미
/프로젝트명/res/values/strings.xml
<string name="hello_world">Hello world!</string>

에뮬레이터에서는 가능하면 XML에 한글을 쓰지 말아라


아래와 같이 변경
/SecondApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello! Mr.Monkey~~" />
</LinearLayout>


버튼을 추가 하기

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello! Mr.Monkey~~" />

    <Button android:text="First Button"
          android:layout_width="100dp"
          android:layout_height="100dp"
          android:id="@+id/btn1"
          />
   
    <Button android:text="Second Button"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:id="@+id/btn2"
          />
   
    <Button android:text="Third Button"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:id="@+id/btn3"
          />
   
    <Button android:text="Forth Button"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:id="@+id/btn4"
          />
   
</LinearLayout>

이벤트 처리는 JAVA 클래스에서 함

----------------------------------- 
* 참조할 사이트

https://developer.android.com/guide/components/fundamentals.html
http://www.kandroid.org/guide/basics/what-is-android.html 

-----------------------------------  
* 컴퍼넌트 필수 속성

크기를 정해줘야함. 반드시!

android:layout_width="wrap_content"
android:layout_height="wrap_content"
-----------------------------------  
* 리소스와 자바에서 쓸 수 있게 연결 해주는 클래스

/프로젝트명/gen/com/example/secondapp/R.java

컴퍼넌트에 android:id를 주면 생성이 됨
-----------------------------------  
* 리플랙션 -> 실행중에 자바코드를 구체화 시켜주는 것
-----------------------------------  
* Android Java 코드 부분

/프로젝트명/src

Main 클래스
/프로젝트명/src/com/example/패키지명/MainActivity.java
-----------------------------------  
-----------------------------------  
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
~\study\AndroidWork 
/SecondApp/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello! Mr.Monkey~~" />

    <Button android:text="First Button"
          android:layout_width="100dp"
          android:layout_height="100dp"
          android:id="@+id/btn1"
          />
   
    <Button android:text="Second Button"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:id="@+id/btn2"
          />
   
    <Button android:text="Third Button"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:id="@+id/btn3"
          />
   
    <Button android:text="Forth Button"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:onClick="forthHandler"
          />
   
</LinearLayout>
----------------------------------- 
3-2
~\study\AndroidWork
/SecondApp/src/com/example/secondapp/MainActivity.java

package com.example.secondapp;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends Activity implements OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        // XML에서 만든 디자인을
        // 실제로 보여질 수 있게 만들어주는 메서드
        // setContentView()
        setContentView(R.layout.activity_main);
       
        // XML에 디자인된 버튼을 가져오는 방법
        Button btn1 = (Button)findViewById(R.id.btn1);
        Button btn2 = (Button)findViewById(R.id.btn2);
        Button btn3 = (Button)findViewById(R.id.btn3);
       
        SecondButtonHandler secondListener = new SecondButtonHandler();
       
        // 이벤트를 처리할 수 있는 4가지 방법이 있음
        // 기존에 배운 방식은 3가지
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(secondListener);
        btn3.setOnClickListener(new OnClickListener() {              
               @Override
               public void onClick(View v) {
                    // TODO 세번째 이벤트 처리 방식, 무명 클래스
                    Toast.makeText(getApplicationContext(),
                              "Third Button is pressed",
                              Toast.LENGTH_SHORT).show();
               }
          });
       
    }

     @Override
     public void onClick(View v) {
          // TODO 첫번째 이벤트 처리 방식, 직접 구현
         
          // getApplicationContext()
          // 항상 실행하고자하는 프로그램의 주소값을 리턴
         
          // 반드시 마지막에 .show() 해야함
         
          Toast.makeText(getApplicationContext(),
                    "Frist Button is pressed",
                    Toast.LENGTH_LONG).show();
     }
    
     class SecondButtonHandler implements OnClickListener{
          @Override
          public void onClick(View v) {
               // TODO 두번째 이벤트 처리 방식, 내부클래스
               Toast.makeText(getApplicationContext(),
                         "Second Button is pressed",
                         Toast.LENGTH_SHORT).show();
          }
     }
    
    
     // 반드시 public void, 반드시 매개변수 View가 있어야함
     public void forthHandler(View v){
          // TODO 네번째 이벤트 처리 방식, 간이용 방식, 간단하게 쓸 때
          Toast.makeText(getApplicationContext(),
                    "Forth Button is pressed",
                    Toast.LENGTH_SHORT).show();
     }
}


----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day72  (0) 2015.06.25
오픈프레임워크_Day71  (0) 2015.06.24
오픈프레임워크_Day69  (0) 2015.06.22
오픈프레임워크_Day66  (0) 2015.06.17
오픈프레임워크_Day65  (0) 2015.06.16
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################

1. 이론 및 정보

-----------------------------------
* 안드로이드(Android) - @@@ start @@@ 시작

1. 앱(App)

1) 네이티브 앱
     - 순수하게 안드로이드에서 제공하는 앱

2) 모바일 앱(웹앱)
     - 안드로이드의 도움을 거의 받지 않음, 웹 브라우져
     - jsp 책 37페이지 , 메타태그를 이용해서 쉽게 모바일에 맞춤
     - 스마트폰에서도 볼 수 있게 배려함

3) 하이브리드 앱
     - 네이티브와 모바일을 합쳐서 사용

2. Tool
1) Eclipse plugin
2) Motodev 
3) Android Studio(Google 제공)
4) Visual Studio 2013 

3. 기본 Runtime 환경
     - Dalvik (JVM의 소형화) -> 5.0 부터는 새로운 방식으로 운영 : JIT(Just In Time) 컴파일러 사용 - 실시간 컴파일
     - 롤리팝부터 ART 사용 : AOT(Ahead Of Time) 컴파일러 사용 - 미리 컴파일 해놓음

4. 4대 컴퍼넌트
(1) Activity
     - 화면상에 하나의 화면

(2) Service
     - Activity의 형제 : 하는일 기능이 똑같음
     - 차이점 : 눈에 안보임(Background Service), Activity는 눈에 보임
     - 거의 종료되지 않음, 종료가 되어도 새로 만들어짐

(3) Broadcast Receiver
     - 모든 이벤트 확인????????

(4) Content Provider
     - 다른 앱의 내용을 재활용
----------------------------------- 
* Eclipse, SDK를 연결하는 방법
1) 직접 Eclipse에서 플러그인으로 다운
2) 직접 별도의 파일로 다운로드 받아서 쓸 수 있음

이번에는 기존 이클립스 버전에 새로 압축을 푼 이클립스를 사용 할 예정
폴더 명은 AndroidEclipse

android.com 설치 파일 받은 곳에서 
Eclipse with ADT를 받을 예정임
이것이 이클립스와 SDK의 중간 역할을 함

Installing the ADT Plugin 클릭(https://developer.android.com/sdk/installing/installing-adt.html)

1. 이 사이트를 등록해서 자동으로 최신버전을 받게 하는 방법(간혹 안되는 경우가 있음)\
     - https://dl-ssl.google.com/android/eclipse/
     - http://dl-ssl.google.com/android/eclipse/

https가 잘 안되면 http로 하는데 이것마저 안되면 두번째 방법

2. ADT-23.0.6.zip 를 다운 받아서 설치

----------------------------------- 
* 안드로이드 개발자 사이트

developer.android.com

Trainnig 
----------------------------------- 
* 마켓에 올리는 방법 나옴

developer.android.com/distribute/googleplay/developer-console.html

앱을 판매할 수 있게 도와줌
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* 안드로이드 공식 사이트

android.com

맨 오른쪽 상단 ... 클릭
Android SDK 클릭
sdk tools only 에서 아래 Window Installer 다운
installer_r24.3.3-windows.exe

JAVA에 JDK가 필요한 것처럼
Android를 만드는데 필요한 것은 SDK
----------------------------------- 
* 강사님 서버 JNDI 지원
jdbc/1503_1
...

web.xml에 ref를 걸 필요없음
소스 코드에만 쓰면 됨
----------------------------------- 
* 안드로이드 설치














----------------------------------- 
* 내 컴퓨터가 가상화 기능을 제공하나?
안드로이드 에뮬레이터가 빨리 되는데 도움이 되는 기능을 체크

"구글에서 CPU 가상화 지원"으로 검색

downloadcenter.intel.com/download/7838
pidenu41.msi 를 다운 및 설치, 확인
----------------------------------- 
* 자신 스마트폰 USB 드라이버 설치

local.sec.samsung.com/comLocal/support/down/kies_main.do?kind=usb
SAMSUNG_USB_Driver_for_Mobile_Phones.zip
-----------------------------------  
* 가능하면 자신의 기기로 사용해라. 느리니까
-----------------------------------  
* 안드로이드 스튜디오 미리 다운
-----------------------------------   
###################################
3. 소스코드 또는 실습 
-----------------------------------
----------------------------------- 
###################################
4. 과제
-----------------------------------
4-1
프로젝트 문서 제출하기
----------------------------------- 
4-2
이력서 제출하기
----------------------------------- 
4-3
안드로이드 프로젝트 7월 10일 
팀별 발표는 필수, 개인 발표는 선택
----------------------------------- 
4-4
스프링으로 게시판을 만들 수 있는 정도
----------------------------------- 
4-5
기존의 프로젝트를 계속 할 거라면
final에 하이브리드 앱을 만들고
개인용 안드로이드 앱을 만든다
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day71  (0) 2015.06.24
오픈프레임워크_Day70  (0) 2015.06.23
오픈프레임워크_Day66  (0) 2015.06.17
오픈프레임워크_Day65  (0) 2015.06.16
오픈프레임워크_Day64  (0) 2015.06.15
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* eclipse 에서 git 사용법 익히기
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* git을 테스트 해보기 위한 프로젝트 생성
/Test2WebProject
/Test2WebProject/WebContent/index.html

서버로 올리기 전에 로컬 레파지토리에 있어야함



상위 폴더에 저장소 만들기를 체크


체크를 안하면 자신이 선택을 할 수 있음
현재 프로젝트 위에 만들수도 있고 자신이 폴더를 선택 할 수 있음



들어가서 프로젝트 클릭 후 create repository 클릭하면 레파지토리가 만들어 짐
또한 git init이 자동으로 됨


finish 버튼으로 끝냄


프로젝트에 변화된 내용을 확인



서버에 올리기 위해서 서버에 레파지토리 하나 만듬

README.md 파일 만들었음. 
해당 파일은 웹에서 수정 가능하고 HTML 태그가 먹힘

----------------------------------- 
* 같이 협업을 할꺼라면 반드시 아이디 패스워드가 공유가 되어야 함
----------------------------------- 
* 서버에 올리기



commit은 로컬에 저장, commit and push

commit and push 선택



서버로 올릴때 어떤 branch로 올릴 것인가?
지금은 Add All Branches Spec을 클릭


Next


Finish


OK

서버에서 수정을 해서 commit 안됨
----------------------------------- 
* 서버에서 다운





에러가 남







서버 등록 끝



README 파일 생성 확인


프로젝트 우클릭 UTF-8로 변경

----------------------------------- 
* 서버에 업로드



commit and push


서버에 저장 된 내용 확인

----------------------------------- 
* 다른 팀원이 다른 기능을 추가 한다고 가정하고 branch 연습



현재 master와 board가 같은 곳을 가리키고 있음
하지만 두 갈래로 나뉠 수 있게 됨

----------------------------------- 
* 팀원이라는 가정하고 새로 받는 상황
이클립스에서 프로젝트를 삭제함

메뉴 - Import








----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
-----------------------------------


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day70  (0) 2015.06.23
오픈프레임워크_Day69  (0) 2015.06.22
오픈프레임워크_Day65  (0) 2015.06.16
오픈프레임워크_Day64  (0) 2015.06.15
오픈프레임워크_Day63  (0) 2015.06.12
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------


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

* branch - 포인터

기본 뼈대는 master

협업을 한다고 가정을 할 때
가지를 하나 만들어 준다(branch)
그럼 가지들과 master이 서로 간섭없이 작업 가능
그래서 안전하고 독립적임

또는 버그를 고치기 위한 따로 branch라고 할 수 있음

git을 제외한 다른 형상관리는 복사를 해서 사용했음

git은 소스는 무줘건 하나, 추가된 내용만 별도로 보관
그래서 git에서 branch는 포인터 역할임 
branch에 부담이 없음

git은 소스를 델타로 보관? 하는게 아니라 스냅샷으로 가지고 있음

나중에 Merge를 하기 전까지는 그냥 branch를 지워도 됨
그래서 합치는 것은 Merge를 하면 됨

팀원들이 할 작업을 branch로 나눠주면 됨


master는 마지막에 commit한 주소를 가리키고 있음
현재 작업하고 있는 주소

Head라는 포인터를 통해서 어떤 branch에서 작업 중인지 확인

branch로 작업 하던 중에 어떻게 합칠까?

서로 다른 branch 합칠때는 공통의 조상을 기준으로 합친다

3-way-Merge => 공통의 조상으로 인해 서로 다른 두 자식이 합쳐진다

----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1

새로운 프로젝트 만들고 아래 파일들 생성

~\GitWork\Test2Project\LICENCE.txt
~\GitWork\Test2Project\README
~\GitWork\Test2Project\test.jsp


jhta@L4-01 /F/study/GitWork/Test2Project
$ git init
Initialized empty Git repository in f:/study/GitWork/Test2Project/.git/

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        LICENCE.txt
        README
        test.jsp


nothing added to commit but untracked files present (use "git add" to track)


jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git add *

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   LICENCE.txt
        new file:   README
        new file:   test.jsp

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git commit -m "First Commit"
[master (root-commit) 55871bd] First Commit
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 LICENCE.txt
create mode 100644 README
create mode 100644 test.jsp


commit 할 때마다 아래의 주소가 생성 됨
중복만 되지 않으면 앞의 4자리만 알면 됨

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git log
commit 55871bd02d3305f895fbf02293fd8d71a057f709
Author: scott <scott@scott.com>
Date:   Tue Jun 16 09:40:40 2015 +0900

    First Commit



여기까지 준비함


test.jsp 수정

first bug fixed...

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git commit -a -m "첫번째 버그 수정"
[master 237369a] 첫번째 버그 수정
1 file changed, 1 insertion(+)

test.jsp 수정
first bug fixed...
second bug fixed..

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git commit -a -m "두번째 버그 수정"
[master 94d0ca2] 두번째 버그 수정
1 file changed, 3 insertions(+), 1 deletion(-)

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git log
commit 94d0ca28551eab27e2cae4efe54bc8ea1c52eb68
Author: scott <scott@scott.com>
Date:   Tue Jun 16 09:45:46 2015 +0900

    두번째 버그 수정

commit 237369a86816fac5c2d794d0d7b318e9af0b9eff
Author: scott <scott@scott.com>
Date:   Tue Jun 16 09:44:58 2015 +0900

    첫번째 버그 수정

commit 55871bd02d3305f895fbf02293fd8d71a057f709
Author: scott <scott@scott.com>
Date:   Tue Jun 16 09:40:40 2015 +0900

    First Commit

위 그림 대로 만듬

이제 testing 브랜치 만들어 볼 것임, 아래 그림처럼



branch에 * 이 붙은 것이 Head 임
jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git branch
* master

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git branch
* master

위 명령을 하면서 아래와 같이 됨


branch를 바꿀 때 


jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git checkout testing
Switched to branch 'testing'

jhta@L4-01 /F/study/GitWork/Test2Project (testing)
$ git branch
  master
* testing


test.jsp 수정
first bug fixed...
second bug fixed..
thrid bug fixed from testing branch....

jhta@L4-01 /F/study/GitWork/Test2Project (testing)
$ git commit -a -m "testing branch에서 첫번째 커밋함"
[testing 8e8a245] testing branch에서 첫번째 커밋함
1 file changed, 2 insertions(+), 2 deletions(-)


jhta@L4-01 /F/study/GitWork/Test2Project (testing)

$ git log
commit 8e8a2450af7ace8989441570d1fbad4a76a94eff
Author: scott <scott@scott.com>
Date:   Tue Jun 16 10:16:51 2015 +0900

    testing branch에서 첫번째 커밋함

commit 94d0ca28551eab27e2cae4efe54bc8ea1c52eb68
Author: scott <scott@scott.com>
Date:   Tue Jun 16 09:45:46 2015 +0900

    두번째 버그 수정

commit 237369a86816fac5c2d794d0d7b318e9af0b9eff
Author: scott <scott@scott.com>
Date:   Tue Jun 16 09:44:58 2015 +0900

    첫번째 버그 수정

commit 55871bd02d3305f895fbf02293fd8d71a057f709
Author: scott <scott@scott.com>
Date:   Tue Jun 16 09:40:40 2015 +0900

    First Commit

commit이 많아 지면 스페이스바로 넘어가고, q로 빠져 나옴


다시 master로 옮김
jhta@L4-01 /F/study/GitWork/Test2Project (testing)
$ git checkout master
Switched to branch 'master'

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git branch
* master
  testing


파일 생성
~\GitWork\Test2Project\register.jsp
이 파일을 어느 branch에 추가 할 것인가?

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git add *

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git commit -m "master 브랜치에서 회원가입 페이지 추가"
[master bc865e3] master 브랜치에서 회원가입 페이지 추가
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 register.jsp



현재 두개의 작업이 병행 되고 있음

branch 하나 더 만듬



jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git branch iss53

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git branch
  iss53
* master
  testing


파일 생성
~\GitWork\Test2Project\iss53test.jsp

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git checkout iss53
Switched to branch 'iss53'

jhta@L4-01 /F/study/GitWork/Test2Project (iss53)
$ git branch
* iss53
  master
  testing

jhta@L4-01 /F/study/GitWork/Test2Project (iss53)
$ git add *

jhta@L4-01 /F/study/GitWork/Test2Project (iss53)
$ git status
On branch iss53
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   iss53test.jsp


jhta@L4-01 /F/study/GitWork/Test2Project (iss53)
$ git commit -m "iss53브랜치에서 새로운 이슈 테스트"
[iss53 0a0924f] iss53브랜치에서 새로운 이슈 테스트
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 iss53test.jsp


내용 추가

~\GitWork\Test2Project\register.jsp
email update from hotfix branch

jhta@L4-01 /F/study/GitWork/Test2Project (iss53)
$ git checkout -b hotfix
Switched to a new branch 'hotfix'

jhta@L4-01 /F/study/GitWork/Test2Project (hotfix)
$ git commit -a -m "hotfix브랜치에서 register.jsp에 있는 이메일 수정"
[hotfix 927ebbb] hotfix브랜치에서 register.jsp에 있는 이메일 수정
1 file changed, 1 insertion(+)

브랜치를 넘나 들면서 파일 내용 확인
jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ ls
LICENCE.txt  README  register.jsp  test.jsp

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ vi register.jsp

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git checkout hotfix
Switched to branch 'hotfix'

jhta@L4-01 /F/study/GitWork/Test2Project (hotfix)
$ vi register.jsp



어디에서 병합을 하느냐에 따라서 차이가 있음
그래서 기본적으로 master에서 병합을 한다고 생각을 하면됨

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git merge hotfix
Updating bc865e3..927ebbb
Fast-forward
iss53test.jsp | 0
register.jsp  | 1 +
2 files changed, 1 insertion(+)
create mode 100644 iss53test.jsp

fast-forward는 master가 앞으로 진행 했다는 것을 의미 

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ vi register.jsp

안에 내용이 들어가 있는 것을 확인


jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git branch
  hotfix
  iss53
* master
  testing

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git branch -d hotfix
Deleted branch hotfix (was 927ebbb).

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git branch
  iss53
* master
  testing



jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git checkout iss53
Switched to branch 'iss53'

jhta@L4-01 /F/study/GitWork/Test2Project (iss53)
$ ls
LICENCE.txt  README  iss53test.jsp  register.jsp  test.jsp


~\GitWork\Test2Project\iss53test.jsp
issue 53 is complete!


jhta@L4-01 /F/study/GitWork/Test2Project (iss53)
$ git commit -a -m "issue 53 번 처리 완료"
[iss53 649579f] issue 53 번 처리 완료
1 file changed, 1 insertion(+)

jhta@L4-01 /F/study/GitWork/Test2Project (iss53)
$ git checkout master
Switched to branch 'master'

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ git merge iss53
Merge made by the 'recursive' strategy.
iss53test.jsp | 1 +
1 file changed, 1 insertion(+)

jhta@L4-01 /F/study/GitWork/Test2Project (master)
$ ls
LICENCE.txt  README  iss53test.jsp  register.jsp  test.jsp


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

###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 

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


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day69  (0) 2015.06.22
오픈프레임워크_Day66  (0) 2015.06.17
오픈프레임워크_Day64  (0) 2015.06.15
오픈프레임워크_Day63  (0) 2015.06.12
오픈프레임워크_Day62  (0) 2015.06.11
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* Git은 자주 해봐야 알 수 있음
금일 내용을 여러번 확인해 보기
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1

jhta@L4-01 /F/study/GitWork/GitWebProject (master)
$ git status
On branch master
nothing to commit, working directory clean

jhta@L4-01 /F/study/GitWork/GitWebProject (master)
$ git remote
origin

jhta@L4-01 /F/study/GitWork/GitWebProject (master)
$ git remote -v
origin  git@github.com:ankptilh/GitWebProject.git (fetch)
origin  git@github.com:ankptilh/GitWebProject.git (push)

jhta@L4-01 /F/study/GitWork/GitWebProject (master)
$ git push origin master
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

----------------------------------- 
3-2

새로운 프로젝트

~\GitWork\ShellingFordProject\test1.txt
첫번째 작성한 문서

jhta@L4-01 /F/study/GitWork/ShellingFordProject
$ git init
Initialized empty Git repository in f:/study/GitWork/ShellingFordProject/.git/


jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test1.txt

nothing added to commit but untracked files present (use "git add" to track)


stage 상태로 올리기
jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git add test1.txt


올린 상태 확인
jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test1.txt

만약 이상태에서 수정하면? 다시 내려옴, 실수를 줄여주기 위해서

~\GitWork\ShellingFordProject\test1.txt
첫번째 작성한 문서
첫번째 수정


jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test1.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   test1.txt

다시 add하고 상태 보기

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git add test1.txt

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test1.txt


파일 한개 더 생성
~\GitWork\ShellingFordProject\test2.txt
두번째 파일 생성


jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test1.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test2.txt

추가 

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git add test2.txt


추가 후 확인

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test1.txt
        new file:   test2.txt


추가 후 test2.txt만 수정
~\GitWork\ShellingFordProject\test2.txt
두번째 파일 생성
두번째 파일 수정


jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test1.txt
        new file:   test2.txt


Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   test2.txt

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git commit -m "test1만 커밋함"
[master (root-commit) 3a367ee] test1만 커밋함
2 files changed, 3 insertions(+)
create mode 100644 test1.txt
create mode 100644 test2.txt

Warning: Your console font probably doesn't support Unicode. If you experience strange characters in the output, consider switching to a TrueType font such as
Lucida Console!


두 개의 파일 비교 (UTF-8로 저장을 하든지 영어로 저장해봐야겠음)

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git diff
diff --git a/test2.txt b/test2.txt
index 39be0d4..b1790b9 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1 +1,2 @@
-<B5>ι<F8>° <C6><C4><C0><CF> <BB><FD><BC><BA>
\ No newline at end of file
+<B5>ι<F8>° <C6><C4><C0><CF> <BB><FD><BC><BA>
+<B5>ι<F8>° <C6><C4><C0><CF> <BC><F6><C1><A4>
\ No newline at end of file


UTF-8로 변경하고 다시 


jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git diff
diff --git a/test2.txt b/test2.txt
index 39be0d4..0993a27 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1 +1,2 @@
-<B5>ι<F8>° <C6><C4><C0><CF> <BB><FD><BC><BA>
\ No newline at end of file
+<U+FEFF>두번째 파일 생성
+두번째 파일 수정
\ No newline at end of file


add하면서 commit

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git commit -a -m "add하면서 커밋"
[master 7ec8dcd] add하면서 커밋
1 file changed, 2 insertions(+), 1 deletion(-)

Warning: Your console font probably doesn't support Unicode. 
If you experience strange characters in the output, 
consider switching to a TrueType font such as
Lucida Console!

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git diff

jhta@L4-01 /F/study/GitWork/ShellingFordProject (master)
$ git status
On branch master
nothing to commit, working directory clean


----------------------------------- 
3-3

다른 사람의 repository 한번 가져오기(전부다 가져옴)

jhta@L4-01 /F/study/GitWork
$ git clone https://github.com/Dong-Hee/ridongProject.git

----------------------------------- 
3-4

기존의 github에 모든 레파지도리 지움 -> setting -> delete

로컬에 모든 프로젝트 삭제
----------------------------------- 
3-5

연습 해보기

1. github에 Test1Project 레포지터리 생성

2. 로컬에는 Test1Project 프로젝트 생성
     1) test1.txt 파일 생성(utf-8 or English)
     2) test1.txt tracked 상태로 변경
     3) test1.txt를 수정
     4) test1.txt Stage Area에 등록
     5) 현재 상태 확인
     6) 로컬 레포지터리 저장
     7) 원격 레포지터리에 업로드

3. 자신이 작업하던 Test1Project 제거

4. 서버로 부터 프로젝트(Test1Project)를 다시 복제 받아 사용할 수 있게 준비

5. 원격 레포지토리에 새로운 파일 생성(누군가가 소스를 업로드 했다고 가정)

6. 원격 레포지토리에 소스 업로드(push) 실패 확인

7. 다시 원격 서버로부터 소스 다운(pull - fetch+merge)

8. 다시 원격 레포지토리로 소스 업로드 성공 확인

----------------------------------- 
3-6

Fetch - 서버로 부터 받아옴
Merge - 내가 작업하는 소스와 합친다 

pull - 위 두개의 동작을 한번에 처리하는 명령어


github에서 파일을 추가 한다, 내용을 작성하고 (프로젝트 명 옆에 "+" 버튼)

로컬에서 파일 수정 또는 추가 후에

jhta@L4-01 /F/study/GitWork/Test1Project (master)
$ git push origin master
Username for 'https://github.com': oo1100
Password for 'https://oo1100@github.com':
To https://github.com/oo1100/Test1Project.git
! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/oo1100/Test1Project.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

jhta@L4-01 /F/study/GitWork/Test1Project (master)
$ git fetch origin
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/oo1100/Test1Project
   b9b5049..c5a2a8e  master     -> origin/master

jhta@L4-01 /F/study/GitWork/Test1Project (master)
$ git pull
Updating b9b5049..c5a2a8e
Fast-forward
test2.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 test2.txt

test1.파일 수정 후 commit -a

jhta@L4-01 /F/study/GitWork/Test1Project (master)
$ git commit -a -m "두번째 커밋..."
[master b57b4f9] 두번째 커밋...
1 file changed, 3 insertions(+), 1 deletion(-)

Warning: Your console font probably doesn't support Unicode. 
If you experience strange characters in the output, 
consider switching to a TrueType font such as
Lucida Console!

jhta@L4-01 /F/study/GitWork/Test1Project (master)
$ git push origin master
Username for 'https://github.com': oo1100
Password for 'https://oo1100@github.com':
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 318 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/oo1100/Test1Project.git
   c5a2a8e..b57b4f9  master -> master

----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day66  (0) 2015.06.17
오픈프레임워크_Day65  (0) 2015.06.16
오픈프레임워크_Day63  (0) 2015.06.12
오픈프레임워크_Day62  (0) 2015.06.11
오픈프레임워크_Day61  (0) 2015.06.10
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 목차 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* CDN 방식
가장가까운 서버에 연결해서 사용할 수 있게 해줌
----------------------------------- 
* SCM(Software configuration management) 
CM - 형상 관리
앞에 software가 붙어서 SCM

같은 이름의 다른 거
supply chain management? 공급망 관리? 이것은 다른 거

각종 결과물에 대한 형상을 만들고, 관리, 제어하기 위한 활동

프로그램 종류  -> CVS, SVN, GIT

GIT?? 공식 사이트 -> git-scm.com

GIT은 분산형 버전 관리 시스템(DVCS)
GIT 이전에는 중앙 집중 관리 시스템(CVCS)이었음 
-> 모든 소스를 한군데에서 관리
-> 관리 용이
-> 단점 : 1.서버가 날아가면 끝임
          2.인터넷 안되면 안됨

분산형
- 소스를 서버 및 모든 사용자가 가지고 있음
- 서버는 임시 보관 장소임
- 서버가 날아가도 한명만 소스가 있으면 복구 가능
- 네트워크 안되도 괜찮음. 나중에 연결 가능


오픈 소스 원격 저장소
- github
- bitbucket
- gitlab
- yobi
...

GIT을 이해하는데 처음에는 명령어로 공부해는게 좋음
Bash shell을 이용해서 Git을 사용함

책 pdf
http://dogfeet.github.io/articles/2012/progit.html
http://git-scm.com/book/ko/v2


Working directory - 내가 코드 수정중인 디렉토리

staging directory(index) - 중간에 git directory에 넣기 전에 준비 장소
git directory(local repository) - DB

local repository에 들어가야 서버와 통신을 함

git-scm 의 git 프로그램
github에서 조금 변경한 git 프로그램
두 개의 프로그램이 다르니 필요한 것을 설치

tracked 상태 - git에 관리 되는 상태
untracked 상태 - 아직 git에 관리 되지 않는 상태, 여기서 add 하면 tracked 됨


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

* 코드 아카데미
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* jQuery 실습시 CDN 방식으로 
----------------------------------- 
* Git 프로그램 다운
git-scm.com 에서 다운 받음



----------------------------------- 
* Git 실습 하기 위한 장소 준비
~\GitWork  폴더 만듬
해당 폴더 들어가서 우클릭 하면 추가된 요소가 보임

해당 프로젝트에서 Tomcat 처음 배울때 
수동으로 프로젝트 만드는 방식으로
폴더 및 index.html 만듬

~\GitWork\GitWebProject\index.xml
~\GitWork\GitWebProject\WEB-INF\web.xml
~\GitWork\GitWebProject\WEB-INF\classes
~\GitWork\GitWebProject\WEB-INF\bin
----------------------------------- 
* Git 설치시 맨 처음에 한번 해야하는 일
아무 폴더에서나 우클릭 "Git bash" 클릭

- 사용자 등록 - 일종의 회원가입,
     프로젝트 별로 따로 등록 가능 --global을 빼면 됨
     --global은 이 PC의 관리자를 의미

git config --global user.name "scott"
git config --global user.email "scott@scott.com"


위 내용이 실제로 어디로 등록이 되는지 확인해 보기
C:\Users\jhta\.gitconfig
안에 아래와 같이 등록이 된다
[user]
     name = scott
     email = scott@scott.com
----------------------------------- 
* 프로젝트 할 때마다 하게 되는 명령, 혹은 모든 프로젝트에서 할 수도 있음
- 관리할 프로젝트를 지정(init 명령, DB 만드는 것)

저장소를 프로젝트 폴더 안에 넣어도 되고, 따로 놓을 수도 있음

~\GitWork\GitWebProject
여기에서 local repository 만들기
여기서 git bash 안에서 아래 내용

$ git init
Initialized empty Git repository in f:/study/GitWork/GitWebProject/.git/

아래 .git 폴더 생성, 여기에 모든 local repository가 저장이 됨


----------------------------------- 
* 현재 상태 보는 명령어
git status

$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        WEB-INF/
        index.html

nothing added to commit but untracked files present (use "git add" to track)
----------------------------------- 
* 특정 파일을 git에 관리 맡기도록 명령
  임시 공간에 저장이 됨

git add index.html

$ git add index.html

jhta@L4-01 /F/study/GitWork/GitWebProject (master) 
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        WEB-INF/

----------------------------------- 
* 파일 내용 변경 확인(add 한 파일은 변경을 확인함)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   index.html

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        WEB-INF/
        test1.jsp
----------------------------------- 
* 여러 파일을 git에 관리 맡기도록 명령 

git add *.jsp
git add test*.jsp

$ git add test*.jsp

jhta@L4-01 /F/study/GitWork/GitWebProject (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   index.html
        new file:   test1.jsp
        new file:   test2.jsp
        new file:   test3.jsp


Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        WEB-INF/
-----------------------------------
* stage로 올리기(곧 repository에 올릴 것들)

add는 두가지 기능 
1. 관리되지 않는 파일 관리되게
2. 관리되고 있는 파일 stage 올릴때

git add *

Changes to be committed 는 stage 상태에 있다는 말임

$ git add *

jhta@L4-01 /F/study/GitWork/GitWebProject (master)
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   WEB-INF/web.xml
        new file:   index.html
        new file:   test1.jsp
        new file:   test2.jsp
        new file:   test3.jsp
-----------------------------------
* local repository에 저장하기

git commit

아래 vim이 뜨는데 여기에 기록을 남기라는 것임
vi를 사용할 줄 알면 그냥 내용을 기록하고 저장하면 됨


$ git commit
[master (root-commit) f6f9f2b] git commit test, 처음 변경한 git test
5 files changed, 39 insertions(+)
create mode 100644 WEB-INF/web.xml
create mode 100644 index.html
create mode 100644 test1.jsp
create mode 100644 test2.jsp
create mode 100644 test3.jsp

Warning: Your console font probably doesn't support Unicode. 
If you experience strange characters in the output, 
consider switching to a TrueType font such as
Lucida Console!

이 상태에서는 원격에 서버 업로드 가능

-----------------------------------
* vim을 띄우지 않고  commit

git commit -m "메시지..."

$ git commit -m "두번째 수정, test4.jsp 추가"
[master dec35f9] 두번째 수정, test4.jsp 추가
1 file changed, 1 insertion(+)
create mode 100644 test4.jsp

Warning: Your console font probably doesn't support Unicode. 
If you experience strange characters in the output, 
consider switching to a TrueType font such as
Lucida Console!
-----------------------------------
* Stage 상태에서 수정을 하면 다시 modified로 내려옴
-----------------------------------
* 작업 History

git log

해쉬 값은 수천, 수만번을 commit해도 중복이 안됨

$ git log
commit dec35f9589a7de34449c48e4c49b175d05b307e2
Author: scott <scott@scott.com>
Date:   Fri Jun 12 12:29:26 2015 +0900

    두번째 수정, test4.jsp 추가

commit f6f9f2b2426e2216815288cb01df714e5109a3db
Author: scott <scott@scott.com>
Date:   Fri Jun 12 12:17:45 2015 +0900

    git commit test, 처음 변경한 git test
-----------------------------------
* GitHub 서버에 등록

github.com 에서 New repository 클릭
이름 넣고 Create

git remote add origin git@github.com:ankptilh/GitWebProject.git
뒤에 긴 주소를 origin 이라는 이름으로 쓰겠다

$ git remote add origin git@github.com:ankptilh/GitWebProject.git

jhta@L4-01 /F/study/GitWork/GitWebProject (master)
$ git remote
origin

jhta@L4-01 /F/study/GitWork/GitWebProject (master)
$ git remote -v
origin  git@github.com:ankptilh/GitWebProject.git (fetch)
origin  git@github.com:ankptilh/GitWebProject.git (push)

fetch는 가져올때, push는 올릴때 서버 주소
-----------------------------------
* GitHub 서버에 올리기
현재 내가 쓰는 프로젝트 별명은 master 임
내가 작업한 소스를 서버에 등록

git push origin master

-----------------------------------
* git help 명령어로 명령어 찾기
$ git help -a
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
생성 - AJAX 연습 - js를 jquery로 변경
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/jquery01.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
     $(document).ready(function() {
          $("#btn").click(function() {
               //alert($("#name").val());
              
               // jQuery안에 포함된 Ajax 쓰기              
               // get방식으로 요청, post는 post 방식
               $.get("jquery01_proc.jsp",
                    {name:$("#name").val()},
                    function(data) {
                         //alert(data);
                         $("#message").html(data);                        
                    });
              
          })
     });              
</script>
</head><body><h1>jQuery를 이용한 Ajax 요청</h1>
이름 : <input type="text" name="name" id="name"/><br/><br/>
<input type="button" value="서버에 요청" id="btn"/>
<hr>
<div id="message"></div></body></html>
----------------------------------- 
3-2
생성 - AJAX 연습 - js를 jquery로 변경
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/jquery01_proc.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<%     request.setCharacterEncoding("utf-8"); %>
안녕하세요. ${param.name}님~~ 방문을 환영합니다.
----------------------------------- 
3-3
생성 - AJAX 연습 - 
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/jquery02_proc.jsp

<?xml version="1.0"?>
<%@ page contentType="text/html; charset=EUC-KR"%>
<result>
     <info>
          <no>가</no>
          <name>홍길동</name>
          <job>회사원</job>
     </info>
     <info>
          <no>나</no>
          <name>임꺽정</name>
          <job>농업</job>
     </info>
     <info>
          <no>다</no>
          <name>신돌석</name>
          <job>상업</job>
     </info>    
</result>
----------------------------------- 
3-4
생성 - AJAX 연습 - 
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/jquery02.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
     $(document).ready(function() {
          // 정식 방법
          $.ajax({
               type:"GET",
               dataType:"xml",
               url:"jquery02_proc.jsp",
               success:function(data){
                    var xmlData = $(data).find("info");
                    //alert(xmlData.length);
                    if(xmlData.length > 0){
                         var contentStr = "";
                         $(xmlData).each(function() {
                              contentStr += $(this).find("no").text() + ", "
                                             + $(this).find("name").text() + ", "
                                             + $(this).find("job").text() + "\n"
                         });
                         alert(contentStr);
                    }
               }
          });
     });              
</script>
</head><body></body></html>
----------------------------------- 
3-5 
생성 - AJAX 연습 - member_json1.jsp
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/jquery03.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
     $(document).ready(function() {
          // 정식 방법
          $.ajax({
               type:"GET",
               // json은 생략함
               //dataType:"xml",              
               url:"member_json1.jsp",
               success:function(data){
                    var jsonData = $.parseJSON(data);
                    alert(jsonData.length);
                   
                    //alert(xmlData.length);
                    if(jsonData.length > 0){
                         var contentStr = "";
                         $(jsonData).each(function(i) {
                              contentStr += jsonData[i].no + ", "
                                             + jsonData[i].name + ", "
                                             + jsonData[i].job + "\n";
                         });
                         alert(contentStr);
                    }
                   
               }
          });
     });              
</script>
</head><body></body></html>
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
-----------------------------------
-----------------------------------
###################################


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day65  (0) 2015.06.16
오픈프레임워크_Day64  (0) 2015.06.15
오픈프레임워크_Day62  (0) 2015.06.11
오픈프레임워크_Day61  (0) 2015.06.10
오픈프레임워크_Day60  (0) 2015.06.09
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 항목 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* JSON 
- 자바스크립트를 위한 표기법? 
- 약속, XML을 대체해서 간단하게, 읽고 쓰기 위해
- 서로 다른 프로그래밍 언어 간에 데이터를 교환하기 위한 표기법이다.

문법 : 아래 두 가지를 혼합해서 씀
- 맵 형식
     {이름:값,이름:값, ...}

- array 형식
     [값,값, ...]

위 두가지 방식 혼합이 가능

XML을 JSON으로 바꾸는 연습 필요!!!
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* AjaxApp 프로젝트 설정 변경
/AjaxApp/WebContent/WEB-INF/web.xml

아래 내용 추가 
  <servlet>
    <servlet-name>valid</servlet-name>
    <servlet-class>ajax.ValidateServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>valid</servlet-name>
    <url-pattern>/valid.do</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>dynamic</servlet-name>
    <servlet-class>ajax.DynamicServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>dynamic</servlet-name>
    <url-pattern>/dynamic.do</url-pattern>
  </servlet-mapping>
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
xml 데이터를 가지고 있는 코드 전반적인 문제가 있는 건가?
아래 코드를 변경해야 xml을 받아 올 수 있는 것으로 보임
<%@ page contentType="text/html; charset=EUC-KR"%>

<%@ page contentType="text/xml; charset=EUC-KR"%>
-----------------------------------
3-1
수정 - AJAX 연습 - XML 합치기 마무리
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/xml02.html

<!DOCTYPE html><html><head><meta charset="EUC-KR"><title></title>
<script src="ajax.js"></script><script>
     var xmlDoc = "", xslDoc = "";
     function fnRequest() {
          // 아래처럼 처리를 하면 비동기 방식이라 callback 함수에서
          // 합칠때 문제가 생길 수 있음, 반드시 xsl 결과가 온뒤에
          // xml 내용이 와야 한다
          //sendRequest("GET","book.jsp",null,fncallback);
          //sendRequest("GET","book.xsl",null,fncallback);
         
          sendRequest("GET","book.jsp",null,fncallback);
     }
     function fncallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    xmlDoc = httpRequest.responseXML;
                    sendRequest("GET","book.xsl",null,fncallback2);
                   
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     function fncallback2() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    xslDoc = httpRequest.responseXML;
                   
                    // XML과 XSL 결합 시키는 함수
                    fnXSLT();
               }else{
                    alert(httpRequest.status);
               }
          }
     }    
     function fnXSLT(){
          // 이 함수는 두개 파일이 다 있다는 전제 하에 호출해야함
          if(xmlDoc == null || xslDoc == null)
               return;
         
          var div = document.getElementById("bookList");
         
          if(window.ActiveXObject){
               div.innerHTML = xmlDoc.transformNode(xslDoc);
          }
          else{
               var xsltProc = new XSLTProcessor();
               xsltProc.importStylesheet(xslDoc);
               var fragment = xsltProc.transformToFragment(xmlDoc, document);
              
               div.appendChild(fragment);
          }
     }
     window.onload = function() { fnRequest(); }
</script></head><body>
<h1>신규 책 목록</h1>
<div id="bookList"></div>
</body></html>
-----------------------------------  
3-2
생성 - AJAX 연습 - 날짜 검사 기능
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/xml03.html

<!DOCTYPE html><html><head><meta charset="EUC-KR"><title></title>
<script src="ajax.js"></script><script>
     function fnRequest() {
          var param = document.getElementById("birthDate").value;
          param = "birthDate="+param;
          sendRequest("GET","/AjaxApp/valid.do",param,fncallback);
     }
     function fncallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    var data = httpRequest.responseXML;
                    var message = data.getElementsByTagName("message");
                    var span = document.getElementById("dateMessage");
                    //span.innerHTML = message.item(0).firstChild.nodeValue;
                    span.innerHTML = message[0].firstChild.nodeValue;
               }else{
                    alert(httpRequest.status);
               }
          }
     }
</script></head><body>
<h1>Ajax를 이용한 유효성 검사</h1>
날짜 입력 :
<input type="text" size="10" id="birthDate" onchange="fnRequest()"/>
<span id="dateMessage"></span>
</body></html>
-----------------------------------  
3-3
생성 - AJAX 연습 - 날짜 검사 기능,서버
Workspace : ~\JSP\EclipseWork
/AjaxApp/src/ajax/ValidateServlet.java
여기서 테스트 해보는 방법
http://localhost:8080/AjaxApp/valid.do?birthDate=1999/1/1

package ajax;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;

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

public class ValidateServlet extends HttpServlet {
     protected void doGet(HttpServletRequest request,
               HttpServletResponse response)
                         throws ServletException, IOException {
          doPost(request, response);
     }

     protected void doPost(HttpServletRequest request,
               HttpServletResponse response)
                         throws ServletException, IOException {
          response.setContentType("text/xml");
          response.setCharacterEncoding("utf-8");
          PrintWriter out = response.getWriter();

          String params = request.getParameter("birthDate");
          boolean passed = isValidateDate(params);
          String msg = "당신이 입력한 날짜는 잘못되었다.";
          if(passed == true){
               msg = "잘 입력하였다.";
          }
          out.println("<response>");
          out.println("<passed>");
          out.println(Boolean.toString(passed));
          out.println("</passed>");
          out.println("<message>");
          out.println(msg);
          out.println("</message>");
          out.println("</response>");
     }

     private boolean isValidateDate(String params) {
          boolean isValid = true;
          if (params != null) {
               SimpleDateFormat formatter =
                         new SimpleDateFormat("yyyy/MM/dd");
               try {
                    formatter.parse(params);
               } catch (ParseException e) {
                    isValid = false;
               }
          } else {
               isValid = false;
          }
          return isValid;
     }
    
}
----------------------------------- 
3-4
생성 - AJAX 연습 - 서버로 부터 메세지를 받아 한줄 씩 추가 
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/xml04.html

<!DOCTYPE html><html><head><meta charset="EUC-KR"><title></title>
<script src="ajax.js"></script><script>
     function fnRequest() {
          var params = "task=reset";
          sendRequest("GET","/AjaxApp/dynamic.do",params,fncallback);
     }
     function fncallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    // 5초마다, 호출할 메서드를 입력
                    setInterval(pollServer, 5000);
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     function pollServer() {
          var params = "task=bravo";
          sendRequest("GET","/AjaxApp/dynamic.do",params,fncallback2);
     }
     function fncallback2() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    // 디자인 할 곳
                    //alert(httpRequest.responseText);
                    var data = httpRequest.responseXML;
                    var msg = data
                              .getElementsByTagName("message")[0]
                              .firstChild.nodeValue;
                    //document.getElementById("test").innerHTML = msg+"<br/>";
                   
                    var table = document.getElementById("dynamicUpdateArea");
                    var tbody = table.getElementsByTagName("tbody").item(0);
                    var first_row = tbody.getElementsByTagName("tr").item(0);
                   
                    var new_row = createRow(msg);                   
                    tbody.insertBefore(new_row,first_row);
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     function createRow(msg) {
          var row = document.createElement("tr");
          var cell = document.createElement("td");
          var cell_data = document.createTextNode(msg);
          cell.appendChild(cell_data);
          row.appendChild(cell);
          return row;
     }
</script></head><body>
<h1>이 페이지는 자동으로 업데이트 됩니다.</h1>
<input type="button" value="실행" id="go" onclick="fnRequest()"/>
<br/><br/>
이 페이지는 <span id="time">5</span>초 후에 갱신됩니다.
<br/><br/>
<table id="dynamicUpdateArea">
     <tbody>
          <tr id="row"><td></td></tr>
     </tbody>
</table>
<div id="test"></div>
</body></html>
----------------------------------- 
3-5
생성 - AJAX 연습 - xml04.html
Workspace : ~\JSP\EclipseWork
/AjaxApp/src/ajax/DynamicServlet.java
여기서 테스트 해보는 방법
http://localhost:8080/AjaxApp/dynamic.do?task=1

package ajax;

import java.io.IOException;
import java.io.PrintWriter;

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

public class DynamicServlet extends HttpServlet {
     private int counter = 1;
     protected void doGet(HttpServletRequest request,
               HttpServletResponse response)
                         throws ServletException, IOException {
          doPost(request, response);
     }

     protected void doPost(HttpServletRequest request,
               HttpServletResponse response)
                         throws ServletException, IOException {
          response.setContentType("text/xml");
          response.setCharacterEncoding("utf-8");
          response.setHeader("Cache-Control", "no-cache");
          PrintWriter out = response.getWriter();
         
          String res = "";
          String message = "";
          String task = request.getParameter("task");
         
          if(task.equals("reset")){
               counter = 1;
          }else{
               switch (counter) {
               case 1:
                    message = "아는 것이 힘이다.";break;
               case 2:
                    message = "천리길도 한 걸음부터";break;
               case 3:
                    message = "콩심은데 콩나도 팥심은데 팥난다.";break;
               case 4:
                    message = "낫 놓고 ㄱ자도 모른다.";break;
               case 5:
                    message = "술 먹을 돈은 없어도 책은 사보자.";break;
               case 6:
                    message = "가는 말이 고와야 오는 말이 곱다.";break;
               default:
                    message = "다른 값을 넣어 주세요.";                    break;
               }
               counter++;
          }
          res = "<message>" + message + "</message>";
          out.println("<response>");
          out.println(res);
          out.println("</response>");
          out.close();
     }

}
----------------------------------- 
3-6
생성 - JSON 연습 - 
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/json01.html

<!DOCTYPE html><html><head>
<meta charset="EUC-KR">
<script>
     window.onload = function() {
          var map1 = {ko:"한국", fr:"프랑스", uk:"영국"};
          //alert(map1.ko+","+map1.fr+","+map1.uk);
         
          var array1 = ["한국","프랑스","영국"];
          //alert(array1[0]);
         
          var mix = {
                    name:"홍길동",
                    food:["짜장면","짬뽕"],
                    favorateColor:["빨강","노랑","파랑"]
          };
          alert(mix.name+","+mix.food.length+","+mix.favorateColor[1]);
     }
</script>
</head><body>
</body></html>
----------------------------------- 
3-7 
생성 - JSON 연습 - 
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/json02.html

<!DOCTYPE html><html><head>
<meta charset="EUC-KR">
<script>
     window.onload = function() {
         
          // 클래스 생성
          Member = function(id,name,age) {
               this.id = id;
               this.name = name;
               this.age = age;
          }
         
          /*
          // 메서드 추가
          Member.prototype.setValue = function(id,name,age) {
               this.id = id;
               this.name = name;
               this.age = age;
          }
         
          // 메서드 추가
          Member.prototype.getAge = function() {
               return this.age;
          }
         
          // 메서드 추가
          Member.prototype.toString = function() {
               return this.id+" ("+this.name+")의 나이는 "+this.age;
          }
          */
                   
          // 위 코드를 json 표기법으로 리펙토링이 가능
          Member.prototype = {
                    setValue : function(id,name,age) {
                         this.id = id;
                         this.name = name;
                         this.age = age;
                    },                   
                    getAge : function() {
                         return this.age;
                    },                   
                    toString : function() {
                         return this.id+" ("+this.name+")의 나이는 "+this.age;
                    }
          }
         
          // 활용
          var mem = new Member("eagle", "임꺽정", 20);
          alert(mem.toString());         
     }
</script>
</head><body>
</body></html>
-----------------------------------  
3-8 
생성 - JSON 연습 - json03.html 의 서버
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/member_xml.jsp

<?xml version="1.0"?>
<%@ page contentType="text/html; charset=EUC-KR"%>
<result>
     <code>success</code>
     <data>
          <member>
               <name>홍길동</name>
               <id>tiger</id>
               <age>20</age>
          </member>
     </data>
</result>
-----------------------------------  
3-9 
생성 - JSON 연습 - xml 데이터 받기
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/json03.html     

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<script src="ajax.js"></script>
<script>
     function fnRequest() {
          sendRequest("GET","member_xml.jsp",null,fncallback);
     }
     function fncallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    var xmlDoc = httpRequest.responseXML;
                    var code = xmlDoc
                              .getElementsByTagName("code")[0]
                              .firstChild.nodeValue;
                   
                    if(code == "success"){
                        
                    }
                   
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     window.onload = function() { fnRequest(); }
</script>
</head><body>
<h1>서버로부터 xml타입의 데이터를 받는 예제</h1>
</body></html>
-----------------------------------  
3-10 
생성 - JSON 연습 - xml,json 데이터 받기
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/json04.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<script src="ajax.js"></script>
<script>
     function fnRequest() {
          sendRequest("GET","member_json.jsp",null,fncallback);
     }
     function fncallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    // json으로 파싱해주는 방법, json 객체로 활용가능
                    var txtDoc = eval("("+httpRequest.responseText+")");
                    if(txtDoc.code == "success"){
                         var mem = txtDoc.data.member;
                         alert(mem.name+","+mem.id+","+mem.age);
                    }
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     window.onload = function() { fnRequest(); }
</script>
</head><body>
<h1>서버로부터 xml과 json타입의 데이터를 받는 예제</h1>
</body></html>
-----------------------------------  
3-11 
생성 - JSON 연습 - json04.html 의 서버
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/member_json.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
{
     code : "success",
     data :{
          member : {name:"임꺽정",id:"lion",age:30}
     }
}
-----------------------------------  
3-12 
생성 - JSON 연습 - member_json1.jsp과 연결
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/json05.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<script src="ajax.js"></script>
<script>
     function fnRequest() {
          sendRequest("GET","member_json1.jsp",null,fncallback);
     }
     function fncallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    // json으로 파싱해주는 방법, json 객체로 활용가능
                    var txtDoc = eval("("+httpRequest.responseText+")");
                    for(var i=0;i<3;i++){
                         alert(txtDoc[i].no+","+txtDoc[i].name+","+txtDoc[i].job);
                    }
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     window.onload = function() { fnRequest(); }
</script>
</head><body>
<h1>서버로부터 json타입의 데이터를 받는 예제</h1>
</body></html>
-----------------------------------  
3-13 
생성 - JSON 연습 - json05.html의 서버, 배열 형식
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/member_json1.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
[
     {"no":"1","name":"임꺽정","job":"개그맨"},
     {"no":"2","name":"홍길동","job":"가수"},
     {"no":"3","name":"신돌석","job":"방송인"}
]
-----------------------------------  
3-14 
생성 - JSON 연습 -
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/member_xml_json.jsp

<?xml version="1.0"?>
<%@ page contentType="text/html; charset=EUC-KR"%>
<result>
     <code>success</code>
     <data>
          <![CDATA[{"name":"강감찬","id":"eagle","age":"30"}]]>
     </data>
</result>
-----------------------------------  
3-15 
생성 - JSON 연습 -
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/json06.html

<!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>
<script src="ajax.js"></script>
<script>
     function fnRequest(){
          sendRequest("GET", "member_xml_json.jsp", null, fnCallback);
     }
    
     function fnCallback(){
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    var xmlDoc = httpRequest.responseXML;
                    var code = xmlDoc.getElementsByTagName("code")[0].firstChild.nodeValue;
                    alert(code);
                    if(code == "success"){
                         var data = xmlDoc.getElementsByTagName("data")[0].firstChild.nodeValue;
                         var jsonData = eval("(" + data + ")");
                         alert(jsonData.name + ", " + jsonData.id + ", " + jsonData.age);
                    }
               }
               else{
                    alert(httpRequest.status);
               }
          }
     }
    
     window.onload = function(){ fnRequest(); }
</script>
</head>
<body>
<h1>서버로부터 xml과 json타입의 데이터를 받는 예제</h1>
</body>
</html>
-----------------------------------  
3-16 
생성 - JSON 연습 - xml로 변환 했음
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic07_2.jsp

<?xml version="1.0"?>
<%@ page contentType="text/html; charset=EUC-KR"%>
<%
     String userNum = request.getParameter("userNum");
     // 디비 연결해서 결과 받아옴
     String name = "", gender = "", addr = "", tel = "";
     if (userNum.equals("1")) {
          name = "홍길동";
          gender = "남성";
          addr = "서울";
          tel = "111-1111";
     } else if (userNum.equals("2")) {
          name = "신사임당";
          gender = "여성";
          addr = "강릉";
          tel = "222-2222";
     } else if (userNum.equals("3")) {
          name = "임꺽정";
          gender = "남성";
          addr = "경기";
          tel = "333-3333";
     }    
%>

<employees>
     <employee name="<%=name%>" gender="<%=gender%>" addr="<%=addr%>" tel="<%=tel%>"/>
</employees>
----------------------------------- 
###################################
4. 과제
-----------------------------------
4-1
/AjaxApp/WebContent/json03.html  
----------------------------------- 
4-2
/AjaxApp/WebContent/basic07_2.jsp
를 받는 클라이언트를 작성해보시오
----------------------------------- 
4-3
코드 전반적으로 문제가 있는지 확인하기
----------------------------------- 
4-4
----------------------------------- 
4-5
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
-----------------------------------
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day64  (0) 2015.06.15
오픈프레임워크_Day63  (0) 2015.06.12
오픈프레임워크_Day61  (0) 2015.06.10
오픈프레임워크_Day60  (0) 2015.06.09
오픈프레임워크_Day59  (0) 2015.06.08
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 항목 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* AJAX에서 POST 방식은 GET과 다르게 헤더를 지정해줘야함
----------------------------------- 
* 컨트롤러를 Servlet 으로 하는 이유, JSP로 안쓰는 이유
자바 문법 활용, 다른 클래스 사용
보통 프레임워크를 가져다 쓰는 경우가 많은데
프레임워크가 Servlet으로 많이 되어 있음

그러나! JSP로 컨트롤러를 사용해도 됨!
고정관념을 가질 필요가 없음
----------------------------------- 
* XSL
Xml Style sheet language
XML과 HTML을 섞어서 스타일을 입힘

XML과 XSL을 전달해서 스타일을 입히는 예제

----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------

* XSL 만들기


----------------------------------- 
----------------------------------- 
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
생성 - AJAX 연습 - ajax.js 모듈 연습
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic04.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<title>Insert title here</title>
<script src="ajax.js"></script>
<script>
     function fnSubmit() {
          var params = "name="+document.getElementById("name").value;
          //sendRequest("GET","basic01_proc.jsp",params,callback);
          //POST 방식
          sendRequest("POST","basic01_proc.jsp",params,callback);
     }
     
     function callback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    // 서버로 부터 받아온 알맹이          
                    //alert(httpRequest.responseText);
                    var data = httpRequest.responseText;
                    var div = document.getElementById("display");
                    div.innerHTML = data;
               }else{
                    alert(httpRequest.status);
               }
          }
     }
</script>
</head><body>
<input type="text" name="name" id="name"/>
<input type="button" value="전송" onclick="fnSubmit()"/>
<hr/>
<div id="display"></div>
</body></html>
-----------------------------------  
3-2
수정 - AJAX 연습 - 반복된 코드 분리,POST 방식 적용
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/ajax.js

var httpRequest = null;
function getXMLHttpRequest() {
     return new XMLHttpRequest();
}
function sendRequest(method,url,params,callback) {
     httpRequest = getXMLHttpRequest();     
     var httpMethod = method ? method : "GET" ;
     if(httpMethod != "GET" && httpMethod != "POST"){
          httpMethod = "GET";
     }
     var httpUrl = url;     
     var httpParams = (params == null || params == "")?null:params;
     
     if(httpMethod == "GET" && httpParams != null){
          httpUrl = httpUrl + "?" + httpParams;
     }
     httpRequest.open(httpMethod,httpUrl,"true");
     httpRequest.onreadystatechange = callback;
     httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
     httpRequest.send(httpMethod =="POST"?httpParams:null);
}
-----------------------------------  
3-3
생성 - AJAX 연습 - 
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic05.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<title>Insert title here</title>
<script src="ajax.js"></script>
<script>
     function fnSubmit() {
          sendRequest("GET","basic05_proc.jsp",null,callback);
     }
     
     function callback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    var data = httpRequest.responseText;
                    var span = document.getElementById("maxTemp");
                    
                    var splitData = data.split(",");
                    
                    //위에 받은 데이터(문자들)를 위한 배열 준비
                    var arrData = new Array(splitData.length);
                    var maxNum = 0;
                    for(var i=0;i<splitData.length;i++){
                         arrData[i] = parseFloat(splitData[i]);
                         if(arrData[i] > maxNum){
                              maxNum = arrData[i];
                         }
                    }
                    span.innerHTML = maxNum;
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     
     window.onload = function() {
          fnSubmit();
     }
</script>
</head><body>
<h2>최근 5일간 최고 기온 : <span id="maxTemp"></span></h2>
</body></html>
----------------------------------- 
3-4
생성 - AJAX 연습 - basic05.html의 서버
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic05_proc.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<%
     double[] temp = {10.2, 11.8, 13.2, 9.8, 12.7};
     for(int i=0;i<temp.length;i++){
          out.print(temp[i]);
          if(i<temp.length-1)
               out.print(",");
     }
%>
----------------------------------- 
3-5
생성 - AJAX 연습 - Ajax를 이용한 문자 변환
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic06.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<title>Insert title here</title>
<script src="ajax.js"></script>
<script>
function fnSubmit() {
     var key = document.getElementById("key").value;
     document.getElementById("keypressed").value = key;
     key = "key="+key;
     sendRequest("GET","/AjaxApp/ascii.do",key,callback);
}

function callback() {
     if(httpRequest.readyState == 4){
          if(httpRequest.status == 200){               
               document.getElementById("decimal").value 
               = httpRequest.responseText;
          }else{
               alert(httpRequest.status);
          }
     }
}
</script>
</head><body>
<h1>Ajax를 이용한 문자 변환</h1>
키를 입력하시오 : <input type="text" id="key" name="key" onkeyup="fnSubmit()"/>
<br/><br/>
입력된 키값 : <input type="text" id="keypressed" name="keypressed"/>
<br/><br/>
변환된 키값 : <input type="text" id="decimal" name="decimal"/>
</body></html>
----------------------------------- 
3-6
생성 - AJAX 연습 - Ajax를 이용한 문자 변환
Workspace : ~\JSP\EclipseWork
/AjaxApp/src/ajax/AsciiServlet.java
테스트 방법
http://localhost:8080/AjaxApp/ascii.do?key=a

package ajax;

import java.io.IOException;
import java.io.PrintWriter;

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

public class AsciiServlet extends HttpServlet {
     protected void doGet(HttpServletRequest request,
               HttpServletResponse response) throws ServletException, IOException {
          doPost(request, response);
     }

     protected void doPost(HttpServletRequest request,
               HttpServletResponse response) throws ServletException, IOException {
          //System.out.println("test...");
          // HTML이 아닌 일반 문서는 plain으로 해준 것
          response.setContentType("text/plain");
          
          // 캐시 설정 변경, 캐시 정보를 쓰지 않겠다
          // 무줘건 서버로 부터 새로운 정보를 받게 만듬
          // 만약 같은 내용이라면 서버에 가지 않고 캐시를 쓰기 때문에
          // html은 meta 태그에 캐시를 쓰지 않게 하는 내용이 있음
          response.setHeader("Cache-Control", "no-cache");
          
          PrintWriter out = response.getWriter();
          try{
               String key = request.getParameter("key");
               if(key != null){
                    // 아스키 코드로 변환
                    int keyChar = key.charAt(0);
                    String strDecimal = Integer.toString(keyChar);
                    out.println(strDecimal);
               }
          }catch(Exception e){
               System.out.println(e);
               out.println("I don't know!");
          }
     }
}
----------------------------------- 
3-7 
생성 및 수정
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/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_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>AjaxApp</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>
  
  <servlet>
     <servlet-name>ascii</servlet-name>
     <servlet-class>ajax.AsciiServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
       <servlet-name>ascii</servlet-name>
       <url-pattern>/ascii.do</url-pattern>
  </servlet-mapping>
</web-app>
-----------------------------------  
3-8 
생성 - AJAX 연습 - 과제, 요즘스타일로 바꿔라
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic07.html
회원번호만 입력하면 자동으로 나머지가 나오는 예제

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<title>Insert title here</title><script>
function fnSubmit() {
     var userNum = document.getElementById("userNum").value;
     document.getElementById("hiddenFrame").src =
          "basic07_1.jsp?userNum="+userNum;
}
function setUserData(name,gender,addr,tel) {
     document.getElementById("userName").value = name;
     document.getElementById("userGender").value = gender;
     document.getElementById("userAddr").value = addr;
     document.getElementById("userTel").value = tel;
}
</script></head><body>
<h2>회원 정보 조회</h2>
회원 번호 : <input type="text" name="userNum" id="userNum" onkeyup="fnSubmit()"/>
<br/><br/>
이름 : <input type="text" name="userName" id="userName" />
<br/><br/>
성별 : <input type="text" name="userGender" id="userGender" />
<br/><br/>
주소 : <input type="text" name="userAddr" id="userAddr" />
<br/><br/>
전화번호 : <input type="text" name="userTel" id="userTel" />
<iframe id="hiddenFrame" width="0" height="0" boarder="0"/>
</body></html>
-----------------------------------  
3-9 
생성 - AJAX 연습 - 과제, 요즘스타일로 바꿔라
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic07_1.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<%
     String userNum = request.getParameter("userNum");
     // 디비 연결해서 결과 받아옴
     String name = "", gender = "", addr = "", tel = "";
     if (userNum.equals("1")) {
          name = "홍길동";
          gender = "남성";
          addr = "서울";
          tel = "111-1111";
     } else if (userNum.equals("2")) {
          name = "신사임당";
          gender = "여성";
          addr = "강릉";
          tel = "222-2222";
     } else if (userNum.equals("3")) {
          name = "임꺽정";
          gender = "남성";
          addr = "경기";
          tel = "333-3333";
     }     
%>
<script>
     function fnSetting() {
          var name = "<%=name%>";
          var gender = "<%=gender%>";
          var addr = "<%=addr%>";
          var tel = "<%=tel%>";
          
          // frame에 접근하는 방식
          // 꼭대기에서 부터 접근을 한다
          // 가장 꼭대기에 있는 frame ==> top
          // 하나의 페이지에는 최소 한개의 프레임이 있음
          // 다른 프레임을 접근해서 해당 프레임에 
          // 자바스크립트 함수를 호출
          
          // 메인 프레임 접근
          top.setUserData(name,gender,addr,tel);
          
     }
     window.onload = function() { fnSetting(); }
</script>
-----------------------------------  
3-10 
생성 - AJAX 연습 - xml로 전달
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/xml01.html

<!DOCTYPE html><html><head><meta charset="EUC-KR"><title></title>
<script src="ajax.js"></script><script>
     function fnRequest() {
          sendRequest("GET","book.jsp",null,fncallback);
     }
     function fncallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    // alert(httpRequest.responseText);
                    
                    // XML로 받으려면 아래와 같이 받아야한다.
                    // 객체로 전달이 된다. 그래야 DOM으로 접근이 가능
                    // alert(httpRequest.responseXML);     
                    
                    var data = httpRequest.responseXML;
                    var bookList = data.getElementsByTagName("book");     
                    var msg = "책 권수 : "+bookList.length+"권 \n";
                    for(var i=0;i<bookList.length;i++){
                         var book = bookList.item(i);
                         var title = book.getElementsByTagName("title").item(0).firstChild.nodeValue;
                         var author = book.getElementsByTagName("author").item(0).firstChild.nodeValue;;
                         msg += title +"(" + author + ")\n";
                    }
                    alert(msg);
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     window.onload = function() { fnRequest(); }
</script></head><body>
</body></html>
-----------------------------------  
3-11 
생성 - AJAX 연습 - xml로 전달
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/book.jsp

<?xml version="1.0" encoding="euc-kr"?>
<%--
// 여기서 처리하려면 아래와 같이 넣어주면 됨
<?xml-stylesheet type="text/xml" href="book.xsl"?>
--%>
<%@ page contentType="text/xml; charset=EUC-KR"%>
<books>
     <book>
          <title>홍길동전</title>
          <author>허균</author>
     </book>
     <book>
          <title>난중일기</title>
          <author>이순신</author>
     </book>
     <book>
          <title>동의보감</title>
          <author>허준</author>
     </book>
</books>
-----------------------------------  
3-12 
생성 - AJAX 연습 - xml로 전달, 데이터 스타일 추가
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/book.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <!-- 결과물을 어떤 형식으로 만들지 방법을 지정 -->
     <!-- 들여쓰기, 인코딩 -->
     <xsl:output method="html" indent="yes" encoding="euc-kr"></xsl:output>
     
     <!-- xsl:template에서 원하는 태그에 디자인을 함 -->
     <!-- 보통 부모태그를 지정하면 자식 태그 또한 적용이 된다 -->
     <xsl:template match="books">
          <ul>
               <!-- 반복을 돌리고자 하는 태그 이름 -->
               <xsl:for-each select="book">
               <li><b><xsl:value-of select="title"/></b>
               (<xsl:value-of select="author"/>)</li>
               </xsl:for-each>
          </ul>
     </xsl:template>
</xsl:stylesheet>
-----------------------------------  
3-13 
생성 - AJAX 연습 - xml로 전달, 데이터 스타일 추가
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/xml02.html

<!DOCTYPE html><html><head><meta charset="EUC-KR"><title></title>
<script src="ajax.js"></script><script>
     var xmlDoc = "", xslDoc = "";
     function fnRequest() {
          // 아래처럼 처리를 하면 비동기 방식이라 callback 함수에서
          // 합칠때 문제가 생길 수 있음, 반드시 xsl 결과가 온뒤에
          // xml 내용이 와야 한다
          //sendRequest("GET","book.jsp",null,fncallback);
          //sendRequest("GET","book.xsl",null,fncallback);
          
          sendRequest("GET","book.jsp",null,fncallback);
     }
     function fncallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    xmlDoc = httpRequest.responseXML;
                    sendRequest("GET","book.xsl",null,fncallback2);
                    
                    // XML과 XSL 결합 시키는 함수
                    fnXSLT();
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     function fncallback2() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    xslDoc = httpRequest.responseXML;
                    
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     function fnXSLT() {
          
     }
     window.onload = function() { fnRequest(); }
</script></head><body>
<h1>신규 책 목록</h1>
<div id="bookList"></div>
</body></html>
-----------------------------------  
3-14 
-----------------------------------  
3-15 
-----------------------------------  
3-16 
-----------------------------------  
3-17 
-----------------------------------  
3-18 
-----------------------------------  
3-19 
-----------------------------------  
3-20 
-----------------------------------  
3-21 
-----------------------------------  
3-22 
-----------------------------------  
3-23 
-----------------------------------  
3-24 
-----------------------------------  
3-25 
-----------------------------------  
3-26 
-----------------------------------  
3-27 
----------------------------------- 
3-28 
----------------------------------- 
3-29 
----------------------------------- 
3-30 
----------------------------------- 
3-31 
----------------------------------- 
###################################
4. 과제
-----------------------------------
4-1
/AjaxApp/WebContent/basic07_1.jsp
/AjaxApp/WebContent/basic07.html
예전 스타일을 요즘 스타일로 바꾸라
ajax.js안에 모듈 이용해서 변경
----------------------------------- 
4-2
----------------------------------- 
4-3
----------------------------------- 
4-4
----------------------------------- 
4-5
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
5-1
-----------------------------------
5-2
----------------------------------- 
5-3
-----------------------------------
5-4
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day63  (0) 2015.06.12
오픈프레임워크_Day62  (0) 2015.06.11
오픈프레임워크_Day60  (0) 2015.06.09
오픈프레임워크_Day59  (0) 2015.06.08
오픈프레임워크_Day58  (0) 2015.06.05
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 항목 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* AJAX(Asynchronous JavaScript and XML)
처음에 컬럼에 글을 적다가 AJAX가 처음 등장
이것이 발단이 되었음, 글쓴이가 매우 욕을 먹음
전혀 새로운 기술이 아니었음

AJAX의 등장한 계기
- 구글 지도 -> 마우스로 지도를 옮길때마다 빠르게 반응했음
            -> 특별한 기능은 아니었음, 체계화 된 것 뿐

AJAX의 특징
JavaScript를 가지고 서버와 통신할 수 있게 해준 기술 
               -> HTML만 가지고 서버와 통신 가능


1. UX, RIA 
User Experience - 사용자 경험(MS)
Rich Internet Application - 편하게 쓰겠끔(Macro)
공통점 - 사용자에게 좀 더 다양하게, 멋지게, 편하게 기술 제공

2. Javascript와 서버와의 통신이 자연스럽게 이루어질 수 있다.

3. 새로고침은 동기 방식,
   AJAX는 비동기 방식으로 새로고침으로 인한 부자연스러움 없고
   동시에 여러작업이 가능, 
   사용자 입장에서 빠르게 반응하는 것처럼 보이고
   자연스러워 보임
   그러나 서버가 느려짐. 빨라지지는 않음

4. 선수과목
(1) javascript
(2) xml
(3) css
(4) XMLHttpRequest 객체(모든 브라우져가 가진객체)
     - 자바스크립트와 서버가 통신을 할 수 있게 해줌

5. onreadystatechange
(1) readyState
          1) 0 - Uninitialize : 객체만 생성되고 아직 초기화 되지 않은 상태
          2) 1 - Loading : open()이 호출되고 아직 send()까지는 호출되지 않은 상태
          3) 2 - Loaded : send()가 호출되고 서버로 부터 status와 헤더정보는 아직 도착하지 않은 상태
          4) 3 - Interactive : 서버로부터 데이터의 일부만 받은 상태
          5) 4 - Complete : 서버로부터 데이터를 전부 받은 상태

(2) status
          1) 200 : OK - 서버로 부터 값을 제대로 받았다, 이거 외에는 전부 실패
          2) 403 : forbidden - 접근 거부
          3) 404 : not found
          4) 500 : internal server error
          ...
----------------------------------- 
* 예전에 AJAX 처럼 구현하는 방식

client에 frame을 하나 만들어 둠,안보이게
client가 frame을 통해서 서버와 데이터를 주고 받고
해당 데이터를 화면에 뿌려줬음
사용자 모르게 서버와 통신하고 화면에 보여줬음
사용자 입장에서 빨라진 것처럼 느껴지게 해줌
-----------------------------------
* AJAX가 자주 사용 된 예제
- 자동완성 기능
- 플래쉬로 인한 다운로드 표시
- 댓글 
- 채팅
-----------------------------------
* AJAX는 클라이언트 측 기술
예전에는 JSP를 통해서 화면을 꾸며준 내용을
클라이언트에서는 출력만 했는데

AJAX는 서버에서 꾸며주는 것을 하지 않고 데이터만 전달하고
클라이언트에서는 전달받은 데이터를 
자바스크립트와 DOM, CSS를 통해서 다시 꾸며준다.
데이터를 XML로 전달했으나 
요즘에는 JSON을 사용한다
-----------------------------------
* AJAX 에서는 무줘건 "UTF-8"로 처리
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
* 프로젝트 생성
Dynamic Web Project - AjaxApp

라이브러리 추가
/AjaxApp/WebContent/WEB-INF/lib/servlet-api.jar
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
생성 - AJAX 연습 - basic,비동기적 방식 사용
텍스트 박스에 글을 서버에 전송
서버에서 전송한 내용을 받아서 화면에 출력
비동기적 방식 사용
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic01.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<title>Insert title here</title>
<script>
     var httpRequest = null;
     function fnSubmit() {
          httpRequest = new XMLHttpRequest();
          var param = "basic01_proc.jsp?name=" + document.getElementById("name").value;
          
          // 404 테스트
          //var param = "errorTEST.jsp?name=" + document.getElementById("name").value;
          
          // 서버와 연결 시도
          // 세가지가 기본 인자, 최신은 인자가 늘어남
          // open(전송방식,url 및 param(누구에게,전달할데이터),비동기 여부)
          // 비동기 여부의 true는 비동기 방식
          httpRequest.open("get",param,true);
          
          // 이벤트를 걸어 줄 수 있음, callback 함수          
          // 서버에게 전달했는지, 전달할려고 하는 구나, 결과를 받았는지,.. 이런 것을 찾는 함수가 있음
          // 위 상황을 감시하는 이벤트 핸들러
          // 이벤트가 발생할때마다 callback이 호출 되도록 예약을 걸어둠
          httpRequest.onreadystatechange=callback;
          
          // 서버에게 데이터를 전달
          // get 방식일때는 null
          httpRequest.send(null);
     }
     
     function callback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    // 서버로 부터 받아온 알맹이          
                    //alert(httpRequest.responseText);
                    var data = httpRequest.responseText;
                    var div = document.getElementById("display");
                    div.innerHTML = data;
               }else{
                    alert(httpRequest.status);
               }
          }
     }
</script>
</head><body>
<input type="text" name="name" id="name"/>
<input type="button" value="전송" onclick="fnSubmit()"/>
<hr/>
<div id="display"></div>
</body></html>
-----------------------------------  
3-2
생성 - AJAX 연습 - basic01.html과 연결
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic01_proc.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<%
     String name = request.getParameter("name");
%>
안녕하세요.~ <%=name%>님!
-----------------------------------  
3-3
생성 - AJAX 연습 - txt로 서버 페이지 
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic02.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<title>Insert title here</title>
<script>
     var httpRequest = null;
     function getXMLHttpRequest() {
          return new XMLHttpRequest();
     }
     function fnProcess(url) {
          httpRequest = getXMLHttpRequest();
          
          // 비동기 방식으로 요청
          httpRequest.open("get", url, true);
          
          httpRequest.onreadystatechange = fnCallback;
          
          httpRequest.send(null);
     }
     function fnCallback() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    alert(httpRequest.responseText);
               }else{
                    alert(httpRequest.status);
               }
          }
     }
</script>
</head><body>
<input type="button" value="euc_msg.txt" 
     onclick="fnProcess('euc_msg.txt')"/><br/><br/>
<input type="button" value="utf_msg.txt" 
     onclick="fnProcess('utf_msg.txt')"/><br/><br/>
<input type="button" value="euc_msg.jsp" 
     onclick="fnProcess('euc_msg.jsp')"/><br/><br/>
<input type="button" value="utf_msg.jsp" 
     onclick="fnProcess('utf_msg.jsp')"/><br/><br/>
</body></html>
----------------------------------- 
3-4
생성 - AJAX 연습 - basic02.html, ANSI로 저장
안나와야 하는데 나는 한글깨지면서 나옴
아마도 html5라서? 아니면 다른 이유가?
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/euc_msg.txt

abcd가나다라
----------------------------------- 
3-5
생성 - AJAX 연습 - basic02.html, UTF로 저장
나옴, 한글 안깨짐
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/utf_msg.txt

abcd가나다라
----------------------------------- 
3-6
생성 - AJAX 연습 - basic02.html, ansi로 저장
나옴, 한글 깨짐, 태그 써주면 한글 안깨짐
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/euc_msg.jsp

<%@ page contentType="text/plain; charset=EUC-KR"%>
abcd가나다라
----------------------------------- 
3-7 
생성 - AJAX 연습 - basic02.html, UTF로 저장
나옴, 한글 안깨짐
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/utf_msg.jsp

abcd가나다라
-----------------------------------  
3-8 
생성 - AJAX 연습 - 오늘의 뉴스
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic03.html

<!DOCTYPE html><html><head><meta charset="EUC-KR">
<title>Insert title here</title>
<script>
     var httpRequest = null;
     function getXMLHttpRequest() {
          return new XMLHttpRequest();
     }
     function fnCallBack() {
          if(httpRequest.readyState == 4){
               if(httpRequest.status == 200){
                    var data = httpRequest.responseText;
                    var div = document.getElementById("newsList");
                    div.innerHTML = data;
               }else{
                    alert(httpRequest.status);
               }
          }
     }
     function fnSubmit() {
          httpRequest = getXMLHttpRequest();
          
          httpRequest.open("GET","basic03_proc.jsp",true);
          httpRequest.onreadystatechange = fnCallBack;
          httpRequest.send(null);
     }
     window.onload = function() {
          fnSubmit();
     }
</script>
</head><body>
<h2>오늘의 뉴스</h2>
아래에 오늘의 뉴스가 출력됩니다.<br/><br/>
<div id="newsList"></div>
</body></html>
-----------------------------------  
3-9 
생성 - AJAX 연습 - 오늘의 뉴스
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/basic03_proc.jsp

<%@ page contentType="text/html; charset=EUC-KR"%>
<%
     String[] titles = {
          "현재 메르스 위험 주의보 발령...",
          "오늘 오후에 돌풍...",
          "중국발 미세먼지 엄청나...",
          };     
%>

<%
     for(int i=0;i<titles.length;i++){
          if(i == 0){
%>
          <strong>
<%          }%>
          <%=titles[i]%>
          <%if(i==0){%>          
          </strong>
<%
          }
     }
%>
-----------------------------------  
3-10 
생성 - AJAX 연습 - 반복된 코드 분리
Workspace : ~\JSP\EclipseWork
/AjaxApp/WebContent/ajax.js

var httpRequest = null;
function getXMLHttpRequest() {
     return new XMLHttpRequest();
}
function sendRequest(method,url,params,callback) {
     httpRequest = getXMLHttpRequest();     
     var httpMethod = method ? method : "GET" ;
     if(httpMethod != "GET" && httpMethod != "POST"){
          httpMethod = "GET";
     }
     var httpUrl = url;     
     var httpParams = (params == null || params == "")?null:params;
     
     if(httpMethod == "GET" && httpParams != null){
          httpUrl = httpUrl + "?" + httpParams;
     }
     httpRequest.open(httpMethod,httpUrl,"true");
     httpRequest.onreadystatechange = callback;
     httpRequest.send(httpMethod =="POST"?httpParams:null);
}
function fnCallBack() {
     if(httpRequest.readyState == 4){
          if(httpRequest.status == 200){
               var data = httpRequest.responseText;
               var div = document.getElementById("newsList");
               div.innerHTML = data;
          }else{
               alert(httpRequest.status);
          }
     }
}
-----------------------------------  
###################################
4. 과제
-----------------------------------
4-1
오늘 한 내용 전체적으로 안되는 것이 있는지 체크
----------------------------------- 
4-2
----------------------------------- 
4-3
----------------------------------- 
4-4
----------------------------------- 
4-5
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
5-1
-----------------------------------
5-2
----------------------------------- 
5-3
-----------------------------------
5-4
-----------------------------------
###################################
6. 기타
----------------------------------- 

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


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day62  (0) 2015.06.11
오픈프레임워크_Day61  (0) 2015.06.10
오픈프레임워크_Day59  (0) 2015.06.08
오픈프레임워크_Day58  (0) 2015.06.05
오픈프레임워크_Day57  (0) 2015.06.04
,
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
,,, : 같은 항목 내에 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
* 웹서비스
xml 데이터를 주고 받기 위한 약속 - soap
----------------------------------- 
* SAX 방식
sax는 반드시 상속을 받아야함
상속된 메서드를 통해서만 가능

DOM에 비해서 SAX를 좀 더 권장하고
안드로이드에서는 SAX 보다 좀 더 좋은 방법이 있음
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
* test1.xml 복사해서 test2.xml 만듬
안에 내용을 공백을 줌
~:\test2.xml 
만든 목적은 데이터를 추가해 보겠음
하나의 필드만 추가 할 예정

<?xml version="1.0" encoding="UTF-8"?>
<students>
     <student>
          <name>홍길동</name>
          <age>18</age>
     </student>
     <student>
          <name>임꺽정</name>
          <age>24</age>
     </student>
</students>
----------------------------------- 
* test2.xml 복사해서 만듬
~:\test4.xml

<?xml version="1.0" encoding="UTF-8"?>
<netsong7>
     <company>
          <url>www.a.com</url>
          <name>netsong7 전자</name>
     </company>
     <company>
          <url>www.b.com</url>
          <name>netsong7 식품</name>
     </company>
     <company>
          <url>www.c.com</url>
          <name>netsong7 항공</name>
     </company>
</netsong7>
-----------------------------------
* test5.xml 만듬
~:\test5.xml

<?xml version="1.0" encoding="UTF-8"?>
<SaxTest>
     <Element name="name" value="Scott"/>
     <Element name="age" value="24"/>
     <Element name="addr" value="서울시"/>
     <Element name="tel" value="111-1111"/>
</SaxTest>

<!--
     <SaxTest>
          <Element>
               <name>Scott</name>
               <age>24</age>
               ...
          </Element>
     </SaxTest>
-->
-----------------------------------
* test6.xml 만듬
~:\test6.xml

<?xml version="1.0" encoding="UTF-8"?>
<poem>
     <title>Roses are red</title>
     <l>Roses are red,</l>
     <l>Violets are blue;</l>
     <l>Sugar is sweet</l>
     <l>And I love you</l>    
</poem>
----------------------------------- 
* test7.xml 만듬

<?xml version="1.0" encoding="UTF-8"?>
<Phonebook>
     <PhonebookEntry>
          <firstname>John</firstname>
          <lastname>Connor</lastname>
          <address>5, Downing Street</address>
          <phone loc="home">111-1111</phone>
          <phone loc="work">222-2222</phone>
          <phone loc="mobile">333-3333</phone>
     </PhonebookEntry>
     <PhonebookEntry>
          <firstname>Peter</firstname>
          <lastname>Reche</lastname>
          <address>6, Downing Street</address>
          <phone loc="home">444-4444</phone>
          <phone loc="work">555-5555</phone>
          <phone loc="mobile">666-6666</phone>
     </PhonebookEntry>
</Phonebook>
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
수정 - XML 연습 - 특정 내용 출력
Workspace : ~\JSP\EclipseWork
/XmlApp/src/dom/Ex1.java

package dom;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;


public class Ex1 {

     public static void main(String[] args) throws ParserConfigurationException, FileNotFoundException, SAXException, IOException {
          //인스턴스를 생성하는 팩토리 생성
          DocumentBuilderFactory factory =
                    DocumentBuilderFactory.newInstance();
         
          DocumentBuilder builder = factory.newDocumentBuilder();
         
          //XML을 메모리에 불러옴, 트리 구조로
          Document doc = builder.parse(new FileInputStream("D:\\test.xml"));
         
          //root 위치를 가져옴
          Element root = doc.getDocumentElement();
          System.out.println(root.getNodeName());
          System.out.println(root.getNodeValue());
          System.out.println(root.getNodeType());
          System.out.println("------------------------------");

          //공백이 나옴, 그래서 xml에 공백을 제거
          Node n1 = root.getFirstChild();
          System.out.println(n1.getNodeName());
          System.out.println(n1.getNodeValue());
          System.out.println(n1.getNodeType());
          System.out.println("------------------------------");
          System.out.println(n1.getFirstChild().getNodeName());
          System.out.println(n1.getFirstChild().getNodeValue());
          System.out.println(n1.getFirstChild().getNodeType());
          System.out.println("------------------------------");
          System.out.println(n1.getFirstChild().getFirstChild().getNodeName());
          System.out.println(n1.getFirstChild().getFirstChild().getNodeValue());
          System.out.println(n1.getFirstChild().getFirstChild().getNodeType());
          System.out.println("------------------------------");
          Node n2 = root.getLastChild();
          System.out.println(n2.getNodeName());
          System.out.println(n2.getNodeValue());
          System.out.println(n2.getNodeType());
          System.out.println("------------------------------");
          // 임꺽정과 나이를 출력
          System.out.println(n2.getFirstChild().getFirstChild().getNodeName());
          System.out.println(n2.getFirstChild().getTextContent());
          System.out.println(n2.getFirstChild().getFirstChild().getNodeType());
     }

}
-----------------------------------  
3-2
생성 - XML 연습 - 필드 추가
Workspace : ~\JSP\EclipseWork
/XmlApp/src/dom/Ex2.java

package dom;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
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.Node;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;


public class Ex2 {

     public static void main(String[] args) throws ParserConfigurationException,
          FileNotFoundException, SAXException, IOException, TransformerException {
          //인스턴스를 생성하는 팩토리 생성
          DocumentBuilderFactory factory =
                    DocumentBuilderFactory.newInstance();
         
          DocumentBuilder builder = factory.newDocumentBuilder();
         
          //XML을 메모리에 불러옴, 트리 구조로
          Document doc = builder.parse(new FileInputStream("D:\\test2.xml"));
         
          //공백을 제외하고 찾아가는 방법
          Element root = doc.getDocumentElement();
          for (Node n = root.getFirstChild(); n != null; n = n.getNextSibling()) {
               if (n.getNodeType() == Node.ELEMENT_NODE) {
                    if (n.getNodeName().equals("student")) {
                         //이 문서에 대해서 소유권을 주장할 수 있는 인증 얻어오기
                         //이 document에 대한 주소값을 가져옴
                         Document d = n.getOwnerDocument();
                         //엘리먼트 생성
                         Element e = d.createElement("address");
                         //들어갈 내용만 따로 만듬
                         Text t = d.createTextNode("서울시");
                        
                         //n은 student라는 엘리먼트를 가리킴
                         //n에 맨뒤에 "address"태그 추가
                         n.appendChild(e);
                        
                         //"address"태그 안에 택스트 내용을 넣음
                         e.appendChild(t);
                        
                         //여기까지 하면 메모리에 새로운 태그가 넣어졌음
                    }
               }
          }
         
          System.out.println("작업끝");
         
          //메모리에 있는 내용을 xml파일 형식으로 변환시켜주는 것이 필요함
          //xml format으로 만들어 주는 클래스
          TransformerFactory transFactory = TransformerFactory.newInstance();
         
          //변환 시킬 공간을 만듬
          Transformer transformer = transFactory.newTransformer();
         
          transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
          transformer.setOutputProperty(OutputKeys.INDENT, "yes");
         
          //파일로 저장을 해야함, streamResult를 통해서 포장을 함
          StreamResult result = new StreamResult(
                    new FileOutputStream(
                              new File("D:\\test3.xml")));

          // doc를 transFactory로 변환 시켜서 파일로 저장을 해야함
         
          // 원본 소스
          DOMSource source =  new DOMSource(doc);
         
          // 변환해서 내보내
          transformer.transform(source, result);
         
     }

}
-----------------------------------  
3-3
생성 - XML 연습 - getElementById, getElementsByTagName
Workspace : ~\JSP\EclipseWork
/XmlApp/src/dom/Ex3.java

package dom;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class Ex3 {

     public static void main(String[] args) throws ParserConfigurationException, FileNotFoundException, SAXException, IOException {
          DocumentBuilderFactory factory =
                    DocumentBuilderFactory.newInstance();
          DocumentBuilder builder = factory.newDocumentBuilder();
          Document doc = builder.parse(new FileInputStream("D:\\test4.xml"));
         
          NodeList nodeList = doc.getElementsByTagName("company");
          System.out.println("다음은 netsong7의 자회사 목록 입니다.");
          for(int i=0;i<nodeList.getLength();i++){
               Node node = nodeList.item(i);
               if(node.getNodeType() == Node.ELEMENT_NODE){
                    Element element = (Element)node;
                   
                    NodeList url = element.getElementsByTagName("url");
                    Element firstElement = (Element)url.item(0);
                    NodeList first = firstElement.getChildNodes();
                    System.out.println("URL : "+((Node)first.item(0)).getNodeValue());
                   
                    NodeList name = element.getElementsByTagName("name");
                    firstElement = (Element)name.item(0);
                    first = firstElement.getChildNodes();
                    System.out.println("NAME : "+((Node)first.item(0)).getNodeValue());
               }
               System.out.println();
          }
     }
}
----------------------------------- 
3-4
생성 - XML 연습 - sax,test5.xml
Workspace : ~\JSP\EclipseWork
/XmlApp/src/sax/Ex1.java

package sax;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Ex1 extends DefaultHandler{
     //아래 메서드들은 전부 callback 메서드임
     private HashMap<String, String> data = new HashMap<String, String>();
    
     @Override
     public void endDocument() throws SAXException {
          System.out.println("끝 태그 만났을 때 - 문서의 끝");
     }

     @Override
     public void startDocument() throws SAXException {
          System.out.println("시작 태그 만났을 때 - 문서의 시작");
     }

     @Override
     public void startElement(String uri, String localName, String qName,
               Attributes attributes) throws SAXException {
//          System.out.println("엘리먼트 만났을 때 : "+localName+", "+qName);
         
//          속성의 갯수
//          System.out.println(attributes.getLength());
         
          if(attributes.getLength()==2){
               data.put(attributes.getValue("name"),
                         attributes.getValue("value"));
          }    
     }
    
     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
          // sax를 만들기 위한 공장
          SAXParserFactory factory = SAXParserFactory.newInstance();
         
          // 원본 메모리 준비
          SAXParser parser = factory.newSAXParser();
         
          // 상속받은 클래스 준비, 별도의 공간 만듬
          Ex1 ex1 = new Ex1();
          parser.parse(new File("D:\\test5.xml"), ex1);
         
//          startElement 에서 처리된 결과를 main에서 돌려봅시다
          System.out.println(ex1.data.get("name"));
          System.out.println(ex1.data.get("age"));
          System.out.println(ex1.data.get("addr"));
          System.out.println(ex1.data.get("tel"));
     }
}
----------------------------------- 
3-5
생성 - XML 연습 - sax,test6.xml
Workspace : ~\JSP\EclipseWork
/XmlApp/src/sax/Ex2.java

package sax;

import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class Ex2 extends DefaultHandler{
     private HashMap<String, String> data = new HashMap<String, String>();
    
     @Override
     public void endDocument() throws SAXException {
          System.out.println("끝 태그 만났을 때 - 문서의 끝");
     }

     @Override
     public void startDocument() throws SAXException {
          System.out.println("시작 태그 만났을 때 - 문서의 시작");
     }

     @Override
     public void startElement(String uri, String localName, String qName,
               Attributes attributes) throws SAXException {
          System.out.println("시작태그 : "+qName);
     }
    
     @Override
     public void characters(char[] ch, int start, int length)
               throws SAXException {
          System.out.println("문자들 :");
          for(int i=start;i<start+length;i++){
               System.out.print(ch[i]);
          }
          System.out.println();
     }

     @Override
     public void endElement(String uri, String localName, String qName) throws SAXException {
          System.out.println("끝태그 : "+qName);
     }
    
     public static void main(String[] args) throws SAXException, IOException {
          // xml 읽어 볼때 간단하게 읽어 오기
          XMLReader xReader = XMLReaderFactory.createXMLReader();
         
          FileReader fr = new FileReader("D:\\test6.xml");
          Ex2 ex2 = new Ex2();
         
//          xmlReader를 통한 디테일한 옵션 가능
          xReader.setContentHandler(ex2);         
//          에러 났을때 처리할 클래스 지정
          xReader.setErrorHandler(ex2);
//          DTD 핸들러를 통해서 DTD 검증이 가능
//          xReader.getDTDHandler();
          xReader.parse(new InputSource(fr));
     }
}
----------------------------------- 
3-6
생성 - XML 연습 - sax,test7.xml,DB대신 활용
Workspace : ~\JSP\EclipseWork
/XmlApp/src/sax/PhoneDto.java

package sax;

public class PhoneDto {
     private String firstname;
     private String lastname;
     private String address;
     private String homephone;
     private String workphone;
     private String mobilephone;
     public String getFirstname() {
          return firstname;
     }
     public void setFirstname(String firstname) {
          this.firstname = firstname;
     }
     public String getLastname() {
          return lastname;
     }
     public void setLastname(String lastname) {
          this.lastname = lastname;
     }
     public String getAddress() {
          return address;
     }
     public void setAddress(String address) {
          this.address = address;
     }
     public String getHomephone() {
          return homephone;
     }
     public void setHomephone(String homephone) {
          this.homephone = homephone;
     }
     public String getWorkphone() {
          return workphone;
     }
     public void setWorkphone(String workphone) {
          this.workphone = workphone;
     }
     public String getMobilephone() {
          return mobilephone;
     }
     public void setMobilephone(String mobilephone) {
          this.mobilephone = mobilephone;
     }    
}
----------------------------------- 
3-7 
생성 - XML 연습 - sax,test7.xml,DB대신 활용
Workspace : ~\JSP\EclipseWork
/XmlApp/src/sax/Ex3.java

package sax;

import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

class PhonebookHandler extends DefaultHandler{
     private PhoneDto phoneBook;
     private ArrayList<PhoneDto> phoneList;
     private String position = "";
     
     public ArrayList<PhoneDto> getPhoneList(){
          return phoneList;
     }
     
     @Override
     public void characters(char[] ch, int start, int length)
               throws SAXException {
          if(position.equals("firstname")){
               phoneBook.setFirstname(new String(ch,start,length));
          }else if(position.equals("lastname")){
               phoneBook.setLastname(new String(ch,start,length));
          }else if(position.equals("address")){
               phoneBook.setAddress(new String(ch,start,length));
          }else if(position.equals("home")){
               phoneBook.setHomephone(new String(ch,start,length));
          }else if(position.equals("work")){
               phoneBook.setWorkphone(new String(ch,start,length));
          }else if(position.equals("mobile")){
               phoneBook.setMobilephone(new String(ch,start,length));
          }
     }

     @Override
     public void endElement(String uri, String localName, String qName)
               throws SAXException {
          if(qName.equals("PhonebookEntry")){               
               phoneList.add(phoneBook);
          }
     }

     @Override
     public void startDocument() throws SAXException {
//          System.out.println("시작 태그 만났을 때 - 문서의 시작");
          phoneList = new ArrayList<PhoneDto>();
     }

     @Override
     public void startElement(String uri, String localName, String qName,
               Attributes attributes) throws SAXException {
          if(qName.equals("PhonebookEntry")){
               phoneBook = new PhoneDto();          
          }else if(qName.equals("firstname")){
               position = "firstname";
          }else if(qName.equals("lastname")){
               position = "lastname";
          }else if(qName.equals("address")){
               position = "address";
          }else if(qName.equals("phone")){
               String attr = attributes.getValue("loc");
               position = attr;
          }else{
               position = "";
          }
     }
     
}
public class Ex3 {     
     public static void main(String[] args) throws SAXException, IOException {
          XMLReader xReader = XMLReaderFactory.createXMLReader();
          FileReader fr = new FileReader("D:\\test7.xml");
          PhonebookHandler handler = new PhonebookHandler();
          xReader.setContentHandler(handler);
          xReader.parse(new InputSource(fr));
          for (int i = 0; i < handler.getPhoneList().size(); i++) {
               System.out.println(handler.getPhoneList().get(i).toString());
          }
     }
}
-----------------------------------  
###################################
4. 과제
-----------------------------------
4-1
/XmlApp/src/sax/Ex3.java
마지막 예제 제대로 출력이 안됨
이유를 찾아내기
----------------------------------- 
4-2
6월 15일까지(다음주 월요일까지) 마인드 맵 제출 , 카테고리 4개 이상

이력서는 10일날 받아서 바로바로 제출
22일 1차 제출,7/17 2차 제출

모의 면접 7/6 ~ 7/24 조별 모의면접 2회 진행
----------------------------------- 
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
----------------------------------- 


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day61  (0) 2015.06.10
오픈프레임워크_Day60  (0) 2015.06.09
오픈프레임워크_Day58  (0) 2015.06.05
오픈프레임워크_Day57  (0) 2015.06.04
오픈프레임워크_Day56  (0) 2015.06.03
,