Spring MVC概述
Spring MVC提供的一个实现了 Web MVC 设计模式的轻量级 Web 框架 它与Struts 框架一样,都属于 MVC 框架,但其使用和性能等方面比 Struts 更加优异
Spring MVC 具有如下特点:
(1)是Spring框架的一部分,可以方便地利用Spring所提供的其他功能
(2)灵活性强,易于与其他框架集成
(3)提供了一个前端控制器 DispatcherServlet ,使开发人员无须额外开发控制器对象
(4)可自动绑定用户输入,并能正确的转换数据类型
(5)内 置了常见的校验器,可以校验用户输入 如果校验不能通过,那么就会重定向到输入表单
(6)支持国际化 可以根据用户区域显示多国语言
(7);支持多种视图技术 它支持 JSP Velocity FreeMarker 等视图技术
(8)使用基 XML 的配置文件,在编辑后,不需要重新编译应用程序
Spring MVC工作流程
该图片出处:Java ee企业级应用开发教程
Spring MVC 程序的完整执行流程如下:
( 1 )用户通过浏览器向服务器发送请求,请求会被 Spring MVC 的前端控制器DispatcherServlet 所拦截
( 2 ) DispatcherServlet 拦截到请求后,会调用 HandlerMapping 处理器映射器
( 3 )处理器映射器根据请求 URL 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet
( 4 ) DispatcherServlet 会通过返回信息选择合适的 HandlerAdapter (处理器适配器)
( 5 ) HandlerAdapter 会调用并执行 Handler (处理器),这里的处理器指的就是程序中编写Controller 类,也被称之为后端控制器
( 6 ) Controller 执行完成后,会返回一个 ModelAndView 对象,该对象中会包含视图名或包含模型和视图名
( 7 ) HandlerAdapter ModelAndView 对象返回给 DispatcherServlet
( 8 ) DispatcherServlet 会根据 ModelAndView 对象选择一个合适的 ViewReslover (视图解析器)
( 9 ) ViewReslover 解析后,会向 DispatcherServlet 中返回具体的 View (视图)
( 10 ) DispatcherServlet View 进行渲染(即将模型数据填充至视图中)
( 11 )视图渲染结果会返回给客户端浏览器显示
第一个Spring MVC程序
项目结构图如下:
注意:
1、web.xml要放在WEB-INF目录下
2、springMVC-config.xml要放在src目录下
一般都这样命名,图中是为了区分不同的配置
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>spirngmvc_01</display-name>
<!-- 配置前端过滤器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<!--servlet-class中的值是spring-webmvc包提供的类,即前端控制器,用于控制所有请求 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化时加载文件(springmvc-anno.xml) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-anno.xml</param-value>
</init-param>
<!-- 表示容器在启动时立即加载 Servlet,数值越小,加载越快 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置servlet映射 servlet-name取值与servlet的servlet-name一致-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc-anno.xml(注解)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 指定需要扫描的包 -->
<context:component-scan base-package="com.controller" >
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 定义视图解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 设置后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
springmvc-xml.xml(非注解)
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置Handel,映射"/hello"请求 -->
<bean name="/hello" class="com.controller.FirstController"/>
<!-- 处理映射器将bean的name作为url进行查找,需要在配置Handel时指定name(即url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- SimpleControllerHandlerAdapter是一个处理器适配器,所有处理器适配器都要实现HandlerAdapter接口,-->
<!--通过适配器实现对handlReqeust的调用 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
controller类
package com.controller;
import java.lang.annotation.Annotation;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
//import org.springframework.web.servlet.mvc.Controller;
//1、基于注解
@Controller
@RequestMapping(value="/hello")
public class FirstController {
@RequestMapping(value="/firstController")
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) throws Exception {
// 向模型对象中添加数据
model.addAttribute("msg", "hello,这是我的第一个Spring MVC程序,基于annotation");
// 返回视图页面
return "first";
}
}
//1、继承Controller类
//public class FirstController implements Controller{
//
// @Override
// public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
//
// ModelAndView mav = new ModelAndView();
//
// mav.addObject("msg", "hello,这是我的第一个Spring MVC程序,基于xml");
// mav.setViewName("/WEB-INF/jsp/first.jsp");
// return mav;
// }
//}
视图(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>入门程序</title>
</head>
<body>
${msg}
</body>
</html>
将项目发布到Tomcat中,并启动Tomcat服务器,然后再浏览器中输入http://localhost:8080/项目名/hello/firstController(基于注解)
使用注解或继承controller类
1、springMVC.xml文件是不一样的
2、web.xml文件中的classpath也要相应的改,
3、在浏览器中输入的url也要相应的改