Posted
Filed under JSP, JAVA

원문 http://blog.naver.com/seogi1004/110069083184

더 좋은 방법이 있는지는 모르겠다.
일단 삽질한 거니 기록으로 남겨둔다.

아무튼... 먼저 Fancy URL 이란?

/board.html?action=list&page=2 이런 일반적인 URL 형식 대신
/board/list/2 이런 형식의 확장자가 없고 쿼리 스트링이 없는 간단한 URL을 말한다.
(fancy url의 정확한 뜻은 모르지만 나는 이렇게 이해하고 있다)

태터툴즈의 /tt/tags/태터툴즈 (태터툴즈란 태그가 있는 글목록을 출력하는 url) 이런걸 생각하면 된다.



가장 간단한 방법은 Apache의 mod_rewrite 모듈을 사용하면 된다.
하지만 이 경우는 아파치가 없거나 있어도 mod_rewrite 모듈 사용이 불가능한 걸 가정했다.

확장자가 없는 매핑이라도 특별한 패턴이 있으면 간단하게 할 수 있다. 예를 들면

/board/list
/board/view
/board/write

이런 매핑을 처리하려면 다음처럼 하면 된다.

   <servlet-mapping>
       <servlet-name>lucy</servlet-name>
       <url-pattern>/board/*</url-pattern>
   </servlet-mapping>

하지만

/list
/view
/write

이런걸 매핑하려면?

   <servlet-mapping>
       <servlet-name>lucy</servlet-name>
       <url-pattern>/list</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
       <servlet-name>lucy</servlet-name>
       <url-pattern>/view</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
       <servlet-name>lucy</servlet-name>
       <url-pattern>/write</url-pattern>
   </servlet-mapping>

특별한 패턴이 없는 url이기 때문에 전부다 매핑해 줘야 한다.
이건 세개뿐이니까 그렇지 매번 늘어날 때마다 매핑해 줄수도 없다.
특히 어떤 url로 요청이 들어올지 미리 알 수 없는 경우는 난감하다.
예를 들면 /(username) 했을 경우 해당 사용자의 정보를 보여준다든지 하는 것


아무튼 글의 요점은 확장자가 없는 모든 요청을 dispatcher가 받도록 하고 싶다는 거다.
내가 알기로는... 현재의 servlet-mapping은... 아래와 같은 식이나

   <servlet-mapping>
       <servlet-name>lucy</servlet-name>
       <url-pattern>/*</url-pattern> <!-- 모든 요청을 처리하되 -->
      <url-pattern-exclude>*.*</url-pattern-exclude> <!-- 확장자 '.' 이 들어가면 안돼 -->
  </servlet-mapping>

또는 아래와 같은 형식으로는...

   <servlet-mapping>
       <servlet-name>lucy</servlet-name>
       <url-pattern>^/([^.]*)$</url-pattern> <!-- . 이 포함되지 않은 패턴 -->
  </servlet-mapping>

이렇게는 지원이 안되기 때문에;;; 조금 편법을 써야 했다.


일단 매핑은 아래처럼...

   <servlet-mapping>
       <servlet-name>lucy</servlet-name>
       <url-pattern>/app/*</url-pattern>
  </servlet-mapping>


이렇게 해당 /app/로 시작하는 모든 요청에 대해 처리하도록 한다.


근데 이것도 맘에 안 드는게 확장자 없이 매핑하는건 되지만
url을 항상 /app/로 요청해야 한다.
그다지 의미있는 url은 아닌데 항상 따라다니는 것도 보기 안좋고...


appfuse에서 발견한... urlrewrite filter를 사용한다.
(appfuse에서는 이런 목적으로 쓰진 않았지만...)


https://urlrewrite.dev.java.net/ 에서 urlrewrite filter 3.0 을 받아 lib 폴더에 넣는다.

/WEB-INF/urlrewrite.xml 을 작성


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">

<!-- https://urlrewrite.dev.java.net/manual/3.0 -->

<urlrewrite>

   <rule>
       <note>
           확장자가 없는 요청은 /app/* 요청이다.
           ex) /user/register -> /app/user/register
       </note>
       <from>^/([^.]*)$</from>
       <to type="forward">/app/$1</to>
   </rule>

</urlrewrite>



web.xml 에 url rewrite filter 등록


   <filter>
       <filter-name>urlRewriteFilter</filter-name>
       <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
       <init-param>
           <param-name>logLevel</param-name>
           <param-value>commons</param-value>
       </init-param>
   </filter>


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


Spring Context XML 파일에서...

   <bean id="userMappings" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
           <map>
               <entry key="/user/register" value-ref="userRegisterController"/>
               <entry key="/user/login" value-ref="userLoginController"/>
           </map>
       </property>


앞에 /app를 붙여 주지 않아도 된다... 물론 브라우저에서 요청시에도 /app를 안 붙여도 되고...



내가 썼는데도 무슨 말인지 모르겠네...
일단 써두기만 하고 정리는 나중에 -_-;;;

http://steelheart.kr/tc/32

레이어 닫기

이 저작물은 아래 조건 만족 시
별도 허가 없이 사용 가능합니다

  • 저작자 명시 필수
  • 영리적 사용 불가
  • 내용 변경 불가
2010/03/02 21:27 2010/03/02 21:27