现在开发流行MVC模式,structs在C(控制器)中使用;hibernate在M(模型)中被使用;至于 spring ,最大的作用在于,structs、hibernate的对象,由于在各个层之间相互调用,自己维护不够效率、会产生疏漏,所以,spring 提供一个容器(IOC),structs、hibernate的对象交由spring管理即可。
另外,spring还有一个作用,AOP是切面编程,就是不同地方的相同代码,spring提取出来,进行统一的使用。
总之,spring就是把开发中共性的问题,抽取出来,统一的调用。
MVC中的V(视图),可以用JSP、structs、ExtJs、JQuery等框架或技术实现。
Structs+Spring+Hibernate,这是很经典的一个搭配,它的开发流程也比较程式化,下面以用户注册为例。
注册页面代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@page contentType="text/html;charset=GBK"
%>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
html
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
head
><
title
>
Spring、Struts和Hibernate整合之用户注册
</
title
></
head
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
body
>
${msg}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
form
name
="user"
action
="/myHibernate/regedit.do"
method
="post"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
用户名
<
input
type
="text"
name
="username"
value
="${user.username}"
/><
br
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
密 码
<
input
type
="password"
name
="password"
value
="${user.password}"
/><
br
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
input
type
="submit"
name
="method"
value
="提交"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
form
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
body
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
html
>
实体Bean类:
对应的映射文件User.hbm.xml:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<?
xml version="1.0"
?>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!
DOCTYPE hibernate-mapping PUBLIC
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
hibernate-mapping
package
="com.myHibernate.bean"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
class
name
="User"
table
="user"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义id
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
id
name
="id"
column
="id"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
generator
class
="native"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
id
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义用户名
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="username"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义密码
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="password"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
class
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
hibernate-mapping
>
用户DAO接口:
用户DAO接口实现类:
注册的业务逻辑接口:
注册的业务逻辑实现:
用户注册控制器类:
下面是配置文件方面,首先是Hibernate的配置文件hibernate.cfg.xml,定义了访问数据库所需要的一些值:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<?
xml version="1.0" encoding="UTF-8"
?>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!
DOCTYPE hibernate-configuration PUBLIC
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
hibernate-configuration
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
session-factory
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="hibernate.connection.driver_class"
>
com.mysql.jdbc.Driver
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="hibernate.connection.url"
>
jdbc:mysql://localhost/myHibernate
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="hibernate.connection.username"
>
root
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="hibernate.dialect"
>
org.hibernate.dialect.MySQLDialect
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="show_sql"
>
true
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
mapping
resource
="com/myHibernate/bean/User.hbm.xml"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
session-factory
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
hibernate-configuration
>
然后是Spring的配置文件spring-config.xml:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<?
xml version="1.0" encoding="UTF-8"
?>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
beans
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义数据源
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
id
="dataSource"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class
="org.apache.commons.dbcp.BasicDataSource"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
destroy-method
="close"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
设定驱动
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="driverClassName"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
value
>
com.mysql.jdbc.Driver
</
value
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
设定url
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="url"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
value
>
jdbc:mysql://localhost/myHibernate
</
value
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
设定用户名
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="username"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
value
>
root
</
value
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
通过org.springframework.orm.hibernate3.LocalSessionFactoryBean建立联系
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
id
="sessionFactory"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="dataSource"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
local
="dataSource"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义要使用的映射文件
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="mappingResources"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
list
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
value
>
com\myHibernate\bean\User.hbm.xml
</
value
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
list
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义要使用的方言和是否显示sql
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="hibernateProperties"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
props
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
prop
key
="hibernate.dialect"
>
org.hibernate.dialect.MySQLDialect
</
prop
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
prop
key
="hibernate.show_sql"
>
true
</
prop
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
props
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
这里添加对事务处理的支持,当然也可以不用
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
id
="transactionManager"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="sessionFactory"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
local
="sessionFactory"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
表示要将下面定义的userDao置于事务处理之下
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
id
="userDaoProxy"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="transactionManager"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
bean
="transactionManager"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
要代理userDao
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="target"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
local
="userDao"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义不同情况下,事务处理的方式
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="transactionAttributes"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
props
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
prop
key
="create*"
>
PROPAGATION_REQUIRED
</
prop
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
prop
key
="update*"
>
PROPAGATION_REQUIRED
</
prop
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
prop
key
="delete*"
>
PROPAGATION_REQUIRED
</
prop
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
prop
key
="query*"
>
PROPAGATION_REQUIRED,readOnly
</
prop
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
props
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义userDao
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
id
="userDao"
class
="com.myHibernate.dao.impl.UserDAOImpl"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="sessionFactory"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
local
="sessionFactory"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义regedit,将UserDAO进行注入
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
id
="regedit"
class
="com.myHibernate.domain.impl.RegeditImpl"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="userDao"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
local
="userDao"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义login,将UserDAO进行注入
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
id
="login"
class
="com.myHibernate.domain.impl.LoginImpl"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="userDao"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
local
="userDao"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义和Struts相应的映射,将regedit进行注入
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
name
="/regedit"
class
="com.myHibernate.action.RegeditAction"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="regedit"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
bean
="regedit"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义和Struts相应的映射,将login进行注入
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
bean
name
="/login"
class
="com.myHibernate.action.LoginAction"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
property
name
="login"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
ref
bean
="login"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
property
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
bean
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
beans
>
然后是Struts的配置文件struts-config.xml:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<?
xml version="1.0" encoding="UTF-8"
?>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!
DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
struts-config
>
<!--
定义formbean
-->
<
form-beans
><
form-bean
name
="user"
type
="com.myHibernate.bean.User"
/></
form-beans
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
action-mappings
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义和SPring配置文件相同的路径
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
action
path
="/regedit"
type
="org.springframework.web.struts.DelegatingActionProxy"
name
="user"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
forward
name
="regedit"
path
="/jsp/regedit.jsp"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
action
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义初次访问时的路径
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
action
path
="/input"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
type
="org.apache.struts.actions.ForwardAction"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
parameter
="/jsp/regedit.jsp"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义和SPring配置文件相同的路径
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
action
path
="/login"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
type
="org.springframework.web.struts.DelegatingActionProxy"
name
="user"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
forward
name
="login"
path
="/jsp/login.jsp"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
action
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
定义初次访问时的路径
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
action
path
="/loginTemp"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
type
="org.apache.struts.actions.ForwardAction"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
parameter
="/jsp/login.jsp"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
action-mappings
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
注册ContextLoaderPlugIn插件
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
plug-in
className
="org.springframework.web.struts.ContextLoaderPlugIn"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
set-property
property
="contextConfigLocation"
value
="/WEB-INF/spring-config.xml"
/>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
plug-in
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
struts-config
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
最后是Web应用程序配置文件web.xml:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<?
xml version="1.0" encoding="UTF-8"
?>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
web-app
version
="2.4"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
xmlns
="http://java.sun.com/xml/ns/j2ee"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
servlet
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
servlet-name
>
actionServlet
</
servlet-name
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
servlet-class
>
org.apache.struts.action.ActionServlet
</
servlet-class
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
初始参数
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
init-param
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
param-name
>
config
</
param-name
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
param-value
>
/WEB-INF/struts-config.xml
</
param-value
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
init-param
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
load-on-startup
>
1
</
load-on-startup
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
servlet
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<!--
处理所有后缀为do的请求
-->
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
servlet-mapping
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
servlet-name
>
actionServlet
</
servlet-name
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
<
url-pattern
>
*.do
</
url-pattern
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
servlet-mapping
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</
web-app
>
可以看到,MVC的三层架构思路很清晰,但缺点也很明显,配置文件太过于冗杂,CRUD代码随处冗余,不够简约,下一篇文章中我们将见识到一个解决这个问题的优秀框架—SpringSide。