文章目录
#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监听
扫描过程总结:
- web项目启动后,加载web.xml;
- web.xml中加载Spring容器,加载springmvc前端控制器;
- 在Spring的不同容器中,实现dao层,service层和trans的不同配置文件的加载;比如dao曾的Spring容器,加载数据源、会话工厂和扫描mapper;
- 在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中将自定义转换器配置到注解驱动上;