一.概述
Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最流行的MVC框架之一。SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,而无需实现任何接口。支持REST风格的URL请求。采用松散耦合可插件组件结构,比其他MVC框架更具扩展性和灵活性。
总结来说:SpringMVC是一种轻量级,基于MVC的Web层应用框架,偏前端而不是基于业务逻辑层。是Spring框架的一个后续产品(就是这个Web模块)。
1.1 SpringMVC优点
- 天生与Spring框架集成。
- 支持Restful风格。
- 进行更简洁的Web层开发。
- 支持灵活的URL到页面控制器的映射。
- 非常容易与其他视图技术继承,如Velocity等等。
- 因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)。
- 非常灵活的数据验证,格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API。
- 更加简单,强大的异常处理。
- 对静态资源的支持。
- 支持灵活的本地化,主题等解析。
1.2 SpringMVC常用组件
- DispatchServlet:前端控制器
- Controller:处理器/页面控制器,做的是MVC中C的事情,但控制逻辑转移到前端控制器,用于对请求进行处理。
- HandlerMapping:请求映射处理器,找谁来处理,如果映射成功返回一个HandlerExecutiongChain对象(包含一个Handler处理器对象,多个HandlerInterceptor拦截器对象)。
- ViewResolver:视图解析器,找谁来处理返回的页面。把逻辑视图解析成为具体的View,进行这种策略模式,很容易更换其他视图技术。例如下面实验使用的InternalResourceViewResolver将逻辑视图转换成JSP视图。
- LocalResolver:本地化,国际化。
- MultipartResolver:文件上传解析器。
- HandlerExceptionResolver:异常处理器
二.HelloWorld
工程创建:创建一个动态Web项目,注意选择版本选择2.5(有web.xml配置文件,如果选择了3.0,选择next手动配置)。
1.导包
1)SpringMVC是Spring的Web模块;所有模块的运行都依赖核心模块(IOC模块)。
(1)核心容器模块
commons-logging-1.1.3.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
(2)Web模块
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
2.写配置
1)在web.xml中配置前端控制器,指定SpringMVC配置文件位置:我们知道SpringMVC的思想就是有一个前端控制器DispatcherServlet能拦截所有请求,并能智能派发。这个前端控制器是一个Servlet,所以在web.xml中写配置这个Servlet。
<?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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>1.SpringMVC_helloWorld</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- SpringMVC思想是有一个前端控制器能拦截所有请求,并智能派发
这个前端控制器是一个Servlet,应该在web.xml中配置这个Servlet来拦截所有请求
-->
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置DispatcherServlet的初始化參數:设置文件的路径和文件名称 -->
<init-param>
<!-- 指定SpringMVC配置文件位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
<!-- Servlet启动加载,Servlet原本是第一次访问创建对象,
load-on-startup:服务器启动的时候创建对象,值越小,越先创建对象
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!-- /*和/拦截所有请求
/会拦截所有请求,但不会拦截*.jsp请求,能保证jsp访问正常。
/*范围更大,还会拦截*.jsp这些请求,一旦拦截jsp页面就不能显示了;
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
如果不指定配置文件指定位置:就在Web应用的/WEB-INF下创建一个名叫前端控制器名-servlet.xml。上面的去掉配置文件的指定位置,就是要找:2)配置SpringMVC配置文件:在上面的Servlet配置中,要指定SpringMVC的配置文件。因为SpringMVC是Spring中的一部分,所以配置文件的创建和Spring一样。首先增名称空间,然后在配置文件中扫描所有组件。
<?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-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 扫描所有组件 -->
<context:component-scan base-package="com.test"></context:component-scan>
</beans>
3)编写处理器:
(1)创建两个JSP页面,一个入口页面,一个成功页面(记得设置JSP页面的编码为UTF-8)。
idnex.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>Insert title here</title>
</head>
<body>
<a href="hello">helloworld</a>
</body>
</html>
success.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>Insert title here</title>
</head>
<body>
<h1>成功!</h1>
</body>
</html>
(2)编写处理器(加注解的):
package com.test.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/*
* 1.告诉SpringMVC这是一个处理器,可以处理请求
* @Controller:表示哪个组件是控制器
*/
@Controller
public class MyFirstController {
/*
* /代表从当前项目下开始:处理当前项目下的hello请求
*/
@RequestMapping("/hello")
public String myfirstRequest(){
System.out.println("请求收到了...正在处理中");
return "/WEB-INF/pages/success.jsp";
}
}
(3)配置映射解析器:如何将控制器返回的结果字符串,转换为一个物理的视图文件。在上面的实验中,返回的页面字符串过于繁琐,为了方便起见,在SpringMVC配置文件中,配置一个映射解析器,用来拼接字符串。
<!-- 配置一个视图解析器:能拼接页面地址 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
处理器中方法:
@Controller
public class MyFirstController {
/*
* /代表从当前项目下开始:处理当前项目下的hello请求
*/
@RequestMapping("/hello")
public String myfirstRequest(){
System.out.println("请求收到了...正在处理中");
//视图解析器自动拼串,:
// <property name="prefix" value="/WEB-INF/pages/"></property>
// <property name="suffix" value=".jsp"></property>
return "success";
}
3.部署测试:http://localhost:8080/1.SpringMVC_helloWorld/index.jsp
点击链接: