关于spring mvc 的初学HelloWorld中的成功运行后的梳理

(1)最重要的一个情况:
welcome-file 的设置:若DispatcherServlet的url-patter的mapping为*.html,则不可以将welcome-file设定为(file-name).html,后缀名不可以再是html了,因为在Spring MVC的配置就是要针对*.html为后缀的页面请求进行处理,说白了,其实就是访问页面的跳转有了一个中间的名称的转换,为了安全(在/WEB-INF/底下的文件平常用户访问不到)和前后端设计的分开。
记住一点:
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
这个配置里面的url-pattern其实就是访问的网页地址,你若在程序中做了一个跳转到*.html的链接
(如<a href="hello.html">This is my JSP page. </a>)
那么spring mvc中的DispatcherServlet就会捕捉它并对该访问地址进行处理,表面上看访问的是*.html,实际上访问的却是另外一个文件路径,类似web.xml中的path和docBase


(2)各控制器和页面的关联参数是什么:
如(1)中所示,表面访问*.html,实际的访问路径是隐藏的,中间的转换需要被处理,怎么才能知道被处理的是这个跳转呢?假设我们跳转到haha.html,那么我们在处理怎么转换路径的过程中通过haha这个前缀名来关联中间的各个处理流程。


(3)在知道了真实的文件访问路径后,处理的流程究竟是什么?

WEB-INF/jsp/hello.jsp
<html>
<head>
    <title>Spring 3.0 MVC Series: Hello World - ViralPatel.net</title>
</head>
<body>
    ${message}
</body>
</html>
这个是访问的真实路径和访问文件的代码。我们看到了${message}的代码,我们返回的是名为"message"的一个消息字符串ModelAndView对象。

那样我们整个过程中的真实流程是怎样的,首先,我先把各个文件的配置目录和文件的代码贴上: 

<span style="color:#ff0000;">1、
<!--文件位置
/WEB-INF/spring-servlet.xml
--></span>

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <context:component-scan base-package="net.viralpatel.spring3.controller" /> 
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

<span style="color:#ff0000;"><!--文件位置
2、/WEB-INF/web.xml
--></span>
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>SpringMVC</display-name>
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
</web-app>

<span style="color:#ff0000;"><!--
3、/WEB-INF/jsp/hello.jsp
--></span>
<html>
<head>
    <title>Spring 3.0 MVC Series: Hello World - ViralPatel.net</title>
</head>
<body>
    ${message}
</body>
</html>

<span style="color:#ff0000;">/*
4、src/package....
*/</span>
package net.viralpatel.spring3.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class HelloWorldController {  


    @RequestMapping("/hello")
    public ModelAndView helloWorld() { 
        String message = "Hello World, Spring 3.0!";
        return new ModelAndView("hello", "message", message);
    }
}

<span style="color:#ff0000;"><!--
5、/WEB-INF/index.htm
--></span>
<html>
  <head>
    <title>My starting page</title>
  </head>
  <body>
    <a href="hello.html">This is my JSP page. </a>
  </body>
</html>

spring jar包的导入这里就不说了,毕竟下载了jar包,手工复制到工程的/WEB-INF/lib文件夹下并在MyEclipse中配置好就可以了。

我们从使用者的观察路径来看整个过程:

首先我们会在tomcat的welcome-file的设定下进入index.htm页面,(记得该文章的第一个问题,因为会对后面是否能访问成功页面有影响)

------->

在index.htm的页面中我们可以看到一个<a>的链接,点击这个链接,是让我们进入hello.html的页面下,此时

------->

请看web.xml文件中的DispatcherServelet设置,这是对访问地址请求的一个分发处理的设定,只要tomcat容器在进行页面跳转请求时,会先看一下请求的链接地址是否包含.html,若包含,则进入spring mvc模式进行处理,传递一个参数<file-name>,记得,这个name里面是不含.html的,我们这个项目的传值是hello;若不包含,那就无所谓了,该干嘛干嘛去。

-------->

接下来我们就需要一个很high的决定了,那就是,怎么处理这个请求的链接呢?

先解释一下一个情况

这里有一点要注意<servlet-name>标签在web.xml中的servlet的名称。DispatcherServlet的初始化后,它会查找一个文件名[servlet-name]-servlet.xmlWeb应用程序的WEB - INF文件夹中。 在这个例子中,该框架将称为文件spring-servlet.xml寻找。

所以处理链接的流程就会再看spring-servlet.xml的配置了,来,诸位客官,我们看一下。

------->

系统在这一步先<context:component-scan....>根据这个扫描控制器(说白了就是一个class),在控制器中(HelloWorldController.java)我们看到了什么呢,首先我们看到了控制器@Controller的设定,表明这个是spring的控制器,然后我们看到了@RequestMapping(/hello)的设定,这个就是我们到底处理哪个页面请求的关联了,根据括号里面的内容,我们就知道应该处理哪个,像这个里面的hello,就是DispatcherServlet接收到请求后分发出来的参数,根据这个我们就知道要用这个控制器里的mapping的这个方法来处理并返回一个MAV(ModelAndView);

-------->

返回了一个MAV后呢?简单,你没有看到在spring-servlet.xml中的后面的配置吗?那个就是下面的工作了。那个设定就是要解析一下传回来的MAV,MAV中有三个参数,依次是(Viewname,要传递的属性名,要传递的属性值),在那个bean中org.springframework.web.servlet.view.UrlBasedViewResolver这个class是干什么的,它就是可以处理Viewname,根据<property>的设定,我们将Viewname加上前缀和后缀,在Controler里面我们返回的Viewname是hello,所以,把前缀后缀加上就是/WEB-INF/jsp/hello.jsp了。哈哈,这就是我们实际的访问路径了

------>

就这样,我们完成了从index.htm到/WEB-INF/jsp/hello.jsp的地址的转换。如果你没有忘记,我们的MAV中是有属性名和属性值的,呵呵了,在hello.jsp中的${message}就是可以提取这个属性值的表达式。

------->

如果你看完了这个,恭喜你,你的spring mvc的第一步已经成功迈出了,大步向前走吧。我来用成功后的图来表示一下祝贺。


看,显示的地址是hello.html,可实际访问的却是/WEB-INF/jsp/hello.jsp。注意,这两个hello的意思是不一样的,前一个hello是首页传的页面链接名称,后一个hello是根据控制器处理后,我们自己命名的一个Viewname,它是返回值的一个参数。

为了让自己好理解,我决定改一下后一个hello的名称,来,我们来看一下改动的文件和文件名。

/*
4、src/package....
*/
package net.viralpatel.spring3.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class HelloWorldController {  


    @RequestMapping("/hello")
    public ModelAndView helloWorld() { 
        String message = "Hello World, Spring 3.0!";
        return new ModelAndView("hellox", "message", message);
    }
}
<!--
2、hello.jsp改名为hellox.jsp
-->
<html>
<head>
    <title>Spring 3.0 MVC Series: Hello World - ViralPatel.net</title>
</head>
<body>
    ${message}
</body>
</html>


注意,此时的首页文件跳转还是hello.htm


这回好理解了吧。显示的地址是hello.html,可实际访问的却是/WEB-INF/jsp/hellox.jsp。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值