http://blog.naver.com/galad/140033728088
|
|
펌.: http://steelheart.tistory.com/32
|
|
|
더 좋은 방법이 있는지는 모르겠다. 일단 삽질한 거니 기록으로 남겨둔다.
아무튼... 먼저 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를 안 붙여도 되고...
| |