vjkoljl

来源:互联网 发布:87版红楼梦配乐知乎 编辑:程序博客网 时间:2024/06/06 03:26

    本文仅供新人参考,求大神莫喷,如果有错误的地方,希望能够指正,谢谢!

首先,假设你刚来项目组,首先了解你今后的工作就要与这些技术打交道。Java  struts  spring hibernate  http  nginx mysql    先混个脸熟吧。

再了解程序的输入输出。

Ctrl+alt+shift+a   出现一块白板

在底下的一行输入action  按enter键

这样你就能看到调用的接口,就是输入

假设你打开邮件:

出现   mail!getMailList.action参数{currentPage:0}

这个效果等同于你在浏览器上输入

10.5.10.47:8080/Game/mail!GetMailList.action?currentPage=0

这个效果等同于执行MailAction类里面的getMailList方法

输入参数 page =0

输出:

在白板最底行输入data  按enter

在“前1条通信数据”和前2条通信数据之间的数据就是输出。

我相信你已经晕头转向了。但是当你熟悉游戏以后,就会觉得它们很亲切。你现在要做的就是不停的玩游戏,熟悉每一个你的操作它调用的接口(在底下的一行输入action   按enter键然后你才能看到)。如果你已经做到的话,就该去熟悉它的输出数据了

 

好吧,写程序就如同以前一样,你的职责就是根据输入编写程序得到符合要求的输出。

你首先看整个项目的概览,发现很多类以action结尾,还有以service结尾的,还有以dao结尾的,dto结尾的,还有以player开头的,还有以cache结尾的,还有以constants结尾的。对了,你的工作就是编写这些形式的类。

 

先来看看项目整体情况。

整个项目的架构是大名鼎鼎的struts、spring、hibernate三大框架。

Hibernate对应dao层(Data Access Object

spring对应service

struts对应action

 

Spring采用依赖注入和面向切面编程。

service是action和dao的中间层,service调用dao,action调用service

Service才是真正的业务逻辑接口,DAO是连数据库的具体操作,action是用来调用service接口的。

好吧,其实你在action的类里面做的工作貌似千篇一律,就是调用的service不同。

比如getMailList()方法中

mailService.getMailByPlayerId(dto.getPlayerId, page);

之前传的参数currentPage = 0

你会看到一个方法setCurrentPage(快捷键ctrl+o查找方法)

就是这个方法将你在浏览器传的数据赋值给currentPage变量的。这就是传说中的依赖注入。

 

在service的方法中你要做的就是调用dao层,你要做的是增删改查。

create ,delete,set方法+update  ,HQL。HQL类似sql,你先看看mail.java这个类,你会发现类的名字对应数据库的表名,类的成员就对应数据库的列。这就是HQL和SQL的区别。

 

 Struts:作为基于 MVC 模式的 Web 应用最经典框架,两个项目Struts 和webwork已经集成,成为现在的Struts2。

Spring: 是一个轻型的容器,利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起。每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。

Hibernate 是一个纯 Java 的对象关系映射和持久性框架,它允许您用 XML 配置文件把普通Java 对象映射到关系数据库表。使用 Hibernate 能够节约大量项目开发时间,因为整个 JDBC 层都由这个框架管理。这意味着您的应用程序的数据访问层位于 Hibernate 之上,完全是从底层数据模型中抽象出来的。Hibernate就是来代替jdbc操作的。

 

我们用Struts实现从Web网页、as前端(MVC中的View)到后台系统的映射(Action),然后由Spring管理这些Action,把它们作为Bean和其他对象一起处理。这些Bean之间处理业务逻辑、数据、系统状态等,且它们被Spring统一管理,为了区分,就算大概包括MVC的MC部分吧。然后需要持久化的数据由Spring和Hibernate之间的接口交由Hibernate处理(这个属于持久层)。

 

你在service层要做的就是三件事,调用dao层的方法,逻辑处理,传递输出数据。对了,输出使用xml的。前端后端之间传输使用http协议的。

每一个数据库都对应一个类,然后还有classname.hbm.xml

数据库分为动态库和静态库,他们的区别是动态库的类名前面有个player

静态库不仅有个classname.java还有个classnameCache.java

    为什么要有个classnameCache.java类呢。在tomcat启动的时候会执行这些类,将数据库里面的数据存到内存里面去,具体就是放到这些classnamecache类里面。这样程序就不用读取数据库,直接读取classnamecache里面的内容就行。

    Dao这个名字非常形象的描述了Dao在应用程序中所扮演的角色。DAO提供了数据读取和写入到数据库中的一种方式。它们应该以接口的方式发布功能,而应用程序的其他部分就可以通过接口来进行访问了。接口就是你看到的  I*Dao  类,这种类同样在项目里面随处可见。这里就是接口反转了。

 

服务对象通过接口来访问DAO。这样做会有几个好处。首先,它使得服务对象易于测试,因为它们不再与特定的数据访问实现绑定在一起。实际上,你可以为这些数据访问接口创建mock实现。这可以让你无需连接数据库就能测试服务对象,这会显著提升单元测试的效率并排除因数据不一致所造成的测试失败。

       数据访问层是以持久化技术无关的方式来进行访问的。持久化方式的选择独立于DAO,只有相关的数据访问通过接口来进行发布。这可以实现灵活的设计并使得切换持久化框架对应用程序其他部分所带来的影响最小。如果将数据访问层的实现细节渗透到应用程序的其他部分中,那么整个应用程序将与数据访问层耦合在一起,从而导致僵化的设计。

 

默认情况下,@Autowired具有强契约特征,其所标注的属性或参数必须是可装配的。如果没有bean可以装配到@Autowired所标注的属性或参数中,自动装配就会失望(抛出讨厌的NoSuchBeanDefinitionException)。这可能就是我们所期望的处理方式当自动装配无法完成时,让spring尽早结束,远胜于以后抛出NullPointerException异常。

       属性不一定要装配,null值也是可以接受的。在这种情景下,可以通过设置@Autowiredrequired属性为false来配置自动装配是可选的。例如:

@Autowiredrequired=false

private Instrument instrument;

       在这里,Spring将尝试装配instrument属性,但是如果没有查找到与之匹配的类型为Instrumentbean,应用就不会发生任何问题,而instrument属性的值为null

       Hibernate是在开发者社区中流行的持久化框架。它不仅提供了基本的对象关系映射,还提供了作为ORM对象关系映射  Object RelationalMapping)工具所具有的所有复杂功能,比如缓存、延迟加载、预先抓取以及分布式缓存。

 

Dto是干什么的,是不是多此一举?dto全称是data transport object,举个例子,写邮件的接口,从action传到service层的参数有title,toUser,content,mailType等,如果直接传递的话,方法的参数太多,容易出bug,而且没有可读性,把这些参数都传到dto的类里面,通过dto对数据的封装,那么传参数的时候只需要传dto就可以了,而且也保证了数据传输的安全性。

 

配置数据库

打开common-applicationContext.xml文件

有一行如下

Jdbc:mysql://127.0.0.1:3306/astd_yanwan_1?user=root&password=&characterEncoding=utf8

我的User为root ,password为空,数据库名称为astd_yaowan_1

 

生成hbm文件

    你按照mail.java那样写好程序之后,找到build.xml(ctrl+shift+r),在右边的outline找到hibernatedoclet,右键Run As ,右键ant build  。然后fresh  resources文件夹。那么classname.hbm.xml就生成好了。

 

    数据库建立联合索引

    当你的查询涉及到两个及以上字段的时候,你就要建立联合索引了。   

例如:String hql = “FROM PlayerToukui toukui” +”WHERE toukui.playerId = ?”

+”ANDtoukui.generalId =  ?”;

我建立的索引是  KEY ‘index1’ (‘player_id’,’type’);

 

修改语言包

在修改之前需要“更新”修改完之后要“提交”,然后需要执行copyproperties.py。执行python程序,按F9键。

 

         打包

好的,现在你已经做好模块了,是时候打个包给前端了,首先需要执行语言包脚本,然后与代码库做对比,看看有没有误操作的代码,最后打开build.xml

在右边的outline有个astd-jar,右键,Run As,1Ant Build。一个包就打好了。

 

         修改静态库

策划文档上的很多数据是要配置数据库的,在静态数据改动了之后呢,必须执行deploy.py。把这个文件拖到python.exe就行了,然后重启tomcat就好了。

 

       配置文件

例如接口mail!getMailList.action参数{currentPage:0}。

mail是哪里来的呢,在mys.xml文件里面有一行

<action  name = “mail” class = “com.xinyun.mail.action.MailAction”/>

就代表了mail就是执行MailAction里面的方法。

      

       测试战斗力数据

每次上线之前策划都要测试武将数据,那么打开BattleAction类搜索“测试”

既能够找到两个方法getPlayerArmyDatagetNpcArmyData将方法里面的注释去掉,打包就好了。

 

         如何提交代码

         在写代码模块之前必须“更新”代码,使得本地代码和svn代码一致。在提交代码前,需要和资源库同步,选择项目,右键Team,右键“与资源库同步”,你可以看到和svn上面代码和本地代码的差别,如果是你自己新加的类,就直接”提交”。如果是别人新添加的类,就“更新”。遇到冲突,就要看到冲突代码的地方,自己手动解决。在这个过程中需要仔细和svn的代码做对比,防止误删代码和误加代码,直到本地代码与svn代码一致。

  

缓存

为什么用缓存,在程序中可能需要频繁取数据库里面的数据,但是读取数据库是很耗性能的。如果这次要取的数据和上次要取的数据一样,那么只需要用上次的数据就可以了。这里要用到concurrenthashmap,concurrenthasomap是线程安全的。每次取数据的时候先取cache中的数据,如果取不到,再从数据库中取,把取到的数据放入cache中,在改变数据的时候,要记得将cache中这个玩家的数据清除掉,因为那里的数据已经过期了,过期了就应该扔掉。

 

         常用Eclipse快捷键

Ctrl+shift+o  去掉没用的引用包

Ctrl+shift+f   一键让代码规范

Ctrl+h 全文搜索

Ctrl+shift+R  搜索类与文件

Ctrl+shift+g  查找引用

Ctrl+d 删除整行

Ctrl+1 自动set,get

Ctrl+o 在类里面查找方法

 

Eclipse调试键  F5  F6 F7  F8

F5:跳入方法

F6:向下逐行调试

F7:跳出方法

F8:直接跳转到下一个断点

 

常见bug分析

 

caused byjava.lang.NullPointerException

              atjava.util.zip.ZipFile.<init>(ZipFile.java:106)

              atjava.util.zip.ZipFile.<init>(ZipFile.java:131)

这个bug的原因是你在启动tomcat的时候没有启动nginx

 

 

Unknown column class.field  in   ‘field list’

这个bug的原因是你在类的 hibernate.property  column =”” 所定义的名字与数据库

列的名字不一致导致的。

 

 

Write operations are not allowed in read-onlymode(FlushMode.NEVER/MANUAL):Turn your Session into FlushMode.COMMIT/AUTO orremove ‘readOnly’  from transactiondefinition

这个bug的原因是你在写service层的方法时没有加Transactional注解,加上@Transactional就好了

 

Java.lang.NullPionterException

这个bug是最常见的,有可能是接口传入的参数不符合要求,所以在service层对传入的参数要做严密的限制,避免因为非法参数导致程序报错。还有可能是对象为空,这就要求写程序的时候每次获取一个对象,都必须判断是否为空。还有可能是在service层需要调用dao层方法的时候,在定义接口的引用的时候没有加@autowired注解,这种情况就是报错行显示在调用dao方法的那一行。

 

Java.lang.Error:Unresolved compilationproblems:

这个可能是你修改了代码导致java无法动态编译,需要你重新启动Tomcat

 

Error creating bean with name ‘classCache’definedin file

这个可能是静态库对应的类的hbm文件没有生成

 

Org.springframework.orm.hibernate3.HibernateQueryException:classname is not mapped

这个可能是动态库对应的类的hbm文件没有生成。

0 0
原创粉丝点击