File JSF nella directory WEB-INF, come posso accedervi?

Voglio mettere i miei file xhtml JSF 2.0 sotto WEB-INF \ jsf. Come posso accedervi allora? So che qualsiasi cosa all’interno di WEB-INF non è esposta all’esterno, quindi ho bisogno di un controller per reindirizzarmi al JSP corrispondente, giusto? (Questo è anche il modello 2 modello iirc).

Posso ottenere questo risultato con un parametro all’interno di web.xml / faces-config.xml? Penso che FacesServlet sia il controller della mia webapp quindi dovrebbe servire a questo scopo?

E un’altra domanda per capire il modello del modello 2. Ogni azione deve prima passare a un servlet che poi gestisce il prossimo passo ansible? Quindi un semplice è vietato in questo modello poiché non va al servlet di controllo?

Voglio mettere i miei file xhtml JSF 2.0 sotto WEB-INF \ jsf. Come posso accedervi allora?

Non puoi. La cartella Files in /WEB-INF non è direttamente accessibile.

Esistono due opzioni per risolvere il problema relativo al fatto che i file di origine JSF siano accessibili al pubblico.

  1. Mappare FacesServlet su *.xhtml anziché su *.jsf .

  2. In alternativa, limita l’accesso diretto su *.xhtml da un in web.xml .

      Restrict direct access to XHTML files  XHTML files *.xhtml    

Guarda anche:

  • Quali file XHTML devo inserire / WEB-INF e quali no?
  • Facelets JSF: A volte vedo che l’URL è .jsf ea volte .xhtml. Perché?

E un’altra domanda per capire il modello del modello 2. Ogni azione deve prima passare a un servlet che poi gestisce il prossimo passo ansible?

FacesServlet fa già. È il controller. Con JSF hai già un semplice javabean come modello e il file JSP / Facelets come vista. FacesServlet come controller ha già preso tutte le brutte attività di raccolta dei parametri, convalida, conversione, aggiornamento dei modelli di richiesta e navigazione dalle tue mani.

Guarda anche:

  • Quali componenti sono MVC nel framework MVC JSF?
  • Controller JSF, servizio e DAO

Quindi un semplice è vietato in questo modello poiché non va al servlet di controllo?

No, è perfettamente a posto. Il controller si avvierà in caso di necessità. Se la risorsa non ha bisogno di un controller (cioè di una risorsa statica), non è necessario lasciar passare il controller.


In futuro, si prega di fare più domande in diverse domande di Stack Overflow.

Per accedere alle pagine xhtml all’interno della cartella WEB-INF/jsf è ansible effettuare la seguente operazione:

  1. Sposta la cartella delle pagine xhtml dalla webapp root a WEB-INF
  2. Introdurre il modello ” Dispatcher View ” nel progetto
  3. Mappare il servlet ” Front Controller ” in url base alle pagine dell’applicazione
  4. Map Faces Servlet a ” .xhtml
  5. All’interno di ” Dispatcher ” inoltrare la richiesta alla pagina da ” WEB-INF/jsf/.xhtml
  6. Sovrascrivere jsf ViewHandler getActionUrl per escludere ” WEB-INFjsf ViewHandler getActionUrl action generato (di form, link, button )

Ad esempio, le pagine xhtml trovano nella cartella radice webapp ” jsf “. Tutti gli url tra le pagine sono come jsf/.xhtml . Quindi facciamo il prossimo:

  1. sposta /jsf su /WEB-INF/jsf

  2. creare un servlet FrontController :

 public class FrontController extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { process(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { process(req, resp); } private void process(HttpServletRequest request, HttpServletResponse response) { Dispatcher dispatcher = Dispatcher.getInstance(); dispatcher.dispatch(request, response); } } 
  1. mappare il servlet di Front Controller in web.xml in url basato sulle pagine:
  Front Controller controllers.FrontController   Front Controller /jsf/*  
  1. mappa Faces Servlet in web.xml to .xhtml
  Faces Servlet javax.faces.webapp.FacesServlet 1   Faces Servlet *.xhtml  
  1. crea Dispatcher che inoltra la request di correggere la pagina xhtml :

 public class Dispatcher { public void dispatch(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pageBase = "/WEB-INF/jsf/"; String pagePath = null; String errorPage = "/WEB-INF/jsf/error.xthml"; //here could be complicated logic to analyze if the page should be visible for security reasons, authorisation etc, business logic //requested page could be taken from parsing requested URI //pageName = findPageNameFromURI(request.getRequestURI()); pagePath = pageBase + pageName; //if page should not be visible pagePath = errorPage; //forward to page inside WEB-INF/jsf request.getServletContext().getRequestDispatcher(pagePath). forward(request, response); } } 

Quindi se url per la pagina era /myapp/jsf/home.xhtml allora il Dispatcher lo inoltrerà a myapp/WEB-INF/jsf/home.xhtml . E Faces Servlet gestirà la richiesta ” .xhtml “. Ma se in una pagina sono usati componenti jsf come h:form, h:link, h:button etc che generano action o url allora l’ url includerà realmente ” /WEB-INF “. Quindi per escluderlo abbiamo bisogno del prossimo passo.

  1. Escludi ” /WEB-INFjsf generato da jsf (per modulo jsf, link, pulsante). Per quello:

    6.1 crea sottoclass di jsf ViewHandler e sovrascrivi getActionUrl :

 public class HiddenPageViewHandler extends ViewHandlerWrapper { private static final String WEB_INF = "/WEB-INF"; private ViewHandler parent; public HiddenPageViewHandler(ViewHandler parent) { this.parent = parent; } @Override public String getActionURL(FacesContext context, String viewId) { String actionUrl = super.getActionURL(context, viewId); if (actionUrl != null && actionUrl.contains(WEB_INF)) { actionUrl = actionUrl.replace(WEB_INF, ""); } return actionUrl; } @Override public ViewHandler getWrapped() { return parent; } } 

6.2 configurare jsf per utilizzare ViewHandler specificato. In faces-config.xml aggiungi successivo:

   ...  controllers.HiddenPageViewHandler