- 浏览: 241761 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
sweed0:
为何每一段代码都重复一次呢?
spring注解实例二 -
Gary_Huangpf:
- - 插件报错啊
Ext前台分页 -
ddvk2007:
版主 我想請問你所說的mapreduce是hadoop的還是g ...
MapReduce中的Shuffle和Sort分析 -
人可木:
好问章,楼主写的相当详细。。。多谢。。。
findbugs插件的安装与应用 -
hautbbs:
按照博主的方法启动调试出现jvm terminated.Ex ...
10分钟学会使用MyEclipse断点调试js
Spring MVC是结构最清晰的MVC Model 2实现。它的Action也不叫Action,而是称做Controller;Controller接收request, response参数,然后返回ModelAndView(其中的Model不是Object类型,而是Map类型)。但在其它的Web Framework中,Action返回值一般都只是一个View Name;Model则需要通过其它的途径(如request.attribute,Context参数,或Action本身的属性数据)传递上去。
Step 1.Business Objects & DAO
教程中的例子涉及到两个实体对象,代表文章的Article类和代表作者的Author类,分别对应了数据库中的article表和author表,一篇文章有一个作者,而一个作者可以有多篇文章。类的代码如下(省略getter和setter):
代码:Article.java
package demo.model;
import javax.persistence.*;
@Entity
public class Article ...{
@Id
@GeneratedValue
private Long id;
private String title;
@ManyToOne
private Author author;
}
代码:Author.java
package demo.model;
import java.util.List;
import javax.persistence.*;
@Entity
public class Author ...{
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany
private List<Article> articles;
}
在MySQL中创建数据表的SQL语句如下,数据请自行添加(如果使用Hibernate,表可以根据映射自动生成,具体做法请参考Hibernate文档):
代码:数据库创建SQL
CREATE DATABASE `articles` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE articles;
CREATE TABLE `article` (
`id` bigint(20) NOT NULL auto_increment,
`title` varchar(100) NOT NULL default '',
`author_id` bigint(20) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `author` (
`id` bigint(20) NOT NULL auto_increment,
`name` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
考虑到可能会有多种DAO的实现,所以在DAO层先定义一个IArticleDao接口,随后可以自由选择具体的实现方式,此处结合Spring的HibernateDaoSupport使用Hibernate来进行实现:
代码:IArticleDao.java
package demo.dao;
import java.util.List;
import demo.model.Article;
public interface IArticleDao ...{
public List<Article> loadAllArticles();
}
代码:ArticleDao.java
package demo.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import demo.model.Article;
public class ArticleDao extends HibernateDaoSupport implements IArticleDao ...{
@SuppressWarnings("unchecked")
public List<Article> loadAllArticles() ...{
return (List<Article>)getHibernateTemplate().loadAll(Article.class);
}
}
接下来对Hibernate进行相应的配置,如果使用了JDO或者iBatis,请参考Spring文档。applicationContext-dao.xml内容如下:
代码:applicationContext-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
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-2.0.xsd"
default-autowire="byName">
<!-- DAO配置于此 -->
<bean id="articleDao" class="demo.dao.ArticleDao"/>
<!-- 数据源 -->
<!-- JNDI数据源 -->
<!--
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${datasource.jndi.name}"/>
</bean>
-->
<!-- JDBC数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${datasource.jdbc.driverClassName}" />
<property name="url" value="${datasource.jdbc.url}" />
<property name="username" value="${datasource.jdbc.username}" />
<property name="password" value="${datasource.jdbc.password}" />
</bean>
<!-- 使用Annotation映射的sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>demo.model.Article</value>
<value>demo.model.Author</value>
</list>
</property>
</bean>
<!-- 事务管理器,此处为Hibernate的事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" />
</beans>
此处如果使用JNDI提供数据源,请根据注释进行调整。Spring的事务管理需要声明事务管理器,由于Hibernate、JDO、JDBC的事务管理器都不一样,所以将其与其他事务的配置分开存放。此外,配置中的一些参数使用了占位符(形如${}),这些内容将在Step 4中进行加载。
Step 2.Service
Service层只是调用DAO中的方法为控制器提供图书列表,Service最好能先给出接口,随后进行实现,但此处的功能比较简单,就直接进行实现了:
代码:ArticleService.java
package demo.service;
import java.util.List;
import demo.dao.IArticleDao;
import demo.model.Article;
public class ArticleService ...{
private IArticleDao articleDao;
public List<Article> loadAllArticles() ...{
return articleDao.loadAllArticles();
}
public void setArticleDao(IArticleDao articleDao) ...{
this.articleDao = articleDao;
}
}
Spring通过setArticleDao方法为ArticleService注入DAO,也可以选择通过构造方法注入,2.5中还能用@Autowired进行注入。
applicationContext-services.xml内容如下:
代码:applicationContext-services.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
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-2.0.xsd"
default-autowire="byName">
<!-- Service配置于此 -->
<bean id="articleService" class="demo.service.ArticleService" />
</beans>
Step 3.Controller & View
Spring MVC提供了多种实现控制器的方式,此处直接实现Controller接口,开发一个单一动作的简单控制器,从Service中取得图书列表,提供给视图进行呈现,ListArticleController内容如下:
代码:ListArticleController.java
package demo.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import demo.model.Article;
import demo.service.ArticleService;
public class ListArticleController implements Controller ...{
private ArticleService articleService;
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception ...{
List<Article> articles = articleService.loadAllArticles();
ModelAndView mav = new ModelAndView();
mav.addObject(articles);
return mav;
}
public void setArticleService(ArticleService articleService) ...{
this.articleService = articleService;
}
}
ModelAndView中保存了要传递给视图的对象和具体要使用的视图文件,自2.0起, Spring MVC提供了Convention over Configuration的机制,大大简化了代码与配置。简单地说,名字以Controller结尾的控制器类都会被映射为相应的地址,ListArticleController对应/listarticle*,如果是MultiActionController则会被映射为一个目录;向ModelAndView添加对象时可以不用指定键(key),单一对象的键取决于类名,比如x.y.User的键是user,而某一类对象的 Set、List或数组则稍有些复杂,取第一个对象的类名加上“List”作为它的键,比如这里的articles是一个存放Article对象的 List,它的键就是articleList;具体的视图会根据请求自动在指定目录中寻找对应的视图文件,本例中就会寻找listarticle(后缀由配置文件决定)。关于Convention over Configuration还有些别的细节,请参考Spring文档的相关章节。
此处的视图比较简陋,只是一张表格,显示了图书的编号、书名和作者,使用JSTL的<c:forEach>标签来遍历列表,具体代码如下:
代码:listarticle.jsp
<%...@ page pageEncoding="UTF-8"%>
<%...@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Article List</title>
</head>
<body>
<table width="80%" cellspacing="0" cellpadding="0" border="1">
<thead>
<tr align="center">
<td width="20%">编号</td><td width="50%">书名</td><td width="30%">作者</td>
</tr>
</thead>
<tbody>
<c:forEach items="${articleList}" var="article">
<tr>
<td align="center">${article.id}</td>
<td>${article.title}</td>
<td>${article.author.name}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
为了使用Spring MVC,需要在web.xml中配置一个分派器,将一些特定格式的请求交给Spring MVC来处理(其实就是一个Servlet,这和Struts有些类似),如果它的名字是dispatcher,那么Spring默认会去寻找名为 dispatcher-servlet.xml的配置文件,该文件内容如下:
代码:dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
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-2.0.xsd"
default-autowire="byName">
<!-- SpringMVC相关Bean配置 -->
<!-- View Resolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<!-- 以下为Controller -->
<bean id="listArticleController" class="demo.controller.ListArticleController" />
</beans>
配置中的DefaultRequestToViewNameTranslator和 ControllerClassNameHandlerMapping就是用来实现Convention over Configuration的,而名为viewResolver的Bean则指定了一些视图的信息。
Step 4.Configuration & Deployment
至此,大部分的工作已经完成了,接下来就是加载properties文件和配置事务属性,这些都放在applicationContext.xml中:
代码:applicationContext.xml
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:config.properties</value>
</list>
</property>
</bean>
<!-- 事务 -->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="load*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config proxy-target-class="true">
<aop:advisor advice-ref="txAdvice" pointcut="execution(* demo.service..*.*(..))" />
</aop:config>
</beans>
pointcut属性确定了AOP拦截的方法,用的是AspectJ pointcut expression,此处对demo.service中每一个类的所有方法都进行了拦截,也就是它们都在事务中执行。
config.properties中保存了一些与数据库和Hibernate相关的配置信息,它们会代替XML中对应的占位符:
代码:config.properties
# DataSource
# JNDI datasource Eg. java:comp/env/jdbc/myds
datasource.jndi.name=
# JDBC datasource
datasource.jdbc.driverClassName=com.mysql.jdbc.Driver
datasource.jdbc.url=jdbc:mysql://localhost/articles?useUnicode=true&characterEncoding=utf8
datasource.jdbc.username=root
datasource.jdbc.password=
# Hibernate
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=false
hibernate.cache.use_query_cache=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
最后要看到的就是web.xml,每个Java EE的Web项目都会有这个配置文件,具体内容如下:
代码:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- Spring ApplicationContext配置文件的路径可使用通配符,多个路径用,号分隔,此参数用于后面的Spring-Context loader -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/modules/applicationContext*.xml</param-value>
</context-param>
<!-- SpringMVC 分派器及相关映射 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--Spring ApplicationContext 载入 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring 刷新Introspector防止内存泄露 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- 支持session scope的Spring bean -->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- Character Encoding filter -->
<filter>
<filter-name>setCharacterEncoding</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>
</filter>
<filter-mapping>
<filter-name>setCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Hibernate Open Session in View Filter-->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
此处加载了Spring的配置文件,并对字符编码进行了处理,*.do和*.html的请求都转交给了Spring MVC的分派器。OpenSessionInViewFilter是用来解决Hibernate的OpenSessionInView问题的,如果没有使用Hibernate则无需配置此过滤器。
发表评论
-
spring AOP
2012-06-13 11:14 879先简单的说说spring aop使用的好处:利用AOP横向添加 ... -
spring IOC的使用
2012-06-13 10:58 929Ioc和他的作用,简单的来讲,就是由容器控制程序之间的关 ... -
spring IOC介绍
2012-06-13 10:55 1298首先想说说IoC(Inversion of ... -
spring概述
2012-06-13 10:52 776随着越来越多的项目 ... -
spring学习总结
2010-02-04 08:49 946先说说简单地使用Struts2做Web时的经历: 1.经常需要 ... -
spring注解实例二
2010-01-26 11:22 2337昨天对Spring注解有了一个整体认识,至少完成了一个简单的w ... -
spring注解实例一
2010-01-26 11:15 2922先来构建一个极为简单的web应用,从controller到da ... -
spring注解配置文件解析
2010-01-26 11:01 35481、applicationContext.xml ... -
使用 Spring 2.5 基于注解驱动的 Spring MVC(二)
2010-01-22 11:13 3400我们在 ② 处添加了一个 ModelMap 属性,其属性名为 ... -
使用 Spring 2.5 基于注解驱动的 Spring MVC(一)
2010-01-22 11:05 1330基于注解的配置有越来越流行的趋势,Spring 2.5 顺应这 ... -
spring注解详解
2010-01-22 09:57 13241.准备工作(1)导入common-annotations.j ... -
spring注解
2010-01-13 09:56 979Spring JSR-250注解 注释配 ... -
spring相关配置内容解析
2010-01-05 14:27 12921、web.xml配置文件: <? ... -
Spring MVC 配置【转】
2010-01-03 14:51 1033一,配置分发器 Dispatche ... -
spring mvc 学习笔记
2010-01-03 14:41 1134一、与struts的不同 1.Spr ... -
Spring 可代码简化操作类
2009-12-28 09:31 1035SimpleJdbcTemplate类是Jd ... -
Spring 命名参数操作类NamedParameterJdbcTemplate
2009-12-28 09:28 1764在传统的SQL语句中,参数都是用'?'占 ... -
Spring JdbcTemplate操作类
2009-12-24 10:42 27461.JdbcTemplate ...
相关推荐
39页的PDF文档,简单详细的介绍了spring MVC的入门知识。 对spring MVC的入门有很大的帮助。
spring mvc入门资料,简单讲解了spring MVC的基础概念就用法,转的
资源准确,并且真材实料,希望可以帮助大家。
入门和提高知识!快速的上手spring
Spring MVC 教程 快速入门 深入分析 目录 一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mvc 双亲上下文的说明 六、springMVC-mvc.xml 配置...
spring mvc快速入门,spring mvc+mybatis+spring的整合
spring mvc经典入门教程好好看吧!你会上手的
《Spring MVC+MyBatis开发从入门到项目实战》分为4篇。第1篇是Java开发环境的搭建,包括JDK的下载与安装、环境变量的配置、MyEclipse的下载与基本配置。第2篇是MyBatis技术入门,包括剖析JDBC的弊端、MyBatis的背景...
这篇文章将教你快速地上手使用 Spring 框架. 如果你手上有一本《Spring in Action》, 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看, 否则那将是一场恶梦! 首先, 我需要在你心里建立起 Spring...
Spring MVC MyBatis开发从入门到项目实战
spring mvc入门小例子spring mvc入门小例子spring mvc入门小例子spring mvc入门小例子spring mvc入门小例子
个人认为相当适合入门和知识巩固!! 一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring mvc 双亲上下文的说明 六、springMVC-mvc.xml 配置文件...
spring mvc 实战指南和spring mvc入门:图解加源代码
详细的资源描述有机会获得我们的推荐,更有利于他人下载,赚取更多积分。
有没有一开始搞spring mvc时,被搞得心态崩溃,这个就发生在了我身上;难得最后走通了,就自我记录备案,权当我的学习笔记了。除了弄一个mvc xml配置,后面还会弄一个纯java配置的mvc。下面是操作指南: ...
spring mvc入门示例
Spring MVC开发快速入门.docx
Spring MVC 从入门到精通,后续还有更多精彩内容,敬请期待!!
Spring MVC【入门】