资深软件开发工程师,业余马拉松选手。
通过结合Servlet和JSP的MVC模式,我们可以发挥二者各自的优点:
- Servlet实现业务逻辑;
- JSP实现展示逻辑。
但是,直接把MVC搭在Servlet和JSP之上还是不太好,原因如下:
- Servlet提供的接口仍然偏底层,需要实现Servlet调用相关接口;
- JSP对页面开发不友好,更好的替代品是模板引擎;
- 业务逻辑最好由纯粹的Java类实现,而不是强迫继承自Servlet。
能不能通过普通的Java类实现MVC的Controller?类似下面的代码:
上面的这个Java类每个方法都对应一个GET或POST请求,方法返回值是,它包含一个View的路径以及一个Model,这样,再由MVC框架处理后返回给浏览器。
如果是GET请求,我们希望MVC框架能直接把URL参数按方法参数对应起来然后传入:
如果是POST请求,我们希望MVC框架能直接把Post参数变成一个JavaBean后通过方法参数传入:
为了增加灵活性,如果Controller的方法在处理请求时需要访问、、这些实例时,只要方法参数有定义,就可以自动传入:
以上就是我们在设计MVC框架时,上层代码所需要的一切信息。
如何设计一个MVC框架?在上文中,我们已经定义了上层代码编写Controller的一切接口信息,并且并不要求实现特定接口,只需返回对象,该对象包含一个和一个。实际上就是模板的路径,而可以用一个表示,因此,定义非常简单:
比较复杂的是我们需要在MVC框架中创建一个接收所有请求的,通常我们把它命名为,它总是映射到,然后,根据不同的Controller的方法定义的或的Path决定调用哪个方法,最后,获得方法返回的后,渲染模板,写入,即完成了整个MVC的处理。
这个MVC的架构如下:
其中,以及如何渲染均由MVC框架实现,在MVC框架之上只需要编写每一个Controller。
我们来看看如何编写最复杂的。首先,我们需要存储请求路径到某个具体方法的映射:
处理一个GET请求是通过对象完成的,它需要如下信息:
有了以上信息,就可以定义来处理真正的请求:
上述代码比较繁琐,但逻辑非常简单,即通过构造某个方法需要的所有参数列表,使用反射调用该方法后返回结果。
类似的,需要如下信息:
和GET请求不同,POST请求严格地来说不能有URL参数,所有数据都应当从Post Body中读取。这里我们为了简化处理,只支持JSON格式的POST请求,这样,把Post数据转化为JavaBean就非常容易。
最后,我们来实现整个的处理流程,以为例:
这里有几个小改进:
- 允许Controller方法返回,表示内部已自行处理完毕;
- 允许Controller方法返回以开头的view名称,表示一个重定向。
这样使得上层代码编写更灵活。例如,一个显示用户资料的请求可以这样写:
最后一步是在的方法中初始化所有Get和Post的映射,以及用于渲染的模板引擎:
如何扫描所有Controller以获取所有标记有和的方法?当然是使用反射了。虽然代码比较繁琐,但我们相信各位童鞋可以轻松实现。
这样,整个MVC框架就搭建完毕。
有的童鞋对如何使用模板引擎进行渲染有疑问,即如何实现上述的?其实非常简单,只需要实现一个简单的方法:
Java有很多开源的模板引擎,常用的有:
- Thymeleaf
- FreeMarker
- Velocity
他们的用法都大同小异。这里我们推荐一个使用Jinja语法的模板引擎Pebble,它的特点是语法简单,支持模板继承,编写出来的模板类似:
即变量用表示,控制语句用表示。
使用Pebble渲染只需要如下几行代码:
最后我们来看看整个工程的结构:
其中,包是MVC的框架,完全可以单独编译后作为一个Maven依赖引入,包才是我们需要编写的业务逻辑。
我们还硬性规定模板必须放在目录下,静态文件必须放在目录下,因此,为了便于开发,我们还顺带实现一个来处理静态文件:
运行代码,在浏览器中输入URL可以看到如下页面:
为了把方法参数的名称编译到class文件中,以便处理时使用,我们需要打开编译器的一个参数,在Eclipse中勾选---;在Idea中选择----,填入;在Maven的添加一段配置如下:
有些用过Spring MVC的童鞋会发现,本节实现的这个MVC框架,上层代码使用的公共类如、和都和Spring MVC非常类似。实际上,我们这个MVC框架主要参考就是Spring MVC,通过实现一个“简化版”MVC,可以掌握Java Web MVC开发的核心思想与原理,对将来直接使用Spring MVC是非常有帮助的。
实现一个MVC框架。
下载练习
一个MVC框架是基于Servlet基础抽象出更高级的接口,使得上层基于MVC框架的开发可以不涉及Servlet相关的等接口,处理多个请求更加灵活,并且可以使用任意模板引擎,不必使用JSP。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/14583.html