실제로 "js", "css", "img"등과 같은 공통 컨텐츠 / 파일 유형이 라이브러리 이름으로 사용 된 웹의 모든 예제는 오해의 소지가 있습니다.
실제 사례
우선 Mojarra 및 MyFaces 와 같은 기존 JSF 구현 과 PrimeFaces 및 OmniFaces 와 같은 JSF 구성 요소 라이브러리가 이를 사용 하는 방법을 살펴 보겠습니다 . 그들 중 누구도 이런 식으로 리소스 라이브러리를 사용하지 않습니다. 그들은 다음과 같은 방식으로 ( 표지 아래 @ResourceDependency
또는 UIViewRoot#addComponentResource()
) 사용합니다.
<h:outputScript library="javax.faces" name="jsf.js" />
<h:outputScript library="primefaces" name="jquery/jquery.js" />
<h:outputScript library="omnifaces" name="omnifaces.js" />
<h:outputScript library="omnifaces" name="fixviewstate.js" />
<h:outputScript library="omnifaces.combined" name="[dynamicname].js" />
<h:outputStylesheet library="primefaces" name="primefaces.css" />
<h:outputStylesheet library="primefaces-aristo" name="theme.css" />
<h:outputStylesheet library="primefaces-vader" name="theme.css" />
기본적으로 모든 리소스 가 공통 으로 사용되는 공통 라이브러리 / 모듈 / 테마 이름을 나타냅니다 .
보다 쉬운 식별
이런 식으로 해당 자원이 속하는 곳 및 / 또는 어디에서 왔는지를 훨씬 쉽게 지정하고 구별 할 수 있습니다. primefaces.css
자신의 웹앱에 PrimeFaces의 기본 CSS를 재정의 / 정의 하는 리소스 가 있다고 상상해보십시오 . PrimeFaces가 자체 라이브러리 이름을 사용하지 않으면 PrimeFaces 자체 라이브러리 primefaces.css
가로드되지 않고 웹 애플리케이션이 제공 하는 라이브러리 이름 이로드되지 않습니다.
또한 custom을 사용하는 경우 올바른 방식으로 사용될 ResourceHandler
때 특정 라이브러리에서 들어오는 리소스를보다 세밀하게 제어 할 수 있습니다 library
. 모든 컴포넌트 라이브러리가 모든 JS 파일에 "js"를 사용 ResourceHandler
했다면 특정 컴포넌트 라이브러리에서 온 것인지 어떻게 구별 할 수 있습니까? 예는 OmniFaces CombinedResourceHandler
및 GraphicResourceHandler
; createResource()
체인의 다음 자원 핸들러에 위임하기 전에 라이브러리가 점검 되는 방법을 점검하십시오 . 이런 식으로 그들은 언제 만들 CombinedResource
거나 GraphicResource
목적 을 알 수 있습니다 .
RichFaces가 잘못했음을 주목해야합니다. 전혀 사용하지 않고 library
다른 리소스 처리 계층을 자체적으로 만들었 으므로 RichFaces 리소스를 프로그래밍 방식으로 식별하는 것은 불가능합니다. 이것이 바로 OmniFaces CombinedResourceHander
가 RichFaces 리소스를 사용하기 위해 반사 기반 핵 을 도입 해야하는 이유 입니다.
자신의 웹앱
자신의 웹앱에 반드시 리소스 라이브러리가 필요하지는 않습니다. 그냥 생략하는 것이 가장 좋습니다.
<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />
또는 실제로 필요한 경우 "기본"또는 회사 이름과 같이보다 일반적인 이름을 지정할 수 있습니다.
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
또는 리소스가 일부 마스터 Facelets 템플릿에 고유 한 경우 템플릿 이름을 지정하여 서로 쉽게 연관시킬 수 있습니다. 다시 말해서, 그것은 자기 다큐멘터리 목적에 더 적합합니다. 예를 들어 /WEB-INF/templates/layout.xhtml
템플릿 파일에서 :
<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />
그리고 /WEB-INF/templates/admin.xhtml
템플릿 파일 :
<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />
실제 예를 보려면 OmniFaces 쇼케이스 소스 코드를 확인하십시오 .
또는 여러 webapps에서 동일한 리소스를 공유하고 webapp 's의 JAR로 삽입 된 이 답변 과 동일한 예제를 기반으로하는 "공통"프로젝트를 만들려면 /WEB-INF/lib
라이브러리로 참조하십시오. (이름은 자유롭게 선택할 수 있습니다. OmniFaces 및 PrimeFaces와 같은 구성 요소 라이브러리도 이런 방식으로 작동합니다) :
<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />
라이브러리 버전 관리
또 다른 주요 장점은 자체 웹 응용 프로그램에서 제공하는 리소스에 리소스 라이브러리 버전 관리를 올바르게 적용 할 수 있다는 것입니다 (JAR에 포함 된 리소스에는 작동하지 않음). \d+(_\d+)*
리소스 폴더 버전을 나타내는 패턴 의 이름으로 라이브러리 폴더에 직접 하위 폴더를 만들 수 있습니다 .
WebContent
|-- resources
| `-- default
| `-- 1_0
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
이 마크 업을 사용하는 경우 :
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
라이브러리 버전을 v
매개 변수 로 사용하여 다음 HTML을 생성합니다 .
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&v=1_0" alt="" />
따라서 일부 리소스를 편집 / 업데이트 한 경우 버전 폴더를 새 값으로 복사하거나 이름을 바꾸면됩니다. 여러 버전 폴더가있는 경우 JSF ResourceHandler
는 숫자 순서 규칙에 따라 가장 높은 버전 번호의 리소스를 자동으로 제공합니다.
따라서 resources/default/1_0/*
폴더를 복사 / 이름 바꾸기 할 때 resources/default/1_1/*
다음과 같이하십시오.
WebContent
|-- resources
| `-- default
| |-- 1_0
| | :
| |
| `-- 1_1
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
그런 다음 마지막 마크 업 예제는 다음 HTML을 생성합니다.
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&v=1_1" alt="" />
이렇게하면 변경된 매개 변수가있는 URL이 처음 요청 될 때 웹 브라우저가 캐시에서 동일한 이름을 가진 자원을 표시하지 않고 서버에서 직접 자원을 요청하게됩니다. 이 방법으로 최종 사용자는 업데이트 된 CSS / JS 리소스를 검색해야 할 때 강제 새로 고침 (Ctrl + F5 등)을 수행 할 필요가 없습니다.
JAR 파일에 포함 된 리소스의 경우 라이브러리 버전 관리가 불가능합니다. custom이 필요합니다 ResourceHandler
. jar의 자원에 JSF 버전 관리를 사용하는 방법 도 참조하십시오 .
또한보십시오: