java - servidor - subir archivos+primefaces
Archivos JSF dentro del directorio WEB-INF, ¿cómo puedo acceder a ellos? (3)
Quiero poner mis archivos JSF 2.0 xhtml en WEB-INF / jsf. ¿Cómo puedo acceder a ellos? Sé que cualquier cosa dentro de WEB-INF no está expuesta al exterior, por lo que necesito un controlador para redirigirme a la JSP correspondiente, ¿verdad? (Este es también el modelo 2 iirc).
¿Puedo lograr esto con un parámetro dentro de web.xml / faces-config.xml? Creo que FacesServlet es el controlador de mi aplicación web, ¿así que debería servir para este propósito?
Y otra pregunta para entender el Patrón del Modelo 2. ¿Cada acción tiene que ir primero a un servlet que luego maneja el siguiente paso posible? Entonces, un <a href="anotherPage.html" /> simple está prohibido en este patrón, ya que no va al servlet de control.
Quiero poner mis archivos JSF 2.0 xhtml en WEB-INF / jsf. ¿Cómo puedo acceder a ellos?
No puedes. Los archivos en la carpeta /WEB-INF no son accesibles directamente.
Hay dos opciones para solucionar el problema de que los archivos de origen JSF sean de acceso público.
Asigne el
FacesServleten*.xhtmllugar de*.jsf.O bien, restrinja el acceso directo en
*.xhtmlmediante una<security-constraint>enweb.xml.<security-constraint> <display-name>Restrict direct access to XHTML files</display-name> <web-resource-collection> <web-resource-name>XHTML files</web-resource-name> <url-pattern>*.xhtml</url-pattern> </web-resource-collection> <auth-constraint /> </security-constraint>
Ver también:
- ¿Qué archivos XHTML necesito poner / WEB-INF y cuáles no?
- Facelets JSF: A veces veo que la URL es .jsf y, a veces, .xhtml. ¿Por qué?
Y otra pregunta para entender el Patrón del Modelo 2. ¿Cada acción tiene que ir primero a un servlet que luego maneja el siguiente paso posible?
El FacesServlet ya lo hace. Es el controlador. Con JSF, usted ya tiene un javabean simple como modelo y un archivo JSP / Facelets como vista. El FacesServlet como el controlador ya ha tomado todas las tareas desagradables de recopilación de parámetros de solicitud, validación, conversión, actualización de modelos y navegación de sus manos.
Ver también:
Entonces, un
<a href="anotherPage.html" />simple está prohibido en este patrón, ya que no va al servlet de control.
No, está perfectamente bien. El controlador se activará siempre que sea necesario. Si el recurso no necesita un controlador (es decir, un recurso estático), tampoco es necesario que pase a través de un controlador.
En el futuro, haga preguntas múltiples en preguntas separadas de desbordamiento de pila.
La restricción de seguridad es solo una solución para la falta de JSF. ¿Cómo puedo asignar una URL como home.jsf a un archivo diferente de home.xhtml bajo WebContent? De esta manera, tengo un alto acoplamiento entre la navegación y la estructura del proyecto. ¿Cómo puedo evitar eso en JSF?
Para acceder a las páginas xhtml dentro WEB-INF/jsf carpeta WEB-INF/jsf , puede hacer lo siguiente:
- Mover la carpeta de páginas
xhtmlde lawebapp rootaWEB-INF - Introduzca el patrón " Vista de despachador " en el proyecto
- Asigne el servlet de " Controlador frontal " a la
urlsegún las páginas de la aplicación - Map Caras Servlet a "
.xhtml" - Dentro de " Dispatcher " enviar la solicitud a la página desde "
WEB-INF/jsf/<name>.xhtml" - Reemplazar
jsf ViewHandler getActionUrlpara excluir "WEB-INF" delurlactiongenerado (deform, link, button)
Por ejemplo, las páginas xhtml están en la carpeta raíz de la aplicación web " jsf ". Todas las url entre páginas son como jsf/<pageName>.xhtml . Entonces lo hacemos a continuación:
mover
<webapp root>/jsfa<webapp root>/WEB-INF/jsfcrear el 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);
}
}
- map Servlet del controlador frontal en
web.xmlaurlbasado en páginas:
<servlet> <servlet-name>Front Controller</servlet-name> <servlet-class>controllers.FrontController</servlet-class> </servlet> <servlet-mapping> <servlet-name>Front Controller</servlet-name> <url-pattern>/jsf/*</url-pattern> </servlet-mapping>
- map Caras Servlet en
web.xmla.xhtml
<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping>
- crea Dispatcher que reenvía la
requestpara corregir la páginaxhtml:
``
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);
}
}
Por lo tanto, si la URL de la página era /myapp/jsf/home.xhtml , Dispatcher lo reenviará a myapp/WEB-INF/jsf/home.xhtml . Y Faces Servlet se encargará de la solicitud " .xhtml ". Pero si en una página se usan componentes jsf como h:form, h:link, h:button etc. que generan action o url , la url incluirá realmente " /WEB-INF ". Entonces para excluirlo necesitamos el siguiente paso.
Excluya "
/WEB-INF" de laurlgenerada por jsf (para jsf form, link, button). Para eso:6.1 crea la subclase de
jsf ViewHandlery reemplazagetActionUrl:
``
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 configure jsf para usar el ViewHandler especificado. En faces-config.xml add next:
<application> ... <view-handler> controllers.HiddenPageViewHandler </view-handler> </application>