这是一个struts学习的入门实例,用一个比较简单的猜数游戏来实现struts2的MVC三层结构的设计思想,对于学
习Struts2的初学者来说,是一个很不错的练习实例。
1、数据实体访问层DAO
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import util.DBConnection;
import entity.Players;
/**
* 数据访问类:主要实现对数据的访问换个操作
* @author niliang
*
*/
public class DaoGuess {
/**
* 该方法实现注册用户
* @param p Players对象
* @throws Exception
*/
public void add(Players p) throws Exception {
String sql = "insert into guess_user (name,password,times) values(?,?,?)";
Connection conn = DBConnection.getConnection();
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, p.getName());
pst.setString(2, p.getPwd());
pst.setInt(3, p.getScore());
pst.executeUpdate();
DBConnection.close(conn);
}
/**
* 该方法实现显示所有已注册的Players对象信息
* @return Players类型的List集合
* @throws Exception
*/
public List<Players> findAll() throws Exception {
String sql = "select * from guess_user order by times";
List<Players> persons = new ArrayList<Players>();
Connection cn = DBConnection.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = cn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
Players p = new Players();
p.setId(rs.getInt(1));
p.setName(rs.getString(2));
p.setPwd(rs.getString(3));
p.setScore(rs.getInt(4));
persons.add(p);
}
} catch (SQLException e) {
e.printStackTrace();
}
DBConnection.close(rs, ps, cn);
return persons;
}
/**
* 该方法根据指定name查询Players对象信息
* @param name 玩家帐号
* @return 返回一个Players对象
* @throws Exception
*/
public Players find(String name) throws Exception {
Players p = null;
String sql = "select * from guess_user where name=?";
Connection conn = DBConnection.getConnection();
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, name);
ResultSet rs = pst.executeQuery();
if(rs.next()){
p=new Players();
p.setId(rs.getInt(1));
p.setName(rs.getString(2));
p.setPwd(rs.getString(3));
p.setScore(rs.getInt(4));
}
DBConnection.close(conn);
return p;
}
/**
* 该方法实现更新数据
* @param times 玩家猜数完成的次数
* @param id 玩家编号
* @throws Exception
*/
public void update(int times,int id) throws Exception{
String sql = "update guess_user set times=? where id=?";
Connection conn = DBConnection.getConnection();
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1,times);
pst.setInt(2,id);
pst.executeUpdate();
DBConnection.close(conn);
}
}
2.实体类POJO
package entity;
/**
* 实体数据类:Players对象
* @author niliang
*
*/
public class Players {
/**
*Players对象的基本属性信息
*/
private int id;
private String name;
private String pwd;
private int score=100;//默认值为100
/**
* 属性Id的get()方法
* @return
*/
public int getId() {
return id;
}
/**
* 属性Id的set()方法
* @param id
*/
public void setId(int id) {
this.id = id;
}
/**
* 属性Name的get()方法
* @return
*/
public String getName() {
return name;
}
/**
* 属性Name的set()方法
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 属性Pwd的get()方法
* @return
*/
public String getPwd() {
return pwd;
}
/**
* 属性Pwd的set()方法
* @param pwd
*/
public void setPwd(String pwd) {
this.pwd = pwd;
}
/**
* 属性Score的get()方法
* @return
*/
public int getScore() {
return score;
}
/**
* 属性Score的set()方法
* @param score
*/
public void setScore(int score) {
this.score = score;
}
}
/******************游戏信息实体类*******************************/
package game;
/**
* 实体数据类:GameInfo游戏信息
* @author niliang
*
*/
public class GameInfo {
private int times;
private int answer;
private boolean success;
private String msg;
private String player;
/**
* 属性Player的get()方法
* @return
*/
public String getPlayer() {
return player;
}
/**
* 属性Player的set()方法
* @param player
*/
public void setPlayer(String player) {
this.player = player;
}
/**
* 属性Msg的get()方法
* @return
*/
public String getMsg() {
return msg;
}
/**
* 属性Msg的set()方法
* @param msg
*/
public void setMsg(String msg) {
this.msg = msg;
}
/**
* 属性Sucess的get()方法
* @return
*/
public boolean isSuccess() {
return success;
}
/**
* 属性Success的set()方法
* @param success
*/
public void setSuccess(boolean success) {
this.success = success;
}
/**
* 属性Times的get()方法
* @return
*/
public int getTimes() {
return times;
}
/**
* 属性Times的set()方法
* @param times
*/
public void setTimes(int times) {
this.times = times;
}
/**
* 属性Answer的get()方法
* @return
*/
public int getAnswer() {
return answer;
}
/**
* 属性Anwser的set()方法
* @param answer
*/
public void setAnswer(int answer) {
this.answer = answer;
}
}
3猜数游戏业务的实现
package game;
import java.util.Random;
/**
* 业务逻辑:实现猜数游戏的业务逻辑
* @author niliang
*
*/
public class GuessNumber {
/**
* 该方法实现猜数游戏
* @param guessNum 用户输入的数字
* @param info 输出的提示消息
*/
public void guess(int guessNum,GameInfo info){
info.setTimes(info.getTimes()+1);
if(guessNum == info.getAnswer()){
info.setSuccess(true);
info.setMsg("(O-^_^-O)恭喜你,你当前用了"+info.getTimes()+"次猜中!!!");
}else if(guessNum<info.getAnswer()){
info.setMsg("^_^你猜的数小了,再大点吧");
}else{
info.setMsg("^_^你猜的数大了,再小点吧");
}
}
/**
* 该方法实现重置游戏
* @param info
*/
public void reset(GameInfo info){
Random random=new Random();
int answer=random.nextInt()%100;
answer=Math.abs(answer)+1;
System.out.println("random:"+answer);
info.setAnswer(answer);
info.setTimes(0);
info.setSuccess(false);
info.setMsg("");
}
}
4.基本登陆注册的action
package game;
import java.util.Random;
/**
* 业务逻辑:实现猜数游戏的业务逻辑
* @author niliang
*
*/
public class GuessNumber {
/**
* 该方法实现猜数游戏
* @param guessNum 用户输入的数字
* @param info 输出的提示消息
*/
public void guess(int guessNum,GameInfo info){
info.setTimes(info.getTimes()+1);
if(guessNum == info.getAnswer()){
info.setSuccess(true);
info.setMsg("(O-^_^-O)恭喜你,你当前用了"+info.getTimes()+"次猜中!!!");
}else if(guessNum<info.getAnswer()){
info.setMsg("^_^你猜的数小了,再大点吧");
}else{
info.setMsg("^_^你猜的数大了,再小点吧");
}
}
/**
* 该方法实现重置游戏
* @param info
*/
public void reset(GameInfo info){
Random random=new Random();
int answer=random.nextInt()%100;
answer=Math.abs(answer)+1;
System.out.println("random:"+answer);
info.setAnswer(answer);
info.setTimes(0);
info.setSuccess(false);
info.setMsg("");
}
}
////////////////////////////////////////////////////////////////
package action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import entity.Players;
/**
* 拦截器:登录检查
* @author niliang
*
*/
public class LoginCheck extends AbstractInterceptor{
/**
*
*/
private static final long serialVersionUID = 2490404583704112520L;
@Override
/**
* 重写intercept方法,执行登录检查
*/
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext ac=invocation.getInvocationContext();
Map<String,Object> session=ac.getSession();
Players user=(Players)session.get("user");
if(user==null){
return "login";
}else{
return invocation.invoke();
}
}
}
//////////////////////////////////////////////////////////////////////////////
package action;
import java.util.List;
import dao.DaoGuess;
import entity.Players;
public class Option {
/**
* 属性玩家列表集合
*/
List<Players> list;
/**
* 属性list的get()方法
* @return 返回Players类型的集合
*/
public List<Players> getList() {
return list;
}
/**
* 属性list的set()方法
* @param list
*/
public void setList(List<Players> list) {
this.list = list;
}
/**
* 该方法显示所有用户
* @return
*/
public String execute(){
DaoGuess dao=new DaoGuess();
try {
list=dao.findAll();
return "show";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
}
////////////////////////////////////////////////////////////////////////
package action;
import org.apache.struts2.ServletActionContext;
import dao.DaoGuess;
import entity.Players;
/**
* 注册玩家的Action
* @author niliang
*
*/
public class RegistAction {
/**
* 属性Players对象
*/
private Players p;
/**
* 属性 p的get()方法
* @return 返回一个Players对象
*/
public Players getP() {
return p;
}
/**
* 属性 p的set()方法
* @param p
*/
public void setP(Players p) {
this.p = p;
}
DaoGuess dao=new DaoGuess();
/**
* 该方法执行注册Action
* @return
*/
public String execute(){
try {
Players player=dao.find(p.getName());
//判断玩家是否已经注册
if(player!=null){
ServletActionContext.getRequest().setAttribute("reg_error", "帐号已存在");
return "wrong";
}
//保存
dao.add(p);
return "add";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
}
5Struts2的配置文件struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.action.extension" value="do"/>
<package name="guessGame" extends="struts-default">
<!-- 登录拦截 -->
<interceptors>
<interceptor name="logincheck" class="action.LoginCheck"/>
<interceptor-stack name="demoStack">
<interceptor-ref name="logincheck"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 定义全局的Result -->
<global-results>
<result name="error">/error.jsp</result>
<result name="login">/login.jsp</result>
</global-results>
<!-- 登录 -->
<action name="login" class="action.Login">
<result name="success" type="redirect">/menu.jsp</result>
<result name="exit" type="redirect">/login.jsp</result>
</action>
<!-- 注册 -->
<action name="regist" class="action.RegistAction">
<result name="add" type="redirect">/login.jsp</result>
<result name="wrong">/add_player.jsp</result>
</action>
<action name="guess" class="action.GuessAction">
<interceptor-ref name="demoStack"/>
<result name="success">/success.jsp</result>
<result name="wrong">/guess.jsp</result>
<result name="numerror">guess.jsp</result>
<result name="init" type="redirect">/guess.jsp</result>
</action>
<action name="option" class="action.Option">
<interceptor-ref name="demoStack"/>
<result name="show">/showInfo.jsp</result>
</action>
</package>
</struts>
当然这里还有一个连接数据库的连接池的类(DBConnection.java)就没有列出来,读者朋友们可以自己加上。
- 描述: 项目结构
- 大小: 31.3 KB
- 描述: 登陆界面
- 大小: 29.7 KB
分享到:
相关推荐
【Ajax实现的猜数游戏】是一个基于Web技术的互动应用,它利用了JavaServer Pages (JSP)、Servlet以及Ajax(Asynchronous JavaScript and XML)技术。在这个游戏中,服务器随机生成一个数字,用户在客户端进行猜测,...
【C# WinForm猜数小游戏】是一个非常适合编程初学者练习的项目,它使用C#语言和Windows Forms(WinForm)框架构建。这个小游戏的核心概念是计算机随机生成一个数字,然后让用户进行猜测,根据用户的猜测给出提示(过...
这个是纯java代码版本的,没有使用JUI窗口制作
【标题】:用JAVA实现猜数小游戏 在编程学习中,设计并实现简单的游戏是提升技能和理解语言特性的有效方式。"用JAVA实现猜数小游戏"是一个经典的编程练习,它可以帮助初学者深入理解Java的基本语法、控制流程以及...
实现猜数小游戏
通过实现这个猜数小游戏,初学者可以掌握C#的基本编程概念,并逐渐提升编程技能。同时,这个游戏也可以作为进一步学习面向对象编程、错误处理和高级功能(如多线程)的起点。实践出真知,动手编写这样一个小项目,...
在本项目中,我们将探讨如何使用Java编程语言来实现一个简单的猜数游戏。这个游戏的核心机制是,计算机随机生成一个介于1和100之间的整数,然后玩家尝试猜测这个数字,程序会根据玩家的猜测给出“偏大”或“偏小”的...
猜数,游戏猜数,游戏猜数,游戏猜数,游戏猜数,游戏猜数,游猜数,游戏猜数,游戏猜数,游戏戏猜数,游戏猜数,游戏猜数,游戏
以上就是基于VB的猜数小游戏的实现原理和代码解析。通过这个游戏,你可以熟悉VB的基本编程语法,理解面向对象编程的思想,以及如何创建交互式的应用程序。实际操作过程中,还可以进一步优化界面设计,增加音效、计时...
【猜数小游戏C语言源码】是一个典型的编程学习资源,主要使用C语言编写,适合初学者和有一定经验的程序员进行代码阅读和分析。C语言是一种基础且强大的编程语言,广泛应用于系统开发、嵌入式系统以及游戏开发等领域...
web实验,规定时间内猜数小游戏。web实验,规定时间内猜数小游戏。
【猜数小游戏EXE版】是一款基于VB编程语言开发的休闲益智类应用程序,它源自于课堂上的教学示例,经过个人的改造和增强,旨在提供一个轻量级的娱乐方式,同时也锻炼用户的逻辑思维能力。 在VB(Visual Basic)环境...
通过这个猜数小游戏项目,学生不仅可以巩固C#的基础知识,还能学习到如何设计和实现一个简单的交互式应用程序,提升问题解决和逻辑思维能力。同时,这也是一个很好的实践机会,让学习者了解程序调试和测试的过程。
自己写的一个猜数小游戏C++源码,刚学没多久,老鸟勿下,新手可以参考
根据以前提供的NumberGuessBean.java文件(模型类),编写SERVLET程序,实现猜数游戏。 重点考察: HttpServletRequest, HttpSession 猜数游戏可以参考TOMCAT提供的JSP 1.2 EXAMPLES
这个简单的猜数游戏演示了Java的基本语法结构,包括如何导入必要的包、使用`BufferedReader`处理文本输入、生成随机数、控制流程以及逻辑判断等。对于Java初学者来说,它是一个很好的实践项目,可以帮助理解这些基本...
请阅读附件中的程序,实现猜数游戏, 使用文本方式(控制台输入输出)和使用图形方式(可以使用AWT或者SWING)来实现猜数游戏。 进入程序后,显示文本内容,提示用户输入1-100之间的数字,然后程序对其进行判断...
猜数小游戏2.0.exe
用c++编写的小游戏《猜数小游戏》,超好玩,操作简单,休闲娱乐!欢迎游玩。 用c++编写的小游戏《猜数小游戏》,超好玩,操作简单,休闲娱乐!欢迎游玩。