在学习完servlet之后,老师讲解了一个MVC模型,将我们练习的项目进行升级,之前我们的代码全是在jsp里面写的,也就是说网页里的有大量的java代码。在写页面的逻辑的时候很方便,在网页里直接写,写完下面就能用,但是里面的逻辑处理太多,这就是一个大问题,任何人都可更改源码使结果发生改变,这样设计出来的网页没有任何安全性而言。
升级后的项目采用的是最普通的MVC模型,即一个请求一个servlet,但是这样重复代码太多,开发效率大大降低,在这个基础之上,老师讲了一个MVC模型,将servlet当作控制器,根据请求传过来的参数来判断实行哪个方法,采用的方法是在servlet的init()方法中将各个请求和对应的java类放入map集合中,每过来一个请求,从map集合中获取对应的 java类,然后执行相应的execute方法,传递的参数都为httprequest和httpresponse,如下图所示:
这种模式有一个问题就是硬编码,每次增加一个方法就要对java文件进行重新编译,这种开发模式不建议使用,后期维护比较麻烦。
在这个模式的基础上,老师又讲解了另外一个更新的MVC模式,就是将请求的字段和对应的java类、方法名、返回值等等信息放在一个xml文件中,将这个xml文件的一级element作为一个java类,element的属性作为这个java类的field,同时这个java类需要一个map集合,添加二级element的信息。二级element则添加两个这个类对应方法的返回值、跳转页面以及是否是转发,根据返回值来判断跳转到哪个页面,二级element也需要抽象成一个java类(属性大于两个的时候,也可以不抽取),方便后期获取对应的信息。采用这个方法,要使用digester这个工具类,自动读取xml文件的内容,并且将element的属性添加到对应的类里,根目录需要一个map集合,可以根据不同的请求来获取不同的java类。当一个请求过来的时候,通过map集合的get()方法,得到对应的java类,然后根据这个类的属性(可以在xml文件中添加方法的名称等等属性)获取相应的方法名,根据反射的原理来调用这个类对应的方法。方法的返回值类型为字符串,这个方法的返回值就是二级element的一个属性,根据这个类的map集合的get()方法,获取二级element类,包含了目标页面,同时也包含了是转发还是重定向;在servlet控制器里根据二级类的属性来判断是转发还是重定向。这样一个servlet就解决了所有的访问的问题,而且以后如果需要更改目标页面,只需要在xml文件中更改配置信息就行,这个方法实现了软件的软编码,利于扩展和维护。
Xml文件如下:
Servlet的init()方法如下:
?
Servlet的service方法如下:
?
具体设计思路如下图所示: