Spring3 MVC的最佳实践和理解(1)
个人学习参考所用,勿喷!
1.搭建一个基于Spring3的MVC应用。
1.1) 建立一个webapp,这里还是采用Maven构建,构建过程参考limingnihao的blog(写得相当的详细!!!): 使用Eclipse构建Maven的SpringMVC项目 。
1.2) 编辑pom.xml,添加Spring3 MVC所必须的jar包,除了Spring基本的core、bean等jar包,这里还需要有web和mvc的相关jar。具体根据需要来。需要哪些jar在附件的工程中都有。需要注意:pom.xml中不用加入el-api.jar和jsp-api.jar两个jar包,因为tomcat目录下有,如果加入了,即使设置scope=provided,也会会产生Unable to read TLD "META-INF/fmt.tld"的Exception。但是如果没有这jsp-api这个jar,会带javax.servlet.jsp.JspException cannot be resolved to a type等Exception。这里不许理会,因为从正常的运行结果来看是正常的。或者添加jar后删除掉tomcat目录下的对应jar来解决问题
1.3) 编辑webapp的web.xml,添加DispatcherServlet入口。以下为到web.xml的根目录的内容和说明:
<!-- 多个Spring的配置文件,要以逗号或者空格分割 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/court-service.xml</param-value> </context-param> <!-- 使用监听器ContextLoaderListener加载是上述的多个文件,加载到根应用上下文中--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 可以配置多个DispatcherServlet到不同的路径 --> <servlet> <servlet-name>court</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 相对使用监听器ContextLoaderListener加载,每个DispatcherServlet将其加载到自己的应用上下文, 并且可引用根应用上下文为其上级 。每个DispatcherServlet实例加载上下文可以访问甚至覆盖根应用的上下文中声明的bean(反之不行), 但是每个DispatcherServlet实例加载上下文无法相互访问--> <!-- <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/court-servlet.xml,/WEB-INF/court-service.xml</param-value> </init-param> --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>court</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
1.4) 创建一个用Spring的annotation标识@Controller表示的控制器,并且用@RequestMapping来映射URL到这个控制器。具体的代码如下:
@Controller
// Bind controller to URL /welcome
// initial view will be resolved to the name returned in the default GET method
@RequestMapping("/welcome")
public class WelcomeController {
// Controller will always look for a default GET method to call first, irrespective of name
// In this case, named welcome to ease identification
@RequestMapping(method = RequestMethod.GET)
// Method contains Model input to setup date object
// NOTE: Model is a Java 5 interface -- newer than the older ModelMap and still older ModelAndView
public String welcome(Model model) {
Date today = new Date();
// Add date to model so it can be display in view
model.addAttribute("today",today);
// Return view welcome. Via resolver the view
// will be mapped to /WEB-INF/jsp/welcome.jsp
return "welcome";
}
}
1.5) 创建了控制器并且将应用方法绑定到了相对应URL路径上,那么现在应该来**这些控制器标识。在WEB-INF下创建court-servlet.xml,虽然在web.xml没有直接配置这个文件,但是ContextLoaderListener会自动的搜索WEB-INF下*-servlet.xml(这里的*是web.xml中配置的配置的DispatcherServlet的名称)。这里court-servlet.xml具体的配置和说明如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> <!-- **自动检测注解,自动搜索@Controller和@RequstMapping注解的存在,包括其下面的子包--> <context:component-scan base-package="com.watson.action" /> <!-- 处理类级别的@RequstMapping注解 --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <!-- 处理方法级别的@RequstMapping注解 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- DispatcherServlet接收到处理程序返回的视图名称,并解析为视图实现以供显示。 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
1.6) 根据1.5步中对逻辑视图和视图文件的映射关系的设置,这里需要在WEB-INF的view目录下创建一个JSP文件welcome.jsp用来处理上述1.4步中的控制器的返回结果,并返回给浏览器。具体代码如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h2>Welcome to Court Reservation System</h2>
Today is <fmt:formatDate value="${today}" pattern="yyyy-MM-dd" />.
<hr />
Handling time : ${handlingTime} ms
<br />
Locale : ${pageContext.response.locale}
</body>
</html>
1.7) 最后发布创建的应用到tomcat下,在本地的浏览其中输入http://[host]:[port]/[appname]/welcome,例如楼主的实例中输入如下:http://localhost:7070/Spring3MVC/welcome。浏览器显示的结果如下:
Welcome to Court Reservation System
Today is 2012-04-23.
Handling time : 0 ms
Locale : zh_CN
参考:
juyon的blog:《 spring3 MVC国际化支持之中文乱码 》
Gary Mark等的书籍:《Spring Recipes》2ed