1. 程式人生 > 實用技巧 >【SpringMVC】環境搭建、namespace、控制器跳轉、請求引數接收(時間處理)、亂碼解決、作用域

【SpringMVC】環境搭建、namespace、控制器跳轉、請求引數接收(時間處理)、亂碼解決、作用域

SpringMVC 框架

1).環境搭建---第一個SpringMVC控制器、控制器生命週期

注意:這裡的Spring MVC配置大都在mvc.xml中配置
(1)SpringMVC
特點:
① SpringMVC天然整合Spring(SpringMVC本身就是spring技術的一部分)
② SpringMVC自帶小Spring工廠,SpringMVC控制器可以使用spring工廠管理
③ Struts2效能低於SpringMVC
④ SpringMVC對映控制器的訪問路徑,可以使用註解的方式
(2)環境搭建
編碼:
1) 匯入jar
	spring相關的jar(webmvc.jar) 日誌的jar
2) 匯入配置檔案
	mvc.xml   log4.properties;
3) 初始化配置
	web.xml初始化:
	① 配置DispatcherServlet核心控制器[Servlet]---org.springframework.web.servlet.DispatcherServlet】
	② 指定mvc.xml檔案路徑:	mvc.xml初始化
	① 開啟註解管理物件
	② 開啟springmnv註解開發mvc;(使用註解對映訪問路徑)
web.xml初始化:
 mvc.xml初始化
 第一個Controller
核心思想
 
編碼步驟:
① 編寫一個控制器程式
@Controller
public class FirstController{
@RequestMapping("/controller的方法路徑")
public String hello(){
	return “跳轉方式:/url-patton”;
}	
}
② 交給spring工廠管理:@Controller
③ 對映控制方法的訪問路徑:@RequsetMapping(“/名”)
④ 訪問:http://ip:port/專案名/方法上的RequestMapping指定的路徑.do
控制器的生命週期:
Struts2的action建立多個:每次請求都要建立新的
SpringMVC的Controller,只需要一個即可。沒有資料屬性,本質是執行緒安全的(不能再屬性中定義資料變數)
建立時機:tomcat啟動時,(初始化mvc的核心控制器,讀取mvc配置檔案,註解生效,掃描控制器),就建立了Controller,只建立一個
可以使用Servlet的API:
public class XxxController{
public String xx(HttpServletRequest  req,HttpServletResponse  resp){
			//使用req,和resp
}
}

2).SpringMVC的namespace、控制器跳轉、請求引數接收(時間處理)、亂碼解決

(1)namespace:@RequestMapping(“/namespace訪問名字”) 放在控制器類上面進行註解
作用: 對映訪問路徑
語法: 
	① 寫在方法上----表明方法的訪問路徑
	② 寫在類上------表明控制器方法訪問的namespace
		a: 訪問控制器方法訪問路徑: /類上的RequestMapping的路徑/方法上的RequestMapping的路徑
		b: 將同一個業務模組下的多個控制器方法,放在一個控制器類
			將同一個業務模組下的多個控制器方法訪問路徑,放在同一個namespace下
 (2)控制器跳轉
核心思路(編碼):return "跳轉方式:/目標路徑的url-pattern";
① 請求轉發:(伺服器內部跳轉)
Controller--->JSP:return "forward:/目標jsp的url-pattern路徑";
Controller---->Controller:return "forward:/類上的RequestMapping路徑/目標跳轉方法上的Requestmapping路徑.do";
總結:return "forward:/目標路徑的url-pattern";
② 重定向:(伺服器外部跳轉)
方式:return "redirect:/目標路徑的url-pattern";

(3)請求引數的接收
① 基本資料型別 + String資料資料收集
使用方式:直接在方法上宣告變數接受即可
優點:不用像struts2提供set和get、自動轉化型別
 
② 接受陣列型別的值:在方法上宣告陣列型別引數即可
 
③ 直接接受物件型別
使用:在方法上宣告物件型別引數、引數名必須接受控制器的方法形參的實體屬性名一致
 
④ 接收物件(實體)屬性時間格式的轉換:
@DateTimeFormat(pattern="yyyy-MM-dd")   	spring接收引數自動封裝物件時轉換,屬性宣告上使用
(4)亂碼問題
① get請求亂碼解決辦法:
修改tomcat的conf/server.xml
<Connector port="8888" protocol="HTTP/1.1"
       		connectionTimeout="20000"	redirectPort="8443" URIEncoding="UTF-8"/>
② Post請求亂碼解決辦法:
request.setCharacterEncoding("UTF-8");
	response.setCharacterEncoding("UTF-8");
③ Spring解決(提供過濾器,需要配置使用)
post請求和響應編碼設定核心思想
 
Springweb提供該編碼設定的Filter:org.springframework.web.filter.CharacterEncodingFilter

3).SpringMVC作用域操作(存/取)、複雜請求引數接收(多個物件接收、日期)

(1)SpringMVC作用域操作
方式一:在方法上宣告HttpServletRequest、HttpServletResponse物件
方式二:Spring提供
1) ModelMap
 	① Request作用域[存]:
作用:代替request作用域,資料存入ModelMap,自動講資料放入Request作用域
獲得ModelMap:方法上引數宣告ModelMap mm
存入方法:modelMap.addAttribute("name",值 物件  資料)
JSP獲取:${requestScope.name}
② Session作用域[存]:
使用:在類上新增@SessionAttribute({"modelmap資料的name","modelmap資料的name"})
作用:對應的moldelmap中的資料,自動拷貝到Session作用域中
使用方式:ModelMap + @SessionAttributes({"modelmap中資料的name"})
 
2) 其他作用操作相關的物件:Model
作用:資料存入,相當於放入request作用域(功能與ModelMap一樣)
使用:同ModelMap
3) Map (java.util.Map)
作用:相當於request作用域
獲得:方法宣告 Map map
使用:map.put("name",值);
4) ModelAndView
作用:model作用+跳轉路徑的作用
獲得:引數宣告ModelAndView
向request作用域存入:mav.addObject("作用域資料的name",值);
設定跳轉路徑:mav.setViewName("跳轉方式:/目標資源url-pattern");
使用:
public ModelAndView xxx(ModelAndView mav) {
    mav.addObject("name",值);	 //1. 向requset作用域存入一個數據
    mav.setViewName("跳轉方式:/目標資源url-pattern");	//2. 跳轉到xxx.jsp
    return mav;
}
*獲得作用域值:SpringMVC作用域高階[面試+獲得作用域中的值,使用web相關物件
① 在方法上宣告Servlet相關的物件:HttpServletRequest、HttpServletResponse、HttpSession
   	呼叫getAttribute(“name”)取值
 
② 允許直接從spring工廠中獲得:HttpServletRequest、HttpServletResponse、HttpSession
	@Controller
	public class MyController {
   	@Autowired
   	private HttpServletRequest request;
   	@Autowired
   	private HttpServletSession session;
  	@Autowired
   	private HttpServletResponse response;
}
    原理: 從spring工廠中,獲得所謂的HttpSession/HttpServletRequest,其實是spring提供的代理物件、通過在代理物件方法內部,獲得真正的session和request,呼叫對應的方法
③ 方式3:RequestContextHolder
   	RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
   	// RequestAttributes作用:可以獲得httpServletReq HttpServletResp物件
   	ServletRequestAttributes attrs = (ServletRequestAttributes) attributes;
   	attrs.getRequest();//獲得request物件
   	attrs.getResponse();//獲得response物件
   	//RequestAttributes作用:可以操作request和session作用域
   	attrs.setAttribute("user1", "蔣文明", RequestAttributes.SCOPE_SESSION);		//將資料存入session作用域
   	attrs.setAttribute("user1", "蔣文明", RequestAttributes.SCOPE_REQUEST);	//將資料存入request作用域
   	attrs.getAttribute("name",RequestAttributes.SCOPE_SESSION);	//從session作用域中獲得name對應的資料
(2)SpringMVC複雜請求引數接收
1) 集合物件的收集(一次性提交多個相同型別資料,或基本資料,或實體物件)
SpringMVC複雜物件型別收集核心:基於控制器方法引數的屬性名。封裝DTO(Data Transfer Object資料傳輸物件)物件,由客戶端傳遞給控制器
命名: XxxDTO
 
2) 日期型別的接受:
	方式一:在要接受的屬性上加@DateTimeFormat (pattern=”yyyy/MM/dd”)
方式二:核心思路
 
型別轉化器的開發步驟:
① 自定義一個類實現,Converter介面(Spring提供)
 
② 將型別轉起物件管理型別轉化工廠內部(使用SpringMVC的工廠)
③ 在mvc:annotation-drive中開啟使用自定義型別轉起的使用