728x90

-- 분석 함수

    -- RANK OVER()

    -- ROW_NUMBER() OVER() ** 중요  제일 많은 씀 **

      -- 순위를 구함. 

      -- RANK() OVER()는 동일 순위인 경우 1,1,3, 형식으로 출력하지만

      -- ROW_NUMBER() OVER()는 동일 순위인 경우 1,2,3, 형식으로 출력

      -- DENSE_RANK() OVER()는 동일 순위인 경우 1,1,2 형식으로 출력

      -- ROW_NUMBER() OVER()는 매우매우매우 중요한 함수이므로 반드시 알아 둘것 !!!!!!!!!!!!!!!!!!!!!!!

      

      --기본급 내림차순으로 순위를 구하기

      SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa; -- 비교데이타가 똑같으면 순위를 건너뜀

      

      SELECT name, basicpay, ROW_NUMBER() OVER(ORDER BY basicpay DESC) 순위 FROM insa; -- 비교데이타가 똑같아도 순위를 차례대로 매김

      

      -- 기본급 내림차순으로 순위. 단, 기본급이 같으면 수당 내림차순.

      SELECT name, basicpay, sudang, RANK() OVER(ORDER BY basicpay DESC, sudang DESC) 순위 FROM insa;

      

       SELECT name, basicpay, sudang, ROW_NUMBER() OVER(ORDER BY basicpay DESC, sudang DESC) 순위 FROM insa;

      

      -- 부서별 기본급의 내림차순 순위 구하기

      SELECT name, basicpay, buseo, 

        RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

      

      SELECT name, basicpay, buseo, 

        ROW_NUMBER() OVER(PARTITION BY buseo ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

      

      -- 출신도별 부서별 순위(학년의 반별)

      SELECT name, basicpay, city, buseo, 

        RANK() OVER(PARTITION BY city ORDER BY basicpay DESC, sudang DESC) 순위 

        FROM insa;

        

      -- 여자 인원수가 가장 많은 부서는?

      SELECT buseo, COUNT(*) FROM insa

        WHERE SUBSTR(ssn,8,1) IN (2,4,6)

        GROUP BY buseo;

        

      SELECT buseo FROM(

      SELECT buseo, COUNT(*) cnt, RANK() OVER(ORDER BY COUNT(*) DESC) 순위

        FROM insa WHERE SUBSTR(ssn,8,1) IN (2,4,6) GROUP BY buseo

        ) WHERE 순위 =1;

        

      -- 기본급여 많이 받는 1~10등 까지 출력(name, basicpay)

      SELECT name, basicpay,RANK() OVER(ORDER BY basicpay DESC) 순위 FROM(

      SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa 

      ) WHERE 순위 <=10;

      

      -- 기본급 상위 10% 출력(name, basicpay)

       SELECT name, basicpay FROM(

        SELECT name, basicpay, RANK() OVER(ORDER BY basicpay DESC) 순위 FROM insa 

        )WHERE 순위<=TRUNC((SELECT COUNT(*) FROM insa) *0.1);

      

      -- 기본급 하위 10% 출력(

      SELECT name, basicpay FROM(

        SELECT name, basicpay, RANK() OVER(ORDER BY basicpay) 순위 FROM insa 

        )WHERE 순위<=TRUNC((SELECT COUNT(*) FROM insa) *0.1);

      

      -- 부서별 기본급여 가장 높은 사람들 출력( name, buseo, jikwi)

      SELECT name, buseo,basicpay, RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC) 순위

      FROM insa; -- 일단 부서별 순위를 매기는 쿼리

      

      SELECT name, buseo,basicpay FROM(

        SELECT name, buseo,basicpay,

        RANK() OVER(PARTITION BY buseo ORDER BY basicpay DESC) 순위 

        FROM insa

        ) WHERE 순위=1;

        

    -- ***** 나중에 게시판 작성 할 때 사용하는 쿼리 형식이므로 반드 암기 해야함. *****

    -- ROW_NUMBER()를 이용한 쿼리가 아래 ROWNUM을 사용한 쿼리보다 우수

      SELECT num,name,basicpay FROM(

        SELECT num, name, basicpay, ROW_NUMBER() OVER(ORDER BY num DESC) rnum FROM insa

        ) WHERE rnum>= 10 AND rnum <=15 ORDER BY num DESC;

        

     SELECT num,name,basicpay FROM(

      SELECT ROWNUM rnum, num, name, basicpay FROM(

        SELECT num, name, basicpay FROM insa ORDER BY num DESC

      )

    )WHERE rnum>=10 AND rnum<=15;


출처 : http://tibang.tistory.com/

728x90

'프로그래밍 > Oracle' 카테고리의 다른 글

오라클에서 COMMENT 다는 법  (0) 2019.04.24
오라클 테이블스페이스 생성  (0) 2019.04.04
oracle hr 사용자 unlock  (0) 2016.01.25
ORACLE PLS-553 오류 처리  (0) 2015.04.29
오라클 백업  (0) 2015.04.24
728x90

@Aspect annotation 기반 AOP 사용

1. 로그인 하지 않은 사용자가, 로그인페이지를 제외한 다른페이지에 접근했을 때 

2. 접근권한이 없는(세션값) 사용자가, 접근할 수 없는 페이지에 접근했을 경우 등

   로깅이나, 공통기능을 사이트 전반에 적용시켜야 할 때 이용한다.


@Aspect 어노테이션은 AspectJ 5버전에 새롭게 추가된 어노테이션으로서, xml파일에 Advice 및 Pointcut 등의 설정을 하지않고도,

자동으로 Advice를 적용할 수 있다.


#STS를 사용할 경우 메이븐 dependency 추가

<!-- AspectJ -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


# spring 환경 설정 xml 파일에 아래 내용을 추가한다.

<aop:aspectj-autoproxy />

<bean id="loginAspect" class="com.common.LoginAspect"/>


# aspect 구현 소스

@Aspect

public class LoginAspect {

 

    @Pointcut("execution(public * com.admin..*(..))")

    private void adminMethod(){}

     

    @Pointcut("execution(public * com.bbs..*(..))")

    private void bbsMethod(){}

     

    @Pointcut("execution(public * com.common..*(..))")

    private void commonMethod(){}

     

    @Pointcut("execution(public * com.onm.administrator..*(..))")

    private void onmAdministratorMethod(){}

     

    @Pointcut("execution(public * com.onm.membership..*(..))")

    private void onmMembershipMethod(){}

     

    @Pointcut("execution(public * com.onm.report..*(..))")

    private void onmReportMethod(){}

         

    private String[] access_url = {

            };

     

    @Around(value ="adminMethod() || bbsMethod()  || commonMethod()

                                || onmAdministratorMethod() || onmMembershipMethod() || onmReportMethod()")

    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable{

 

System.out.println("#### LoginAspect 시작 ####");     

        HttpServletRequest request = null;

        HttpServletResponse response = null;

        for ( Object o : joinPoint.getArgs() ){ 

            if ( o instanceof HttpServletRequest ) {

                request = (HttpServletRequest)o;

            } 

            if ( o instanceof HttpServletResponse ) {

                response = (HttpServletResponse)o;

            } 

        }

        try{

            HttpSession session = request.getSession();

 

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

                String userEnterType = (String) session

                        .getAttribute("UserEnterType");

 

                System.out.println("### Margo ==> loginId : " + loginId);

                if (loginId == null || "".equals(loginId)) {

                    System.out.println("### Margo ==> in if loginId : "

                            + loginId);

                    throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

                }           

        }catch(Exception e){

             

            throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

 

        }       

        Object result = joinPoint.proceed();

System.out.println("#### LoginAspect 끝 ####");      

        return result;

    }

}


1라인 에 적용한 @Aspect 어노테이션을 적용한 클래스는 advice구현메소드나, pointcut정의를 포함할 수 있게된다.


4 라인에 AspectJ의 pointcut 표현식으로 pointcut을 정의한다. 


execution(수식어패턴 리턴타입 클래스이름패턴 이름패턴(파라미터패턴))


수식어패턴: public, protected 등


각패턴은 * 를 이용하여 모든 값을 표현할 수 있고. '..' 를 이용하여 0개 이상이라는 의미를 표현가능

Controller라고 끝나는 이름의 클래스에만 적용할때는 - execution(public * com.bbs..*Controller.*(..))


5라인 처럼 pointcut 정의 메소드는 무조건 리턴타입이 void여야한다.

 이 메소드는 advice 관련 어노테이션인 @around의 값으로 사용될 메소드이다.




이제 trace메서드를 이용해서, 필요한 처리를 구현하면된다.

!!!!!!!!!!!!!!!! 여기서...중요한게 있다!!!!!!

27라인에서 joinPoint는 수행될 메소드인데, 보통 세션값 이용할때 request에서 빼내오는데

그 원래 해당메소드 파라메타로 HttpServletRequest가 지정되어 있지 않으면, request가 null이 되겠지..


끝으로 51,55라인에서 뿌린 Exception을 잡을 놈도 xml에 정의해야한다.

servlet xml에다가 추가해주자

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="java.lang.Exception">

index

</prop>

</property>

</bean>


출처 : http://winmargo.tistory.com/164

728x90
728x90

google map 서비스 만드는 과정 

1. sdk manager로 들어가서 google play service를 설치한다.


2. 라이브러리를 등록한다.



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


<!-- 내 프로젝트에 대한 보안 수준 설정. 내 프로젝트의 패키지가 com.example.vincentgoo.myapplication 인 경우 -->
<!--android:name="com.example.myapplication.permission.MAPS_RECEIVE"-->
<permission
android:name="com.example.vincentgoo.myapplication.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />

<!-- 구글맵 API v2의 권한 설정 -->
<uses-permission android:name="com.example.vincentgoo.myapplication.permission.MAPS_RECEIVE" />

<!-- 구글맵 API v2의 일반 권한 설정. -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- OpenGL 사용 설정 -->
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">

<!-- 라이브러리 사용 설정 -->
<uses-library android:name="com.google.android.maps" />

<!-- 구글맵 API v2 키 설정 -->
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyAnZOuHXGxWoTuxXejtC0BWfuEJE7vnJAI" />

<!-- GMS 라이브러리 버전 설정 -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

</manifest>

<구글 map api key 받기>


작업 1 : 고급설정에 path에 C:\Program Files\Java\jdk1.7.0_40\bin 설정여부를 확인한다. 작업 2 : C:\Users\a\.android/debug.keystore을 이용해서 MD5값을 생성하기 위해서 콘솔창을 실행하고 C:\Users\a\.android/으로 경로를 이동한다. 작업 3 : keytool -v -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android 실행한다. 작업 4 : 'SHA1:'뒤에 있는 값을 이용하여 구글맵을 사용하기 위한 API키를 발급받는다. 작업 5 : 구글맵을 사용하기 위한 API키를 발급받기 위해 https://code.google.com/apis/console/사이트에 접속한다. 작업 6 : Google Maps Android API v2 을 'API사용설정'을 클릭한다. 작업 7 : Api Acess서브메뉴선택후 create new android key버튼을 클릭한다. 작업 8 : SHA1;어플리케이션 패키지명을 입력후 create버튼을 클릭한다. 작업 9 : 작업8단계에서 생성된 API키를 androidmanifast.xml파일에서 <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="API키" /> value속성에 작성한다



https://code.google.com/apis/console/ 접속





Google Maps APIs 에서 Google Maps Android API 클릭



Credentials 클릭



API key 설정




728x90
728x90

=============================================================
키 | 자바스크립트 코드(숫자)
=============================================================

←(백스패이스) = 8
TAB = 9
ENTER = 13
SHIFT = 16
CTRL = 17
ALT = 18
PAUSEBREAK = 19
CAPSLOOK = 20
한/영 = 21
한자 = 25
ESC = 27

스패이스 = 32
PAGEUP = 33
PAGEDN = 34
END = 35
HOME =36

←(중간) = 37
↑(중간) = 38
→(중간) = 39
↓(중간) = 40

0 = 48
1 = 49
2 = 50
3 = 51
4 = 52
5 = 53
6 = 54
7 = 55
8 = 56
9 = 57
INSERT = 45
DELETE = 46

A = 65
B = 66
C = 67
D = 68
E = 69
F = 70
G = 71
H = 72
I = 73
J = 74
K = 75
L = 76
M = 77
N = 78
O = 79
P = 80
Q = 81
R = 82
S = 83
T = 84
U = 85
V = 86
W = 87
X = 88
Y = 89
Z = 90

윈도우(왼쪽) = 91
윈도우(오른쪽) = 92
기능키 = 93
0(오른쪽) = 96
1(오른쪽) = 97
2(오른쪽) = 98
3(오른쪽) = 99
4(오른쪽) = 100
5(오른쪽) = 101
6(오른쪽) = 102
7(오른쪽) = 103
8(오른쪽) = 104
9(오른쪽) = 105
.(오른쪽) = 110
/(오른쪽) = 111
*(오른쪽) = 106
+(오른쪽) = 107
-(오른쪽) = 109
F1 = 112
F2 = 113
F3 = 114
F4 = 115
F5 = 116
F6 = 117
F7 = 118
F8 = 119
F9 = 120
F10 = 121
F11 = 122
F12 = 123
NUMLOCK = 144
SCROLLLOCK = 145
=(중간) = 187
-(중간) = 189
`(왼쪽콤마) = 192
(중간) = 220

 

 


































출처 : http://Ssemi.net


728x90
728x90

최근의 대부분 프로젝트는 Sitemesh를 사용하여 개발했었다.
이번에 문서들을 보면서 확인해보니 Tiles2가 나오면서 성능등이 많이 개선이 되었다고한다.
그럼, 해봐야 하지 않겠어?! 해보자.

pom.xml 추가

<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-core</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-jsp</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-servlet</artifactId>
	<version>2.2.2</version>
</dependency>


스프링소스 사이트에서 다운로드받은 STS의 경우 메이븐 pom.xml업데이트만 해도 자동으로 라이브러리가 추가되더라.
따로 메이븐을 설치하여 사용해야하나 고민하고 있었는데, 조금 두고 봐야겠다. 

이제 servlet-context.xml에 Tiles사용을 위한 설정을 해보자.

<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
	<beans:property name="definitions">
		<beans:list>
			<beans:value>/WEB-INF/config/tiles_layouts.xml</beans:value>
		</beans:list>
	</beans:property>
	<beans:property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"/>
</beans:bean>
<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
	<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> 
</beans:bean>


Tiles2에서 view를 연결하기 때문에 InternalResourceViewResolver를 사용하지 않아도 된다.
하지만, 나는 혹시나 발생할 수 있는 레이아웃없이 jsp페이지만 호출할 일이 있을까 싶어서,
InternalResourceViewResolver를 삭제하지 않았다.

이제 Tiles2의 레이아웃 설정이다.
설정파일은 위에서 지정한 "/WEB-INF/views/config/tiles_layouts.xml" 이 파일이 되겠다.

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
	<definition name="layouts-tiles" template="/WEB-INF/views/template/layouts-tiles.jsp">
		<put-attribute name="header"    value="/WEB-INF/views/template/header.jsp" />
		<put-attribute name="content"   value="" />
		<put-attribute name="footer"    value="/WEB-INF/views/template/footer.jsp" />
	</definition>
	 
	<definition name="*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}.jsp" />
	</definition>
	<definition name="*/*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}/{2}.jsp" />
	</definition>
	<definition name="*/*/*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}/{2}/{3}.jsp" />
	</definition>
</tiles-definitions>


layouts-tiles설정에서 기본 레이아웃 페이지와 이름을 설정한다.
content의 경우는 유동적으로 바뀌기에 하단에서 layouts-tiles를 extends받아서 추가해 준다.
자신에 맞게 바꾸면 되겠다.

layouts-tiles.jsp 내용

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>Digigroove Intranet</title>
</head>
<body>
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="content"/>
<tiles:insertAttribute name="footer"/>
</body>
</html>


여기까지가 끝이다.
header와 footer는 일반적인 html레이아웃 짜듯이 구성해 주면되겠다.
하나 불편한 점이 있는데, sitemesh의 경우는 header와 body의 내용 혹은 속성을 레이아웃에서
받아서 처리할 수 있있지만 Tiles녀석도 가능한지 아직모르겠다.
문서를 좀 읽어봐야겠다. 

아름답게도 잘 설명해준 블로그가 있어서 살살 따라하다보니 쉽게 되었다.
출처를 밝히며 감사의 마음을 표한다. 앞으로도 이곳 저곳의 자료를 모아올 것 같다.. ㅋㅋ

출처 : http://blog.naver.com/PostView.nhn?blogId=jazz1234k&logNo=40123376205 

728x90
728x90

새로운 프로잭트 프리젠테이션 레이어에 Apache Tiles 를 적용 할 것이냐 OpenSymphony Sitemesh를 사용 할것인가 고민을 좀 했다.

과거에 두가지 모두 사용해본 경험으로는
일단 간편하게 적용하기엔 Sitemesh가 편리했지만 구현 방식에 따른 성능이슈때문에 조금 손이 가더라도 Tiles를 선호했던 것 같다.

잠깐 두개를 비교한 블로그 포스팅을 검색해 보고 Tiles 를 선택 하기로 했다.

전자정부프레임워크에 Tiles 관련 종속 jar를 올려보자.

1. /[프로잭트]/pom.xml

properties 추가

 <properties>
  <spring.maven.artifact.version>3.0.5.RELEASE</spring.maven.artifact.version>
  <org.apache.tiles-version>2.2.2</org.apache.tiles-version>
 </properties>

dependency 추가

  <!-- Tiles -->
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-core</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-servlet</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>
  
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-jsp</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

2. Spring 설정에 View Resolver 수정

/[프로잭트]/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml 수정

기존 JSTL View 를 2순위로 내리고

Tiles 우선순위를 1로 설정한다.

    <!-- Tiles 2 Resolver -->
 <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
  <property name="order" value="1" />
 </bean>

 <!-- Tiles 2 Configurer -->
 <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
  <property name="definitions">
   <list>
    <value>/WEB-INF/tiles/default-layout.xml</value>
   </list>
  </property>
 </bean>
 
    <!--
        - This bean configures the 'prefix' and 'suffix' properties of 
        - InternalResourceViewResolver, which resolves logical view names 
        - returned by Controllers. For example, a logical view name of "vets" 
        - will be mapped to "/WEB-INF/jsp/vets.jsp".
    -->
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="2
    p:viewClass="org.springframework.web.servlet.view.JstlView" 
    p:prefix="/WEB-INF/jsp/egovframework/rte/" p:suffix=".jsp"/>

 

기존 리졸버의 order를 2로 바꾸는 것을 빼먹지 않도록 한다.

 

3. 프로잭트에 맞는 layouts.xml을 설정한다.

layout 설정은 다음 포스트에.


- 참조 사이트 : http://opensrc.tistory.com/116

728x90
728x90

프로젝트를 하다 보면 현재 요청된 HttpServletRequest를 찾고자

할때가 있습니다.

Service,DAO에서 현재의 request가 필요할때가 있을수 있습니다.

(물론 컨트롤러에 인자로 넘기면 됩니다.)

정확한 케이스를 말하긴 힘들지만 실무에서

꼭 필요할때가 있습니다.

그래서 현재의 Request를 스프링에서 가져 오는 방법을

설명 하고자 합니다.


* RequestContextListener 설정하기


web.xml 파일에 아래와 같이 리스너를 설정 합니다.


<listener>

  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>

</listener>


* 현재 HttpServletRequest 객체 가져오는 함수 만들기


public static HttpServletRequest getCurrentRequest() {


       ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder

               .currentRequestAttributes();


       HttpServletRequest hsr = sra.getRequest();

       return hsr;

}


출처 : http://beyondj2ee.tumblr.com/

728x90

'프로그래밍 > spring' 카테고리의 다른 글

@Aspect Annotation을 이용한 로그인 세션 관리  (0) 2016.04.29
Spring3에서 Tiles2 설정  (0) 2016.04.21
Apache Titles 적용하기  (0) 2016.04.21
messageConverter 방법  (0) 2016.04.20
DefaultAnnotationHandlerMapping  (0) 2016.04.20
728x90

spring 3.2 이상에서 사용할 수 있는 messageConverter 방법

오늘 json 데이터를 가져오는 방법을 코드로 짜보면서 도움이 될 거 같아 정리했다.

servlet.xml 에 보면 "컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 1" 과

"컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 2" 가 있다.

원하는 방법으로 사용하면 된다.


아래는 Ref는 AnnotationMethodHandlerAdapter가 deprecated 된 이유를 알 수 있는 좋은 블로그가 있어서 참조했다.

Description Ref :)

http://javaiyagi.tistory.com/357

Spring 3.0 의 DefaultAnnotationHandlerMapping 과 AnnotationMethodHandlerAdapter가  Spring 3.1 에선 @Deprecated 되고, 

대신 RequestMappingHandlerMapping과 RequestMappingHandlerAdapter 로 바뀌었다.

이유인즉슨, Controller 의 요청이 메소드 단위로 세분화 되면서 , 

DefaultAnnotationHandlerMapping 이 AnnotationMethodHandlerAdapter로 handler 를 전달해줄 때, 문제가 생겼기 때문이다 .


pom.xml

<!-- jackson Json -->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.7.3</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>2.7.3</version>

</dependency>


<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-annotations</artifactId>

<version>2.7.3</version>

</dependency>

<dependency>

    <groupId>org.codehaus.jackson</groupId>

    <artifactId>jackson-core-asl</artifactId>

    <version>1.9.13</version>

</dependency>


<dependency>

    <groupId>org.codehaus.jackson</groupId>

    <artifactId>jackson-mapper-asl</artifactId>

    <version>1.9.13</version>

</dependency>


servlet-context.xml

<!-- 컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 2 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

<property name="messageConverters">

    <util:list list-class="java.util.ArrayList">

<ref bean="mappingJackson2HttpMessageConverter"/>

    </util:list>

</property>

</bean>

<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

<property name="supportedMediaTypes">

    <list>

<value>text/html;charset=UTF-8</value>

<value>application/json;charset=UTF-8</value>

    </list>

</property>

</bean>

728x90

+ Recent posts