1:复杂对象的形参绑定的定义:
2: 数组的形参绑定方式的定义:
3: List的形参绑定方式:
页面
包装类对list进行封装
Handler中的包装类的装载。
4: Map的参数包装
同样也是通过包装类型来封装
Springmvc的校验框架:
Springmvc使用的是hibernate校验框架,添加hibernate校验框架的jar包,但是跟hibernate没有任何关系的。
配置校验器:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!--不设置则默认为classpath下的 ValidationMessages.properties -->
<property name="validationMessageSource" ref="validatemessageSource"/>
</bean>
<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:validatemessages"/>
<property name="fileEncodings" value="utf-8"/>
<property name="cacheSeconds" value="120"/>
</bean>
把校验器注册到适配器中:
<mvc:annotation-drivenvalidator="validator"> </mvc:annotation-driven>
在pojo中添加校验规则:
在controller中添加校验:
添加错误的提示信息:
@RequestMapping("/add.action")
public String toIndex( HttpServletRequest request ,@Validated(value={ValidateGroup1.class}) String name, BindingResult bindingResult, Model model){
if(bindingResult.hasErrors()){
List<ObjectError>errors=bindingResult.getAllErrors();
model.addAttribute("error", errors);
}
页面显示校验错误信息
分组校验:
在pojo中定义校验的规则,而pojo是被多个controller所共用的,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验规则的时候。
解决方法:
定义多个校验分组(其实是一个java接口),分组中定义有哪些规则,每个controller方法使用不同的校验分组。
在校验规则中定义分组:
// 图书名称
@Size(min=1,max=30,message="{items.length.error}",groups={ValidateGroup1.class} )
private String name;
在controller中使用指定分组的校验:
@RequestMapping("/add.action")
Public String toIndex(HttpServletRequestrequest ,@Validated(value={ValidateGroup1.class}) String name,BindingResult bindingResult, Model model){
数据的回显:
提交后,如果出现错误,将刚才提交的数据会显到刚才的提交页面。
对象回显方法:
1. springmvc默认对对象数据进行回显。
对象数据传入controller方法后,Springmvc自动将对象数据放到request域,key等于对象类型
2.使用@ModelAttrubute指定对象回显到页面在request中的key。还可以将方法的返回值传到页面。
Itemtypes表示最终要将方法的返回值,放到request返回值的key中。这样的话在页面中就得到了itemtypes中的数据回显。
3.使用最简单的方法
异常处理
系统中异常包括两类:预期异常和运行时异常,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发,测试通过手段减少运行时异常的发生
在Springmvc中系统的dao,service,controller出现都是通过throwsException向上抛出,最后由springmvc前端控制器,交由异常处理器进行异常处理的
Springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一得异常处理。
自定义异常类
public class MyException extends Exception {
private String Message;
public MyException(String message) {
super(message);
this.Message = message;
}
public String getMessage() {
return Message;
}
public void setMessage(String message) {
Message = message;
}
}
全局异常处理器
思路:
系统遇到异常,从程序中手动抛出,dao抛给service,service给controller,controller抛给前端控制器,前端控制器调用全局异常处理器
全局异常处理器:
解析异常类型
如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示
如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型
/**
* 自定义的异常处理器(自定义的异常解析器)
*
* @author Administrator
*/
public classMyExceptionResover implements HandlerExceptionResolver {
@Override
public ModelAndViewresolveException(HttpServletRequest request,
HttpServletResponseresponse, Object arg2, Exception exception) {
/*
*
*1 解析异常类型 2 如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示 3
* 如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型
*/
MyExceptionmyException = null;
Stringmessage= "";
if (exception instanceof MyException) {
myException = (MyException) exception;
}else{
myException = new MyException("unkonw exception");
}
ModelAndViewmodelAndView = new ModelAndView();
modelAndView.addObject("exceptionMessage",myException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
配置全局异常处理器
<!-- 配置全局异常处理器 -->
<bean class="com.cn.hnust.exception.MyExceptionResover"></bean>
上传图片:
Springmvc对多部件类型的解析:
在页面form中提交entype=”multipart/form-data”的数据时,需要springmvc对multipart类型的数据进行解析,在springmvc.xml中配置mutipart类型解析器。
<beanid="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize"><value>100000</value></property>
<property name="defaultEncoding"><value>UTF-8</value></property>
</bean>
创建图片的虚拟目录来存储图片
配置tomcat下面conf目录下的server.xml文件的虚拟文件目录用来上传图片
注意:在图片虚拟目录中,一定将图片目录分级创建(提高i/o 性能)
编写上传图片的代码
@RequestMapping("/add.action")
public String toIndex( HttpServletRequest request ,@Validated(value={ValidateGroup1.class}) String name, BindingResult bindingResult, Model model,MultipartFile file){
页面图片文件名要与multipart的文件名一致。
Json数据交互:
Json数据格式在接口调用中,html页面中较常用用。Json格式比较简单,解析还是比较方便。
1.请求json.输出json.要求请求的是json串,所以在前端页面中需要将请求的内容转换成json,不太方便。
2.请求的是key/value,输出的是json。
环境装备(导入json数据支持的包)
Springmvc中使用jackson的包进行json转换(@requestBody和@responseBody)使用下边的包进行json转换。
配置json转换器:
1.使用适配器配置方式
2.使用适配器注解方式
<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>
如果使用了注解的配置方式的话就不用再配置了。
编码
1输入json,输出 json:
2:输入key/value,输出json:
Restful:
它是一个开发理念,对http进行了很好的解释。
定义restful风格的url
Restful前端控制器的配置:
利用restful请求静态资源
拦截器
定义拦截器,HandlerInterceptor实现HandlerInterceptor方法,
public classHandlerInterceptor implements org.springframework.web.servlet.HandlerInterceptor{
@Override
//handler执行完执行此方法
//可以用来统一异常处理,统一日志处理
public voidafterCompletion(HttpServletRequest arg0,
HttpServletResponsearg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
//进入handler之后,返回ModelAndView之前,将公用的模型数据传到视图
public voidpostHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Objectarg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
}
@Override
//进入handler方法之前,用于身份验证与授权
public booleanpreHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Objectarg2) throws Exception {
// TODO Auto-generated method stub
return false;
}
}
如上所以定义拦截器。
配置拦截器:
Springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的handler最终使用该拦截器。
类似全局的拦截器配置
Springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。
<mvc:interceptors>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<bean class="com.host.app.web.interceptor.AllInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/test/number.do"/>
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="com.host.app.web.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
拦截器位置放置:
统一日志处理拦截器,需要该拦截器prehandle一定要放行,且将它放在拦截器连接中第一个位置,而登陆校验拦截器与权限校验拦截器依次进行放置。
实现登陆认证的拦截器:
1写handler
/**
* 测试登陆拦截器
* @param session
* @param username
* @param pass
* @return
*/
@RequestMapping("/login")
public Stringlogin(HttpSession session,Stringusername,String pass){
session.setAttribute("username",username);
return "redirect:success";
}
@RequestMapping("/logout")
public Stringlogout(HttpSession session,Stringusername,String pass){
//清除session
session.invalidate();
return "redirect:login";
}
2写拦截器
public class LoginInterceptor implements HandlerInterceptor{
@Override
//handler执行完执行此方法
//可以用来统一异常处理,统一日志处理
public voidafterCompletion(HttpServletRequest arg0,
HttpServletResponsearg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
//进入handler之后,返回ModelAndView之前,将公用的模型数据传到视图
public voidpostHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Objectarg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
}
@Override
//进入handler方法之前,用于身份验证与授权
public booleanpreHandle(HttpServletRequest request, HttpServletResponse response,
Objectarg2) throws Exception {
Stringurl=request.getRequestURI();
/**
* 首次登陆放行
*/
if(url.indexOf("login.action")!=-1){
return true;
}
Stringusername=request.getParameter("username");
if(request.getSession().getAttribute(username)!=null){
return true;
} request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
}
3配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<bean />
<mvc:interceptor>
<mvc:mapping path="/**" />
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="com.cn.hnust.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>