subir servidor multiple localizado example directorio desplegar archivos archivo aplicacion java model-view-controller jsf-2 web-inf

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.

  1. Asigne el FacesServlet en *.xhtml lugar de *.jsf .

  2. O bien, restrinja el acceso directo en *.xhtml mediante una <security-constraint> en web.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:

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:

  1. Mover la carpeta de páginas xhtml de la webapp root a WEB-INF
  2. Introduzca el patrón " Vista de despachador " en el proyecto
  3. Asigne el servlet de " Controlador frontal " a la url según las páginas de la aplicación
  4. Map Caras Servlet a " .xhtml "
  5. Dentro de " Dispatcher " enviar la solicitud a la página desde " WEB-INF/jsf/<name>.xhtml "
  6. Reemplazar jsf ViewHandler getActionUrl para excluir " WEB-INF " del url action generado (de form, 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:

  1. mover <webapp root>/jsf a <webapp root>/WEB-INF/jsf

  2. crear 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); } }

  1. map Servlet del controlador frontal en web.xml a url basado 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>

  1. map Caras Servlet en web.xml a .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>

  1. crea Dispatcher que reenvía la request para corregir la página 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); } }

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.

  1. Excluya " /WEB-INF " de la url generada por jsf (para jsf form, link, button). Para eso:

    6.1 crea la subclase de jsf ViewHandler y reemplaza 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 configure jsf para usar el ViewHandler especificado. En faces-config.xml add next:

<application> ... <view-handler> controllers.HiddenPageViewHandler </view-handler> </application>