一、打开vs2010,菜单文件->新建->项目->其它项目类型->vs解决方案
工程结构分部:
Solution-
src
Domain
Entities
Mappings
Dao
Config
Interface
InterfaceImpl
Nhibernate(这一层可以不写用上面的)
Nhibernate
Service
Interface
InterfaceImpl
Web工程
lib
doc
1、新建一个类库工程domain,位置路径为解决方案路径下面的src下面。
vs工程新建的时候必须看下工程的属性必须选择 .net framework 4 默认是client这个有问题。使用spring.net和nhibernate时候报引用错误
2、在Domain工程下新建2个文件夹Entities和Mappings,然后使用自动生成工具生成entities和mappings文件并添加进vs2010对应工程文件夹,因为用了动软生成实体,和codesmith生成配置文件所以生成的文件名字、字段属性可能不一致,这里需要修改一下(最好不要带下划线。属性名不要加表名作为前缀)。
用到mapping的时候配置文件必须是嵌入式的否则会报错(这个在winform中是这样,但是如果把配置文件放到web项目方案下面可以不是,用context 在web.config中使用file调用未测试,下面只针对controller.xml 做了这样的修改,因为其他部分和winform的配置一样。)
Error creating context 'spring.root': InputStream is null from Resource = [assembly [Dao, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], resource [Dao.Dao.Config.Dao.xml]]
3、再次新建类库工程Dao(Service)下面新建2个文件夹Dao、DaoImpl(Service、ServiceImpl)。添加对应的业务接口可实现。
4、添加web工程Web添加Config文件夹,编写Controller.xml 配置文件
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<object type="Web.Controllers.HomeController, Web" singleton="false" >
<property name="Message" value="Welcome to ASP.NET MVC3 powered by Spring.NET!" />
<property name="RalasafeRoleService" ref="RalasafeRoleService"/>
</object>
</objects>
Web工程下必须修改下Global.asax文件
public class MvcApplication : SpringMvcApplication 必须继承这个SpringMvcApplication
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// 日志启动
log4net.Config.XmlConfigurator.Configure();
}
不然spring不会加载controller的配置文件里面的属性。
<property name="Message" value="Welcome to ASP.NET MVC3 powered by Spring.NET!" />
<property name="RalasafeRoleService" ref="RalasafeRoleService"/>
添加controller action文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using System.Collections;
using System.Text;
using Web.Tools;
using Service.Interface;
using Domain.Entities;
namespace Web.Controllers
{
public class HomeController : AbstractController
{
#region Fields
public string Message { get; set; }
private IRalasafeRoleService ralasafeRoleService;
#endregion
#region Properties
public IRalasafeRoleService RalasafeRoleService
{
get { return ralasafeRoleService; }
set { ralasafeRoleService = value; }
}
#endregion
public ActionResult Index()
{
//simple asp.net mvc sample app hard-coded message commented out b/c we
// can property-inject it via the container instead
// (gratuitous container usage trick, but demonstrates that the container
// is resolving HomeController)
//ViewData["Message"] = "Welcome to ASP.NET MVC!";
//set the message value in the viewdata bag based on the property value
// as injected into the controller from the container
ViewData["Message"] = Message;
return View();
}
public ActionResult Login()
{
return View("Login");
}
public JsonResult getAccordionMenu()
{
IList<RalasafeRole> list = RalasafeRoleService.GetRalasafeRoles();
Hashtable rtnVal = new Hashtable();
List<Object> items = new List<Object>();
Object item1 = new
{
ID = 1,
ProductCode = "1KDB",
};
items.Add(item1);
Object item2 = new
{
ID = 2,
ProductCode = "S5GRA",
};
items.Add(item2);
rtnVal["items"] = items;
return CreateJsonNetResult(true, rtnVal);
}
}
}
前台写个js程序测试下
Ext.Ajax.request({
url: 'Home/getAccordionMenu',
params: {
iMenuParentId: 0
},
method: 'post',
callback: function (options, success, response) {
//调用回调函数
alert(response);//
alert(response.responseText);
var json = Ext.decode(response.responseText);
var obj = Ext.decode(json).childrenItem;
addTree(obj);
// addTree(Ext.JSON.decode(response.responseText)); //将后台传送json字符串 转为对象
},
failure: function (response, opts) {
alert(response.responseText);
console.log('server-side failure with status code ' + response.status);
}
});
二、配置web.config
1、在Web工程中添加web.config xml配置文件
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=152368
-->
<configuration>
<configSections>
<!--Spring 配置节点id-->
<sectionGroup name="spring">
<!--这里的context属性和winform程序不一样,因为是mvc3web程序所以改为MvcContextHandler-->
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3"/>
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
</sectionGroup>
<!--Log4net 日志配置节点id-->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
<!--配置文件中定义了关于数据访问的一些配置参数,以备以后使用-->
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>
</configSections>
<spring>
<context>
<!--第一种 表示在app.config配置文件的<spring><objects>配置节内部定义了<object />托管对象。例如下面的 -->
<resource uri="config://spring/objects"/>
<!--第二种最常用 读取嵌入在程序集中的配置文件 assembly://MyAssembly/MyProject+package/xml -->
<!--Dao-->
<resource uri="assembly://Dao/Dao.Config/Dao.xml"/>
<!--Service-->
<resource uri="assembly://Service/Service.Config/Service.xml"/>
<!--Web-->
<!--第二种第三种从web 的Context中获取这里的配置xml属性不要写成嵌入式的改成context的 -->
<resource uri="file://~/Config/Controller.xml"/>
<!--<resource uri="assembly://Web/Web.Config/Controller.xml"/>-->
</context>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
</parsers>
<!--第一种就是把Dao.xml的托管对象内容贴到这里App.config 在Context配置节中作如下指示-->
<objects xmlns="http://www.springframework.net">
<description>An example that demonstrates simple IoC features.</description>
<!--<object id="Form1" type="WinForm.Form1">-->
<!--</object>-->
</objects>
</spring>
<!-- These properties are referenced in Dao.xml -->
<!--配置文件中定义了关于数据访问的一些配置参数,以备以后使用-->
<databaseSettings>
<add key="db.datasource" value="127.0.0.1"/>
<add key="db.user" value="root"/>
<add key="db.password" value=""/>
<add key="db.database" value="ralasafe"/>
</databaseSettings>
<!--log4net 配置节点id对应具体的配置文件位置-->
<log4net>
<!--控制台输出日志-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %logger - %message%newline"/>
</layout>
</appender>
<!--文件日志输出-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="Logs/Log.log" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10" />
<param name="MaximumFileSize" value="10MB" />
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<param name="datePattern" value="yyyy-MM-dd HH:mm" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<!--默认日志输出级别根节点,其它没有写的话都继承这个Set default logging level to DEBUG-->
<root>
<level value="DEBUG"/>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
<!--设置其他插件日志输出Set logging for Spring. Logger names in Spring correspond to the namespace-->
<logger name="Spring">
<level value="DUBUG"/>
</logger>
<logger name="Spring.Data">
<level value="DUBUG"/>
</logger>
<logger name="NHibernate">
<level value="DUBUG"/>
</logger>
</log4net>
<appSettings>
<!-- 在appsettings中一定要加这句话,用于注册NHibernate的SessionFactory-->
<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory"/>
<!--<add key="ClientValidationEnabled" value="true"/>-->
<!--<add key="UnobtrusiveJavaScriptEnabled" value="true"/>-->
</appSettings>
<system.web>
<!--用于注册spring.net和nhibernate-->
<!-- Spring 提供的 Module -->
<httpModules>
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
<!--
由 Spring 自动打开会话,必须提供一个名为 SessionFactory 的会话工厂
使用后,可以使用 SessionFactory 的 GetCurrentSession 方法获取会话
-->
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/>
</httpModules>
<httpHandlers>
<!-- Spring 提供的处理程序 -->
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
<!-- 取消 Spring.NET 对于 Web 服务的处理 -->
<add verb="*" path="*.asmx" type="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web"/>
<add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/>
</httpHandlers>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages"/>
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
2、Dao.xml配置文件下面红色标注的地方必须注意不同版本可能有所区别,文档上的跟新不是很及时有些东西是老的容易出错。还是要看版本更新列表说明。
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:db="http://www.springframework.net/database">
<!-- Referenced by main application context configuration file -->
<description>
The Northwind object definitions for the Data Access Objects.
</description>
<!-- 用来读取Web.config中设置的databaseSettings 可以给下面的db:provider引用-->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object>
<!-- Database Configuration -->
<db:provider id="DbProvider"
provider="MySql-5.2.3"
connectionString="Data Source=${db.datasource};Database=${db.database};User Id=${db.user};Password=${db.password};"/>
<!--connectionString="Data Source=127.0.0.1;Database=kasai;User Id=root;Password="/>-->
<!-- NHibernate Configuration -->
<object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate32">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<!--mapping所在程序集-->
<value>Domain</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<!--配置属性不同版本key和value可能都不一样文档上的跟新不是很及时有些东西是老的容易出错。还是要看版本更新列表说明-->
<entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="dialect" value="NHibernate.Dialect.MySQL5Dialect"/>
<entry key="connection.driver_class" value="NHibernate.Driver.MySqlDataDriver"/>
<entry key="use_proxy_validator" value="false" />
</dictionary>
</property>
<!-- provides integation with Spring's declarative transaction management features -->
<!--允许您使用Spring的声明式事务 区别于编程式事务不需要在代码中写事务commit-->
<property name="ExposeTransactionAwareSessionFactory" value="true" />
</object>
<!-- Transaction Management Strategy - local database transactions -->
<!-- 配置事务管理策略,本地数据库事务 -->
<object id="transactionManager"
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
</object>
<!-- Exception translation object post processor-->
<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/>
<!-- Data Access Objects -->
<object id="RalasafeRoleDao" type="Dao.InterfaceImpl.RalasafeRoleDao, Dao">
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
</object>
</objects>
2.3 Servcie.xml 配置
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:tx="http://www.springframework.net/tx">
<!-- Referenced by main application context configuration file -->
<description>
The service layer definitions
</description>
<!-- Property placeholder configurer for database settings -->
<object id="RalasafeRoleService" type="Service.InterfaceImpl.RalasafeRoleService, Service">
<property name="RalasafeRoleDao" ref="RalasafeRoleDao"/>
</object>
<!--支持事务的特性,可以在代码中使用注解写事务-->
<tx:attribute-driven/>
</objects>