springSide3框架的笔记
首先,从官网下载的springSide3并不具备我所需要的jar包,几个列子和我的编写习惯有很大冲突。
仔细观察目录结构发现无法像struts2.0一样,把列子改一下就可以架设成功了。
没办法,下载包用处不是很大,还是看文档把——http://wiki.springside.org.cn/display/springside3/Home。
在文档中,首先看到了“快速开发指南”,进去看看。
一键式安装,唉,没兴趣,看看别的。
还是看看“完全技术参考手册”吧,进去后看到。
1. 总述
2. 持久化
2. Web
3 企业服务
4.常见事项
5 开发过程
不用说先看看前四项把,只是看看而已。
好了,5分钟到了 看完了把。开始实践把。
开始看第五项“开发实践指南 ”,
重点在这里:
1. SpringSide风格项目
进去后:
一、原理
SpringSide使用maven的archetype插件 进行项目生成,新版的archetype2.0插件比以往有了大幅提升。
SpringSide3.0在archtypes目录里存放使用Velocity语法的项目模板。
新生成的项目中将包含保证能跑起来的项目骨架、配置文件与示例代码。
二、预要求
- 设置环境变量JAVA_HOME指向JDK5.0安装目录。
- 下载Maven2.0.9 (all in one版已自带),并在环境变量PATH中添加 maven下载目录/bin。
- 初始化SpringSide,双击bin/install.bat安装springside-core.jar 和两个archetype项目。
三、步骤
- 双击bin/new-project.bat,按提示输入参数。
- 在tools/generator/generated-project目录下将生成新项目。
- 进行必要的配置,如修改数据源,参考Hibernate 。
- 将项目加入版本管理系统向团队分发项目。
如果不打算在团队中使用maven,使用copy-jar.bat命令初始化依赖的jar到/webapp/WEB-INF/lib中,并将这些jar加入版本管理系统。
五、生成结果
- maven的pom.xml 及maven格式的目录结构。
- Eclipse 3.4.1 for JavaEE 项目文件,含符合maven格式的目录设置,UTF-8及JDK1.5设置等。
- 配置文件范例
- 源代码范例
SpringSide使用maven的archetype插件 进行项目生成的,不过我可不喜欢用maven 开发项目,没办法先生成个例子项目把(Struts真好,复制,粘贴,项目就是我的了 哈哈)。
按照步骤三的方法,经过漫长的等待,终于生成了一个例子项目。
导入到eclipse,晕死 目录还真乱,我要改造他,当然也可以不改造,我只是想让他看起来更舒服。
刚生成时的目录结构:
改造后的目录结构。
好了,顺眼了,看看他都有什么东西吧。
1.user增删改差示例。
2.权限的示例。
先不管这些,先看看配置文件:
1.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:jee = "http://www.springframework.org/schema/jee" xmlns:tx = "http://www.springframework.org/schema/tx"
- xmlns:context = "http://www.springframework.org/schema/context"
- xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
- default-lazy-init = "true" >
- < description > Spring公共配置文件 </ description >
- <!-- 定义受环境影响易变的变量 -->
- < bean class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
- < property name = "systemPropertiesModeName" value = "SYSTEM_PROPERTIES_MODE_OVERRIDE" />
- < property name = "ignoreResourceNotFound" value = "true" />
- < property name = "locations" >
- < list >
- < value > classpath:application.properties </ value >
- < value > classpath:application.local.properties </ value >
- <!-- <value>file:/var/myapp/application.server.properties</value> -->
- </ list >
- </ property >
- </ bean >
- <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
- < context:component-scan base-package = "cn.xxn" />
- <!-- 数据源配置,在开发测试环境直连数据库 -->
- < bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource" >
- < property name = "driverClassName" value = "org.gjt.mm.mysql.Driver" />
- < property name = "url" value = "jdbc:mysql://localhost:3306/FMS?generateSimpleParameterMetadata=true&useUnicode=true&characterEncoding=UTF-8" />
- < property name = "username" value = "root" />
- < property name = "password" value = "123456" />
- </ bean >
- <!-- 数据源配置,在生产环境使用应用服务器的数据库连接池 -->
- <!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" />-->
- <!-- Hibernate配置 -->
- < bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
- < property name = "dataSource" ref = "dataSource" />
- < property name = "namingStrategy" >
- < bean class = "org.hibernate.cfg.ImprovedNamingStrategy" />
- </ property >
- < property name = "hibernateProperties" >
- < props >
- < prop key = "hibernate.dialect" > org.hibernate.dialect.MySQLDialect </ prop >
- < prop key = "hibernate.show_sql" > ${hibernate.show_sql} </ prop >
- < prop key = "hibernate.cache.provider_class" > org.hibernate.cache.EhCacheProvider
- </ prop >
- < prop key = "hibernate.cache.provider_configuration_file_resource_path" > ${hibernate.ehcache_config_file} </ prop >
- < prop key = "hibernate.hbm2ddl.auto" > update </ prop >
- </ props >
- </ property >
- < property name = "packagesToScan" value = "cn.xxn.entity.*" />
- </ bean >
- <!-- 事务管理器配置,单数据源事务 -->
- < bean id = "transactionManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >
- < property name = "sessionFactory" ref = "sessionFactory" />
- </ bean >
- <!-- 事务管理器配置,多数据源JTA事务-->
- <!--
- < bean id = "transactionManager" class ="org.springframework.transaction.jta.JtaTransactionManager or
- WebLogicJtaTransactionManager" />
- -- >
- <!-- 使用annotation定义事务 -->
- < tx:annotation-driven transaction-manager = "transactionManager" />
- </ beans >
<?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:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> <description>Spring公共配置文件</description> <!-- 定义受环境影响易变的变量 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="ignoreResourceNotFound" value="true" /> <property name="locations"> <list> <value>classpath:application.properties</value> <value>classpath:application.local.properties</value> <!-- <value>file:/var/myapp/application.server.properties</value> --> </list> </property> </bean> <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --> <context:component-scan base-package="cn.xxn" /> <!-- 数据源配置,在开发测试环境直连数据库 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/FMS?generateSimpleParameterMetadata=true&useUnicode=true&characterEncoding=UTF-8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> <!-- 数据源配置,在生产环境使用应用服务器的数据库连接池 --> <!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" />--> <!-- Hibernate配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="namingStrategy"> <bean class="org.hibernate.cfg.ImprovedNamingStrategy" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider </prop> <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file}</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <property name="packagesToScan" value="cn.xxn.entity.*" /> </bean> <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 事务管理器配置,多数据源JTA事务--> <!-- <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager or WebLogicJtaTransactionManager" /> --> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> </beans>
生成的很完美,我只需要改下数据源配置就可以了。
注意:在sessionFactory中
- < property name = "packagesToScan" value = "cn.xxn.entity.*" />
<property name="packagesToScan" value="cn.xxn.entity.*" />
恩,太爽了,这个目录下实体文件都会被映射,不用像以前一样添加实体了。这样一来,这个文件我们以后不用动他了。
2.struts.xml
- <? xml version = "1.0" encoding = "UTF-8" ?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
- "http://struts.apache.org/dtds/struts-2.1.dtd" >
- < struts >
- < constant name = "struts.convention.default.parent.package" value = "crud-default" />
- < constant name = "struts.convention.package.locators" value = "web" />
- < package name = "crud-default" extends = "convention-default" >
- <!-- 基于paramsPrepareParamsStack,增加store interceptor -->
- < interceptors >
- < interceptor-stack name = "crudStack" >
- < interceptor-ref name = "store" >
- < param name = "operationMode" > AUTOMATIC </ param >
- </ interceptor-ref >
- < interceptor-ref name = "paramsPrepareParamsStack" />
- </ interceptor-stack >
- </ interceptors >
- < default-interceptor-ref name = "crudStack" />
- </ package >
- <!--
- 使用ZeroConfig + CodeBehind插件,实现约定大于配置的零配置文件风格.
- 特殊的Result路径在Action类中使用@Result设定.
- -- >
- </ struts >
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.convention.default.parent.package" value="crud-default" /> <constant name="struts.convention.package.locators" value="web" /> <package name="crud-default" extends="convention-default"> <!-- 基于paramsPrepareParamsStack,增加store interceptor --> <interceptors> <interceptor-stack name="crudStack"> <interceptor-ref name="store"> <param name="operationMode">AUTOMATIC</param> </interceptor-ref> <interceptor-ref name="paramsPrepareParamsStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="crudStack" /> </package> <!-- 使用ZeroConfig + CodeBehind插件,实现约定大于配置的零配置文件风格. 特殊的Result路径在Action类中使用@Result设定. --> </struts>
这个配置也很强大,在不用对Action进行配置了。
疑问1,如何跳转。简单,例如:UserAction中有方法
- public String school() throws Exception {
- return "school" ;
- }
public String school() throws Exception {
return "school";
}
他就会跳转到user-school.jsp中。
哪么为什么会这样呢?
你会在lib中发现struts2-convention-plugin-2.1.6.jar,没错就是他干的。怎么实现的?我怎么知道。
- 从struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。
- * 包命名习惯来指定Action位置
- * 命名习惯制定结果(支持JSP,FreeMarker等)路径
- * 类名到URL的约定转换
- * 包名到命名空间(namespace)的约定转换
- * 遵循SEO规范的链接地址(即:使用my-action 来替代 MyAction)
- * 基于注解的Action名
- * 基于注解的拦截机(Interceptor)
- * 基于注解的命名空间(Nameespace)
- * 基于注解的XWork包
- * 默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products 或
- com.example.actions.products.Index进行处理)
- 无需配置Convention即可使用Convention,Convention的某些约束习惯可以通过配置属性来控制,
- 您也可以在类中覆写其中的方法来达到扩展目地。
从struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。
* 包命名习惯来指定Action位置
* 命名习惯制定结果(支持JSP,FreeMarker等)路径
* 类名到URL的约定转换
* 包名到命名空间(namespace)的约定转换
* 遵循SEO规范的链接地址(即:使用my-action 来替代 MyAction)
* 基于注解的Action名
* 基于注解的拦截机(Interceptor)
* 基于注解的命名空间(Nameespace)
* 基于注解的XWork包
* 默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products 或
com.example.actions.products.Index进行处理)
无需配置Convention即可使用Convention,Convention的某些约束习惯可以通过配置属性来控制,
您也可以在类中覆写其中的方法来达到扩展目地。
疑问2,我要是跳转到别的ACTION去,不到页面怎么办。
嘻嘻,当然可以,不过这些东西不会让你去改变配置文件的。
你可以写在这里:
- @Results ({
- @Result (name = CRUDActionSupport.RELOAD, location = "user.action?page.pageParam=${page.pageParam}" , type = "redirect" ) ,
- })
- public class UserAction extends CRUDActionSupport<User> {
@Results({
@Result(name = CRUDActionSupport.RELOAD, location = "user.action?page.pageParam=${page.pageParam}", type = "redirect") ,
})
public class UserAction extends CRUDActionSupport<User> {
不要说你不知道这是什么位置。
你可以写多个
- @Result (name = CRUDActionSupport.RELOAD1, location = "user.action?page.pageParam=${page.pageParam}" , type = "redirect" ) ,
- @Result (name = CRUDActionSupport.RELOAD2, location = "user.action?page.pageParam=${page.pageParam}" , type = "redirect" ) ,
@Result(name = CRUDActionSupport.RELOAD1, location = "user.action?page.pageParam=${page.pageParam}", type = "redirect") ,
@Result(name = CRUDActionSupport.RELOAD2, location = "user.action?page.pageParam=${page.pageParam}", type = "redirect") ,
其中,name:方法的返回值。 location:跳转的方法或页面。
简单把。