基礎配置
<!-- web.xml -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- dispatcher-servlet.xml -->
<context:component-scan base-package="com.xxx" />
<!-- 視圖解析器 (有無影響跳轉寫法) -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
1. 原生 Servlet API 方式
1.1 直接輸出響應
@RequestMapping("/resp")
public void handle(HttpServletRequest req, HttpServletResponse resp) throws Exception {
resp.getWriter().println("hello HttpServletResponse");
}
1.2 sendRedirect 重導向
@RequestMapping("/resp")
public void handle(HttpServletRequest req, HttpServletResponse resp) throws Exception {
resp.sendRedirect("index.jsp"); // 瀏覽器 URL 變化
}
1.3 forward 轉發
@RequestMapping("/resp")
public void handle(HttpServletRequest req, HttpServletResponse resp) throws Exception {
req.setAttribute("message", "it's forward");
req.getRequestDispatcher("index.jsp").forward(req, resp); // URL 不變
}
2. 返回 String 視圖名 (有/無視圖解析器)
| 場景 | 寫法 | 效果 |
| 無視圖解析器 | return "home.jsp"; | 轉發到 home.jsp |
| return "forward:index.jsp"; | 轉發 |
| return "redirect:index.jsp"; | 重導向 |
| 有視圖解析器 | return "home"; | 解析為 /WEB-INF/jsp/home.jsp 並轉發 |
| return "forward:index"; | 轉發到 index (經解析器) |
| return "redirect:hello"; | 重導向到 /hello (匹配 @RequestMapping) |
3. ModelAndView 方式 (需視圖解析器)
@Controller
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "hello myfirst mvc"); // 模型數據
mv.setViewName("hello"); // 視圖名 → /WEB-INF/jsp/hello.jsp
return mv;
}
}
4. ModelMap / Model 方式 (現代推薦)
@RequestMapping("/modelmap")
public String modelHello(String name, ModelMap map) {
map.addAttribute("name", name);
return "index.jsp"; // 無視圖解析器時寫全名;有解析器寫邏輯名
}
也可用 Model、@ModelAttribute 綁定表單對象。
核心差異總結
| 方式 | 需視圖解析器 | 攜帶數據 | 靈活度 | 推薦度 |
| 原生 API | 否 | request.setAttribute | 高(完全控制) | 特殊場景 |
| String 返回 | 視情況 | Model/Map/ModelMap | 高 | ✅ 推薦 |
| ModelAndView | 是 | addObject | 中 | 傳統項目 |
| ModelMap/Model | 視情況 | addAttribute | 高 | ✅ 現代首選 |
關鍵前綴語法
forward:viewName → RequestDispatcher.forward()
redirect:viewName → HttpServletResponse.sendRedirect()
- 有視圖解析器時,
viewName 為邏輯名;無解析器時為物理路徑