一、拦截器
Spring MVC的拦截器(Interceptor) 类似于Java Servlet的过滤器(Filter)。前面学习Java Web学过一点过滤器。
拦截器的作用 是拦截用户的请求,并做相应的处理 。例如在JSP提交表单数据给Controller,先是提交给拦截器的类。比如权限验证,是否登录,然后再交给Controller处理。
作法:需要配置拦截器类。Interceptor类。
接着需要在Springmvc.xml文件里面 注册拦截器类。并配置拦截器作用的路径。
拦截器 的类用的不多,在springmvc里面,对登录权限进行判断,一般都是使用的数据验证类。
二、数据验证(需要记忆)
数据验证,在企业应用里面用的比较多,但一般都是结合 统一异常处理 的方式进行处理。现只讲一下数据验证的方式。
它的作用是,使得输入的数据符合 预期,否则 就提示输入数据的格式问题。
这里我们学习Spring框架自带的验证组件。Spring验证器:
Validator接口:(自带的)
存在两个方法(自带的):boolean supports(Class<?> klass)
void validate(Object object,Errors errors)
存入错误消息的方法是reject 或者rejectValue
应用实训:编写一个添加商品的表单。
要求:1.商品名和商品详情不能为空。
2.商品价格在0到100之间
3.创建日期不能在系统日期之后。
代码分析:
第一步:导入依赖 (和前面的依赖是一样的。Spring自带的验证器不需要额外导入包)
第二步:配置web.xml文件,和之前一样
第2.5步:配置Validator类(验证器类)和错误消息的属性文件(例如error.properties,这个文件需要在springmvc里面注册噢。)
这个类自定义,但继承Validator类。并且重写它的两个方法。最后根据POJO的属性,对每一个属性进行一次判定(数据验证。符合上述的要求即可)
第三步:配置POJO、Service层、Contoller层 。方法和之前的差不多。
注意不同的是Controller层可以使用第2.5层定义的Validator(验证器类)。
第四步:配置View页面。创建数据输入页面addGoods,jsp。 (使用和前面学过的 数据绑定 去绑定POJO类型。)
需要注意一下JSP 和Controller 是可以相互转换的,也就是说,JSP的创建可以放在创建Controller之前。
第五步:配置Spring.mvc。和前面一样。
不过,多了 配置消息属性文件(就是第2.5步创建的Validator类),以及注册格式转换器。
代码分析优化:
像上面那样分为步骤来编写,很容易 因为Validate类出现问题而导致整个 项目出现问题。建议,先按 数据绑定的方式对代码进行编写。如果数据绑定通过了,并且最后能查看商品的详细页面。再接着去 修改代码,添加数据验证的方式。
数据绑定的方式步骤 的一点感悟:(建议多加练习这个方式,获得最后的数据绑定总结)
一开始,盲写数据绑定。遇到的一个问题是,先编写JSP页面进行数据绑定到POJO类,还是先编写Controller类。
在编写代码步骤的 建议:
POJO类是首先编写的。
再编写Service类(业务逻辑层,它的方法一般是一个判断类型(判断是否添加成功),一个集合类型(伪装数据库集合,将POJO的数据集合在一起。))。这个Service层的编写 需要重点注意一下,它需要很强的抽象逻辑。分为一个接口和一个实现类。你要思考,在Controller需要得到什么数据,那么就把得到的数据,用抽象方法在Service层表示
再编写Controller类(要用到service的注入,以及service的方法。比如:判断条件,然后选择返回一个页面,在比如:使用model.Attribude,将service层得到的数据 封装在model类型里面。)。最后编写JSP页面。
再加一点感悟:
这是控制Controller类的,它使用goods表示是一个Goods的类型(POJO类),它实际是传给了JSP类里面。
小结:
所以获取Controller类里面的model.Addribute(" name",service层的方法 )
有两种方式:第一种,最常用的是EL表达式:${name}
第二种,就是在表单元素里面的modelAttribute="name" 。
总结:数据验证,需要额外创建 Spring的验证器类 以及对它的类进行配置注册。
三、统一异常处理(重点部分)
请结合数据验证 的方式,判断异常处理 的过程有何不同。
异常处理方式比数据验证方式用的多,而且异常处理方式有的时候也可以代替数据验证。所以统一异常处理这个知识点需要掌握。
主要介绍 自定义异常类。因为无论是dao、service、Controller层。都是可以throws Exception。所以,异常类的实现 单独用一个exception包来存放,对这些层里面抛出的异常,这里我们主要介绍两种方式来实习,这两种方式都用的比较多。
第一种:HandlerExceptionResolver接口实现。
这个是系统自带的类,我们定义好了异常类,需要继承implements它,它存在一个方法,然后你重写方法就行。
不过,这种系统自带的异常类。使用的时候,需要去springmvc.xml文件里面,注册配置。
一般都是一句:<bean class=" exception.自定义的类"/>
第二种:通过注解实现声明异常类。@ExceptionHandler (不过实践运用中,这个省略关系不大) (最常用这种方式)
这种异常类都是自定义,并且没有继承关系。
但是,需要在控制层里面,对需要进行异常处理的Controller类 进行继承自定义的这个类,例如:
@Controller
public class TestExceptionController extends BaseController { }
暂时没有例子。
四、SSM框架整合(本此JavaEE学习的最终目标,非常重要)
本次学习的最终目标,就是能够实现SSM框架的整合。
在前面第一部分的学习,我们提到了Spring和MyBatis的整合,第二部分学习SpingMVC的框架。现在结合这三个框架一起使用。SSM其实就是(Spring、Spring MVC、MyBatis)这三个大框架的整合。
以应用项目为实例,进行这部分的学习:
项目:根据用户名 模糊查询用户信息。
问题分析:
第一个问题:
Caused by: java.lang.UnsupportedClassVersionError: org/mybatis/spring/SqlSessionFactoryBean has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 (鏃犳硶杞藉叆鐨�.绫� [org.mybatis.spring.SqlSessionFactoryBean])
原因:org.mybatis.spring.SqlSessionFactoryBean
类是由一个比当前 Java 运行时更新的版本编译的(类文件版本为 61.0),而当前 Java 运行时只能识别最高到 52.0 版本的类文件。
纠错:在pom.xml文件里面,改变mybatis的版本。将mybatis的版本降低一些,或者mysql的版本提高一些。
第二个问题:
第三个问题:(多加练习。)
测试是否获取dao的数据。(没有进行测试,结果导致,是否获取到了数据都不知道。所以以后做SSM的框架,从数据库提取的数据都进行测试一下。)
测试作法:
在Controller编写TestController 类方法 和Test 类测试。
TestController 类方法:编写测试用到的数据。(调用的是Dao类的方法)
Test类:就是调用applicationContext.xml文件的类方法,进行调用上一个的test方法。
将第二个问题解决之后,发现,代码可以运行的通了,而且符合预期!!!诀绝子
请多加练习SSM框架,建议组合式练习,先练习spring+mybatis的框架整合,在添加spingmvc的框架。
一定要理解springmvc是怎么绑定POJO的,因为在mybatis的框架里面,我们发现,它连接数据库之后对数据获取进行测试,是对POJO类型 ,就是设置了setName="某个字符串",就是加了这样的设置,才能进行测试。
但在springmvc框架里面不需要进行这样的设定。(这个地方一定要多加练习,了解它们是怎么就绑定了POJO类的)
练习:使用工厂模式的思维进行练习
实现登录,注册,查询三个功能。