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
FacesServlet
en*.xhtml
lugar de*.jsf
.O bien, restrinja el acceso directo en
*.xhtml
mediante 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
xhtml
de lawebapp root
aWEB-INF
- Introduzca el patrón " Vista de despachador " en el proyecto
- Asigne el servlet de " Controlador frontal " a la
url
segú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 getActionUrl
para excluir "WEB-INF
" delurl
action
generado (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>/jsf
a<webapp root>/WEB-INF/jsf
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);
}
}
- map Servlet del controlador frontal en
web.xml
aurl
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>
- 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>
- crea Dispatcher que reenvía la
request
para 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 laurl
generada por jsf (para jsf form, link, button). Para eso:6.1 crea la subclase de
jsf ViewHandler
y 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>