1. 通過@RequestParam綁定請求參數
使用@RequestParam綁定請求參數的值到Controller的方法入參中。
/**
* 方式一,通過@RequestParam綁定請求參數
* 1、使用RequestMapping注解來映射請求的URL,在本案例,處理/say此URL的GET請求
* 2、傳回值會通過視圖解析器解析為實際的實體視圖, 對于InternalResourceViewResolver視圖解析器,會做如下解析
* 通過prefix+returnVal+suffix 這樣的方式得到實際的實體視圖,然後會轉發到該實際的實體視圖,在本案例,
* 得到實際的實體視圖是/jsp/say.jsp
* @param msg URL中傳遞的請求參數
* @return
*/
@RequestMapping(value="say",method=RequestMethod.GET)
public ModelAndView say(@RequestParam("msg") String msg){
//其中第一個參數為View Name,第二個參數為要傳遞的資料的key,第三個參數為資料對象。在這裡要注意的是:資料是預設被存放在request中的
return new ModelAndView("say", "msg", msg);
}
2.通過RequestContextHolder上下文擷取request對象
大部分情況下,這種方式是有效的!當請求為multipart類型的請求的時候,如檔案上傳,form表單的enctype類型為"multipart/form-data",這種情況下,RequestHolder.getRequest().getParameter()是得不到參數值的!!因為通過RequestHolder.getRequest()擷取到的request對象org.apache.catalina.connector.RequestFacade的執行個體
不推薦使用這種方式,解決方案:直接将HttpServletRequest作為spring mvc的方法入參
/**
* 方式二,通過RequestContextHolder上下文擷取request對象
* 不推薦使用這種方式!!
* 當請求為multipart類型的請求的時候,如檔案上傳,form表單的enctype類型為"multipart/form-data",
* 這種情況下,RequestHolder.getRequest().getParameter()是得不到參數值的!!
* 因為通過RequestHolder.getRequest()擷取到的request對象是org.apache.catalina.connector.RequestFacade的執行個體
* 1、使用RequestMapping注解來映射請求的URL,在本案例,處理/say2此URL的GET請求
* 2、傳回值會通過視圖解析器解析為實際的實體視圖, 對于InternalResourceViewResolver視圖解析器,會做如下解析
* 通過prefix+returnVal+suffix 這樣的方式得到實際的實體視圖,然後會轉發到該實際的實體視圖,在本案例,
* 得到實際的實體視圖是/jsp/say.jsp
* @return
*/
@RequestMapping(value="say2",method=RequestMethod.GET)
public ModelAndView say2(){
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
//其中第一個參數為View Name,第二個參數為要傳遞的資料的key,第三個參數為資料對象。在這裡要注意的是:資料是預設被存放在request中的
return new ModelAndView("say", "msg", request.getParameter("msg"));
}
3.将HttpServletRequest作為spring mvc的方法入參
推薦使用這種方式,靈活!
/**
* 方式三,直接将HttpServletRequest對象作為方法的入參
* 1、使用RequestMapping注解來映射請求的URL,在本案例,處理/say3此URL的GET請求
* 2、傳回值會通過視圖解析器解析為實際的實體視圖, 對于InternalResourceViewResolver視圖解析器,會做如下解析
* 通過prefix+returnVal+suffix 這樣的方式得到實際的實體視圖,然後會轉發到該實際的實體視圖,在本案例,
* 得到實際的實體視圖是/jsp/say.jsp
* @param request
* @return
*/
@RequestMapping(value="say3",method=RequestMethod.GET)
public ModelAndView say2(HttpServletRequest request){
//其中第一個參數為View Name,第二個參數為要傳遞的資料的key,第三個參數為資料對象。在這裡要注意的是:資料是預設被存放在request中的
return new ModelAndView("say", "msg", request.getParameter("msg"));
}
4.使用@ModelAttribute将請求參數轉換成Java自定義對象的成員變量
/**
* 方式四,通過@ModelAttribute将請求參數轉換成Java自定義對象的成員變量
* 1、使用RequestMapping注解來映射請求的URL,在本案例,處理/say4此URL的GET請求
* 2、傳回值會通過視圖解析器解析為實際的實體視圖, 對于InternalResourceViewResolver視圖解析器,會做如下解析
* 通過prefix+returnVal+suffix 這樣的方式得到實際的實體視圖,然後會轉發到該實際的實體視圖,在本案例,
* 得到實際的實體視圖是/jsp/say.jsp
* @param request
* @return
*/
@RequestMapping(value="say4",method=RequestMethod.GET)
public ModelAndView say2(@ModelAttribute MsgObject msgObject){
//其中第一個參數為View Name,第二個參數為要傳遞的資料的key,第三個參數為資料對象。在這裡要注意的是:資料是預設被存放在request中的
return new ModelAndView("say", "msg", msgObject.getMsg());
}
4.具體的demo代碼
GetRequestParameterController.java:
package edu.mvcdemo.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;
import edu.mvcdemo.model.MsgObject;
/**
* @編寫人: yh.zeng
* @編寫時間:2017-7-9 下午2:37:33
* @檔案描述: 擷取請求參數demo
*/
@Controller
public class GetRequestParameterController {
/**
* 方式一,通過@RequestParam綁定請求參數
* 1、使用RequestMapping注解來映射請求的URL,在本案例,處理/say此URL的GET請求
* 2、傳回值會通過視圖解析器解析為實際的實體視圖, 對于InternalResourceViewResolver視圖解析器,會做如下解析
* 通過prefix+returnVal+suffix 這樣的方式得到實際的實體視圖,然後會轉發到該實際的實體視圖,在本案例,
* 得到實際的實體視圖是/jsp/say.jsp
* @param msg URL中傳遞的請求參數
* @return
*/
@RequestMapping(value="say",method=RequestMethod.GET)
public ModelAndView say(@RequestParam("msg") String msg){
//其中第一個參數為View Name,第二個參數為要傳遞的資料的key,第三個參數為資料對象。在這裡要注意的是:資料是預設被存放在request中的
return new ModelAndView("say", "msg", msg);
}
/**
* 方式二,通過RequestContextHolder上下文擷取request對象
* 不推薦使用這種方式!!
* 當請求為multipart類型的請求的時候,如檔案上傳,form表單的enctype類型為"multipart/form-data",
* 這種情況下,RequestHolder.getRequest().getParameter()是得不到參數值的!!
* 因為通過RequestHolder.getRequest()擷取到的request對象是org.apache.catalina.connector.RequestFacade的執行個體
* 1、使用RequestMapping注解來映射請求的URL,在本案例,處理/say2此URL的GET請求
* 2、傳回值會通過視圖解析器解析為實際的實體視圖, 對于InternalResourceViewResolver視圖解析器,會做如下解析
* 通過prefix+returnVal+suffix 這樣的方式得到實際的實體視圖,然後會轉發到該實際的實體視圖,在本案例,
* 得到實際的實體視圖是/jsp/say.jsp
* @return
*/
@RequestMapping(value="say2",method=RequestMethod.GET)
public ModelAndView say2(){
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
//其中第一個參數為View Name,第二個參數為要傳遞的資料的key,第三個參數為資料對象。在這裡要注意的是:資料是預設被存放在request中的
return new ModelAndView("say", "msg", request.getParameter("msg"));
}
/**
* 方式三,直接将HttpServletRequest對象作為方法的入參
* 1、使用RequestMapping注解來映射請求的URL,在本案例,處理/say3此URL的GET請求
* 2、傳回值會通過視圖解析器解析為實際的實體視圖, 對于InternalResourceViewResolver視圖解析器,會做如下解析
* 通過prefix+returnVal+suffix 這樣的方式得到實際的實體視圖,然後會轉發到該實際的實體視圖,在本案例,
* 得到實際的實體視圖是/jsp/say.jsp
* @param request
* @return
*/
@RequestMapping(value="say3",method=RequestMethod.GET)
public ModelAndView say2(HttpServletRequest request){
//其中第一個參數為View Name,第二個參數為要傳遞的資料的key,第三個參數為資料對象。在這裡要注意的是:資料是預設被存放在request中的
return new ModelAndView("say", "msg", request.getParameter("msg"));
}
/**
* 方式四,通過@ModelAttribute将請求參數轉換成Java自定義對象的成員變量
* 1、使用RequestMapping注解來映射請求的URL,在本案例,處理/say4此URL的GET請求
* 2、傳回值會通過視圖解析器解析為實際的實體視圖, 對于InternalResourceViewResolver視圖解析器,會做如下解析
* 通過prefix+returnVal+suffix 這樣的方式得到實際的實體視圖,然後會轉發到該實際的實體視圖,在本案例,
* 得到實際的實體視圖是/jsp/say.jsp
* @param request
* @return
*/
@RequestMapping(value="say4",method=RequestMethod.GET)
public ModelAndView say2(@ModelAttribute MsgObject msgObject){
//其中第一個參數為View Name,第二個參數為要傳遞的資料的key,第三個參數為資料對象。在這裡要注意的是:資料是預設被存放在request中的
return new ModelAndView("say", "msg", msgObject.getMsg());
}
}
配置的視圖解析器為InternalResourceViewResolver,配置如下:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
say.jsp頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${requestScope.msg}
</body>
</html>
效果:
