PITTSBURGH -- The only real drama -- if it could be called that -- Thursday night at Heinz Field was who would make the better impression in the competition to be the Pittsburgh Steelers' third-string quarterback.
That's the way the last games of the preseason usually go in the NFL.
Rookie free agent Jarrod Johnson made his bid to back up Ben Roethlisberger and Byron Leftwich by throwing a game-winning 6-yard touchdown pass to Weslye Saunders with 7:23 left to lift the Steelers to a 17-16 exhibition victory over the Carolina Panthers.
The touchdown capped a 10-play, 89-yard drive and gave the Steelers three straight wins to finish the preseason 3-1. Johnson played the second and completed 7 of 10 passes for 78 yards and the one touchdown.
Saunders, a second-year tight end, was suspended for four games by the NFL during the offseason for testing positive for a performance-enhancing drug. He will not be allowed to play in the regular season until Oct. 11 at Tennessee.
Charlie Batch, the 15-year veteran quarterback, played the first half for the Steelers and was 11 of 14 for 102 yards and one touchdown.
Carolina (2-2) scored with 2:31 to go when third-stringer Jimmy Clausen threw a 79-yard pass to Lamont Bryant to draw within 17-16. However, the Panthers missed a two-point conversion as Clausen's pass attempted for Bryant was incomplete.
Carolina had another chance to win the game, but Justin Medlock's 50-yard field goal attempt was wide right with 32 seconds left. Medlock beat out veteran Olindo Mare for the Panthers' kicking job.
Pittsburgh quarterback Ben Roethlisbeger didn't play, and neither did Carolina's Cam Newton.
Batch, listed at No. 3 on the depth chart behind Roethlisberger and Byron Leftwich, completed 11 of 14 passes for 102 yards and one touchdown in the first half. Derek Anderson, Newton's primary backup, was 8 of 18 for 91 yards.
Batch helped the Steelers take a 10-3 halftime lead.
The Steelers scored on the game's initial possession as Emmanuel Sanders made a diving 37-yard catch in the end zone of a pass by Batch. The drive covered 80 yards in five plays.
Pittsburgh increased its lead to 10-0 when Shaun Suisham kicked a 49-yard field goal with 41 seconds left in the first quarter.
Thursday's game was the Steelers' last dress rehearsal under new offensive coordinator Todd Haley before the regular season.
"We feel really good," Sanders said of the offense. "Every day we practice, we get better and better. Everyone can feel it. Coach Haley is learning his personnel better and we are starting to click. The sky is the limit. We have an exceptional amount of talent."
Justin Medlock, who won the kicking job when veteran Olindo Mare was released earlier in the week, provided Carolina's first points when he nailed a 31-yard field goal with 8:18 to go in the second quarter.
The Steelers were pleased that their defense did not allow any first-half touchdowns.
"Our communication has definitely improved," linebacker Larry Foote said. "We've worked hard toward putting the whole package together and executing as a team."
NOTES: Pittsburgh rookie running back Chris Rainey had two punt returns for touchdowns in the first quarter, covering 78 and 90 yards, but both were called back because of holding penalties on defensive backs Will Allen and Ryan Mundy. ... It marked the 10th straight season the Steelers and Panthers met in the preseason finale. ... The Steelers open the regular season a week from Sunday on Sept. 9 with a night game at Denver, while Carolina opens that afternoon at Tampa Bay.