springMVC入门

 

做为一个J2EE的开发者,咱们基本上是开发基于WEB的应用系统。事实上,工做流,状态管理以及验证都是须要解决的重要功能。而HTTP协议的无状态性决定了这些功能都不容易实现。Spring的WEB框架就是来帮助咱们解决这些问题的。使用Spring,咱们可让WEB框架自动将传递进来的请求参数填充到模型对象中,同时提供验证和错误处理。还能够管理用户在WEB表单中建立的对象的状态。在了解SpringMVC以前,咱们先来复习下MVC.html

MVC从逻辑上把应用分为模型组件,视图组件和控制器组件。其中控制器组件又能够细分为:前端控制器组件和后端控制器组件。前端

 

咱们来看一下MVC的基本工做流程:java

 

首先是客户端(一般是浏览器)发出一个请求。第一个接受这个请求的组件通常是一个前端控制器。它将不一样的请求交给不一样的后端控制器来处理,而在后端控制器里面又能够调用相应的模型对象来处理具体的业务逻辑,最后再返回一个特定的视图响应给客户端。web

 

怎么理解MVC呢?咱们举一个现实的例子,前段时间地震太可怕了,全国人民都在上下一心抗震救灾。咱们敬爱的温总理给武警司令下命令让他完成抗震救灾的艰巨任务,因而武警司令就根据各地状况派遣不一样类型的特种兵到不一样的地区去,而后特种兵使用大大小小的工具完成了任务,最后上交给司令一份统计图表,司令再上交给温总理。咱们就来分析一下,这符不符合MVC的设计模式。这里呢,温总理就是客户端,武警司令就是前端控制器,特种兵就是后端控制器,特种兵所使用的工具就是模型,最后上交的统计图表就是视图。spring

 

如今你们应该能够理解MVC的设计思想了。拿咱们比较熟悉的struts框架来讲,前端控制器就是ActionServlet,后端控制器就是Action.请求的URL和后端控制器的映射关系在struts-config.xml上的<action-mappings>里面配置,模型对象就是咱们日常写的DAO/DTO,返回的视图类型通常就是jsp了。后端

 

那么,在spring MVC中又是怎样的呢?,咱们先按上面对号入座地说一下。第一个接受这个请求的前端控制器叫DispatcherServlet,后端控制器叫Controller。负责处理请求URL和后端控制器映射的叫HandMapping,它有多种类型,比较灵活,也是在一个xml文件上进行配置。负责业务逻辑处理的模型对象通常也是咱们日常写的DAO/DTO组件。只是它最后的返回更灵活,Controller返回一个ModelAndView对象给DispatcherServlet,ModelAndView能够携带一个视图对象,也能够携带一个视图对象的逻辑名。若是携带的是一个视图对象的逻辑名,那DispatcherServlet须要一个ViewResolver来查找用于渲染回应的视图对象。最后,DispatcherServlet将请求分派给ModelAndView对象指定的视图对象。视图对象负责渲染返回给客户的回应。设计模式

 

       咱们学习知识,同样要注意运用类比迁移的方法。有人说,我学会了struts,但学不会springMVC。这是说不过去的。由于两者的思想彻底一致。因此,咱们只须要学习它们不同的地方就能够啦。好,咱们如今先跑一个最简单的例子,让你们对构建SpringMVC的基本步骤有个直观的认识。你们要边跑边跟struts作比较。浏览器

(1)创建动态web工程,导入spring的jar包。服务器

 

(2)配置DispatcherServletmvc

 

DispatcherServlet是SpringMVC的核心,将下面Servlet的注册信息登记在web.xml中。必定要记住:Servlet跟伴侣同样,要结婚,先得注册登记!

<servlet>

  <servlet-name>test</servlet-name>  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  <load-on-startup>1</load-on-startup>

 </servlet>

 

 <servlet-mapping>

  <servlet-name>test</servlet-name>

  <url-pattern>*.do</url-pattern>

 </servlet-mapping>

 

(3)编写Controller,作核心配置文件,并配置url和Controller的映射

 

package com.wepull.test;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.Controller;

 

public class HelloController implements Controller{

    public ModelAndView handleRequest(HttpServletRequest request,

              HttpServletResponse response) throws Exception {

             request.setAttribute("hello", "welcome to spring!");

             return new ModelAndView("welcome");

            }

}

咱们知道Struts有个XML格式的核心配置文件,springMVC固然也有,在WEB-INF下新建一XML文件:test-servlet.xml.注意,这里的test取决于servlet的名字.当DispatcherServlet载入后,它将试图从这个文件中载入应用上下文。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <!--缺省映射处理器,不须要明确声明,但声明后就很是清楚使用的是哪一个映射处理器  -->   <beanid="beanNameUrlMapping"

    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">

    </bean>

    <!-- 这里的name属性有两个职责,既定义Bean的名字,也定义须要这个控制器处理的URL样式 -->

    <bean name="/hello.do"

       class="com.wepull.test.HelloController">

    </bean>

</beans>

上面可能有人奇怪,为何不用id属性,而设置name属性。这里是由于URL中含有XML id属性非法字符——特别是斜杠(/);

 

(4)配置一个视图解析器将控制器与JSP结合起来。

 

将解析器的配置片断加到上面的test-servlet.xml中。

<bean id="viewResolver"

    class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <property name="prefix" value="/WEB-INF/jsp/" />

       <property name="suffix" value=".jsp" />

</bean>

InternalResourceViewResolver在ModelAndView返回的视图名前加上prefix属性配置的前缀,再在最后加上suffix属性配置的后缀。因为HelloController返回的ModelAndView中视图名为welcome,因此InternalResourceViewResolver将在/WEB-INF/jsp/welcome.jsp处查找视图。

 

(5)编写呈现给用户的jsp文件。

 

/WEB-INF/jsp/welcome.jsp

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ page isELIgnored="false" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

 <head>

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  <title>Hello World!</title>

 </head>

 <body>

  <h2>

   ${hello}

  </h2>

 </body>

</html>

 

完成后启动服务器,在浏览器地址栏上输入http://locahost:8080/projectName/hello.do       就能够访问了。

       对照一下,咱们发现SpringMVC跟Struts大同小异。只是有两处映射,SpringMVC作的相对灵活。哪两处呢?

(1) url和动做(后端控制器)的映射。

springMVC里有个映射处理器(HandlerMapping)的概念。它其实是一个处理器映射Bean,用来将一个控制器指定到一个URL上。Spring提供了三种有用的HandlerMapping的实现:

—— BeanNameUrlHandlerMapping

       根据控制器的名字将控制器映射到URL

—— SimpleUrlHandlerMapping

       用上下文配置文件中定义的属性集合将控制器映射到URL

—— CommonsPathMapHandlerMapping

       使用控制器代码中的元数据将控制器映射到URL  

(2) 逻辑视图名和视图对象的映射。

springMVC里还有个视图解析器(ViewResolver)的概念。它决定了ModelAndView对象的逻辑视图名如何解析成一个用于将结果渲染给用户的视图Bean..Spring有四种ViewResolver实现:

—— InternalResourceViewResolver

       将逻辑视图名解析成一个用模板文件(如JSP和Velocity模板)渲染的视图对象

—— BeanNameViewResolver

       将逻辑视图名解析成一个DispatcherServlet应用上下文中的视图Bean

—— ResourceBundleViewResolver

       将逻辑视图名解析成一个ResourceBundler中的视图对象

—— XmlViewResolver

       从一个XML文件中解析视图Bean,这个文件是从DispatcherServlet应用上下文中分离出来的。

       好啦,今天就算是SpringMVC的一个入门。建议你们将Struts和SpringMVC对照着学习,那样效果会更好。与人分享,集思广益。但愿你们都可以学习快乐,工做顺心。下次再见。

相关文章
相关标签/搜索