HttpServletResponse.sendRedirect()方法/RequestDispatcher.forward()方法

RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法:include/forward

由于<jsp:include>只能指定固定的jsp文件名,不能动态指定jsp文件名。我们需要把<jsp:include>翻译为Java code – RequestDispatcher.include();

用法:
<% request.getRequestDispatcher(filename).include(request, response); />

服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法.

HttpServletResponse.sendRedirect()方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect("http://java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。

RequestDispatcher.forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。 include()方法将把Request Dispatcher资源的输出包含到当前输出中。

注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用URL重写(URL Rewriting)技术来实现这个功能。具体实现方法如下: 1. 在web.xml文件中配置一个Filter,用于拦截以.html结尾的请求: ``` <filter> <filter-name>urlRewriteFilter</filter-name> <filter-class>com.example.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>urlRewriteFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> ``` 2. 编写UrlRewriteFilter类,实现doFilter方法: ``` public class UrlRewriteFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String path = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length()); if (path.endsWith(".html")) { String newPath = path.substring(0, path.length() - 5); RequestDispatcher dispatcher = request.getRequestDispatcher(newPath); dispatcher.forward(request, response); } else { chain.doFilter(request, response); } } // 其他方法 } ``` 3. 在web.xml文件中配置一个servlet-mapping,将"/user/logout"路径映射到LogoutServlet: ``` <servlet> <servlet-name>logoutServlet</servlet-name> <servlet-class>com.example.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>logoutServlet</servlet-name> <url-pattern>/user/logout</url-pattern> </servlet-mapping> ``` 4. 编写LogoutServlet类,处理"/user/logout"路径的请求: ``` public class LogoutServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理登出逻辑 // ... response.sendRedirect("http://www.jt.com/user/logout.html"); } // 其他方法 } ``` 这样,当用户访问"http://www.jt.com/user/logout.html"时,UrlRewriteFilter会拦截请求并将其转发到"/user/logout"路径,然后LogoutServlet会处理该路径的请求并执行相应的逻辑,最后将用户重定向回"http://www.jt.com/user/logout.html"页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值