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

来源:互联网 发布:傲剑境界数据 编辑:程序博客网 时间:2024/06/06 05:21
(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; @Controllerpublic 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; @Controllerpublic 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
原创粉丝点击