欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

为什么MVC模型中的V层默认是JSP?

程序员文章站 2022-07-08 10:27:30
...

今天在熟悉一个新项目的时候,发现这个项目前台使用的是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