Make A Big Image
要学习使用spring mvc有几个简单的要领,spring mvc的架构很简单地想是透过一个共通的入口DispatcherServlet来接受所有的request,接着依request要求的页面透过handler转送给Controller处理;待Controller处理完毕后,再将结果丢让View呈页出来。大致上的示意图如下(ps. 俺不会uml只是常看大家这样用, 有错的话和我说一声啊。):
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><img style="WIDTH: 583px; HEIGHT: 390px" height="400" alt="" width="732" src="http://p.blog.csdn.net/images/p_blog_csdn_net/xtpdcsse/001.JPG"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 468pt; HEIGHT: 247.5pt" type="#_x0000_t75" alt=""><imagedata src="file:///C:/DOCUME~1/xt/LOCALS~1/Temp/msohtml1/01/clip_image001.png" o:href="http://static.flickr.com/52/138199405_8b54d56b71_o.png"></imagedata></shape>
身为library user的我们,只需要在每一个流程中贡献一点心力。就能让spring mvc跑了起来
DispatcherServlet
DispathcerServlet的角色就好像是一个任意门,他位于spring mvc的"入口"想到那跟他说就对了。但是要使用任意门,您必需先安上他。要怎么按上呢? DispatcherServlet本身其实是一个Servlet,所以我们要做的事就是在web.xml中布署他。就如同一般Servlet布署的方式一样,描述servlet的名字和类别,再给他一个mapping描述适用的网页。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN''http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
</web-app>
|
在这个例子里,我们给DispatcherServlet的小名为dispatcher,并且让container知道所有.htm结尾的request都丢给dispatcher。
handler
安上了我们的"任意门"之后,还有一件重要的事情:那就是要设定一下任意门可以移动的范围。默契(预设)上,DispatcherServlet的handler会设定在dispatcher-servlet.xml文件中(您猜到规规则了吗没错就是DispatcherServlet的小名再加上-servlet.xml)。所以,我们为了要让任意门知道我们欲往何方需要再努力一点点。在spring mvc中,常用的handler为org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,他的功能很简单地维护一个map。Key是request的网页,Value则是处理这个网页的controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<!--
- Application context definition for"dispatcher" DispatcherServlet.
-->
<beans>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/helloSpringMVC.htm"></prop>
</props>
</property>
</bean>
</beans>
|
惯例上,我们把handler的bean称为"urlMapping"。而SimpleUrlHandlerMapping提供2个setter,一个是指定单一map的;一个是指定很多map rule的。现在我们使用的是后者(这些xml的设定,请参考IoC基础文件)。到目前为止,我们只填上了request page
Controller
填完了request page却没有填Controller,这样任意门的设定只做了一半耶。当你在门前大喊我要去"/helloSpringMVC.htm",门大概会回你说: "Controller都不Controller了,要怎么任意们呢>"<"。为了让咱们的任意门能继续摇摆,我们是该写给Controller给他了。这里就有二件事要做了,一件是填好handler内的mapping rule,一件是生出一个Controller给他,总不能填了却又晃点它是呗:p
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<!--
- Application context definition for"dispatcher" DispatcherServlet.
-->
<beans>
<bean id="helloController" class="HelloController"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.htm">helloController</prop>
</props>
</property>
</bean>
</beans>
|
1 2 3 4 5 6 7 8 9 10 11 12
|
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
publicclass HelloController implements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
returnnew ModelAndView("");
}
}
|
这次,我们先示范实作Controller的方式吧他只要求我们实任handleRequest方法。这个方法会回传ModelAndView类别,ModelAndView类别,就是用在下一个阶段用来产生View用的。
View
经过一番实作,终于把我们的Controller给"完成了!!!"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
publicclass HelloController implements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
/*
*相信我, 这一段是放非常简单或非常之复杂的商业逻辑
*经过了非常简单或非常复杂的"运算"之后,
*千辛万苦, 我们终于修作正果. (泣)
* */
returnnew ModelAndView("/WEB-INF/jsp/hello.jsp");
}
}
|
好的! 本小节的重点在,ModelAndView。您可以先看看我们的Controller中,最后return了"/WEB-INF/jsp/hello.jsp"。我们把view放在/WEB-INF/jsp/目录中,这样做是有理由的。因为使用者不应该在view还没完成时有机会取得view的"样版",所以放在该目录是一种合理的作法(这次是玩真的啦! 你一定要放一个真实的档案在/WEB-INF/jsp/中,可不像handler mapping看到影子就开枪了,即使没有helloSpringMVC.htm也能跑。)
所以,小弟我提供一个老梗的hello.jsp范本:p
1 2 3 4 5
|
<html>
<body>
<h1>Hello! View</h1>
</body>
</html>
|
虽然,这样下去是能让我们的view出来见见人,我们的任意门确实能由"/helloSpringMVC.htm"跑到"/WEB-INF/jsp/hello.jsp"。但是好像麻烦了点,那天高兴起来想把hello.jsp换一下位子,那不就要去改Controller了! 真是囧rz。不过,好在SpringMVC牌的任意门还有密技可以call一下,那就是ViewResolver (谜之声,这一定是谜武将,在循序图中没出现啊!!!)。
我们简单示范一下ViewResolver的用法 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<!--
- Application context definition for"dispatcher" DispatcherServlet.
-->
<beans>
<bean id="helloController" class="HelloController"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.htm">helloController</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/WEB-INF/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
</beans>
|
作法很简单,把org.springframework.web.servlet.view.UrlBasedViewResolver bean调出来! 注入!!!。这里要注入的主要有3个参数,为了解决刚刚那个名字太长的问题,我们可以设定prefix和suffix,自动解析veiwer,把他包装为prefix为/WEB-INF/jsp/,与扩展名为.jsp的档案。另外,还要选用一个view class,给我们的View。这里用的是JstlView,因为俺还蛮常用Jstl的所以,嘿嘿嘿。
1 2 3 4 5 6 7 8 9 10 11 12
|
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
publicclass HelloController implements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
returnnew ModelAndView("hello");
}
}
|
[finished]
我们的任意门实作终于完成了。这也就是spring mvc的基本用法。当然,弟抽离了许多可以深入的点,因为我觉得入门的重点在掌握使用上的流程,先对大致上的流程有了印象,再来细部的调整自己真的需要深入学习的东西才不会让学习没方向的感觉。希望这篇文章能帮助您入门Spring MVC。
分享到:
相关推荐
spring mvc入门小例子spring mvc入门小例子spring mvc入门小例子spring mvc入门小例子spring mvc入门小例子
有没有一开始搞spring mvc时,被搞得心态崩溃,这个就发生在了我身上;难得最后走通了,就自我记录备案,权当我的学习笔记了。除了弄一个mvc xml配置,后面还会弄一个纯java配置的mvc。下面是操作指南: ...
spring mvc 实战指南和spring mvc入门:图解加源代码
spring mvc入门示例
首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController ...
Spring MVC 入门教程
Spring MVC入门教程
SPRING MVC入门实例,适合入门者
Spring MVC入门实例
spring mvc入门教程,pdf版,比较适合初学者入门使用,值得收藏!
NULL 博文链接:https://liuzidong.iteye.com/blog/897047
资料-10 Spring MVC入门程序.rar
Spring MVC入门
spring mvc 入门介绍
spring mvc 入门Demo 注释都很清楚,简单的入门
spring mvc 入门范例,包学包会!
spring mvc入门资源,webstore项目贯穿始终,mvc,视图解析器,拦截器restfull,文件上传等方方面面
跟开涛一起学习SprigMVC 第二章 Spring MVC入门