2017.2.25-2017.2.28
整合dao层
mybatis和Spring整合,通过Spring管理mapper接口
使用mapper的扫描器自动扫描mapper接口在Spring中进行注册
整合service层
通过Spring管理service接口
使用配置方式将service接口配置在Spring配置文件中
实现事务控制
整合springmvc
由于springmvc是Spring的模块,不需要整合
以下借助用户查询业务来进行springmvc-Spring-mybatis框架整合
创建工程引入相应jar包,创建db.properties、log4j.properties
用逆向工程创建User实体类、mapper.xml、mapper.java。为了方便扩展创建UserCustom类继承User,再创建UserQueryVo类设置User对象和UserCustom属性
在sqlMapConfig.xml中配置匿名(可选)
在Spring的dao层(applicationContext-dao.xml)配置文件中加载配置文件、配置数据源、创建sqlSessionFactory、定义mapper扫描器
创建service接口UserService和实现类UserServiceImpl,UserService的方法和UserMapperCustom类中的方法一样。在UserServiceImpl中设置UserMapperCustom对象属性并注入,实现父类的方法调用UserMapperCustom的方法实现功能
public class UserServiceImpl implements UserService{
@Autowired
private UserMapperCustom userMapperCustom;
@Override
public UserCustom findUserById(UserQueryVo userQueryVo) {
return userMapperCustom.findUserById(userQueryVo);
}
}
配置service层的Spring配置文件applicationContext-service.xml,创建service接口实现类。
配置事务管理,创建applicationContext-transaction.xml配置文件。
创建springmvc配置文件
在web.xml中配置springmvc的前端控制器
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
*.action
编写controller,就是Handler
public class UserController implements Controller{
@Autowired
private UserService userService;
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
UserQueryVo uq=new UserQueryVo();
uq.getUser().setId(1);
UserCustom userCustom=userService.findUserById(uq);
ModelAndView modelAndView=new ModelAndView();
//相当于setAttribute
modelAndView.addObject("users",userCustom);
//指定视图
modelAndView.setViewName("users/user/userList");
return modelAndView;
}
}
编写JSP页面
商品列表
${user.username}
加载Spring容器
contextConfigLocation
classpath:spring/applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener
到此ssm框架整合结束
根据id查询用户,根据id修改用户
service层,创建UserMapper对象属性
//根据id查询用户
@Override
public UserCustom findUserById(Integer id) {
User user=userMapper.selectByPrimaryKey(id);
UserCustom userCustom=new UserCustom();
//将user的属性拷贝到userCustom中
BeanUtils.copyProperties(user, userCustom);
return userCustom;
}
//根据id更新用户
@Override
public void updateUser(Integer id, UserCustom userCustom) {
userCustom.setId(id);
userMapper.updateByPrimaryKeySelective(userCustom);
}
对URL进行分类管理,可以在controller类中定义根路径,最终的访问路径为根路径+自路径
@RequestMapping("/user")
public class UserController{
对http请求的方法进行限定
@RequestMapping(value="/userDetail",method={RequestMethod.POST,RequestMethod.GET})
void,可设置形参request和response
request.getRequestDispatcher("页面路径").forward(request,response);
response.sendRedirect("url");
response指定响应结果。
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
将页面请求的key、value通过处理器适配器绑定到controller的形参中
参数绑定默认支持的类型:
Model/ModeMap
model是一个接口,modelMap是model的实现类。最终model将数据放到request域中
如果不是用@RequestParam,要求request传入参数名称和controller方法的性参名称一致,方可绑定成功。使用的话任意更改形参名称
public ModelAndView userDetail(@RequestParam(value="id",required=true,defaultValue="1") Integer id){
value:请求的参数值
required:value指定的值不能为空
defaultValue:指定形参默认值
定义自定义参数绑定的bean
在mvc:annotation-driven中声明conversion-service属性
定义转换类,实现Converter接口
public class UserDateConverter implements Converter {
@Override
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
// 转成直接返回
try {
return simpleDateFormat.parse(source);
} catch (java.text.ParseException e) {
e.printStackTrace();
}
return null;
}
}
springmvc基于方法开发,struts2基于类开发
springmvc将url和controller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括一个method方法。方法之行结束,形参数据销毁。
springmvc的controller开发类似于service开发
经过实际测试,struts2速度慢,在于实用struts标签,如果使用struts2建议使用jstl。
例如包装的pojo为UserQueryVo,页面的input标签的name要绑定到UserQueryVo的userCustom属性的username属性中,则input的name定义为userCustom.username,即
例如:实现查看复选框选中的情况。
页面中复选框的name为c_name,value为String型的,则controller方法的形参定义为“String []c_name”,即页面的name与形参的name相同。
例如:批量修改用户信息。用户信息显示(input标签)在页面,手动修改并提交。
一般在封装的pojo类(如:UserQueryVo)中设置Link
在springmvc中配置校验器,在根路径下创建UserValidationMessages.properties校验资源文件并添加错误提示的key-value
classpath:UserValidationMessages
将校验器注入到处理器适配器中
在实体类的属性上添加校验注解
//user.username.length.error在校验资源文件中定义(key-value形式定义),message可以直接写成字符串
@Size(min=1,max=3,message="{user.username.length.error}")
private String username;
在controller的方法形参之前添加注解(@Valid)之后添加错误结果(BindingResult),然后输出错误结果
public String userUpdate(@Valid UserCustom userCustom,BindingResult bindingResult,Integer id){
if(bindingResult.hasErrors()){
List errors=bindingResult.getAllErrors();
for(ObjectError error:errors){
System.out.println(error.getDefaultMessage());
}
}
测试,访问指定的handle
创建一个接口作为分组的类
public interface ValidateGroup1 {
//此接口中不必写任何方法,只用于分别校验属性
}
在pojo的校验注解中写上Groups属性,属性值为接口的class
//groups可以定义多个组
@Size(min=1,max=3,message="{user.username.length.error}",groups={ValidateGroup1.class})
private String username;
controller的方法@Validated中添加所属的组别
public String userUpdate(@Validated(value=ValidateGroup1.class) UserCustom userCustom,BindingResult bindingResult,Integer id)
当操作出错的时候,重新回到上个页面
pojo回显
pojo数据传入controller方法之后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写)
@ModelAttribute可以指定pojo回显到页面在request的key
public String userUpdate(@ModelAttribute("userCutom")){}
@ModelAttribute还可以将方法的返回值放到request中
@ModelAttribute("return")
public String test(){
return "aaa";
}
系统中异常包括两类:预期异常和运行时异常(RuntimeException),前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试手段来减少运行时异常的发生
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理
springmvc提供了一个全局异常处理器进行统一异常处理
创建一个pojo类继承Exception
public class CustomException extends Exception{
private String message;
public CustomException(String message){
super(message);
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
创建全局异常处理类,这个类实现了HandlerExceptionResolver接口,再实现其方法其实就是一个Handler
public class CustomExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
CustomException customException=null;
if(ex instanceof CustomException){
customException=(CustomException) ex;
}
else{
customException=new CustomException("未知异常!!!");
}
ModelAndView modelAndView=new ModelAndView();
String message=customException.getMessage();
modelAndView.addObject("message", message);
modelAndView.setViewName("error");
return modelAndView;
}
}
在springmvc中注册bean
在页面form中提交enctype=”multipart/form-data”的数据时,需要springmvc对multipart类型的数据进行解析
在springmvc的配置文件中配置解析器
RequestBody将json串转成java对象,ResponseBody将Java对象转换成json串
配置json转换器
如果使用了单独的处理器映射器,则需要在适配器中加入