spring mvc 简介 、架构、优势网上都一片一片的,现在主要结合Idea 创建一个hello world
1. 优势概括
使用简单,学习成本低
丰富简单的注解方式,减少xml文件配置
更简洁的控制层开发
支持多种视图集成
支持Restful风格
对静态文件的支持和过滤
强大的标签库
和Spring 其他框架无缝集成,是其它Web框架所不具备的
2. 重要组件
Ø DispatcherServlet 核心控制器,也是一个servlet,通过在web.xml中配置,所有请求都经过这个类,负责全局的流程控制。
Ø HandlerMapping 映射处理器,它会把请求映射为HandlerExecutionChain对象,通过url找到对应的Controler类
Ø HandlerAdapter handler适配器,通过注解,把一个URL映射到Controller类的方法上,根据处理结果,返回ModelAndView对象
Ø ViewResolver 视图解析器,将会根据逻辑视图名解析为具体的View,供页面渲染
3. 入门程序
1) 引入spring jar
Jstl 和standard一定要引入,否则不能解析jstl标签,spring mvc内部需要依赖。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
2) 配置web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-servlet.xml</param-value>
</context-param>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
url-pattern:表示拦截所有请求
3) 配置HandlerMapping、HandlerAdapter
<beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
上面两个过时,可使用下面配置(主要是针对注解配置@RequestMapping)
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
4) ViewResolver配置
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix"value="/WEB-INF/views/"/>
<property name="suffix"value=".jsp"/>
</bean>
一般页面都放在/WEB-INF/views下;InternalResourceViewResolver是支持jsp的视图解析,VelocityViewResolver是支持Velocity的。
5) 编写控制层Controler
@Controller //此注解代表是控制器,不需要在xml中配置
@RequestMapping("/first") //url
public class FirstController {
@RequestMapping("hello") //方法url
public ModelAndView view() {
ModelAndView mv = new ModelAndView(); //设置返回页面逻辑名,不带页面名后缀
mv.addObject("message", "Hello World!"); //保存值到作用域中,key为msg
mv.setViewName("hello");
return mv;
}
}
6) 编写页面
<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<html>
<head>
<title>hello world</title>
</head>
<body>
${message}
</body>
</html>
7) 启动执行测试
需要注意的是,要引入jstl和stander jar包;这个例子是最基本的,当然spring mvc支持的注解还很多,包括视图解析器有xml 、velocity等,都可配置。
4. 异常情况:
1. nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
引入以下jar,刷新
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
2. 可以请求到页面,但值(hello world) 没有显示,一般是优于web.xml默认配置导致
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
这个默认把标签配置注释掉了,换成以下即可:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">