어느덧 2015년 1월이 지나가고
새로운 2월이 시작됬네요…
정신없이 한달이 지나가고.. 또 한달이 지나가고…
항상 느끼는거지만… 새해를 맞이하고 1,2,3월달은 엄청 빨리가는듯…
새롭게 한해 계획 모두 잘지키려고 노력하는 모습들…
저도 마찬가지네요..ㅠ
또 2015년 열심히 살아가며
더 낳은 개발자가 되기위해 노력합니다…
Alto ventos est coeptis utque fecit. Phoebe sine circumfuso arce. Tanto aliis. Matutinis cornua origo formaeque animal mundo. Chaos: fabricator. Natura mundo caesa addidit. Cuncta habendum meis omni ille formaeque emicuit septemque et. Lege fecit aethere porrexerat gentes horrifer formas.
어느덧 2015년 1월이 지나가고
새로운 2월이 시작됬네요…
정신없이 한달이 지나가고.. 또 한달이 지나가고…
항상 느끼는거지만… 새해를 맞이하고 1,2,3월달은 엄청 빨리가는듯…
새롭게 한해 계획 모두 잘지키려고 노력하는 모습들…
저도 마찬가지네요..ㅠ
또 2015년 열심히 살아가며
더 낳은 개발자가 되기위해 노력합니다…
Web Project에다가 Spring MVC를 적용하는 과정에서 web.xml 에 `Listener`를 추가하고 서버를 실행시키면 아래의 메시지가 출력한다.
2월 04, 2013 2:50:09 오후 org.apache.catalina.core.StandardContext listenerStop 심각: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:172) at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1071) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1045) at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:993) at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:548) at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4831) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5478) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)
발생원인 |
ContextLoaderListener 을 Listener로 등록해두면, 웹 애플리케이션이 시작할 때 자동으로 루트 애플리케이션 컨텍스트를 만들고 초기화를 한다. 디폴트Default로 XmlWebApplicationContext를 애플리케이션 컨텍스트 클래스가 지정되고 /WEB-INF/applicationContext.xml을 탐색한다. 이때, applicationContext.xml 파일을 찾지 못하면서 발생한다.
해결방법 |
1. /WEB-INF/applicationContext.xml 생성 및 설정
2. web.xml 내에 <context-param></context-param> 으로 ~Context.xml 을 지정
contextConfigLocation /WEB-INF/spring/appServlet/applicationContext.xml
위의 두 가지 방법 중 하나를 선택해서 처리하면 된다.
Spring Framework를 통해서 인증(Authentication)과 허가(Authorization)에 관련된 작업을 한다면 여러 방법이 있을 수 있겠지만. 일반적으로 Spring의 서브 프로젝트인 Spring Security를 사용하게 된다. Spring Security는 필터기반으로 동작하므로 Spring MVC의 구현과 완전히 분리되고 Spring과의 밀접한 연동으로 메서드 보안등의 여러가지 장점이 있다. 또한 Role 기반의 허가를 지원하므로 경로별, 권한별 리소스 제한에 대해서도 많은 기능을 제공한다. Spring Security를 사용할 때 기본적인 Form 인증을 사용하는 경우에 대해서 정리해본다.
1. Spring Framework를 구성한다.
2. Spring Security 사이트에서 배포본을 다운로드 받아 그 안의 jar 파일을 라이브러리에 등록한다.(http://www.springsource.org/spring-security#download) Spring Framework의 버전에 따라서 다운로드 받아야 할 Spring Security의 배포본 버전이 다르므로 주의.
3. 다음의 필터 정의를 web.xml에 추가한다.
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/-</url-pattern>
</filter-mapping>
이 필터 정의를 추가함으로서 해당 사이트의 모든 요청은 Spring Security를 통해서 처리된다.
4. 다음의 설정 파일을 추가한다. 관리상 Spring Framework의 설정 파일과 분리하는 편이 좋겠다. 여기서는 security-context.xml 파일에 내용을 넣었다.
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans:beans xmlns=”http://www.springframework.org/schema/security”
xmlns:beans=”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-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd“>
<http pattern=”/login” security=”none”></http>
<http auto-config=”true” access-denied-page=”/login?denied=true”>
<intercept-url pattern=”/-*” access=”ROLE_USER” />
<form-login
login-page=”/login”
authentication-success-handler-ref=”loginSuccessHandler”
authentication-failure-handler-ref=”loginFailureHandler”
/>
<logout logout-success-url=”/login” />
</http>
<beans:bean id=”loginSuccessHandler”></beans:bean>
<beans:bean id=”loginFailureHandler”></beans:bean>
<beans:bean id=”preludebUserService”></beans:bean>
<beans:bean id=”encoder”/>
<authentication-manager>
<authentication-provider user-service-ref=”preludebUserService”>
<password-encoder ref=”encoder” />
</authentication-provider>
</authentication-manager>
</beans:beans>
설정 파일의 내용을 설명해 보면
<http pattern=”/login” security=”none”></http>
위 코드는 login 요청에 대해서는 보안을 적용하지 않는다는 의미이다. Spring Security를 사용할 때 인증에 관련없이 보여주어야 할 부분(주로 로그인 페이지, 이미지 등의 정적인 리소스등)은 <http pattern=”/s-ripts/-*” security=”none”></http> 같은 형태로 패턴을 추가해 주면 된다. 이 패턴 설정은 위부터 순서대로 적용되고 패턴매칭이 완료 되면 아래의 패턴은 무시 되므로 보안 설정을 무시하는 경로는 아래에 나오는 보안 설정 이전에 나와야 한다.
<http auto-config=”true” access-denied-page=”/login?denied=true”>
<intercept-url pattern=”/-*” access=”ROLE_USER” />
<form-login
login-page=”/login”
authentication-success-handler-ref=”loginSuccessHandler”
authentication-failure-handler-ref=”loginFailureHandler”
/>
<logout logout-success-url=”/login” />
</http>
위 코드는 실질적으로 웹사이트 경로에 대한 권한 설정을 하는 부분이다. auto-config=”true”를 통해서 일반적으로 설정되는 많은 설정 부분이 자동으로 설정된다. access-denied-page=”/login?denied=true” 부분은 인증을 통과 했지만 해당 요청에 맞는 권한이 없는 경우 보내지는 페이지 경로를 설정한다.
<intercept-url pattern=”/-*” access=”ROLE_USER” /> 는 웹사이트 모든 경로에 대해서 ROLE_USER 권한이 있어야 접근할 수 있다는 내용이다. 인증된 사용자에 대하여 ROLE_USER 권한이 없다면 access-denied-page에 지정된 페이지로 리다이렉트 된다.
<form-login login-page=”/login” authentication-success-handler-ref=”loginSuccessHandler” authentication-failure-handler-ref=”loginFailureHandler” /> 는 폼 인증을 사용하겠다는 정의이며, 로그인 페이지는 /login. 인증이 성공할때는 loginSuccessHandler 핸들러로 처리. 인증이 실패할때는 loginFailureHandler 핸들러로 처리하겠다는 의미이다.
<logout logout-success-url=”/login” /> 는 로그아웃시 리다이렉트 될 페이지를 정의한다.
<beans:bean id=”loginSuccessHandler”></beans:bean>는 로그인 성공시 처리할 핸들러 빈의 정의이다. 해당 구현은 잠시 후 살펴본다.
<beans:bean id=”loginFailureHandler”></beans:bean>는 로그인 실패시 처리할 핸들러 빈의 정의이다. 해당 구현은 잠시 후 살펴본다.
<beans:bean id=”preludebUserService”></beans:bean>는 로그인 처리 과정에서 UserDetails 객체를 생성하는 UserDetailsService의 빈의 정의이다. 해당 구현은 잠시 후 살펴본다.
<beans:bean id=”encoder”/>는 Spring Security에서 제공하는 패스워드 인코더의 빈 정의이다. 이 인코더는 random salt를 적용하는 단 방향 해시이며 일반적인 해시와 동일한 형태로 사용하면 된다. 구버전 Spring Security의 경우에는 이 인코더를 지원하지 않으므로 SHA나 MD5 해싱을 이용한다.
<authentication-manager>
<authentication-provider user-service-ref=”preludebUserService”>
<password-encoder ref=”encoder” />
</authentication-provider>
</authentication-manager>
위 코드는 인증 매니저를 설정한다. 이 부분에서 설정한 구성을 사용해 Spring Security는 인증 객체를 가져오고 인증 과정을 처리한다.
5. UserDetails 인터페이스를 구현하는 계정정보를 담는 클래스를 구현한다. 클래스의 이름은 각자 환경에 맞게 하면 된다.
package com.preludeb.auth.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
public class PreludebUser implements UserDetails
{
private String username;
private String password;
public Collection<? extends GrantedAuthority> getAuthorities()
{
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority(“ROLE_USER”));
return authorities;
}
public void setPassword(String password)
{
this.password = password;
}
public String getPassword()
{
return password;
}
public void setUsername(String username)
{
this.username = username;
}
public String getUsername()
{
return username;
}
public boolean isAccountNonExpired()
{
return true;
}
public boolean isAccountNonLocked()
{
return true;
}
public boolean isCredentialsNonExpired()
{
return true;
}
public boolean isEnabled()
{
return true;
}
}
UserDetails 인터페이스는 위의 클래스에서 정의된 각각의 get, is 메서드를 호출해 인증 과정에서 필요한 정보를 UserDetailsService에 노출한다. 필요에 따라서 username, password 등의 변수를 생성하고 그 변수에 값을 입력하는 getter 메서드를 추가하면 된다. 여기에서는 username, password만을 입력하도록 구현하였다. 권한처리가 필요한 경우에는 getAuthorities()에 대응하는 List<Authority> 변수를 설정하거나 계정 잠금의 경우에는 isNonLocked() 메서드에 대응하는 boolean 값을 추가하면 된다. UserDetails 인터페이스는 각 설정을 확인하기 위한 getter 메서드만을 필요로 한다.
username과 password의 경우에는 일반적인 형태의 getter, setter 메서드를 사용하였고 권한을 반환하는 getAuthorities() 메서드에서는 인증 후 필요한 기본 권한인 ROLE_USER 권한을 반환하도록 구현 하였다. 그외의 부분은 아무런 입력 없이도 허가가 통과하도록 true를 반환하도록 되어 있다. 계정 잠금, 계정 만료, 계정 사용여부 등으로 계정 사용을 처리하고자 한다면 해당 부분을 사용하면 된다.
6. 인증 객체를 생성하는 UserDetailsService 클래스를 구현한다.
package com.preludeb.auth.core;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.StandardPasswordEncoder;
public class PreludebUserService implements UserDetailsService
{
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
StandardPasswordEncoder encoder = new StandardPasswordEncoder();
PreludebUser entazUser = new PreludebUser();
entazUser.setUsername(username);
entazUser.setPassword(encoder.encode(“abcd”));
return entazUser;
}
}
Spring Security는 인증 과정이 시작되면 UserDetailsService 클래스의 loadUserByUsername()을 호출하게 된다. 이 메서드의 파라마터는 사용자가 로그인 정보로 입력한 j_username이 전달된다. 일반적인 경우에는 전달받은 username으로 데이터베이스등에 쿼리를 하고 그 결과 전달받은 패스워드, 권한 정보등을 UserDetails를 구현하는 클래스(여기서는 PreludebUser)에 저장하고 객체를 반환하게 된다. 여기에서는 간단한 구현을 위해 username은 전달받은 username, 패스워드는 abcd의 해시값을 입력하였다. 실제 데이터베이스를 사용하는 경우에는 회원 가입시 입력받은 패스워드를 StandardPasswordEncoder.encode()를 거쳐 저장하고 이 메서드에서는 쿼리결과를 바로 setter 메서드로 보내는 형태가 될 것이다. 만약 username으로 쿼리를 날려서 결과가 없다면 UsernameNotFoundException 예외를 throw 하면 된다.
7. 인증 성공시 처리하는 핸들러를 구현한다.
package com.preludeb.auth.core;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
public class LoginSuccessHandler implements AuthenticationSuccessHandler
{
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) throws IOException, ServletException
{
response.sendRedirect(request.getContextPath() + “/index”);
}
}
성공시 처리하는 핸들러는 AuthenticationSuccessHandler 인터페이스를 구현한다. Spring Security에서 인증 과정을 거친 후 인증이 성공하면 onAuthenticationSuccess() 를 호출한다. 여기에서는 단순히 /index 로 리다이렉트 하지만 일반적인 경우에는 계정에 대한 초기화 작업이나 로그 기록등의 작업을 진행하게 된다.
8. 인증 실패시 처리하는 핸들러를 구현한다.
package com.preludeb.auth.core;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
public class LoginFailureHandler implements AuthenticationFailureHandler
{
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException auth) throws IOException, ServletException
{
response.sendRedirect(request.getContextPath() + “/login”);
}
}
실패시 처리하는 핸들러는 AuthenticationFailureHandler 인터페이스를 구현한다. Spring Security에서 인증 과정을 거친 후 인증이 실패하면 onAuthenticationFailure() 를 호출한다. 여기에서는 단순히 /login 로 리다이렉트 하지만 일반적인 경우에는 로그인 실패에 대한 로그 기록등을 하게 된다.
9. 로그인 과정을 처리하기 위한 컨트롤러 코드를 구현한다.
package com.preludeb.auth.controller;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.preludeb.auth.core.PreludebUser;
@Controller
public class IndexController
{
public PreludebUser getUser()
{
return (PreludebUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
@RequestMapping(value = “/index”, method = RequestMethod.GET)
public ModelAndView index()
{
ModelAndView view = new ModelAndView();
view.setViewName(“index”);
view.addObject(“username”, getUser().getUsername());
return view;
}
@RequestMapping(value = “/login”, method = RequestMethod.GET)
public ModelAndView login()
{
ModelAndView view = new ModelAndView();
view.setViewName(“login”);
return view;
}
}
별다른 내용이 없는 컨트롤러 코드이다. login의 경우에는 로그인 view 페이지를 쓰고 있고, index의 경우에는 인증 객체에서 username을 가져와 view페이지에 전달하는 간단한 구현을 하였다.
10. 로그인을 위한 JSP페이지를 구현한다.
<%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%>
<html>
<head></head>
<body>
<form action=”j_spring_security_check” method=”post”>
<table border=”0″>
<tr>
<td>ID:</td>
<td><input type=”text” name=”j_username”></td>
</tr>
<tr>
<td>패스워드:</td>
<td><input type=”password” name=”j_password”></td>
</tr>
<tr>
<td colspan=”2″>
<input type=”submit” value=”Login”>
</td>
</tr>
</table>
</form>
</body>
</html>
form에서 action을 j_spring_security_check로 로그인 내용을 보내면 Spring Security가 인증 과정을 처리하게 된다. action과 form의 name은 예약되어 있는 이름으로 그대로 사용하면 된다.
11. 로그인 후 리다이렉트 되는 JSP페이지를 구현한다.
<%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%>
<html>
<head></head>
<body>
Hello ${username}!<br>
<a href=”<%= request.getContextPath() %>/j_spring_security_logout”>[로그아웃]</a>
</body>
</html>
앞에서 구현한 Controller 클래스에서의 내용처럼 이 뷰 페이지에는 로그인 계정명이 전달된다. 아래 로그아웃 부분에서처럼 j_spring_security_logout 페이지를 호출하면 Spring Security에서 로그아웃 처리를 하고 설정 파일에 정의된 로그아웃 후 페이지로 리다이렉트 된다.
사이트 구성이 끝났다면 웹사이트를 시작하고 로그인 페이지에서 ID와 패스워드에 ‘abcd’를 입력하면 Hello ID!가 출력됨을 확인할 수 있다.
가끔 결과 값에 따라서 소수점을 제외하는 상황이 발생합니다.
JSTL로 소수점을 제외하는 방법을 알아봅시다.
< fmt:parseNumber var= "pages" integerOnly= "true" value= " ${totalCnt/rowsPerPage } " />
가끔 안드로이드 개발을 할때 유용하게 필요할것 같습니다.
버전 분기 / 통신사 분기/ 기기명 분기
할때 쓸수 있겠군효 ^,^ …
TelephonyManager tpMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String alphName = tpMgr.getNetworkOperatorName(); Log.d("Telephony", "alphName:\t" + alphName); // 통신사 Log.d("", "SDK:" + android.os.Build.VERSION.RELEASE); // 버젼 sdk:2.1-update1 Log.d("", "MODEL:" + android.os.Build.MODEL); // Device Model
웹 개발에 화면단을 구성하기위해
공통으로 쓰이는 영역과 헤더 푸터 사이드 등등…
영역 별로 나눠서 관리하면 훨씬 편하다…
이에 따라 tiles라는 좋은 기술이 있어서 메모한당..
물론 크게 어렵지 않아서 한번만 보고도 쉽게 적용할수 있습니다.^^
1. pom.xml 설정
(dependency 추가)
<properties> <java-version>1.6</java-version> <org.springframework-version>3.1.1.RELEASE</org.springframework-version> <org.aspectj-version>1.6.10</org.aspectj-version> <org.slf4j-version>1.6.6</org.slf4j-version> <org.apache.tiles-version>2.2.2</org.apache.tiles-version> </properties> <!-- Tiles --> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-extras</artifactId> <version>${org.apache.tiles-version}</version> </dependency>
2. servlet-context.xml 설정
(스프링 context 파일 수정 )
(InternalResourceViewResolver사용을 tilesViewResolver으로 변경)
<!-- <beans:bean --> <!-- class="org.springframework.web.servlet.view.InternalResourceViewResolver"> --> <!-- <beans:property name="prefix" value="/WEB-INF/jsp/" /> --> <!-- <beans:property name="suffix" value=".jsp" /> --> <!-- </beans:bean> --> <!-- tilesViewResolver -->
3. tiles.xml 설정
<!--?xml version="1.0" encoding="UTF-8" ?-->
4. controller 추가
@RequestMapping(value="/hello.do") public String handleRequest(Model model) throws Exception { String message = "hello world"; model.addAttribute("message", message); return "hello"; }
5. layout.jsp
(base가 되는 레이아웃 구성)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></pre> <table border="1" cellspacing="2" cellpadding="2" align="center"> <tbody> <tr> <td colspan="2" height="30"></td> </tr> <tr> <td height="250"></td> <td width="350"></td> </tr> <tr> <td colspan="2" height="30"></td> </tr> </tbody> </table> <pre>
6. layout.jsp에 들어갈 파일 생성
header.jsp</pre> <h1>Header</h1> <pre> menu.jsp Menu footer.jsp Copyright @2014 heewooworld hello.jsp ${message}
<filter> <filter-name>encodingFilter</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> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
– JSON 파서는 Java Script Object Notation 의 약자로, Java Script 에서 주로 사용하는 파서입니다.
– 웹에서 정보를 주고받는 경량화된 방법이며, XML 파서가 아닌 script 에서 사용하는 자료형에 대한 파싱이 가능하다.
<자체 포맷>
1. 배열 : 대괄호 안에 값을 콤마로 나열 ex) [1, 2, 3]
2. 객체 : 중괄호 안에 이름:값 형태로 ex) {“name”:”babo”, “age”:26}
3. 단순 값 : 수치, 문자열, 논리형, null 지원.
Object get (int index) int getInt (int index) String getString int index) boolean getBoolean (int index) JSONArray getJSONArray (int index) JSONObject getJSONObject (int index)
Object get (String key) int getInt (String key) String getString (String key) boolean getBoolean (String key) JSONArray getJSONArray (String key) JSONObject getJSONObject (String key)
예제를 보며 얘기하자.
String Json = "[8, 9, 6, 2, 9]"; try{ int sum = 0; JSONArray ja = new JSONArray(Json); for (int i = 0; i < ja.length(); i++){ sum += ja.getInt(i); } } catch (JSONException e){ ;}
String Json = "[{\"Product\" : \"Mouse\", \"Maker\":\"Samsung\", \"Price\":23000}," + "{\"Product\" : \"KeyBoard\", \"Maker\":\"LG\", \"Price\":12000}," + "{\"Product\":\"HDD\", \"Maker\":\"Western Digital\", \"Price\":156000}]"; try{ String result = ""; JSONArray ja = new JSONArray(Json); for (int i = 0; i < ja.length(); i++){ JSONObject order = ja.getJSONObject(i); result += "product: " + order.getString("Product") + ", maker: " + order.getString("Maker") + ", price: " + order.getInt("Price") + "\n"; } } catch (JSONException e){ ;}
JSON 문자열로 변환하기
– JSON 객체를 생성
JSONObject jsonObj = new JSONObject();
– JSON 객체에 데이터 저장(복수저장 가능)
jsonObj.put("이름1", "내용1"); jsonObj.put("이름2", "내용2");
– JSON 객체를 전송할 문자열로 변환
String sendMsg = jsonObj.toJSONString();
여기서 만들어진 문자열을 전송시에 이용하시면 됩니다.
JSON 문자열 파싱하기
– JSON Parser 생성
JSONParser parser = new JSONParser();
– 넘어온 문자열을 JSON 객체로 변환
JSONObject jsonObj = (JSONObject)parser.parse(receiveMsg);
– JSON 객체에서 데이터 가져오기
String data1 = jsonObj.get("이름1").toString(); String data2 = jsonObj.get("이름2").toString();
이런 형태로 이용하면 된다.
## 추가내용 ##
JSON 배열 저장하기
– JSON 배열객체 생성
JSONArray jArr = new JSONArray();
– 여러개의 JSON 객체 생성
JSONObject obj1 = new JSONObject(); obj1.put("name","유준상"); obj1.put("sex","남"); JSONObject obj2 = new JSONObject(); obj2.put("name","티아라"); obj2.pub("sex","여");
– JSONArray에 담기
jArr.add(obj1); jArr.add(obj2);
– JSON 객체생성
JSONObject jObj = new JSONObject();
– JSON 객체에 배열을 담음
jObj.put("연예인", jArr);
– JSONArray 가져오기
JSONArray arr = (JSONArray)jObj.get("연예인")
– iterator를 가져와서 처리
Iterator it = outArr.iterator();
– 반복하여 존재하는 데이터 가져옴
while(it.hasNext()){ JSONObject o = (JSONObject)it.next(); }
참고로 JSON을 이용하기 위해서는 JSON 패키지를 설치하시고,
import org.json.simple.JSONObject; 를 포함 시켜서 이용하세요~
http://javakorean.com/wp2/wp-content/uploads/2015/02/하이브레인넷-부설연구소-MySQL-Replication-설정과-몇-가지-테스트.pdf
출처 : 하이브레인넷-부설연구소—-MySQL-Replication-설정과-몇-가지-테스트