唯一の理由が拡張機能を取り除くことである場合、.xhtml
使用している JSF のバージョンに応じてさまざまな方法があります。
JSF 2.3+
JSF 2.3 は、すべてのビューを収集するための新しい API を提供しますViewHandler#getViews()
。これを以下ServletRegistration#addMapping()
のように組み合わせます。ServletContextListener
@FacesConfig
@WebListener
public class ApplicationConfig implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
addExtensionLessMappings(event.getServletContext(), FacesContext.getCurrentInstance());
}
private void addExtensionLessMappings(ServletContext servletContext, FacesContext facesContext) {
servletContext
.getServletRegistrations().values().stream()
.filter(servlet -> servlet.getClassName().equals(FacesServlet.class.getName()))
.findAny()
.ifPresent(facesServlet -> facesContext
.getApplication()
.getViewHandler()
.getViews(facesContext, "/", ViewVisitOption.RETURN_AS_MINIMAL_IMPLICIT_OUTCOME)
.forEach(view -> facesServlet.addMapping(view))
);
}
}
事実上、これはワンライナーです。出典: Arjan Tijms のブログおよびThe Definitive Guide to JSF。
MyFaces を JSF 2.3 実装として使用している場合、これは次のweb.xml
コンテキスト パラメータのみによって透過的にアクティブ化できます。
<context-param>
<param-name>org.apache.myfaces.AUTOMATIC_EXTENSIONLESS_MAPPING</param-name>
<param-value>true</param-value>
</context-param>
Mojarra にはまだ同等のものはありません。
JSF 2.2-
OmniFaces FacesViewsを使用します。ビューファイルを/WEB-INF/faces-views/
フォルダーに配置することにより、それを実現するゼロ構成の方法を提供します。それ以外の場合は、プロジェクト構造を変更せず、ビュー ファイルを通常の場所に保持し、拡張子のない URL の利点を維持したい場合は、次のコンテキスト パラメーターを追加するだけです。
<context-param>
<param-name>org.omnifaces.FACES_VIEWS_SCAN_PATHS</param-name>
<param-value>/*.xhtml</param-value>
</context-param>
OmniFaces を使用するのではなく、独自に開発したい場合は、OmniFaces のソース コードを参照してください。Apache 2.0 ライセンスの下でオープン ソースです。それはワンライナーではありません。