【发布时间】:2015-07-02 07:18:56
【问题描述】:
我有一个静态 404 页面,里面有很多花哨的东西。 如果用户输入了一个不存在的页面的错误 url,我希望他看到那个 404 页面,但也希望保持 url 原样,以便用户查看他/她输入了什么错误网址。
进入的页面不存在: http://localhost:10039/my.website/my/halp.html
404 页面: http://localhost:10039/my.website/my/notfound.html
简而言之,我不会在这里使用“sendRedirect”,而是“获取 pageNotFoundUrl 的内容”并在 url 仍为 http://localhost:10039/my.website/my/halp.html 时显示它
我还尝试按照 Kayaman 的建议“转发”而不是重定向,但在这种情况下,我得到 “无法转发。响应已提交。”
TestServlet 定义在 web.xml 中,并且这个类扩展了 UtilFreemarkerServlet,它扩展了 FreemarkerServlet。
UtilFreemarkerServlet
public abstract class UtilFreemarkerServlet extends FreemarkerServlet {
private static final long serialVersionUID = 1L;
public static final String REQUEST_OBJECT_NAME = "RequestObject";
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void init() throws ServletException {
logger.info("init started");
super.init();
Configuration cfg = getConfiguration();
cfg.setLocalizedLookup(false);
}
@Override
protected ObjectWrapper createObjectWrapper() {
return ObjectWrapper.BEANS_WRAPPER;
}
@Override
protected HttpRequestParametersHashModel createRequestParametersHashModel(HttpServletRequest request) {
request.setAttribute(REQUEST_OBJECT_NAME, request);
return super.createRequestParametersHashModel(request);
}
}
TestServlet
public class TestServlet extends UtilFreemarkerServlet{
private static final long serialVersionUID = 1L;
private String website;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
boolean handleResult = handlerForRequest(req, resp);
}
protected boolean handlerForRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if (resp.getStatus() == 404) {
String pageNotFoundUrl = "http://localhost:10039/my.website/my/notfound.html";
RequestDispatcher rd = req.getRequestDispatcher(url);
rd.forward(req, resp);
// resp.sendRedirect(url);
}
return true;
}
}
【问题讨论】:
-
您可以使用 javascript 更改页面内容...并使用您从用户那里获取数据的同一页面...
-
@CoderNeji,不确定是否要将 JS 放入我的项目中。这可以在服务器端处理它们吗?
-
您可以在服务器端执行所有这些操作,但 url 会随着 404 页面的存在而改变,并且您已将 404 页面设置为错误页面,并且它有一些获取路径。
-
@shamaleyte 使用转发而不是重定向来保留 URL,但显示 404 页面的内容。
-
CoderNeji,那么如果不更改服务器端的 url 就不可能? @Kayaman,我该如何转发?由 RequestDispatcher ?
标签: java servlets freemarker