欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring3 MVC的最佳实践和理解(1)

程序员文章站 2022-03-31 12:27:31
...

 

 个人学习参考所用,勿喷! 

 

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