Jsf 2 如何处理未找到的javax.faces.resource资源
当我从javax.faces.resource键入指向不存在资源的url时,例如Jsf 2 如何处理未找到的javax.faces.resource资源,jsf-2,primefaces,Jsf 2,Primefaces,当我从javax.faces.resource键入指向不存在资源的url时,例如 http://myapp/javax.faces.resource/noexisting.xhtml 我正在获取默认的HTTP 404页面,而我的404错误页面未被呈现。我知道FacesServlet正在将状态代码设置为404,而不是发送en error,这就是我的错误页面从未被调用的原因。是否有方法覆盖此实现以发送错误而不是设置状态代码 我使用的是primefaces 3.5和morajara 2.1.14
http://myapp/javax.faces.resource/noexisting.xhtml
我正在获取默认的HTTP 404页面,而我的404错误页面未被呈现。我知道FacesServlet正在将状态代码设置为404,而不是发送en error,这就是我的错误页面从未被调用的原因。是否有方法覆盖此实现以发送错误而不是设置状态代码
我使用的是primefaces 3.5和morajara 2.1.14
谢谢你的帮助。我自己找到了解决办法。我实现了自己的ResourceHandler并检查资源是否存在。如果资源不存在,我会发送404错误。 如果其他人也有同样的问题,以下是代码:
package com.mypackage;
import java.io.IOException;
import javax.faces.application.Resource;
import javax.faces.application.ResourceHandler;
import javax.faces.application.ResourceHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import com.sun.faces.util.Util;
public class MyResourceHandler extends ResourceHandlerWrapper {
// Properties
// -----------------------------------------------------------------------------------------------------
private final ResourceHandler wrapped;
public MyResourceHandler (final ResourceHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ResourceHandler getWrapped() {
return wrapped;
}
/**
* @see javax.faces.application.ResourceHandlerWrapper#isResourceRequest(javax.faces.context.FacesContext)
*/
@Override
public boolean isResourceRequest(final FacesContext context) {
return super.isResourceRequest(context);
}
@Override
public void handleResourceRequest(FacesContext context) throws IOException {
String resourceId = normalizeResourceRequest(context);
if (null != resourceId && resourceId.startsWith(RESOURCE_IDENTIFIER)) {
Resource resource = null;
String resourceName = null;
if (ResourceHandler.RESOURCE_IDENTIFIER.length() < resourceId.length()) {
resourceName = resourceId.substring(RESOURCE_IDENTIFIER.length() + 1);
if (!StringUtils.isEmpty(resourceName)) {
resource =
context
.getApplication()
.getResourceHandler()
.createResource(resourceName,
context.getExternalContext().getRequestParameterMap().get("ln"));
}
}
if (resource == null) {
HttpServletResponse response =
(HttpServletResponse) context.getExternalContext().getResponse();
response.sendError(404);
return;
}
}
super.handleResourceRequest(context);
}
private String normalizeResourceRequest(FacesContext context) {
String path;
String facesServletMapping = Util.getFacesMapping(context);
// If it is extension mapped
if (!Util.isPrefixMapped(facesServletMapping)) {
path = context.getExternalContext().getRequestServletPath();
// strip off the extension
int i = path.lastIndexOf(".");
if (0 < i) {
path = path.substring(0, i);
}
} else {
path = context.getExternalContext().getRequestPathInfo();
}
return path;
}
}
package com.mypackage;
导入java.io.IOException;
导入javax.faces.application.Resource;
导入javax.faces.application.ResourceHandler;
导入javax.faces.application.ResourceHandlerWrapper;
导入javax.faces.context.FacesContext;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.commons.lang3.StringUtils;
导入com.sun.faces.util.util;
公共类MyResourceHandler扩展了ResourceHandlerWrapper{
//性质
// -----------------------------------------------------------------------------------------------------
私有最终资源处理器;
公共MyResourceHandler(最终ResourceHandler包装){
this.wrapped=wrapped;
}
@凌驾
公共资源处理程序getWrapped(){
返回包装;
}
/**
*@see javax.faces.application.ResourceHandlerWrapper#isResourceRequest(javax.faces.context.FacesContext)
*/
@凌驾
公共布尔值isResourceRequest(最终FacesContext上下文){
返回super.isResourceRequest(上下文);
}
@凌驾
public void handleResourceRequest(FacesContext上下文)引发IOException{
字符串resourceId=normalizeResourceRequest(上下文);
if(null!=resourceId&&resourceId.startsWith(资源标识符)){
Resource=null;
字符串resourceName=null;
if(ResourceHandler.RESOURCE\u IDENTIFIER.length()
你的意思是这样的吗?不。这是我已经实现的。对于/javax.faces.resource/下不存在的资源,从未调用我的自定义错误页。这是一个很棒的部分。感谢男人@alpha2011!帮了我大忙!但是我想知道,你能告诉我你是从哪里知道的吗:“我知道FacesServlet正在将状态代码设置为404,而不是发送错误,这就是为什么我的错误页面从未被调用的原因。”此外,我编辑了你代码中的一些部分以使用OmniFaces,因为我使用的是MyFaces,而我没有com.sun.faces.util.util