当前位置:网站首页 > Java教程 > 正文

java web 高级教程



廖雪峰
资深软件开发工程师,业余马拉松选手。

通过结合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可以看到如下页面:

mvc

为了把方法参数的名称编译到class文件中,以便处理时使用,我们需要打开编译器的一个参数,在Eclipse中勾选---;在Idea中选择----,填入;在Maven的添加一段配置如下:

有些用过Spring MVC的童鞋会发现,本节实现的这个MVC框架,上层代码使用的公共类如、和都和Spring MVC非常类似。实际上,我们这个MVC框架主要参考就是Spring MVC,通过实现一个“简化版”MVC,可以掌握Java Web MVC开发的核心思想与原理,对将来直接使用Spring MVC是非常有帮助的。

实现一个MVC框架。

下载练习

一个MVC框架是基于Servlet基础抽象出更高级的接口,使得上层基于MVC框架的开发可以不涉及Servlet相关的等接口,处理多个请求更加灵活,并且可以使用任意模板引擎,不必使用JSP。

  • 上一篇: 菜鸟教程+java
  • 下一篇: java课程教程推荐
  • 版权声明


    相关文章:

  • 菜鸟教程+java2024-12-16 08:26:03
  • 手机java版联机教程2024-12-16 08:26:03
  • java图形化编程教程2024-12-16 08:26:03
  • java教程8062024-12-16 08:26:03
  • java支付接口的教程2024-12-16 08:26:03
  • java课程教程推荐2024-12-16 08:26:03
  • java面试理论教程2024-12-16 08:26:03
  • java项目搭建教程2024-12-16 08:26:03
  • java i/o 教程2024-12-16 08:26:03
  • java游戏教程书2024-12-16 08:26:03