3. xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
4. xsi:
schemaLocation="
5.
6.
7. spring
8. org.springframework.web.servlet.DispatcherServlet
9. 1
10.
11.
12. spring
13. *.do
14.
15.
16.
17.
--所有请求都要由DispatcherServlet来处理,因此映射到"/"上面(包括静态页面),不加经测试也未见出错,而且如果要修改spring-servlet.xml的配置位置或名字,
18. 可以加contextConfigLocation/WEB-INF/spring-servlet.xml
19. 但一定要放到前面,否则xml校验出错(经测试)。
20.
21. 简要说明:
DispatcherServlet就是一个Servlet,也是对请求进行转发的核心Servlet。
在这里即所
22.有.do的请求将首先被DispatcherServlet处理,而DispatcherServlet它要作的工作就是对请求进行分
23.发(也即是说把请求转发给具体的Controller)。
可以简单地认为,它就是一个总控处理器,但事实上
24.它除了具备总控处理理器对请求进行分发的能力外,还与spring的IOC容器完全集成在一起,从而可以
25.更好地使用spring的其它功能。
在这里还需留意spring,下面
26.步骤三会用到。
27. -->
复制代码
步骤三、建立spring-servlet.xml文件,它的命名规则:
servlet-name-servlet.xml。
它的主要代码如下:
1.
xmlversion="1.0"encoding="UTF-8"?
>
2.
3.//www.springframework.org/schema/beans"
4. xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"xmlns:
p="http:
//www.springframework.org/schema/p"
5. xmlns:
mvc="http:
//www.springframework.org/schema/mvc"xmlns:
context="http:
//www.springframework.org/schema/context"
6. xmlns:
util="http:
//www.springframework.org/schema/util"
7. xsi:
schemaLocation="http:
//www.springframework.org/schema/beanshttp:
//www.springframework.org/schema/beans/spring-beans-3.0.xsd
8. http:
//www.springframework.org/schema/contexthttp:
//www.springframework.org/schema/context/spring-context-3.0.xsd
9. http:
//www.springframework.org/schema/mvchttp:
//www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
10. http:
//www.springframework.org/schema/utilhttp:
//www.springframework.org/schema/util/spring-util-3.0.xsd">
11.
12. 13. class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
14.
15.
16. helloControl--说明:
hello.do的请求将给名为helloControl的bean进行处理。
-->
17.
18.
19.
20.
21.
22.
复制代码
步骤四、完成HelloWord.java的编写,代码如下:
1.packagecontroller;
2.
3.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.importorg.springframework.web.servlet.ModelAndView;
7.importorg.springframework.web.servlet.mvc.Controller;
8.
9.publicclassHelloWordimplementsController{
10. publicModelAndViewhandleRequest(HttpServletRequestrequest,HttpServletResponseresponse)
11. throwsException{
12. ModelAndViewmav=newModelAndView("hello.jsp");
13. mav.addObject("message","HelloWorld!
");
14. returnmav;
15. }
16. }
17./*
18.*说明:
ModelAndView对象是包含视图和业务数据的混合对象,即是说通过此对象,我们可以知道所
19.返回的相应页面(比如这里返回hello.jsp页面),也可以在相应的页面中获取此对象所包含的业务数据
20.(比如这里message-helloworrld)。
*/
21.
复制代码
步骤五、在当前项目web根目录下编写hello.jsp,主要代码如下:
1.<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
2.<%
3.Stringpath=request.getContextPath();
4.StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
5.%>
6.
7.
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
8.
9.
10. ">
11.
12.
MyJSP'hello.jsp'startingpage
13.
14.
15.
16.
17.
18.
19.
--
20.
21. -->
22.
23.
24.
25.
26. 获取值:
${message}
27.
28.
29.
复制代码
步骤六:
输入.../hello.do进行测试。
如http:
//localhost/springmvc/hello.do
运行的结果是:
获取值:
HelloWorld!
4.简析springmvc工作原理
(1)启动服务器,根据web.xml的配置加载前端控制器(也称总控制器)DispatcherServlet。
在加载
时、会完成一系列的初始化动作。
(2)根据servlet的映射请求(上面的helloWorld实例中针对.do请求),并参照“控制器配置文
件”(即spring-servlet.xml这样的配置)文件,把具体的请求分发给特定的后端控制器进行处理(比
如上例会分发给HelloWorld控制器进行处理)
(3)后端控制器调用相应的逻辑层代码,完成处理并返回视图对象(ModelAndView)给前端处理器。
(4)前端控制器根据后端控制器返回的ModelAndView对象,并结合一些配置(后面有说明),返回一
个相应的页面给客户端。
小结:
这种FrontController模式常应用在主流的web框架中,比如典型的struts1.x框架.Front
Controller模式:
所有请求先交给一个前端处理器(总控处理器)处理,然后前端处理器会参照一些配
置文件再把具体的请求交给相应的后端处理器。
后端处理器调用逻辑层代码,并根据逻辑返回相应的视
图对象给前端控制器。
然后前端控制器再根据视图对象返回具体的页面给客户端(提示:
和springmvc
一样,在struts1.x中前端控制器是Servlet,而在struts2中前端控制器是Filter)。
概述Front
Controller模式:
前端控制器预处理并分发请求给后端控制器,后端控制器进行真正的逻辑处理并返回
视图对象,前端控器器根据视图对象返回具体页面给客户端。
5.初识springmvc的视图
在前面的HelloWorld实例中,在HelloWorld.java中返回ModelAndViewmav=newModelAndView(
"hello.jsp")参数为hello.jsp,它会对应于当前项目根目录下的hello.jsp页面。
但springmvc为我们提供了
一个特别的视图定位方式,下面改进前面的HelloWord实例:
改进一:
在spring-servlet.xml中增加如下代码:
1.
2.
3.
4.
复制代码
改进二:
在HelloWorld.java重新定义返回的ModelAndView对象,即把ModelAndViewmav=new
ModelAndView("hello.jsp")改为ModelAndViewmav=newModelAndView("hello")
改进三:
在/WEB-INF/page目录下建立hello.jsp页面
进行上面三个改进操作后,重新访问hello.do会访问到WEB-INF/page/hello.jsp页面。
简析视图定位:
当返回ModelAndView对象名称为hello时,会给hello加上前后缀变成
/WEB-INF/page/hello.jsp。
因此在给前后缀赋值时,应特别注意它和返回的ModelAndView对象能否
组成一个正确的文件全路径。
在前面的“简析springmvc工作原理(4)”点中提到在根
据ModelAndView对象返回页面时,会结合一些配置。
这里就是结合了视图定位方式,给viewName
加上前后缀进行定位
springmvc学习教程
(二)-后端控制器(上)
1.概述SpringMVC后端控制器
为了方便开发人员快捷地建立适合特定应用的后端控制器,springMVC实现Controller接口,自定义了许多特定控制器。
这些控制器的层次关系如下:
-AbstractController
-AbstractUrlViewController
-UrlFilenameViewController
-BaseCommandController
-AbstractCommandController
-AbstractFormController
-AbstractWizardFormController
-SimpleFormController
-CancellableFormController
-MultiActionController
-ParameterizableViewController
-ServletForwardingController
-ServletWrappingController
下面重点分析两个特色控制器:
2.SimpleFormController控制器
在正式开发前,请先熟悉上前面的HelloWord实例。
在保证熟悉前一个实例后,我们建立名为springMVC_02_controllerweb项目,并导入相关的jar包。
步骤一:
建立后端控制器RegControl.java代码如下:
1.packagecontroller;
2.
3.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.importorg.springframework.validation.BindException;
7.importorg.springframework.web.servlet.ModelAndView;
8.importorg.springframework.web.servlet.mvc.SimpleFormController;
9.
10.publicclassRegControlextendsSimpleFormController{
11. @SuppressWarnings("deprecation")
12. publicRegControl(){
13. setCommandClass(User.class);
14. }
15.
16. protectedModelAndViewprocessFormSubmission(HttpServletRequestarg0,HttpServletResponsearg1,
17. Objectformbean,BindExceptionarg3)throwsException{
18. Useruser=(User)formbean;
19. ModelAndViewmav=newModelAndView("hello");
20. mav.addObject("message","HelloWorld!
");
21. mav.addObject("user",user);
22. returnmav;
23. }
24.
25. protectedModelAndViewshowForm(HttpServletRequestarg0,HttpServletResponsearg1,BindExceptionarg2)
26. throwsException{
27. returnnull;
28. }
29.}
复制代码
User.java,代码如下:
1.packagecontroller;
2.
3.publicclassUser{
4. privateStringusername;
5. privateintage;
6. publicStringgetUsername(){
7. returnusername;
8. }
9. publicvoidsetUsername(Stringusername){
10. this.username=username;
11. }
12. publicintgetAge(){
13. returnage;
14. }
15. publicvoidsetAge(intage){
16. this.age=age;
17. }
18.
19.}
复制代码
简要说明:
如果熟悉struts1.x相信很容易理解Objectformbean参