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。