- 浏览: 341343 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (139)
- Java (49)
- C# (23)
- 软件实施 (1)
- Mysql (8)
- Struts2&1.x (15)
- DWR (0)
- Javascript (7)
- Effective Java (8)
- Oracle (0)
- SqlServer (1)
- Spring (6)
- 数据结构 (2)
- 设计模式 (0)
- Hibernate (6)
- c++ (2)
- Qt (1)
- 瞎侃几句 (5)
- Openbravo2.5实施记录 (3)
- 工作总结 (6)
- 软件测试 (3)
- css (1)
- Android (13)
- Object-c (0)
- Html5 (1)
- jshoper开源项目 (34)
- Windows Phone (1)
- activiti (2)
最新评论
-
yzlseu:
没有思考,就是抄的,垃圾文章
Activiti5用户手册---Message Event Definitions -
yy756127197:
<timeDuration>P10D</ti ...
Activiti5用户手册---Events---Timer Event Definitions -
云端帕帕:
Activiti5用户手册---Events---Timer Event Definitions -
raychiong:
lz现在哪里高就呢?
记录一次高德软件面试经历 -
sdywcd:
water_quite 写道sdywcd 写道water_qu ...
jshoper3x在线商城系统更新说明及未来开发计划
首先我要感谢下【北京-痕迹】同学在这个过程中的帮助,让我能及时完成这部分工作。也让产品有了一个新的版本,新的编码体验。接下来就说下基本情况和过程吧!
本分分为如下几个部分:
A, 原始版本介绍
B, 注解版本介绍
C, 注解过程疑难问题总结
开源地址:http://code.google.com/p/ostocy-jshop/ 完全开源
A, 原始版本是基于struts2+spring2.5+hibernate3+freemarker构件的。完全没有使用注解,所以在整个编码从dao到action的过程都需要在applicationContext.xml和多个struts.xml中配置(我为了区分业务,定义了多个struts2的配置文件)。
对于团队合作开发来说太多配置文件每次加入新方法都需要修改是很不好的,很容易造成svn的冲突。
B, 注解版本的构件也是基于原始版本的,但是使用了注解。具体使用了spring的注解给类进行依赖注入,用struts2的注解完成页面控制和拦截器设定。本来有想过想用spring mvc代替action层,但是这样会破坏了现有较为完好的逻辑和页面控制。所以放弃了。再者个人对spring mvc 不怎么熟悉。
这里来一个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" 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/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" default-autowire="byName"> <aop:aspectj-autoproxy> </aop:aspectj-autoproxy> <context:component-scan base-package="com.jshop" /> <context:annotation-config /> <context:property-placeholder location="classpath*:*.properties" /> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc.driver}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="initialPoolSize" value="${pool.initialPoolSize}" /> <property name="minPoolSize" value="${pool.minPoolSize}" /> <property name="maxPoolSize" value="${pool.maxPoolSize}" /> <property name="maxIdleTime" value="${pool.maxIdleTime}" /> <property name="acquireIncrement" value="${pool.acquireIncrement}" /> <property name="checkoutTimeout" value="${pool.checkoutTimeout}" /> <property name="maxIdleTimeExcessConnections" value="${pool.maxIdleTimeExcessConnections}" /> </bean> <!-- 邮箱服务器配置 --> <bean id="javamailsenderimpl" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="${email.host}"></property> <property name="defaultEncoding" value="${email.defaultEncoding}"></property> <property name="port" value="${email.port}"></property> <property name="username" value="${email.username}"></property> <property name="password" value="${email.password}"></property> <property name="javaMailProperties"> <props> <prop key="mail.smtp.auth">${email.auth}</prop> <prop key="mail.smtp.timeout">${email.timeout}</prop> </props> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="mappingDirectoryLocations"> <list> <value>classpath:com/jshop/entity</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <aop:config> <aop:advisor pointcut="execution(* com.jshop.action.service.*Service.*(..))" advice-ref="txAdvice"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="query*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="load*" read-only="true"/> <tx:method name="*" rollback-for="Exception"/> </tx:attributes> </tx:advice> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <!-- 配置异步线程执行器 --> <!-- 为异步线程执行器 进注入 --> <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!-- 设置核心池子的大小 --> <property name="corePoolSize" value="10"></property> <!-- 设置最大池子的大小 --> <property name="maxPoolSize" value="30"></property> </bean> </beans>
从上到下,依次的内容解释为
<!--[if !supportLists]-->1, <!--[endif]-->default-autowire="byName" 要求spring按照name来依赖注入而不是类型。
<!--[if !supportLists]-->2, <!--[endif]-->context:component-scan base-package="com.jshop" 要求spring去扫描com.jshop下得所有类去解释注解。
<!--[if !supportLists]-->3, <!--[endif]-->context:property-placeholder location="classpath*:*.properties" 要求spring检索web-info下得文件,这里主要是给下面的数据库和邮箱信息提供了properties形式的保存而已。
<!--[if !supportLists]-->4, <!--[endif]--><value>classpath:com/jshop/entity</value> 要求spring去搜索这个目录下得所有数据库映射文件,以前都是一个一个写的,现在让他自己搜索去,省事点。
<!--[if !supportLists]-->5, <!--[endif]-->com.jshop.action.service.*Service.*(..))" advice-ref="txAdvice"/>这个就是事务管理了,在service进行事务的回滚
<!--[if !supportLists]-->6, <!--[endif]--> <bean id="taskExecutor" 是邮件发送,是用的线程发送。
接下来是摘录部分类的注解了
Dao层
@Repository("articleCategoryTDaoImpl") public class ArticleCategoryTDaoImpl extends HibernateDaoSupport implements ArticleCategoryTDao {
继承HibernateDaoSupport 就不用注入hibernateTemplate了
Service 层
@Service("articleCategoryTServiceImpl") @Scope("prototype") public class ArticleCategoryTServiceImpl implements ArticleCategoryTService { @Resource(name="articleCategoryTDaoImpl") private ArticleCategoryTDaoImpl articleCategoryTDaoImpl; public ArticleCategoryTDaoImpl getArticleCategoryTDaoImpl() { return articleCategoryTDaoImpl; }
Action层@ParentPackage("jshop")
@Controller("articleCategoryTAction") public class ArticleCategoryTAction extends ActionSupport { @Resource(name = "articleCategoryTServiceImpl") private ArticleCategoryTServiceImpl articleCategoryTServiceImpl;
接下来是struts.xml了
<!--开发状态 --> <constant name="struts.devMode" value="true" /> <!-- 配置文件重新加载 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- convention类从新加载 --> <constant name="struts.convention.classes.reload" value="true" /> <!-- 主题 --> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.custom.i18n.resources" value="globalMessages" /> <constant name="struts.i18n.encodeing" value="UTF-8" /> <constant name="struts.convention.result.path" value="/" /> <package name="jshop" extends="json-default" > <interceptors> <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor" /> <!-- 新增登录验证拦截器 --> <interceptor name="authoritylogin" class="com.jshop.action.interceptor.impl.AuthorityLogininterceptor"></interceptor> <!-- 定义全部变量拦截器!是否开启用户注册 --> <interceptor name="isusercanregister" class="com.jshop.action.interceptor.impl.MyIsusercanregisterInterceptor" /> <!-- 定义全局变量拦截器 是否允许用户注册多个商城信息 --> <interceptor name="canuserregistermoreshopinfo" class="com.jshop.action.interceptor.impl.CanuserregistermoreshopinfoInterceptor"></interceptor> <!-- 定义全局变量拦截器是否允许发送激活邮件 --> <interceptor name="issendactivatemail" class="com.jshop.action.interceptor.impl.Issendactivatemail" /> <interceptor-stack name="jshopdefaultStack"> <!-- 将登录验证拦截器加入默认的拦截器栈中 --> <interceptor-ref name="authoritylogin"> <param name="excludeMethods">adminlogin,uploadFiles,findAllCoupon,loginforAndroid,registerforAndroid</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="json"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="jshopdefaultStack" /> <global-results> <result name="login" type="redirect">/jshop/admin/jump.jsp</result> <result name="isusercanregister">/usercenter/warning/warningmsg.jsp</result> <result name="canuserregistermoreshopinfo">/jshop/admin/error/adminerror.jsp </result> </global-results> <!-- 验证码 --> <action name="randomchecknum" class="com.jshop.tools.RandomCheckNumAction"> <result type="stream"> <param name="contentType">image/jpeg</param> <param name="inputName">inputStream</param> </result> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package>
解释如下
1,<constant name="struts.convention.result.path" value="/" /> 这个很重要,告诉struts2我所有可以跳转的页面在项目根目录下。
2,<package name="jshop" extends="json-default" >这个package和action中的package要一致,因为这个影响到拦截器的作用域。
C,注解过程疑难问题总结
1, 注解默认的依赖注入对象是首字母小写的类名@Repository("articleCategoryTDaoImpl")对应的dao层的类就是ArticleCategoryTDaoImpl
2, Struts2配置文件中的拦截器作用域是和package有关的,所有action类都要统一package和struts.xml一致。
3, Struts2的注解中有namespace注解,这个注解是会影响页面跳转的,应该是url了的显示问题,我这里没有用。需要在研究下。
4, Struts2我继承了json-default,所以绝大部分action层的struts2的@Action没有显示的跳转页面,我都让前台的js做了页面控制。
发表评论
-
看了一些git教程后自己的总结
2014-04-24 12:45 1292平时在维护开源程序 ... -
android在布局中动态增加view时的层级控制
2014-03-24 14:40 33896问题:我们有时候希望动态的在android的布局中增加vi ... -
android 在配置文件中指定上级activity
2013-12-07 23:47 1404今天在看sdk doc时发现可以在配置文件中定义一个acti ... -
android button 点击事件
2013-12-06 11:49 1112<Button android:layou ... -
在eclipse 4.2中配置tomcat插件并修改jvm启动参数
2013-06-04 12:31 4708情况:今天在运行项目的时候发现需要一个比较大的内存才能够完成 ... -
搜寻了关于android推送资料后的一些思考
2013-04-11 22:23 1627其实我们要用推送服务的情况还挺多: 1,站内性 其实是可以 ... -
java中集合的父类collection的那些事
2013-04-10 18:02 01,collection是所有集合的父类 2,Li ... -
有那些设计模式,观察者模式是什么
2013-04-09 15:41 0设计模式还挺多的。可以分成如下几类 创建模式: ... -
写一个线程安全的单例模式
2013-04-08 23:30 1672谢谢 http://blog.sina.com.cn/s/b ... -
ThreadLocale是什么
2013-04-07 21:53 1055维持线程封闭性的一种更规范的方法是用ThreadLocal, ... -
如何保证线程安全 实现线程安全有那些方法
2013-04-07 20:45 73401,如何保证线程安全 不在线程之间共享状态变量 将状态 ... -
final搞不清的那些事
2013-04-07 19:44 884面试老是问final,finally ... -
java 拦截器和过滤器区别(转载)
2013-04-06 21:21 19061、拦截器是基于java的反射机制的,而过滤器是基于函数回 ... -
struts默认提供了那些拦截器
2013-04-06 21:07 1207如下是struts-default.xml中的部分内容,主 ... -
spring aop的实现原型模拟
2013-04-06 20:59 977我们都知道spring的配置文件中可以进行声明式事务管理,其 ... -
jdk动态代理
2013-04-06 17:38 781以下的内容是从 http://www.blogjava.n ... -
org.springframework.transaction.CannotCreateTransactionException: Could not open
2013-01-11 11:51 11060一客户和我说,服务器报错了, org.springframe ... -
ubuntu12下安装jdk
2012-09-26 14:17 1324这几天 我 忽然想在ubuntu12下进行java web 的 ... -
TabHost整合Listview进行数据显示和单独准确绑定listview中的控件
2012-08-21 16:05 4752情况:最近ostocy-jshop这个开源项目,一直在进行pa ... -
ostocyjshop模板体系功能说明
2012-08-09 13:24 1414ostocy-jshop的模板体系介绍。 1,osto ...
相关推荐
sdywcd-ostocy-jshop 是Android平台下的在线商城程序,内有详细介绍!
NULL 博文链接:https://sdywcd.iteye.com/blog/1617013
ostocy-jshop的功能会陆续移植到jshoper3x中 欧斯塔克在线商城系统 基于java技术开发有如下特性: 1,使用spring + hibernate + struts2 + freemarker + jquery + css开发 2,在服务端有部分为android设备提供的...
人工智能-深度学习-tensorflow
人工智能毕业设计&课程设计
基于ssm的中小型企业财务管理录系统.zip
这个资源是一个基于Spring Boot和MySQL的洗衣店订单管理系统的完整源码。它包括了所有的源代码文件,以及一个详细的文档,可以帮助你理解和运行这个系统。这个系统的主要功能包括:用户注册和登录,下单,查看订单,修改订单,删除订单等。用户可以在系统中选择洗衣服务,然后提交订单。系统会自动计算订单的总价,并将其显示在用户的订单列表中。用户还可以查看自己的历史订单,以及每个订单的详细信息。此外,系统还包括了一个管理员模块。管理员可以查看所有的订单,以及对订单进行管理。他们可以修改订单的状态,例如将订单标记为已完成,或者取消订单。这个系统使用了Spring Boot框架,这是一个非常流行的Java开发框架,它可以帮助你快速地开发和部署应用程序。同时,系统也使用了MySQL数据库,这是一个广泛使用的关系型数据库,它可以存储大量的数据,并提供高效的查询功能。总的来说,这个资源是一个非常完整的洗衣店订单管理系统的源码,它可以帮助你理解如何使用Spring Boot和MySQL来开发一个实际的应用程序。无论你是正在学习Java编程,还是已经有一定的开发经验,都可以从这个资源中学到很多有用的知识和技能。
W9825G6KH-6I SDRAM,256Mb(32MB,16Mbx16),3.3v 动态随机存取存储器
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
人工智能毕业设计&课程设计
asp代码ASP基于web的学校新闻发布系统开发(论文+源代码+开题报告+文献综述+外文翻译)本资源系百度网盘分享地址
三菱PLC例程源码PLC 气压程式本资源系百度网盘分享地址
三菱PLC例程源码PLC通过RS485 对FR系列变频的控制本资源系百度网盘分享地址
基于ssm的学生档案管理系统.zip
这是一个基于Java语言开发的elfinder 2.x版本Web文件管理器后端设计,包含63个文件,其中主要文件类型包括49个Java源文件、3个XML文件、2个PNG图片文件、2个Markdown文档、1个gitattributes文件、1个gitignore文件、1个LICENSE文件、1个Properties文件、1个types文件和1个未知类型的文件。该项目提供了丰富的文件管理功能,包括自定义文件视图和自定义文件操作,为用户提供了高效、便捷的文件管理体验。
使用DS Client在PPT中动态展示分子三维结构
基于ssm+vue的汽车站车辆运管系统.zip
算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
DS在生物药物领域的解决方案
三菱PLC例程源码SBR废水处理本资源系百度网盘分享地址