成欢驿位于牙山东北五十里处,系汉城南下之要道。地形上,成欢驿三面环山,一面临河,河的南北两岸分布大片沼泽和水田,与牙山相比,确实是一个易守难攻的防御阵地。主力部队移兵成欢驿后,剩下两营共一千人的兵力,叶志超派一个营驻守牙山,防止日军直插此地,自率一个营驻守交通要枢公州,保护撤退路线及辎重,同时等待援兵。
聂士成在成欢驿修筑了六座临时堡垒和防御工事,其间不断派出骑兵侦察日军动向。1894年7月28日,侦察骑兵向聂士成报告,日军已兵分两路,看样子一路是要截断公州退路,另一路则是会袭击成欢驿军营。聂士成立即进行迎敌准备,将淮军主要兵力层层部署在成欢驿驿道的两边,炮队则驻扎于西南山顶,以应对随时可能沿着大路进犯的日军。
当晚,日军果然向成欢驿军营实施袭击,其先头部队到一座叫佳龙里的村子里打探情况,但是没想到村子里早有伏兵——武备学堂出身的学生于光炘等人率数十名兵勇,就埋伏在村子里,敌人刚一进村,他们就给予了迎头猛击。
日军猝不及防,惊慌失措之下,急忙撤出村子,跳进水田,继而又撤到一处沼泽中,这才开始组织还击。占据优势地形的于部则继续猛烈射击,将日军死死地压制在沼泽中。
不幸的是,这一好的开局并没有能够继续延续下去。直到甲午战争前,中国依旧还没有实行近代征兵制,淮军的成军办法,仍是源自于湘军的募兵制。募兵制的最大特点是“兵归将有”,聂士成所统辖部队,由芦防淮勇、仁字虎勇、武备学堂队等几部分组成,除了武备学堂的学生外,兵勇都由营官、哨官分别招募而成,真正能指挥兵勇作战的也都是各自的营官、哨长,各部都需要持有预先命令,或者聂士成临时“往来策应”,才能做到相互协作。
佳龙里伏击战在作战预案之中,是于光炘等人抓住战机,临时发动的。在没有得到预先命令的情况下,其余各部深怕抽调援兵后,影响自己的防守,于是都只守着自己的一亩三分地,持观望态度,而因为情况紧急,聂士成又一时难以全部调度到位,以至于武备学堂队迟迟难以等到援兵。日军则无此弊端,指挥官武田秀山在判明村中伏兵人数并不多后,立即得以集中优势兵力,对佳龙里发起冲锋。
伏击战迅速沦为阻击战,于光炘等人双拳难敌四手,只得且战且退,最后在水田附近全部被日军狙杀,壮烈殉国。
聂士成对正面进攻的武田秀山部层层设防,但是实际上,武田秀山部只是佯攻部队,真正的日军主力,是已迂回至成欢驿主阵地右翼的大岛义昌部。大岛义昌在完成迂回后,没有急于发起进攻,而是原地隐蔽,同时派人测量了两军营垒间的距离,部署好了炮兵阵地。
7月29日凌晨,大岛义昌下令开炮轰击,掩护步兵向成欢驿的第一座营垒发起进攻。聂士成部炮队阵地尚在西南顶峰,虽发炮还击,但因距离太远,超出火炮射程,对敌步兵几乎没有杀伤力。相比之下,敌炮火却能对聂部造成致命威胁——成欢驿的六座堡垒皆系临时构筑,以泥土夯筑而成,胸墙只有五到六寸厚,被日军炮火击中后,泥土四散,难以对守军形成有效的保护。
由于堡垒之下没有挖掘壕沟,日军轻而易举便得以接近堡垒,双方短兵相接,开始端起buqiang互射。日军此时已全面装备村田式buqiang,后者是明治维新后日本自己研制的第一款制式buqiang,乃后来三八式buqiang的鼻祖,技术层面上领先于亚洲。聂部的buqiang则大多还是西方各国抛售的旧枪,虽就国内来说是最先进的,但跟村田buqiang一比,差距甚为明显。