Spring MVC-学习笔记(1)认识spring mvc

1、基于XML Schema、Controller接口的spring mvc简单例子

  

  1》创建一个动态Web项目,选择同时创建web.xml文件

  2》在WEB-INF/lib中粘贴spring框架jar包,同时粘贴commons-logging-1.2.jar、servlet-api.jar(Tomcat的安装libs中可以找到)

  3》编写核心控制器HelloController.java

package com.lfy.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

/**
 * HelloController是一个实现Controller接口的控制器
 * 可以处理一个单一的请求动作
 * @author lfy
 * HttpServletRequest、HttpServletResponse的引入需要Tomcat的servlet-api.jar
 * 在构建路径中将其添加为外部jar即可。
 */
public class HelloController implements Controller {

    private static final Log log=LogFactory.getLog(HelloController.class);
    
    /**
     * 该方法的参数对应请求的HttpServletRequest和HttpServletResponse。
     * 该方法必须返回一个包含视图名或模型的ModelAndView对象。
     */
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        log.info("handleRequest()被调用");
        ModelAndView mv=new ModelAndView();
        //添加模型数据,可以是任意的pojo对象
        mv.addObject("message","Hello World!");
        //设置逻辑视图名,视图解析器会根据名字解析到具体的视图页面
        mv.setViewName("/WEB-INF/content/welcome.jsp");
        //返回ModeAndView对象
        return mv;
    }
}

  4》编写web.xml、springmvc-config.xml

  web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>springMVCTest-1.0.0</display-name>
  <!-- 定义springMVC的前端控制器  -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- 让springMVC的前端控制器拦截所有请求  -->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

    也可以将springmvc-config.xml文件放置在类路径下,此时配置的方式为:

<param-value>classpath*:config/springMVC/springmvc-config.xml</param-value>

    springmvc-config.xml

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
      
      <!-- 配置Handle,映射"/hello"请求 -->
      <bean name="/hello" class="com.lfy.controller.HelloController"/>
      
      <!-- 处理映射器将bean的name作为url进行查找,需要在配置Handler时指定name(即url) -->
      <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 
      
      <!-- SimpleControllerHandlerAdapter是一个处理器适配器,所有处理器适配器都要实现HandlerAdapter接口 -->
      <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 
      
      <!-- 视图解析器 -->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>

  5》添加welcome.jsp简单返回页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>welcome</title>
</head>
<body>
  ${requestScope.message}
</body>
</html>

   6》运行

2、基于注解的的spring mvc简单例子。在上面的例子上,进行修改。

  1》HelloController.java

package com.lfy.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * 最简单的基于注解的springMVC
 * @author lfy
 *
 */
@Controller
public class HelloController {

    private static final Log log=LogFactory.getLog(HelloController.class);
    
    @RequestMapping(value="/HelloController/hello")
    public ModelAndView hello() {
        
        log.info("hello()被调用");
        ModelAndView mv=new ModelAndView();
        //添加模型数据,可以是任意的pojo对象
        mv.addObject("message","Hello World!");
        //设置逻辑视图名,视图解析器会根据名字解析到具体的视图页面
        mv.setViewName("/WEB-INF/content/welcome.jsp");
        //返回ModeAndView对象
        return mv;
    }
}

   2》springmvc-config.xml

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
       http://www.springframework.org/schema/mvc 
       http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-4.0.xsd">
      
      <!-- spring可以自动扫描base-package下面的包或者子包下的java文件,如果扫描
                                 到有spring的相关注解的类,则把这些类注册为spring的bean -->
      <context:component-scan base-package="com.lfy.controller"/>
      
      <!-- 配置annotation类型的处理映射器  -->
      <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
      
      <!-- 配置annotation类型的处理器适配器   -->
      <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
      
      <!-- 视图解析器 -->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>

   3》运行

 3、springMVC核心4类配置

   配置文件总体上有4类配置:springmvc前端控制器处理器映射器处理器适配器视图解析器

   前端控制器配置:
      第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析

      第二种:/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,如使用<mvc:default-servlet-handler/>。
  使用此种方式可以实现 RESTful风格的url。

   处理器映射器:
     非注解处理器映射器(了解)
     注解的处理器映射器(掌握)
     对标记@Controller类中标识有@RequestMapping的方法进行映射。在@RequestMapping里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。

   处理器适配器:
     非注解处理器适配器(了解)
     注解的处理器适配器(掌握)
     注解的处理器映射器和注解的处理器适配器是配对使用。不能非注解的映射器和注解的适配器使用。

<!--使用<mvc:annotation-driven>,默认还加载了很多参数绑定的方法-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--可替代以下的映射器、适配器的注解配置声明-->
<!-- 配置annotation注解类型的处理映射器  -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 配置annotation注解类型的处理器适配器   -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    视图解析器:

      主要是了解前缀、后缀的作用。

4、springMVC的一般运行步骤

    第一步:发起请求到前端控制器(DispatcherServlet)
    第二步:前端控制器请求处理器映射器HandlerMapping查找Handler
            可以根据xml配置、注解进行查找
    第三步:处理器映射器HandlerMapping向前端控制器返回Handler
    第四步:前端控制器调用处理器适配器去执行Handler
    第五步:处理器适配器去执行Handler
    第六步:Handler执行完成给处理器适配器返回ModelAndView
    第七步:处理器适配器向前端控制器返回ModelAndView
    第八步:前端控制器请求视图解析器去解析视图
           根据逻辑视图名解析成真正的视图(jsp)
    第九步:视图解析器向前端控制器返回view
    第十步:前端控制器进行视图渲染
           数据填充到request域
    第十一步:前端控制器向用户响应结果。

原文地址:https://www.cnblogs.com/ZeroMZ/p/11374398.html