现在的位置: 首页 > 综合 > 正文

Spring MVC 入门

2013年10月04日 ⁄ 综合 ⁄ 共 4205字 ⁄ 字号 评论关闭

 

 

本人在学习 spring mvc 开始时对以下几个基本概念的理解:

  • 分发器 DispatcherServlet  :  响应请求
  • 控制器 Controller :  控制请求
  • 处理器映射 HandleMapping : 映射请求到处理器
  • 视图解析 ViewResolver : 解析请求到指定的视图

以上概念写的比较简单,要是想理解的更深还是看文档.

下面是这些概念实际的执行顺序:

接下来说明下他们在实际应用中代码的编写:

DispatcherServlet

org.springframework.web.servlet.DispatcherServlet 配置要在 web.xml 中声明

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
  <servlet> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 

   <!-- 

    DispatcherServlet 默认加载的bean文件是/WEB-INF/(servlet-name)-servlet.xml

    可以通过配置contextConfigLocation来改变加载的文件

   --> 
    <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/dispatcherServlet-servlet.xml</param-value>
 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
  </servlet> 

  <!-- 拦截所有以 do 结尾的请求 --> 
  <servlet-mapping> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <url-pattern>*.do</url-pattern> 
  </servlet-mapping>
</web-app>

在web.xml中声明后就可以来写整个处理过程所需要的其他配置,该配置文件的名字应该符合上面说述的规则

(servlet-name)-servlet.xml,所以文件名是dispatcherServlet-servlet.xml

HandleMapping

 <!--
  定义处理器映射
  将要处理的请求映射到处理器上
 -->
  <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
      <props>
        <prop key="helloWorld.do">helloWorldController</prop> 
      </props> 
    </property> 
  </bean>
   SimpleUrlHandlerMapping将映射的信息存入到mappings中,
   key : DispatcherServlet响应的请求,
   value : 映射的处理器,
   也就是 urlMappin 将请求 helloWorld.do 由处理分配到了下面要配置的 helloWorldController 控制器上

Controller

 <!--
  定义控制器, 继承 AbstractController ,实现 handleRequestInternal 方法

  通过注入来避免硬编码
  显示的信息:helloWorld
  视图名称:viewPage

  除了继承AbstractController以外, Spring还有提供了一些方便的Controller, 可以参考文档来用
 -->
  <bean id="helloWorldController" class="com.mvc.HelloWorldController"> 
    <property name="helloWorld">
      <value>AbstractController --- HelloWorld</value>
    </property> 
    <property name="viewPage">
      <value>/WEB-INF/jsp/index.jsp</value> 
    </property>
  </bean>
  
  到了这Controller要开始做事了, Controller的java代码:
  public class HelloWorldController extends AbstractController{   
    private String helloWorld;
    private String viewPage;  
 
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {

      /*要进行的处理在这执行*/
      Map<String,String> model = new HashMap<String,String>();  
      model.put("helloWorld",getHelloWorld());
 
      /*返回ModelAndView(传入视图名称,处理得到的数据)*/
      return new ModelAndView(getViewPage(),model);    
  }
 
    public String getHelloWorld() {  
      return helloWorld;  
    }  
 
    public void setHelloWorld(String helloWorld) {  
      this.helloWorld = helloWorld;  
    }  
 
    public String getViewPage() {  
      return viewPage;  
    }  
 
    public void setViewPage(String viewPage) {  
      this.viewPage = viewPage;  
    }  
}  

Controller会返回一个ModelAndView并携带视图名,处理得到的数据剩下的事就要交给视图解析器去做了.

ViewResolver

  <!--
   定义视图解析器
   
   UrlBasedViewResolver 允许将视图名直接解析到URL上, 不需要显示的映射定义. 如果你的视图名称直接符合视图资源的
       名字而不需要任意的映射, 就可以使用这个解析器.

   InternalResourceViewResolver 是 UrlBasedViewResolver 的子类, 支持InternalResourceView, JstlView, TitleView
   这个解析器生成的视图的类都可以用setViewClass指定 (相关的内容可查阅文档).
  --> 
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass">
      <value>org.springframework.web.servlet.view.InternalResourceView</value> 
    </property>
  </bean>

  <!--   
   因为我用的视图名是直接符合视图资源的名字/WEB-INF/jsp/index.jsp, 所以选用,InternalResourceViewResolver,
   若是选用UrlBasedViewResolver, 注入Controller的视图名因该是"index", 最后请求的视图资源才是/WEB-INF/jsp/index.jsp
  -->
  <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
   <property name="viewClass"><value>org.springframework.web.servlet.view.InternalResourceView</value></property>
   或
   <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>

   最后通过解析器将视图交给RequestDispatcher, RequestDispatcher将请求再传递给/WEB-INF/jsp/index.jsp, 也就是Controller返回的ModelAndView中所携带的视图名.

抱歉!评论已关闭.