Spring MVC3注解学习之简单入门范例

原创文章,转载请注明出处

本文地址:http://www.yshjava.cn/post/430.html

 

之前做Web应用都是在用Struts2,觉得功能强大,效率也能提升很多,所以一直都很喜欢Struts。虽然也曾经在接手前人遗留的项目时遭遇过Spring MVC,不过不知道是前人用的不好,还是自己水平差,亦或者是Spring MVC(那个时候还是2)本身的问题,让Spring MVC给自己留下了很不好的印象:配置文件繁琐、功能一般甚至简陋、不能够在开发效率上与Struts2媲美等等问题,致使自己一直以来都是带着偏见看待Spring MVC的,也因此一直都没有再去尝试过。

最近是一次偶然的机会,再次正面遭遇Spring MVC,不过这次它改头换面,由2升级到3了,看到别人基于Spring MVC注解方式写出来的简洁流畅的代码后,惊叹于Spring MVC3的注解驱动能力之强大,代码之简洁,觉得自己以前的偏见简直就是愚昧至极,不由地暗自对Spring MVC有了好感,打算实实在在尝试一把。

不过自己之前对Spring MVC确实不熟,加之这次升级的内容有点多,所以我找来了一份很好的入门文档《Spring3_MVC注解教程》作为自己的领路人。这份PPT做的很好,本文也是在此基础上有感而发的,在此感谢作者陈雄华先生的辛勤劳动和无私奉献!

本文所示代码均基于最新版SpringFrameword3.2.3,请知悉。

 

Spring MVC框架简介

  • 支持REST风格的URL
  • 添加更多注解,可完全注解驱动
  • 引入HTTP输入输出转换器(HttpMessageConverter)
  • 和数据转换、格式化、验证框架无缝集成
  • 对静态资源处理提供特殊支持
  • 更加灵活的控制器方法签名,可完全独立于Servlet API

 

Spring MVC框架结构

Spring MVC 3框架结构

 

 

框架的实现者

Spring MVC 3框架的默认实现者

 

 

如何在应用中使用Spring-MVC?

  1. 在应用中添加Spring框架支持;
  2. 在web.xml中配置Spring-MVC的请求转发器(前端控制器)
  3. 编写Spring-MVC的配置文件
  4. 将任意JavaBean通过注解配置成Controller(控制器)并注解其中的方法
  5. 完成

 

步骤简单明了,接下来我们一步一步详细说明:

在应用中加入Spring支持:

因为Spring-MVC是属于SpringFramework的一部分,因此要在应用中使用Spring-MVC,就必须以引入Spring基础框架为前提,另外还包括beans、context、aop、web组件,将上述组件的jar及其依赖添加到buildpath下,就算完成了为应用添加Spring框架支持的工作,然后在web.xml中配置Spring的监听器,代码如下:

<!-- 该监听器将在Web容器启动时激活Spring -->
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


另外,因为是在web应用中使用Spring,因此建议配置一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器来处理资源回收的工作:

<!-- 处理由JavaBeans Introspector的使用而引起的缓冲泄露 -->
<listener>
	<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>

 

再配置一个编码过滤器

<filter>
	<filter-name>encodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping> 


 

在web.xml中配置Spring-MVC的请求转发器(前端控制器)

在应用中使用Spring-MVC比较简单,除了需要引入相关依赖库外,还需要在web.xml配置Spring-MVC的请求转发器,代码如下:

<servlet>
	<servlet-name>SpringMVCDispatcher</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<!-- 声明Spring MVC配置文件路径 -->
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:mvc-config.xml
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>SpringMVCDispatcher</servlet-name>
	<!-- 监听所有请求,注意这里是/而不是/*,否则将会造成jsp页面不能正常渲染等问题 -->
	<url-pattern>/</url-pattern>
</servlet-mapping>

 

编写Spring-MVC的配置文件

在上述代码中,我们告知Spring-MVC的请求转发器我们的mvc配置在classpath:mvc-config.xml中,因此我们需要在该文件中正确描述我们的mvc配置信息,配置代码如下:

<?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:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<!-- 扫描指定包下面通过注解配置的组件 -->
    <context:component-scan base-package="cn.ysh.studio.spring.mvc.web"/>

	<!-- 添加自动代理功能 -->
	<aop:aspectj-autoproxy proxy-target-class="true"/>

	<!-- 默认的注解处理器映射,必须配置 -->
	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
		<property name="useDefaultSuffixPattern" value="false" />
 	</bean>
 	
 	<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
			</list>
		</property>
	</bean>
 	
 	<!-- RESTful风格链接,处理静态资源无法访问的问题 -->
    <mvc:default-servlet-handler />
    
    <!-- 基于内容协商的视图解析器,其中可以配置多个视图解析器 -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="viewResolvers">
        	<list>
        		<!-- JSP/HTML页面的视图解析器 -->
			    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			        <property name="prefix" value="/WEB-INF/jsp/"/>
			        <property name="suffix" value=".jsp"/>
			        <property name="contentType" value="text/html;charset=UTF-8"/>
					<property name="order" value="2"/>
			    </bean>
			    <!-- FreeMarker模板的视图解析器 -->
			    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
					<property name="prefix" value="/WEB-INF/views/" />
					<property name="suffix" value=".ftl" />
					<property name="contentType" value="text/html;charset=UTF-8"/>
					<property name="order" value="2"/>
			        <property name="exposeSpringMacroHelpers" value="true"/>  
				</bean>
        	</list>
        </property>
    </bean>
    
    <!-- 根路径默认视图,非必须,可以去掉 -->
    <mvc:view-controller path="/" view-name="welcome" />
    
    <!-- 异常处理,非必须,可以去掉 -->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="exception"/>
        <property name="warnLogCategory" value="warn"/>
    </bean>

</beans>

 

将任意JavaBean通过注解配置成Controller(控制器)并注解其中的方法

本文主要示范如何使用注解为应用添加Spring-MVC支持,因此本文中的所有MVC映射配置都采用注解方式,范例Controller如下所示:

package cn.ysh.studio.spring.mvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import cn.ysh.studio.spring.mvc.bean.User;

/**
 * @author Shenghany
 */
//通过注解将VisitController声明为一个Controller控制器
@Controller
//声明该Controller控制器的请求映射路径为/visit(非必须,可以不声明)
@RequestMapping("/visit")
public class UserController {

	//将当前方法的请求映射路径声明为create
    @RequestMapping("create")
    /**
     * 该方法将处理请求到/visit/create(控制器的映射路径(可以没有) + 处理方法的映射路径)路径的HTTP请求
     * @param model 将会被带到view层使用的数据模型
     * @return 逻辑视图名
     */
    public String create(Model model) {
        return "create";
    }

    @RequestMapping(value = "/visits", method = RequestMethod.POST)
    public ModelAndView visits() {
        ModelAndView mav = new ModelAndView("visitList");
        mav.addObject("visits", "");
        return mav;
    }
    
    @RequestMapping(value = {"/show", "view"}, method = {RequestMethod.GET, RequestMethod.POST})
    public String show(User user, Model model) {
        model.addAttribute("username", "springmvc");
        model.addAttribute("password", "类型非常灵活");
        return "show";
    }
    
    @RequestMapping("/hello/{username}")
    public String hello(@PathVariable("username")/*URL中的{xxx}占位符可以通过@PathVariable("xxx")绑定到操作方法的入参中*/String username, Model model) {
        model.addAttribute("username", username);
        model.addAttribute("password", "类型非常灵活");
        return "hello";
    }
    

}

 

为了是上面的Controller能够正常使用,我们还需要在WebRoot下创建Controller中使用的逻辑视图对应的视图文件,以上例中create为例,我们在WEB-INF/jsp/目录下新建jsp文件,内容如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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>创建新用户</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  
  <body>
    这是一个创建新用户的页面,对应的请求地址为<%=basePath%>visit/create
  </body>
</html>

 

完成上述四个步骤后,将工程部署到任意web容器(本文采用tomcat6.0),然后启动,即可在浏览器中浏览映射出来的地址,如果需要在记录详细的Spring调试信息,则可以通过配置log4j来实现(这里多说一句,Spring的调试信息真的很详细很丰富,通过分析日志,将有助于我们快速理解和掌握Spring-MVC的工作原理)。

以访问示例中create地址为例,结果图如下所示:

Spring MVC3范例预览结果

 

至此,Spring-MVC算是简单入门了,但上述例子并未展现Spring-MVC注解的强大功能,稍后将会在一个单独的篇幅中详细介绍。

原创文章,转载请注明出处http://www.yshjava.cn/post/430.html

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值