您的位置:首页 > 编程语言 > Java开发

基于注解的spring mvc入门

2015-07-14 17:26 896 查看
Spring WEB MVC框架是围绕着DispatcherServlet来设计的,DispatcherServlet实质上就是一个HttpServlet,通过查看源代码可以发现,DispatcherServlet间接继承了HttpServlet。在Spring MVC中DispatcherServlet负责接收请求,然后根据请求路径信息,将请求分发至相应的处理器,处理器处理完成后返回到视图,最后再将视图呈现给用户,Spring MVC的处理流程如下图所示(图片来源于spring 官方文档):


一、第一个spring mvc示例

示例程序使用maven构建,需要在pom.xml中添加如下依赖:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>


与编写servlet程序一样,Spring MVC需要将DispatcherServlet配置到应用程序的web.xml文件中:

<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>
Spring会自动到WEB-INF下查找[servlet-name]-servlet.xml文件,此文件中包含了Spring MVC的特殊组件(beans)配置。基于以上配置,我们还需要在WEB-INF下增加一个springmvc-servlet.xml配置文件:内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
<span style="white-space:pre">	</span>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
<span style="white-space:pre">	</span>xmlns:context="http://www.springframework.org/schema/context"
<span style="white-space:pre">	</span>xmlns:mvc="http://www.springframework.org/schema/mvc"
<span style="white-space:pre">	</span>xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd       http://www.springframework.org/schema/context       http://www.springframework.org/schema/context/spring-context-3.0.xsd       http://www.springframework.org/schema/mvc       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
<span style="white-space:pre">	</span><mvc:annotation-driven/>
<span style="white-space:pre">	</span><!-- 自动扫描base-package包下的类,spring会自动将该包下带@Controller的类注册为Spring Bean -->
<span style="white-space:pre">	</span><context:component-scan base-package="com.chenqa.springmvc.demo.controller"/>

<span style="white-space:pre">	</span><!-- 视图配置 -->
<span style="white-space:pre">	</span><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<span style="white-space:pre">		</span><property name="prefix" value="/WEB-INF/jsp/" />
<span style="white-space:pre">		</span><property name="suffix" value=".jsp" />
<span style="white-space:pre">	</span></bean>
</beans>
在com.chenqa.springmvc.demo.controller包下编写一个控制器类HelloController.java:

package com.chenqa.springmvc.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller//将这个类标识为控制器类
@RequestMapping("/hello")//控制器类的访问的路径
public class HelloController {

@RequestMapping("/index")//方法的访问路径
public ModelAndView index() {
Map<String,String> map = new HashMap<String, String>();
map.put("msg", "Hello Spring MVC");
//根据springmvc-servlet.xml中的配置,将返回到WEB-INF/jsp/hello.jsp页面
return new ModelAndView("hello",map);
}
}
再在WEB-INF/jsp下增加hello.jsp文件:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'hello.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>

<body style="background:url('images/bg.jpg') center center no-repeat;background-size:100% 100%;">
${msg}
</body>
</html>
同时在webapp下建立一个images目录,放到一张bg.jpg图片,然后将程序部署到tomcat,启动tomcat在浏览器中输入http://localhost:8080/demo/hello/index,浏览器显示出Hellp Spring MVC,但是背景图片并没有显示出来。

这是因为在web.xml中配置了DispatcherServlet的url-pattern为/,即DispatcherServlet中处理所有的请求,包含对静态资源(css,js,图片待)的请求,而DispatcherServlet接收到请求以后,会将请求分发到处理器进行处理,显然将对静态资源的请求分发给处理器进行处理肯定是无法获取到资源的,为了解决此问题需要在WEB-INF/springmvc-servlet.xml中增加<mvc:resources location="/images/" mapping="/images/**"
/>配置,此配置的意思就是告诉DispatcherServlet如果请求路径中包含了images,就不进行分发,直接进入到location指定的目录下去获取资源,此时再重新部署tomcat,再输入http://localhost:8080/demo/hello/index,背景图片也能正常显示了:

二、请求匹配

在Spring MVC中通过@RequestMapping中设置请求路径,通过@RequestMapping可以很容易的创建出RESTful 以很出的web站点,现在修改下HelloController的index方法,修改为:

@RequestMapping("/index/{name}")//方法的访问路径
public ModelAndView index(@PathVariable String name) {//@PathVariable表示将路径中设置的变量作为方法参数
Map<String,String> map = new HashMap<String, String>();
map.put("msg", "Hello "+name);
//根据springmvc-servlet.xml中的配置,将返回到WEB-INF/jsp/hello.jsp页面
return new ModelAndView("hello",map);
}
此时在浏览器地址栏中输入http://localhost:8080/demo/hello/index/guest,将显示出Hello guest:

在@RequestMapping中还可以指定请求的METHOD,如果将method设置为:RequestMethod.POST:

@RequestMapping(value="/index/{name}", method=RequestMethod.POST)//方法的访问路径
public ModelAndView index(@PathVariable String name) {//@PathVariable表示将路径中设置的变量作为方法参数
Map<String,String> map = new HashMap<String, String>();
map.put("msg", "Hello "+name);
//根据springmvc-servlet.xml中的配置,将返回到WEB-INF/jsp/hello.jsp页面
return new ModelAndView("hello",map);
}


此时再通过get方式请求会出现405错误:

@RequestMapping中的路径还能匹配正则表示式,比如规定name只能是小写字母:

@RequestMapping("/index/{name:[a-z]+}")
此时在浏览器地址栏中输入http://localhost:8080/demo/hello/index/Guest,按照设置name只能是小写字母,而url中的Guest的G为大写,因此这个路径是错误的,直接返回404:

三、返回json数据,

在HelloController中添加方法:

@RequestMapping(value="/json")
@ResponseBody
public Map<String,Object> getJson() {
List<String> list = new ArrayList<String>();
for(int i=0; i<10; i++) {
list.add("string"+i);
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("strList", list);
map.put("foo", "fooinfo");
map.put("bar", "123123sdfasdf");
return map;
}
要返回json数据,需要增加对jackson的依赖,在spring 4.1.0之前使用:

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.8</version>
</dependency>


spring 4.1.0及以后版本使用:

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.1</version>
</dependency>
在浏览器地址栏中输入http://localhost:8080/demo/hello/json,显示为:

g
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: