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.
Mappare FacesServlet
su *.xhtml
anziché su *.jsf
.
In alternativa, limita l’accesso diretto su *.xhtml
da un
in web.xml
.
Restrict direct access to XHTML files XHTML files *.xhtml
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.
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:
xhtml
dalla webapp root
a WEB-INF
url
base alle pagine dell’applicazione .xhtml
” WEB-INF/jsf/.xhtml
” jsf ViewHandler getActionUrl
per escludere ” WEB-INF
” jsf 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/
. Quindi facciamo il prossimo:
sposta
su
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); } }
web.xml
in url
basato sulle pagine:
Front Controller controllers.FrontController Front Controller /jsf/*
web.xml
to .xhtml
Faces Servlet javax.faces.webapp.FacesServlet 1 Faces Servlet *.xhtml
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.
Escludi ” /WEB-INF
” jsf
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