- JSP 에서JSTL사용을 위해서 

상단의  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 와 같이

      core, functions, form 등을 추가를 해주어야 되는데 Uri 가 길다. 귀찮다.

그래서 찾은 것이 JSTL 다운받아서 특정 경로에 넣어주고

Web.xml 내의 <taglib> element 추가해서 변하게 불러 사용

이렇게 쓸일이 있겠냐마는 알고 있어서 나쁠 건 없으니깐...



---------- web.xml 에서

<jsp-config>
    <taglib>
         <taglib-uri>jstl-c</taglib-uri>
         <taglib-location>/WEB-INF/tlds/c.tld</taglib-location>
    </taglib>
    <taglib>
         <taglib-uri>jstl-fmt</taglib-uri>
         <taglib-location>/WEB-INF/tlds/fmt-html.tld</taglib-location>
    </taglib>
    <taglib>
         <taglib-uri>jstl-fn</taglib-uri>
         <taglib-location>/WEB-INF/tlds/fn.tld</taglib-location>
    </taglib>
</jsp-config>

  
 
위 항목 추가하고

---------- jsp 에서

<%@ taglib uri="jstl-c" prefix="c" %>

<%@ taglib uri="jstl-fmt" prefix="fmt" %>

<%@ taglib uri="jstl-fn" prefix="fn" %>





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

JSTL_[ forEach, forTokens 에서 varStatus 사용법 ]  (0) 2014.04.08
JSTL_[ Function(fn) 기초문법 ]  (0) 2013.03.26
JSTL_ [ Core(c) 기초문법 ]  (0) 2013.03.26

- 학교(서디대) 오픈 API 기초와 활용 수업 중 GooleMap API 사용법 

사이트 들어가도 친절하게 예제로 다 나와있으나 수업한거니 기재하는게 좋을 것 같다고 생각한다.

https://developers.google.com/maps/documentation/javascript/?hl=ko-KR

Google Maps JavaScript API v3


<!DOCTYPE html>
<html DIR="LTR">
<head>
<!--  meta : viewport 지도가 화면전체에 표시하고 사용자가 크기를 조정할수 없도록 지정함. -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"  />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" rel="stylesheet" type="text/css" />
<title>Google Maps JavaScript API v3 예제: 간단한 지도</title>
<!-- 센서매개변수 False (데스크탑 사용시 GPS 로케이션 이 없으므로 -->
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
    function initialize() {
    // 사용자 위도/경도 지정(google.maps.LatLng)
        var myLatlng = new google.maps.LatLng(37.397, 127.644);
    // 지도 초기화(mpOptions)
        var myOptions = {
      // 줌 정도
        zoom: 4,
      // 위치(위도/경로)
        center: myLatlng,
      // 기본UI 를 사용하지 않도록설정(제거시 기본UI)
        disableDefaultUI: true,
      // 제공되는 컨트롤 추가( 컨트롤 표시 : True | 숨기기 : False )
        panControl: false,
        zoomControl: false,
        scaleControl: true,
      // 지도 타입설정
        mapTypeId: google.maps.MapTypeId.ROADMAP
      /*
        ROADMAP - 일반적인 기본 2D 타입의 Google 지도를 표시
        SATELLITC - 사진타일을 표시
        HYBRID - 사진타일과 도로, 도시 등 주요 지형지물을 담고있는 타일 레이어를 함께 표시
        TERRAIN - 고도 및 수경(산, 강등)을 표시하기 위한 물리적 기복타일을 표시
      */
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  }
</script>
</head>
<!--  HTML 페이지가 로딩된 후 onload 이벤트를 받은 후에 Map 객체 생성하여 화면에 보여짐 -->
<body onload="initialize()">
  <div id="map_canvas"></div>
</body>
</html>

 

 

위에는 기본 GooGoleMap 소스 이고 화면에서 지도 설정인 Control 설정 부분

※ 본문 <body> 는 모두 동일하니 <script></script> 부분만 설명


<script type="text/javascript">
  function initialize() {
    var myOptions = {
        zoom: 4,
      /* 좌표 설정 */
      center: new google.maps.LatLng(-33, 151),
      /* Control 활성화 */
      mapTypeControl: true,
      /* Control 속성 */
      mapTypeControlOptions: {
        style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
    },
      /* 확대 축소 활성화 */
      zoomControl: true,
      zoomControlOptions: {
        /* ZoomControl 미니로 설정 */
        style: google.maps.ZoomControlStyle.SMALL
    },
      /* 지도 종류설정 */
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"),
                                  myOptions);                         
  }

Control 설정을 하기위해서 해당 Control 활성화를 준다음 맵으로 설정부분을 입력하다.

 

사용자가 직접 해당 Control 의 위치를 변경 할 수 도 있다.

-    일단 위치설명

 

 

이 사진을 부고 직접 원하는 위치에 놓으면 된다.

-    사용 예


  function initialize() {
    var myOptions = {
      zoom: 12,
      center: new google.maps.LatLng(-28.643387, 153.612224),
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      /* Control 사용을 위한 활성화 */
      mapTypeControl: true,
      /* 해당 Control 변경 옵션 설정 */
      mapTypeControlOptions: {
          style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
          position: google.maps.ControlPosition.BOTTOM_CENTER
      },
      panControl: true,
      panControlOptions: {
          position: google.maps.ControlPosition.TOP_RIGHT
      },
      zoomControl: true,
      zoomControlOptions: {
          style: google.maps.ZoomControlStyle.LARGE,
          position: google.maps.ControlPosition.LEFT_CENTER
      },
      scaleControl: true,
      scaleControlOptions: {
          position: google.maps.ControlPosition.TOP_LEFT
      },
      streetViewControl: true,
      streetViewControlOptions: {
          position: google.maps.ControlPosition.LEFT_TOP
      }
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"),
                                  myOptions);                         
  }

위와 똑같이 무든 Control 부분을 수정하기위해서 우선 해당 Control 활성화를 해준다음 작업을 해야한다.


 - 'Int' 는 자료형(원시자료형 : int | char | float | double )이고

 - 'Integer' 는 클래스

Wrapper 클래스(감싸는 클래스 : 기존의 클래스를 더욱 확장시키기 위해 쓰이며 주로 형변환에 사용된다)

즉. 원시자료형을 클래스로 만든 것.


- 원시자료형과 클래스(Wrapper클래스) 차이점

'Integer' 를 사용하면 Null 값 처리가 용이하지만 직접적인 산술연산을 할수 없다는 장점.

그래서 주로 형변환에 쓰이나 보다.


형변환 예)

Integer.valueOf(String) 와 Integer.parseInt(String) 의 차이 때문

Integer.valueOf(String) 를 사용하면 Integer 클래스로 리턴이 되기 때문에 산술 연산을 할 수가 없다.

그리고 위에 말한 바와 같이 Integer.parseInt(String) 는 int형을 리턴하니 null 값이 들어가선 안된다.

Integer.valueOf(String)하고 intValue()로 바꿔 연산하던지

Integer.parseInt(String)하기 전 null 값을 체크하던지 선택을 해야한다.


Wrapper 클래스 공부를 다시해야겟다. 챙피하군 


- Wrapper 클래스(기본자료형 -> 객체형)

기본형 변수도 때로는 객체로 다루어져야하는 경우가 있다.

예를 들면, 매개변수로 객체를 요구할 때, 기본형 아닌 객체로 저장해야 할 때, 객체간의 비교가 필요할 때 등의 경우에는 기본형 값들을 객체로 변환하여 작업을 수행하여야 하는데 그 때에 Wrapper 클래스를 이용한다.

Wrapper 클래스는 모두 equals() 가 오버라이딩되어 있어서 주고값이 아닌 객체가 가지고 있는 값을 비교한다.

 

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

JAVA_[문자열 비교 .equals() 메서드와 등가비교연산자(==) 차이점]  (0) 2014.01.20
JAVA_[ OS 정보 확인 ]  (0) 2013.09.30
JAVA_[날짜 형식 변경(SimpleDateFormat)]  (0) 2012.11.12
JAVA_[Vector]  (0) 2012.07.31
JAVA_[Thread]  (0) 2012.06.23

- 기존에 @RequestParam 을 사용해서 파라미터를 받는방법 말고 @PathVariable 어노테이션을 이용해서

URI 에 아이디나 이름 등을 포함되도록 URL을 구성하여 Controller 로 넘긴다.


사용예)

@Controller

@RequestMapping("/game/users/{userId}")

public class CharaterInfoController {

@RequestMapping("/characters/{characterId}") {

public String characterInfo(@PathVariable String userId,

@PathVariable String characterId, ModelMap model) {

model.addAttribute("userId", userId);

model.addAttribute("characterId", characterId);

return "game/character/info";

}

}

}




[부록]_ @RequestMapping 어노테이션은 Ant 스타일의 패턴을 지원한다.

따라서. 다음과 같이 경로명에 "*" 나 "**"를 값으로 사용할 수 있다.


@RequestMapping("/members/*.do")

public String memberInfo(...) {

...

}


@RequestMapping("/game/*/items/{itemId}")

public String itemInfo(...) {

...

}

- ?   : 1개의 문자와 매칭

- *   : 0개 이상의 문자와 매칭

- ** : 0개 이상의 디렉터리와 매칭


@ModelAttribute 어노테이션을 이용하면 다음 두 가지 작업을 수행할 수 있다.

- 1. @RequestMapping 어노테이션 없는 메서드로 모델에 추가될 객체 생성

@ModelAttribute 어노테이션 메서드에 적용하면 해당 메서드가 생성한 객체가 뷰에 전달된다.

따라서, @ModelAttribute 어노테이션을 사용하면 두 개 이상의 요청처리 메서드에서 공동으로

사용되는 모델 객체를 생성할 수 있다.

(쉽게 Controller 에서 해당 @RequestMapping value 값과 상관없이 @ModelAttribute 어노테이션 메서드 실행 후

뷰 페이지로 객체럴 넘겨준다란 뜻 - 그럼 @RequestMapping 선언 메서드의 객체와 @ModelAttribute 메서드의

객체 두개 모두 뷰에 전달된다)


- Client 에서 /serach/main.do 요청이 오면 GameSearchController 의

main() 메서드만 실행이 되는게 아니라 @ModelAttribute 어테이션 선언된 메서드도 실행 후

생성된 객체가 함께 뷰로 전달된다.



- 2. 커맨트 객체의 초기화 작업 수행(작업순 : @ModelAttribute -> @RequestMapping 메서드)

@ModelAttribute 어노테이션이 적용된 메서드가 @RequestMapping 어노테이션 적용된 메서드 보다 먼저 실행되기 때문에, 커맨드 객체에 대한 초기화 작업이 필요하다면 커맨드 객체와 동일한 이름을 같는 @ModelAttribute 어노테이션을 적용된 메서드를 이용하여 초기화 작업을 수행시킨다.




PS> @ModelAttribute 어노테이션은 Controller 에서 @RequestMapping 메서드의 참소변수 Bean 객체의 Return 명?

쉽게말해 뷰에 건너줄 커맨드객체의 명칭을 임의로 바꿀때도 사용이 된다. 이건 알고 있어야징


 - 인코딩 처리필터 클래스명 : org.springframework.web.filter.CharacterEncodingFilter


요청 파라미터 캐릭터 인코딩이 'ISO-8859-1'이 아닌 경우

request.setCharacterEncoding("UTF-8");

메서드를 사용해서 요청 파라미터의 캐릭터 인코등을 설정해 주어야 한다.


모든 Controller 에서 위 코드를 실행할 수도 있지만 번거롭다.

이러면 스프링을 쓰는 이유가 없지 않겠는가?


스프링은 요청 파라미터의 캐릭터 인코딩을 설정할 수 있는  필터 클래스인 CharacterEncodingFilter 제공하고

있다. 다음과 같이 Web.xml 파일에 CharacterEncodingFilter 클래스를 설정함으로써

요청 파라미터의 캐릭터 인코딩을 손쉽게 설정할 수 있다.



특정 Bean의 기능 수행을 위해 다른 Bean을 참조해야 하는 경우 사용하는 Annotation으로는 @Autowired, @Resource 그리고 @Inject가 있다.

  • @Autowired
    Spring Framework에서 지원하는 Dependency 정의 용도의 Annotation으로, Spring Framework에 종속적이긴 하지만 정밀한 Dependency Injection이 필요한 경우에 유용하다.

의존관계를 자동으로 설정해주는 어노테이션

: 타입을 이용하여 의존객체를 자동으로 설정한다.

: 생성자, 필드, 메서드 세곳에 적용 가능하다.

 

예) 프로퍼티 설정 메서드 이용

import org.springframework.beans.factory.annotation.Required

public class TestBean {

    private TestDao testDao;

 

    @Autowired

    public void setTestDao(TestDao testDao) {

        this.testDao = testDao;

    }

}

위와 같은 경우 testDao프로퍼티에 TestDao 타입의 bean객체를 전달한다.

AutowiredAnnotationBeanPostProcessor 클래스를 설정파일에 빈객체로 등록하면 @Autowired 어노테이션을 이용한 자동설정이 적용된다.

 

또한 Required어노테이션과 마찬가지로 <context:annotation-config>태그를 사용하면 된다.

@Autowired 어노테이션은 프로퍼티 설정 메서드 뿐 아니라 일반 메서드나 멤퍼필드 자체에 적용시킬수도 있다.

제너릭이 적용된 컬렉션 타입에도 적용시킬 수 있다.

 

@Autowired 어노테이션은 타입을 이용하여 자동으로 빈객체를 전달하기 때문에 타입에 맞는 객체가 없거나 두개 이상일 경우 예외를 발생시킨다.

 

@Autowired 어노테이션을 적용한 프로퍼티를 반드시 설정할 필요가 없는 경우에는 @Autowired 어노테이션의 required속성 값을 false로 지정한다.

@Autowired(required=false)

 

이렇게 지정된 경우에는 해당 타입에 맞는 빈객체가 존재하지 않는다고 해도 예외를 발생시키지는 않는다.

 

@Qualifier

: 동일한 타입의 빈객체들 중 특정 빈 객체를 자동으로 설정하도록 한다.

: @Autowired 어노테이션과 함께 사용되며 자동 연결될 빈객체의 수식어를 값으로 갖는다.

 

public class TestBean {

    @Autowired

    @Qualifier("main")

    private TestDao testDao;

}

위 코드에서 수식어구는 main 이고

이러한 수식어는 설정파일에서 <qualifer> 태그를 이용하여 설정한다.

 

<bean id="testDao" class="lja.test.TestDao">

    <qualifier value="main"/>

</bean>

  • @Resource
    JSR-250 표준 Annotation으로 Spring Framework 2.5.* 부터 지원하는 Annotation이다. @Resource는 JNDI 리소스(datasource, java messaging service destination or environment entry)와 연관지어 생각할 수 있으며, 특정 Bean이 JNDI 리소스에 대한 Injection을 필요로 하는 경우에는 @Resource를 사용할 것을 권장한다.

  • @Inject
    JSR-330 표준 Annotation으로 Spring 3 부터 지원하는 Annotation이다. 특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다. @Inject를 사용하기 위해서는 클래스 패스 내에 JSR-330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 함에 유의해야 한다.

@Autowired, @Resource, @Inject를 사용할 수 있는 위치는 다음과 같이 약간의 차이가 있으므로 필요에 따라 적절히 사용하면 된다.
  • @Autowired : 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능
  • @Resource : 멤버변수, setter 메소드에 적용가능
  • @Inject : 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능

@Autowired, @Resource, @Inject를 멤버변수에 직접 정의하는 경우 별도 setter 메소드는 정의하지 않아도 된다.

※ spring 3.0 공부 중에 책의 설명을 보면 @Autowired @Resource 두개 모두 내가보기엔 똑같은 연결을 한다.(내 생각일뿐...)
    이해가 안되서 인터넷 뒤져서 설명을 찾긴 했는데... 그래도 큰 차이점을 모르겠다. 그냥 일반메소드에는 @Resource 가
    적용이 안된다는 점정도? 아직 부족한가보다...


- 어노테이션별 BeanPostProcessor

1. RequiredAnnotationBeanPostProcessor : @Required 어노테이션처리

2. AutowiredAnnotationBeanPostProcessor : @Autowired 어노테이션처리

3. CommonAnnotationBeanPostProcessor : @Resource, @PostConstruct, @PreDestroy 어노테이션처리

4. ConfigurationClassPostProcessor : @Configuration 어노테이션처리


※ 특별히 특정 기능을 사용하지 않아야 하는 경우가 아니라면 <context:annotation-config> 태그를 사용하는 것이 설정

파일을 단순하여 만들어준다.

InitializingBean 인터페이스

빈 객체의 라이프 사이클과 관련된 인터페이스 중에서 가장 많이 사용되는 것 중의 하나가
  org.springframework.beans.factory.InitializingBean 인터페이다.
 
  객체를 생성하고 프로퍼티를 초기화 하고, 컨테이너관련 설정을 완료한 뒤에 호출되는 메서드를 정의하고 있다.
 
  public interface InitializingBean {
    public void afterPropertiesSet() throws Exception
  }
 
  afterPropertiesSet() 메서드는 주로 빈 객체의 프로퍼티가 모두 올바르게 설정되었는지의 여부를 검사하는 용도
  (프로퍼티 값을 검증하는 코드를 구현)
 
  public abstract class AbstractUrlBasedView extends AbstractView implements InitializingBean {
    ...
    public void afterPropertiesSet() throws Exception {
      if( getUrl() == null ) {
        throw new lllegalArgumentException("Property 'url' is required");
      }
    }
    ...
  }

-- 위 설정을 보면 세 개의 빈은 이름만 다를 뿐 <bean> 에서 가지고 있는 <property> 값이 대부분 동일하다.
   이렇게 중복되는 설정을 갖는 빈이 다수 존재할 경우, 중복되는 설정 정보를 담고 있는 부모빈을 정의한 뒤, 부모 빈 정보를
   재사용하도록 설장할 수 있다. 부모 빈으로 부터 설정 정보를 상속받는 예
<bean id="doorMonitor" class="madvirus.spring.chap02.SystemMonitor">
  <property name="periodTime" value="10" />
  <property name="sender" ref="smsSender" />
</bean>

<bean id="lobbyMonitor" class="madvirus.spring.chap02.SystemMonitor">
  <property name="periodTime" value="10" />
  <property name="sender" ref="smsSender" />
</bean>

<bean id="roomMonitor" class="madvirus.spring.chap02.SystemMonitor">
  <property name="periodTime" value="10" />
  <property name="sender" ref="smsSender" />
</bean>


<bean id="commonMonitor" class="madvirus.spring.chap02.SystemMonitor" abstract="true">
  <property name="periodTime" value="10" />
  <property name="sender" ref="smsSender" />
</bean>
※ abstract 속성 값을 "true" 지정하면 스프링 컨테이너는 해당 빈 객체를 생성하지 않는다.
  commonMonitor 빈은 설정정보만 존재할 뿐 실제로 객체는 생성되지 않는다.

<bean id="lobbyMonitor" parent="commonMonitor">
</bean>
<bean id="roomMonitor" parent="commonMonitor">
</bean>
<bean id="doorMonitor" parent="commonMonitor">
  <property name="periodTime" value="20" />
</bean>
※ 자식 빈에서는 parent 속성을 사용하여 클래스 및 프로퍼티 설정 정보를 물려 받을 부모빈을 설정한다.
   그래서 자식 빈에서는 class명 설정이 없어도 부모빈의 class 설정정보를 물려받는다.
   변경하고자 하는 값이 있다면, 추가로 입력해주면된다.( property , class 모두 공통 )

+ Recent posts