ssm框架整合筆記

韓猿外發表於2020-10-01
@Service
public class ItemServiceImpl implements ItemService {

	@Autowired             將類當做屬性注入,然後呼叫其中的方法
	private ItemMapper itemMapper;

	@Override
	public List<Item> queryItemList() {
		// 從資料庫查詢商品資料
		List<Item> list = this.itemMapper.selectByExample(null);

		return list;
	}

}
@Controller
public class ItemController {

	@Autowired
	private ItemService itemService;

	@RequestMapping("/itemList")   //或者@RequestMapping(value="item")
	public ModelAndView queryItemList() {
		// 獲取商品資料
		List<Item> list = this.itemService.queryItemList();

		ModelAndView modelAndView = new ModelAndView();
		// 把商品資料放到模型中
		modelAndView.addObject("itemList", list);
		// 設定邏輯檢視
		modelAndView.setViewName("itemList");

		return modelAndView;
@RequestMapping定義不同的處理器對映規則
	@RequestMapping(value = { "itemList", "itemListAll" })
	public ModelAndView queryItemList() 
	//可以將多個url對映到同一個方法
	
請求方法限定
@RequestMapping(method = RequestMethod.GET)	
@RequestMapping(value = "itemList",method = RequestMethod.POST)
@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})

請求中的引數繫結問題

簡單引數繫結

頁面點選修改按鈕,發起請求
http://127.0.0.1:8080/springmvc-web/itemEdit.action?id=1
一.

RequestMapping("/itemEdit")
public ModelAndView queryItemById(HttpServletRequest request) {
	(支援的引數型別:
	1.通過request物件獲取請求資訊
	2.通過response處理響應資訊
	3.通過session物件得到session中存放的物件)	
// 從request中獲取請求引數
	String strId = request.getParameter("id");
	Integer id = Integer.valueOf(strId);

	// 根據id查詢商品資料
	Item item = this.itemService.queryItemById(id);

二.繫結簡單型別
1.(當請求的引數名稱和處理器形參名稱一致時會將請求引數與形參進行繫結,支援的資料型別<推薦使用包裝資料型別,基礎資料型別不可以為null>包括
整形:Integer、int
字串:String
單精度:Float、float
雙精度:Double、double
布林型:Boolean、boolean
)

@RequestMapping("/itemEdit")
public String queryItemById(int id, ModelMap model) {
	// 根據id查詢商品資料
	Item item = this.itemService.queryItemById(id);

2.@RequestParam也常用於處理簡單型別的繫結(當請求引數名字不對應的時候)。

@RequestMapping("/itemEdit")
	public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") 		Integer id,ModelMap modelMap) {
	// 根據id查詢商品資料
	Item item = this.itemService.queryItemById(id);
(引數名字,引數是否必須,引數的,預設值)

3.使用pojo接收表單資料
如果提交的引數很多,或者提交的表單中的內容很多的時候,可以使用簡單型別接受資料,也可以使用pojo接收資料(pojo物件中的屬性名和表單中input的name屬性一致)

@RequestMapping("/updateItem")
public String updateItem(Item item) {
	// 呼叫服務更新商品
	this.itemService.updateItemById(item);

	// 返回邏輯檢視
	return "success";
}

4.使用包裝的pojo接收查詢引數,最後將查詢結果返回jsp頁面
包裝物件定義如下:

public class QueryVo {
	private Item item;
	set/get。。。
	}
	
接收查詢條件
// 繫結包裝資料型別
	@RequestMapping("/queryItem")
	public String queryItem(QueryVo queryVo) {
		System.out.println(queryVo.getItem().getId());
		System.out.println(queryVo.getItem().getName());

		return "success";

高階引數繫結問題
1.繫結陣列
功能要求商品列表頁面中的每個商品前有一個checkbok,選中多個商品後點選刪除按鈕把商品id傳遞給Controller,根據商品id刪除商品資訊。
前面用pojo的包裝類接收了表單資料

public class QueryVo{
	private Item item;
	private Integer[] ids;
}

我們將查詢引數使用item接收,將查詢到的結果在頁面顯示, 然後每個商品前有核取方塊,當點選核取方塊則會將
商品的id屬性傳入到ids屬性中根據,然後可根據陣列中的id刪除相應的商品

@RequestMapping("queryItem")
public String queryItem(QueryVo queryVo, Integer[] ids) {

	System.out.println(queryVo.getItem().getId());
	System.out.println(queryVo.getItem().getName());

	System.out.println(queryVo.getIds().length);
	System.out.println(ids.length);

	return "success";
}

//未做刪除操作

2.繫結list集合
需求
<1>在商品列表頁面中可以對商品資訊進行修改。
<2>可以批量提交修改後的商品資料。

public class QueryVo{
	private Item item;
	private Integer[] ids;    //可以選擇哪些進行批量修改
	private List<Item> itemList; //批量修改後的商品集合
}

注意:接收List型別的資料必須是pojo的屬性,如果方法的形參為ArrayList型別無法正確接收到資料?

除了ModelAndView以外,還可以使用Model(或者ModelMap --只需將model換成ModelMap 即可)來向頁面傳遞資料,程式碼可以得到簡化

@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, Model model) {
	// 從request中獲取請求引數
	String strId = request.getParameter("id");
	Integer id = Integer.valueOf(strId);

	// 根據id查詢商品資料
	Item item = this.itemService.queryItemById(id);
	model.addAttribute("item", item);

	return "itemEdit";
}

返回值問題
1.返回void(此時return無返回值)

@RequestMapping("queryItem")
public void queryItem(HttpServletRequest request, HttpServletResponse response) throws Exception {
	// 1 使用request進行轉發
	// request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,
	// response);

	// 2 使用response進行重定向到編輯頁面
	// response.sendRedirect("/springmvc-web2/itemEdit.action");

	// 3 使用response直接顯示
	response.getWriter().print("{\"abc\":123}");
}
擴充套件:轉發和重定向的原理
使用轉發時,jsp容器使用內部方法獲取原來頁面的請求,將這個請求轉發到新的頁面,新的頁面繼續處理這個請求,這個過程都是在伺服器完成的,瀏覽器不知道. 相反,重定向方式的是第一個頁面通知瀏覽器傳送一個新的頁面請求. 因此,轉發用的是同一個request(引數可以共享)而重定向是兩個不同的request(引數不共享)

2.返回字串(即一個頁面)
//指定邏輯檢視名,經過檢視解析器解析為jsp物理路徑:/WEB-INF/jsp/itemList.jsp
return “itemList”;

3.forward轉發
Controller方法執行後繼續執行另一個Controller方法

@RequestMapping("updateItem")
public String updateItemById(Item item) {
	// 更新商品
	this.itemService.updateItemById(item);
	//結果轉發到editItem.action,request可以帶過去
	return "forward: /itemEdit.action";   //執行另一個Controller方法
}

4.5.3.2. Redirect重定向
Contrller方法返回字串可以重定向到一個url地址

@RequestMapping("updateItem")
public String updateItemById(Item item) {
	// 更新商品
	this.itemService.updateItemById(item);
	// 重定向相當於執行了新的request和response,所以之前的請求引數都會丟失
	// 如果要指定請求引數,需要在重定向的url後面新增 ?itemId=1 這樣的請求引數
	return "redirect:/itemEdit.action?itemId=" + item.getId();   //重定向到一個url地址
}

對比轉發和重定向發現可以實現同樣的功能,只是一個不需要重新攜帶引數,另一個需要

相關文章