前言:
一、总共有10节,也就是10篇博客来讲述Spring的MVC,几乎涵盖了所有Spring MVC中的内容。
二、我创建的例子是一个球场预订系统,例子我已经测试调试通过,是一个Maven的project,包含一个Parent project:wsheng-spring-base和一个子Module:wsheng-spring-mvc.
三、在Eclipse中直接import maven的project即可,会同时引入上诉两个project的。
四、如果你没有耐心,可以不必往下学习,因为网上有很多例子,但是都是讲的Spring MVC很少的面,而且你可以快速的上手,但如果你想真正了解Spring MVC中的很多细节,就可以慢慢的去看博客(从第一节到第十节),如果有什么问题,欢迎信息告诉我。
五、学习的方法是你可以先将源码导入到eclipse中,然后根据博客上的内容,对照源码,慢慢消化,这是个漫长的过程,但是会帮助你了解很多Spring MVC的细节。
===================================================================================
1. 问题:
创建MVC控制器的时候,不想硬编码字段的值,而是想赋一个出现在Bean文件或者是属性资源文件(message.properties)中的值。
2.解决方法:
用@Value注解使得Spring的MVC控制器中相关的字段能够使用Spring表达式语言SpEL进行赋值。你可以使用@Value注解和SpEL一起,查询应用上下文中的bean,取到相关的值。
3.工作原理:
例子: 例如,假如你有一个简单的控制器,它的作用仅仅是显示一个“关于”页面,如下的JSP:
<html>
<head>
<title>About</title>
</head>
<body>
<h2>Court Reservation System</h2>
<table>
<tr>
<td>Version:</td>
<td>1.0</td>
</tr>
</table>
</body>
</html>
在“关于”页面中添加管理员的联络邮件是最常见的做法。但是管理员的邮件地址有可能出现在除了“关于”页面的其他多个页面中。因为我们最好在一个统一的地方存放管理员的邮件地址,message.properties就是个不错的选择。这样,如果管理员的地址发生变化,我们只需要修改一个地方,让其它用到该邮件地址的地方也发生变化。所以我们可以在message.properties文件中添加如下属性:
然后可以修改about.jsp将控制器传入的email属性作为模式属性显示:
<html>
<head>
<title>About</title>
</head>
<body>
<h2>Court Reservation System</h2>
<table>
<tr>
<td>Version:</td>
<td>1.0</td>
</tr>
<tr>
<td>Email:</td>
<td><a href="mailto:${email}">${email}</a></td>
</tr>
</table>
</body>
</html>
在应用的/WEB-INF/jsp中创建about.jsp之后,接下来我们就就可以创建对应的控制器,以便把E-mail属性传递给视图。下面的AboutConroller使用@Value注解,通过message.properties文件为email字段赋值。
@Controller
public class AboutController {
@Value("#{ messageSource.getMessage('admin.email',null,'en')}")
private String email;
@RequestMapping("/about")
public String courtReservation(Model model) {
model.addAttribute("email", email);
return "about";
}
}
赋予@Value注解的值是一条SpEL语句,SpEL语句可以由标记形式#{SpEL Statement}识别出来。
在这个例子中,messageReource代表Bean org.springframework.context.support.ResourceBundleMessageSource的值,这个Bean在web应用上下文中声明,用于访问message.properties文件。
关于该bean的配置,可以参照:http://josh-persistence.iteye.com/admin/blogs/1881831(Spring3.X @MVC - (五)用外部化文件来显示区域的信息)
<!-- Message .properties sources -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- <property name="basename" value="messages.properties" /> -->
<property name="basename" value="messages" />
</bean>
messageSource.getMessage('admin.email',null,'en')是Bean类的方法,使用这些参数访问会返回admin.email的值。通过@Value的注解,该值会自动赋值给email字段。(即SpEL和messageSource是用来从properties文件中取值的,而@Value是用来赋值的。
最后可以通过http://localhost:8088/wsheng-spring-mvc/about 测试。