java web开发之 Servlet之Forward 使用(1)

本文详细解析了Forward机制在Web开发中的应用,介绍了如何使用RequestDispatcher对象进行页面跳转,包括跳转到Servlet、JSP页面及WEB-INF文件夹下的资源。通过实例展示了ForwardServlet的代码实现,以及如何在Servlet中处理业务逻辑并跳转到JSP页面展示结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Forward是通过RequestDispatcher对象的forward(HttpServletRequest req,HttpServletResponse res)方法来实现的。RequestDispatcher可以通过HttpServletRequest的getRequestDispatcher()方法获得。

 

例如下面的代码转跳到另一个Servlet:

RequestDispatcher dispatcher=request.getRequestDispacher("/servlet/LifeCycleServlet");
dispatcher.forward(request,response);


**requestDispatcher()方法的参数必须为以“/”开始,“/”表示本Web应用程序的根目录。如果要转跳到Servlet为http://localhost:8080/servlet/servlet/LifeCycleServlet,则参数应为“/servlet/LifeCycleServlet“。 


Forward是MVC框架中常用的一种技术。Forward不仅可以转跳到本应用的另一个Servlet,JSP页面,也可以转跳到另外一个文件,甚至WEB-INF文件夹下的文件。其中跳转到Servlet与JSP页面是最常见的。

框架中常使用一个Servlet来集中处理请求然后跳转到响应的Servlet,或者在Servlet中处理业务逻辑,然后跳转到JSP页面中显示处理结果。 


下面通过一个例子。使用向导新建ForwardServlet,输入如下代码: 
ForwardServlet.java**

package com.helloweenvsfei.servlet;

import java.io.IOException;
import java.util.Date;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ForwardServlet extends HttpServlet {

    private static final long serialVersionUID = -291840563095094360L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String destination = request.getParameter("destination");

        // 跳转到 /WEB-INF/web.xml。通过地址栏输入网址是不能访问到该文件的,但是 forward 可以
        if("file".equals(destination)){
            RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/web.xml");
            dispatcher.forward(request, response);
        }
        // 跳转到 /forward.jsp
        else if("jsp".equals(destination)){
            // 通过 setAttribute 方法传递一个 Date 对象给 JSP 页面
            Date date = new Date();
            request.setAttribute("date", date);
            RequestDispatcher dispatcher = request.getRequestDispatcher("/forward.jsp");
            dispatcher.forward(request, response);
        }
        // 跳转到另一个 Servlet
        else if("servlet".equals(destination)){
            RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/LifeCycleServlet");
            dispatcher.forward(request, response);
        }
        else{
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html; charset=UTF-8");
            response.getWriter().println("缺少参数。用法:" + request.getRequestURL() + "?destination=jsp 或者 file 或者 servlet ");
        }

    }
    public void doPut(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        this.doGet(request, response);
    }

}

**ForwardServlet中根据地址栏传入的destination参数不同而跳转到不同的目的地。如果destination参数值为file,则跳转到文件/WEB-INF/web.xml;如果为servlet,则跳转到/servlet/LifeCycleServlet;如果为jsp则跳转到JSP页面/forward.jsp. 
本程序使用了一个JSP程序。在项目servlet的WebRoot文件夹上右击,新建forward.jsp页面。输入代码如下:**

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<jsp:directive.page import="java.util.Date" />
<jsp:directive.page import="java.text.SimpleDateFormat" />
<%
Date date = (Date) request.getAttribute("date");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
    <HEAD>
        <TITLE>Forward 跳转</TITLE>
        <link rel='stylesheet' type='text/css'
            href='<%=request.getContextPath()%>/css/style.css'>
    </HEAD>
    <BODY>
        <div align='center'>
            <br />
            <fieldset style=width:90%>
                <legend>
                    Forward 跳转
                </legend>
                <br />
                <div style='line'>
                    <div class='leftDiv' style='width:250px; '>
                        从 ForwardServlet 中取到的 Date 为
                    </div>
                    <div align='left' class='rightDiv'>
                        <%=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
                            .format(date)%>
                    </div>
                </div>
                <br />
                <div style='line'>
                    <div align="center">
                        <input type='button'
                            οnclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=servlet"; '
                            οnmοuseοver="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=servlet'"
                            value='跳转到 Servlet' class=button>
                        <input type='button'
                            οnclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=file"; '
                            οnmοuseοver="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=file'"
                            value='跳转到 web.xml' class=button>
                        <input type='button'
                            οnclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=jsp"; '
                            οnmοuseοver="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=jsp'"
                            value='跳转到 JSP' class=button>
                    </div>
                </div>
    </BODY>
</HTML>

### 自定义 `std::map` 比较器的定义与使用 在 C++ 中,`std::map` 默认使用小于运算符 (`<`)比较键。然而,在某些情况下,默认的行为可能不满足需求,这时可以提供自定义比较器来改变这种行为。 #### 使用函数对象作为比较器 可以通过创建个类并重载其调用操作符 (`operator()`) 来实现自定义比较逻辑: ```cpp struct CustomComparator { bool operator()(const int& lhs, const int& rhs) const { return abs(lhs) < abs(rhs); // 自定义比较规则:按绝对值大小排序 } }; ``` 接着可以在声明 `std::map` 时传递该比较器实例给模板参数列表: ```cpp #include <map> #include <cmath> int main() { std::map<int, char, CustomComparator> myMap; myMap[-1] = 'a'; myMap[2] = 'b'; myMap[-3] = 'c'; for (auto&& [key, value] : myMap) { printf("%d -> %c\n", key, value); } return 0; } ``` 这段代码会按照整数的绝对值从小到大排列键值对[^1]。 #### 使用 lambda 表达式简化语法 如果不想额外定义结构体或者类,则可以直接利用lambda表达式来构建匿名函数作为比较器: ```cpp #include <map> int main(){ auto comp = [](int l, int r){return abs(l)<abs(r);} ; std::map<int,char,decltype(comp)> m{{-1,'a'},{2,'b'}, {-3,'c'} ,comp}; for(auto &&p:m){ cout<< p.first <<":"<<p.second<<"\n"; } return 0; } ``` 这里通过指定第三个模板参数为 `decltype(comp)` 并传入具体的 lambda 对象实现了相同的效果。 当涉及到更复杂的类型或需要特定处理的情况下,建议采用显式的函数对象形式以便于维护和理解;而对于简单的场景下,Lambda 表达式则提供了更加简洁的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值