为什么MVC模型中的V层默认是JSP?
今天在熟悉一个新项目的时候,发现这个项目前台使用的是FreeMarker模型引擎。后台使用的SpringBoot,项目中只是在pom文件中引入了FreeMarker的jar包和在application.properties文件中配置了一下FreeMarker而已,所以我就很纳闷儿,为什么只是引一个jar和配置一下,后台controller返回数据就会返回给FreeMarker呢?
然后我又想了想最开始学Java的时候做web项目,没有struts和springmvc这种框架,而使用servlet+jsp的时候是怎么做的,发现之前也是写一个servlet类处理请求,然后把要传递的数据封装到request或session作用域中通过forwd或重定向返回给jsp,然后在web.xml文件中为这个servlet定义一个路径,用于通过浏览器访问这个servlet,最后通过这个servlet把处理的数据通过jsp在前台浏览器上展示出来。
然后我又想最开始用servlet+jsp的时候我也没有特别指定要通过jsp展示数据,我只是在servlet的最后通过forwd或重定向跳转到一个jsp而已。那为什么它会自己默认的使用jsp呢。
带着这个问题去重新看了看当时学习是的笔记。首先我先看了servlet,开始学servle没有学jsp的时候,我们也可把请的数据在前台显示,方法是通过数据流把要展示的数据写到response中,然后就可以展示了。
这时候我有多了一个问题,那为什么只用servlet也可以展示数据,为什么还需要jsp,这个问题好解释,因为servlet展示的都是动态数据,所以需要自己在servlet中通过html标签把样式拼接起来。因为这样做法很麻烦所以出现了jsp,把html标签卸写在jsp中,然后通过jsp内置的标签把数据展示出来。
此时又多了一个问题jsp中为什么能做之前在servlet中拼接html标签和解析数据的事情,而且还变得简单了就像写html页面那样简单。
想到这里一个问题接一个问题,真担心自己会这样一直这样一个问题一个问题的产生却无法解决。
怀着沉重的心情继续往下看,在看jsp笔记时,突然看到了一句话,这一句话让我找到了关键所在,那就是jsp不是在浏览器客户端解析的,而是在服务器解析,服务器(也即是tomcat)会把jsp文件解析成servlet,保存下tomcat的某个路径下,意思就是当你访问一个jsp时其实是在访问一个servlet,那如果是访问servlet的话,需要你在web.xml文件配置访问路径,然而我并不记得我自己给jsp配置过这些路径。
所以此时有出现两个问题,jsp在什么时候解析成servlet的?并且这些servlet的路径又是什么?(其实这个问题很好解释,我们在自定义的servlet中要跳转到一个jsp,写的是这个jsp的路径,那么我想jsp解析成的servlet路径应该就是jsp的路径)。
那就剩下一个问题了,jsp在什么时候解析成servlet的?既然没有在我们自己项目web.xml里,那我们就看看tomcat的web.xml文件,于是在Tomcat的web.xml文件中发现了下面这个servlet映射
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
这个映射的含义就是任何以jsp或者jspx结尾的请求都会执行这个servlet,所以这个servlet就是把jsp解析成servlet的方法,其实这个方法的作用就是再把jsp转换成我们没有学jsp只用servlet展示数据的时候的样子,再把html标签拼接i起来封装到response中,然后在前台显示。
到此我们明白了为什么web不用任何配置就可以使用jsp,因为tomcat帮我们默认配置了。
所以我也理解了,今天熟悉的这个项目,为什么只是通过简单额配置就可以让前台框架变成FreeMarker,因为是在SpringBoot中配置了一个像tomcat提供的这个servlet一样的方法,并且你可以指定什么样的后缀可以调用这个servlet,从而使用FreeMarker
推荐阅读