SSM整合(八)

复习:

springmvc框架

DispatcherServlet前端控制器:接收request,进行response

HanderMapping处理器映射器:根据rul查找Handler,(可以通过xml配置方式,注解方式)

HandlerAdapter处理器适配器:根据特定规则去执行Handler,编写Handler时需要按照HanderAdapter的要求去编写。

Handler处理器(后端控制器):需要程序员去编写,常用注解开发方式

Handler处理器执行后结果是ModelAndView.具体开发时,Handler返回方法值类型包括:ModelAndView,String(逻辑视图名),void(通过在Handler形参中添加request和response,类似原始servlet开发方式,注意:可以通过指定response响应的结果类型,实现json数据的输出)

View resolver视图解析器:根据逻辑视图名来生成真正的视图(在springmvc中使用View对象表示)

VIew视图:jsp页面,仅是数据展示,没有业务逻辑。

注解开发:

使用注解方式的处理器映射器和适配器:

<!--注解映射器 -->
	<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
	<!--注解适配器 -->
	 <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> --> 

在实际开发中,使用    <mvc:annotation-driven>代替上边处理器映射器和适配器配置。

@controller注解必须要加,作用标识类是一个Handler处理器

@requestMapping注解必须要加,作用:

1,对url和Handler的方法进行映射

2,可以窄化请求映射,可以设置Handler的根路径url就是根路径+子路径

3,可以限制http请求的方法

映射成功后,springmvc框架生成一个Handler对象,对象中只包括一个映射成功的method。

注解开发中参数绑定:

将request请求过来的key/value的数据(理解一个串),通过转换(参数绑定的一部分),将key/value串转成形参,将转换后的结果传给形参(整个参数绑定过程)

springmvc所支持参数绑定:

1,默认支持很多类型,HttpServletRequest,response,session,model/modelMap(将模型数据填充到request域)

2,支持简单数据类型,整型,字符串,日期。

只要保证request请求的参数名和形参名称一致,自动绑定成功。

如果request请求的参数名和形参名称不一致,可以使用@RequestParam(指定request请求的参数名),@RequestParam加在形参的前边。

3,支持pojo类型

只要保证request提交的参数名称和pojo中的属性名一致,自动将request请求的参数设置到pojo的属性中。

注意:形参中既有pojo类型,又有简单类型,参数绑定互不影响。

自定义参数绑定:

日期类型的绑定自定义:

定义的Converter<源类型,目标类型>接口实现类,比如:

Converter<String,Date>标识:将请求的日期数据串转成java中的日期类型。

注意:要转换的目标类型一定和接收的pojo中的属性类型一致。

将定义的Converter实现类,注入到处理器适配器中。

springmvc面向方法开发,struts2面向类开发。

springmvc可以单例开发,struts2只能是多例。

1 课程安排

上午:

在商品查询和商品修改功能案例驱动下进行学习:

     包装类型pojo 参数绑定(掌握)。

      集合类型的参数绑定:数组,list,map

      商品修稿添加校验,学习springmvc提供校验validation(使用的是hibernate校验框架)

数据回显,

统一异常处理(掌握)

上传图片(下载)

下午:json数据交互,

RESTful支持

拦截器

2 包装类型pojo参数绑定

2.1需求

商品查询controller方法中实现商品查询条件传入

2.2实现方法

第一种方法:在形参中添加HttpServletRequest request参数,通过request接收查询条件参数。

第二种方法:在形参中让包装类型的pojo接收查询条件参数。

分析:

页面传参的特点:复杂,多样性,条件包括:用户账户,商品编写,订单信息。。

如果将用户账户,商品编写,订单信息等放在简单pojo(属性是简单类型)中,pojo类属性比较乱。建议使用包装类的pojo,pojo中的属性是pojo.

2.3 页面参数和controller方法形参定义(使用属性点的方式进行命名)

页面参数:

商品名称:<input name="itemsCustom.name"/>

注意:itemsCustom和包装pojo中的属性一致即可。

controller方法形参

public ModelAndView queryItems(HttpServletRequest request,ItemsQueryVo itemsQueryVo) throws Exception{

3 集合类型

3.1 数组绑定

3.1.1 需求

商品批量删除,用户在页面选择多个商品,批量删除

3.1.2 表现层实现

关键:将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组来接收页面请求的多个id。

页面定义:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!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>查询商品列表</title>
</head>
<script type="text/javascript">
function deleteItems(){
	//提交form
	document.itemsForm.action="${pageContext.request.contextPath }/items/deleteItems.action";
	document.itemsForm.submit();
	
}
function queryItems(){
	//提交form
	document.itemsForm.action="${pageContext.request.contextPath }/items/queryItems.action";
	document.itemsForm.submit();
	
}
</script>
<body> 
<form name="itemsForm" action="${pageContext.request.contextPath }/items/queryItems.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td>商品名称<input type="text" name="itemsCustom.name"/></td>
<td><input type="button" value="查询"  onclick="queryItems()"/></td>
<td><input type="button" value="批量删除"  onclick="deleteItems()"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
	<td>选择</td>
	<td>商品名称</td>
	<td>商品价格</td>
	<td>生产日期</td>
	<td>商品描述</td>
	<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
	<td><input type="checkbox" name="items_id" value="${item.id}"/></td>
	<td>${item.name }</td>
	<td>${item.price }</td>
	<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
	<td>${item.detail }</td>
	
	<td><a href="${pageContext.request.contextPath }/items/editItems.action?id=${item.id}">修改</a></td>

</tr>
</c:forEach>

</table>
</form>
</body>

</html>

 

controller方法定义:

package cn.itcast.ssm.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.servlet.ModelAndView;

import cn.itcast.ssm.po.Items;
import cn.itcast.ssm.po.ItemsCustom;
import cn.itcast.ssm.po.ItemsQueryVo;
import cn.itcast.ssm.service.ItemsService;

//为了对url进行分类管理,可以在这里定义路径,最终访问url是根路径+子路径
//比如:商品列表:/items/queryItems.action
@Controller
@RequestMapping("/items")
public class ItemsController {

	@Autowired
	private ItemsService itemsService;
	//商品查询
	//商品查询列表
		@RequestMapping("/queryItems.action")
		public ModelAndView queryItems(HttpServletRequest request,ItemsQueryVo itemsQueryVo) throws Exception{
			System.out.println(request.getParameter("id"));
			
			//调用service查找数据,查询商品列表,这里使用静态数据模拟
			List<ItemsCustom> itemsList = itemsService.findItemdsList(itemsQueryVo);
			
			
			//创建modelAndView准备填充数据、设置视图
			ModelAndView modelAndView = new ModelAndView();
			
			//填充数据
			modelAndView.addObject("itemsList", itemsList);
			//指定视图
			//下边的路径,如果在视图解析器中配置jsp前缀和后缀,
			//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
			//上边的路径可以不在程序中指定jsp路径的前缀和后缀,修改为
			modelAndView.setViewName("items/itemsList");
			
			return modelAndView;
			
		}
	
	//商品信息修改页面显示
		//@RequestMapping("/editItems")
		//限制http请求方法
/*		@RequestMapping(value="/editItems",method= {RequestMethod.GET,RequestMethod.POST})
	public ModelAndView editItems()throws Exception{
		//调用service根据商品id查询商品信息
		ItemsCustom itemsCustom = itemsService.findItemsById(1);
		ModelAndView modelAndView = new ModelAndView();
		
		//将商品信息添加至model
		modelAndView.addObject("itemsCustom",itemsCustom);
		modelAndView.setViewName("items/editItems");
		return modelAndView;
	}*/
		
		
		
	//通过required参数指定	参数是否必须要传入,
	//通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定。
	@RequestMapping(value="/editItems",method= {RequestMethod.GET,RequestMethod.POST})
	public String editItems(Model model,@RequestParam(value="id",required = true,defaultValue="")Integer items_id)throws Exception{
		//调用service根据商品id查询商品信息
		ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
	
		//通过形参中的model将model数据传到视图
		model.addAttribute("itemsCustom", itemsCustom);
		return "items/editItems";
	}
		
		
	//商品信息修改
		@RequestMapping("/editItemSubmit")
		public String editItemSubmit(HttpServletRequest request,Integer id,ItemsCustom itemsCustom)throws Exception{
			//调用service跟新商品信息,页面需要将商品信息传到此方法
			itemsService.updateItems(id, itemsCustom);
	
			//重定向
			//return "redirect:queryItems.action";
			//页面转发
			return "forward:queryItems.action";
			//return "success";
		}
		
		
		@RequestMapping("/deleteItems")
		public String deleteItems(Integer[] items_id)throws Exception{
			//调用service批量删除商品
			System.out.print("yes");
			return "success";

		}

}

3.2 list绑定

3.2.1 需求

通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中,比如:成绩录入(录入多门成绩,批量提交)

本例需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。

3.2.2 表现层实现

页面定义:

1,进入批量商品修改页面(页面样式参考列表实现)

2,批量修改商品提交

使用List接受页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list

public class ItemsQueryVo {

	//包装查询条件
	private Items items;
	//为了系统可扩张行,对原始生成的po进行扩展
//	
	private List<ItemsCustom> itemsList;
	
	public Items getItems() {
		return items;
	}

controller方法定义:

		//批量修改商品提交
		//通过ItemsQueryVo接收批量商品信息,将商品信息存储到itemsQueryVo中itemsList属性中。
		public String editItemsALlSubmit(ItemsQueryVo itemsQueryVo)throws Exception{
		

 

3.3 map绑定

在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。

包装类中定义Map对象如下:

Public class QueryVo {

private Map<String, Object> itemInfo = new HashMap<String, Object>();

  //get/set方法..

}

页面定义如下:


<tr>

<td>学生信息:</td>

<td>

姓名:<inputtype="text"name="itemInfo['name']"/>

年龄:<inputtype="text"name="itemInfo['price']"/>

.. .. ..

</td>

</tr>

Contrller方法定义如下:

public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{

System.out.println(queryVo.getStudentinfo());

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值