SpringMVC学习笔记——视频补充2

文章目录


#ssm架构整合
ssm整合:
1)Dao层

  • pojo和映射文件以及接口使用逆向工程生成
  • SqlMapConfig.xml:mybatis核心配置文件
  • ApplicationContext-dao.xml:整合后spring在dao层的配置
  • 数据源
  • 会话工厂
  • 扫描Mapper

2)service层

  • 事务:ApplicationContext-trans.xml
  • @Service注解扫描:ApplicationContext-service.xml

3)controller层

  • SpringMvc.xml

  • 注解扫描:扫描@Controller注解

  • 注解驱动:替我们显示的配置了最新版的处理器映射器和处理器适配器

  • 视图解析器:显式的配置是为了在controller中不用每个方法都写页面的全路径
    4)web.xml

  • springMvc前端控制器配置

  • spring监听

扫描过程总结:

  1. web项目启动后,加载web.xml;
  2. web.xml中加载Spring容器,加载springmvc前端控制器;
  3. 在Spring的不同容器中,实现dao层,service层和trans的不同配置文件的加载;比如dao曾的Spring容器,加载数据源、会话工厂和扫描mapper;
  4. 在dao层的Spring容器,又加载了mybatis的核心配置文件SqlMapConfig.xml;
    以上。

Note:
@Autowired与@Resource的区别:
@Autowired自动注入,如果一个接口有多个实现,由于不知道用哪个实现类,报错;

被水淹没不知所措。
#参数绑定
商品修改的实现:
处理流程是这样的:
url请求访问页面后,(因为之前已经扫描过了,通过处理器映射器匹配一下),controller中完成对该请求的处理方法。
controller完成以下三步:获得页面提供的参数;调用方法,获得数据;将数据封装,返回到某页面;
Controller类中会定义Service成员对象,通过调用Service中的方法,获得数据;
Service层,通常会定义接口和实现类;实现类中,定义Dao类对象作为成员对象;通过dao对象调用相应的方法,获得数据,最终返回给controller;
controller获取数据后,进行一定的处理和封装(封装到reponse中或model中,或ModelAndView中),返回到某页面。

##Springmvc默认支持的类型

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Model
	/**
	 * springMvc中默认支持的参数类型,在controller方法中,可以加入,也可以不加入;
	 * 按需求选择是否加入这些参数;
	 * HttpServletRequest
	 * HttpServletResponse
	 * HttpSession
	 * Model
	 */
	//该方法要接收一个商品的id,通过request接收
	//这几个参数需要servlet-api的jar包
	//
	@RequestMapping("/edit")
	public String itemEdit(HttpServletRequest request, Model model) throws Exception{
		String idStr=request.getParameter("id");//获得参数;
		//逻辑思路是这样的:controller负责流程:流程上就是,从页面获取什么;执行什么;最后返回;
		//这里执行什么,就要靠调用service中的相应的方法来执行,并获取数据;
		//service中,两个,一个接口,一个实现;在实现中,就要调用dao中的方法;
		//这里的dao的使用,是通过都动态mapper方式实现的;所以service实现中定义mapper对象,通过该对象调用方法;
		//这里要写的就是,通过id获得数据;
		Items item=itemsService.findItemsById(Integer.parseInt(idStr));
		//将数据返回给页面
		//Model模型:模型中放入了返回给页面的数据;
		//Model底层其实就是用的request域来传递数据,但是对request域进行了扩展;
		//用request:
		//request.setAttibute("item",item);
		//springmvc建议用model;
		model.addAttribute("item", item);
		
		//如果SpringMvc方法返回一个简单的string字符串,那么springmvc就会认为这个字符串是页面的名称;
		//又,这里的字符串,其实也依赖于在springmvc.xml配置文件中配置的视图解析器的相关内容;比如前后缀;
		return "editItem";
	}

##简单数据类型
业务:编辑数据后,点击提交按钮,实现数据更新。

	//开发中,方法返回String或者ModelAndView都可以;
	//springmvc可以接受简单类型的参数,即基本数据类型,包括string;
	//springmvc可以帮你自动进行类型转换;
	//Controller方法接受的参数的变量名称必须要等于页面上input框的name属性值;
	@RequestMapping("/updateitem")
	public String update(Integer id,String name, Float price, String detail,) throws Exception{
		//根据前端提交的数据,保存数据到数据库中;
		//接收前端的数据的几种方式:
		//request.getParameter,通过控件中的id获取数据;
		//springmvc提供的方式:直接接受简单类型;
		//从jsp中接受的参数都是string类型,Springmvc能自动转成参数列表指定的类型;
		//又:自动转是根据形式参数名称和页面中控件的name匹配中转换的;所以要注意名称相同;
		Items item=new Items();
		item.setId(id);
		item.setName(name);
		item.setPrice(price);
		item.setDetail(detail);
		item.setCreatetime(null);
		//将接收到的数据保存;
		itemsService.updateItems(item);
		return "success";
	}

Note:
两种请求方式:

  • get请求:默认请求方式;或url中有?的请求方式;
  • post请求:提交表单

解决get请求乱码的问题

  • 修改tomcat配置文件添加乱码与工程编码一致:
<Connector URIEncoding="utf-8"connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
  • 对参数进行重新编码:
String userName new 
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

这里提交后出现问题:中文乱码;
解决post请求乱码的问题:

  <!-- 配置Post请求乱码 -->
  <filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

##Pojo类型
springmvc也可以接收pojo类型的参数;
**要求:**页面上input框的name属性名称必须等于pojo的属性名称;

	//springmvc可以直接接收pojo类型;要求:页面上input框的name属性名称必须等于pojo的属性名称;
	@RequestMapping("/updateitem")
	public String update(Items item) throws Exception{	
		item.setCreatetime(null);
		//将接收到的数据保存;
		itemsService.updateItems(item);
		return "success";
	}

##Pojo包装类型
poho包装类型:比如说Vo类;(就是,em,不只一个类的成员属性,可能包括商品啊,用户啊等的共同信息的输入参数)
Note:
如果controller中接收的是Vo,那么页面上input框的name属性要等于vo的属性.属性.属性…
这里就是items99.name和items99.price;
举例:

<!-- jsp页面 -->
查询条件:
<table width="100%" border=1>
<tr>
<td>商品名称:<input name="items99.name" type="text"/></td>
<td>商品价格:<input name="items99.price" type="text"/></td>

<td><input type="submit" value="查询"/></td>
</tr>
</table>
//Vo类定义:
public class QueryVo {
	//商品对象;
	private Items items99;
	//...
}
//Items类定义:
public class Items {
    private Long id;
    private String name;
    private BigDecimal price;

##自定义参数绑定
问题:当实现修改业务时,如果提交修改的数据包括日期类型,则会产生错误:因为Date不属于基本数据类型或String;
解决:spring提供了类型转换的工具;
处理流程:
实现:页面传给Controller一个String类型的参数,;Controller一看,我其实需要一个Date类型的参数啊,然后就交给适配器去解决;适配器已经通过配置文件,得到了各种converter;就挨个看每个converter,找适合将String转为Date的converter;找到之后,就转转转;controller就能处理了。
感慨:(什么都没学会瞎感慨什么——还是要顽强的感慨一下)程序员真厉害啊;真的连万分之一都比不上。
定义CustomGlobalStrToDateConverter类,类实现:

/**
 * S - source:源,这里是String
 * T - target:目标,这里是Date
 * @author Administrator
 *
 */
public class CustomGlobalStrToDateConverter implements Converter<String, Date> {
	
	public Date convert(String source){
		try {
			Date date=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(source);
			return date;
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

在Springmvc.xml中配置:

    <!-- 注解驱动:
    		替我们显示的配置了最新版的注解的处理器映射器和处理器适配器 -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
  
	<!-- 配置自定义转换器 
	注意: 一定要将自定义的转换器配置到注解驱动上
	(注解驱动是干嘛的:自动配置处理器适配器和处理器映射器的)
	-->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<!-- 指定自定义转换器的全路径名称 -->
				<!-- 这里可以写多个转换器,在这里配置即可。 -->
				<bean class="cn.itheima.controller.converter.CustomGlobalStrToDateConverter"/>
			</set>
		</property>
	</bean>

#总结
被水淹没不知所措
参数绑定(从请求中接收参数) 重点

  • 默认类型:
  • 在controller方法中可以有也可以没有,看自己需求随意添加.
  • httpservletRqeust,httpServletResponse,httpSession,Model(ModelMap其实就是Mode的一个子类,一般用的不多)
  • 基本类型:string,double,float,integer,long.boolean
  • pojo类型:页面上input框的name属性值必须要等于pojo的属性名称
  • vo类型:页面上input框的name属性值必须要等于vo中的属性.属性.属性…
  • 自定义转换器converter:
  • 作用:由于springMvc无法将string自动转换成date所以需要自己手动编写类型转换器;
  • 需要编写一个类实现Converter接口;
  • 在springMvc.xml中配置自定义转换器;
  • 在springMvc.xml中将自定义转换器配置到注解驱动上;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值