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域
第十一步:前端控制器向用户响应结果。