java实现超市管理系统
第一篇:java实现超市管理系统
基于java小型超市管理系统
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; import java.util.Scanner;
public class Mytest { static int sign=0;//goodname数组第一个空下标号
static int sign1=0;//cname数组第一个空下标号
static String[] cpass=new String[20];//存放售货员名称
static String[] cname=new String[20];//存放售货员登入密码
static String[] goodname=new String[20];//存放商品名称
static double[] goodprice=new double[20];//存放商品价格
static int[] goodout=new int[20];//存放商品销售量
static int[] goodnum=new int[20];//存放商品数量
public static void main(String[] args)throws Exception { cname[0]="ZhouTian";//初始的售货员名称
cpass[0]="723"; //初始的售货员密码 createArrays(); readArrays("goodname");//将文件中的内容读入到相应的数组里
readArrays("goodprice"); readArrays("goodnum"); readArrays("cname"); readArrays("cpass"); readArrays("goodout"); menu();//登入之后加载的主菜单
} /** * 加载登入菜单
*/ private static void menu() {
Scanner scan = new Scanner(System.in);
System.out.println(" 欢迎使用商超购物管理系统 ");
System.out.println(" 1.登录系统 ");
System.out.println(" 2.退出 ");
System.out.println("*************************************************");
System.out.println("请选择,输入数字: ");
int a = scan.nextInt();
switch (a) {
case 0:
System.out.println("退出!");//按0不登入
case 1:
System.out.println("请输入用户名:");// 查找售货员姓名是否存在,与所对应的密码是否匹配
String name = scan.next();
System.out.println("请输入密码:");
String pass = scan.next();
int flage = 0;
int ff = 0;
for (int i = 0; i < cname.length; i++) {
if (name.equals(cname[i])) {
flage = 1;//售货员的名称匹配flage=1;
ff = i;
break;
}
}
if (flage == 1) {//名称匹配之后再匹配密码
if (pass.equals(cpass[ff])) {
loadmenu1();//密码也匹配之后再允许登入
} else {
System.out.println("密码错误!");
}
} else {
System.out.println("该用户名不具有权限");
}
break;
case 2:
System.out.println("谢谢您的使用!");
break;
default:
break;
} }
/** * ,创建文件,将数组信息存入到各文件中, */ static void createArrays() {
BufferedWriter bw = null;
try {
File file1 = new File("d:gname.txt");
if (!file1.exists()) {
bw
=
new
BufferedWriter(new FileWriter("d:gname.txt"));
String content1 = strToString(goodname);//数组内容转换成字符串
bw.write(content1);//写入
bw.close();
}
File file2 = new File("d:gprice.txt");
if (!file2.exists()) {
bw
=
new
BufferedWriter(new FileWriter("d:gprice.txt"));
String content2 = doubleToString(goodprice);//数组内容转换成字符串
bw.write(content2);//写入
bw.close();
}
File file3 = new File("d:gnum.txt");
if (!file3.exists()) {
bw
=
new
BufferedWriter(new FileWriter("d:gnum.txt"));
String content3 = intToString(goodnum);//数组内容转换成字符串
bw.write(content3);//写入
bw.close();
}
File file4 = new File("d:cname.txt");
if (!file4.exists()) {
bw
=
new
BufferedWriter(new FileWriter("d:cname.txt"));
String content4 = strToString(cname);//数组内容转换成字符串
bw.write(content4);//写入
bw.close();
}
File file5 = new File("d:cpass.txt");
if (!file5.exists()) {
bw
=
new
BufferedWriter(new FileWriter("d:cpass.txt"));
String content5 = strToString(cpass);//数组内容转换成字符串
bw.write(content5);//写入
bw.close();
}
File file6 = new File("d:gout.txt");
if (!file6.exists()) {
bw
=
new
BufferedWriter(new FileWriter("d:gout.txt"));
String content5 = intToString(goodout);//数组内容转换成字符串
bw.write(content5);//写入
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/** * 登入之后加载商超购物管理系统
*/ static void loadmenu1() {
System.out.println("欢迎进入商超购物管理系统!");
System.out.println(" 商超购物管理系统");
System.out
.println("********************************************************************************");
System.out.println(" 1.商品维护");
System.out.println(" 2.前台收银");
System.out.println(" 3.商品管理");
System.out.println(" 4.退出");
System.out.println("********************************************************************************");
System.out.println("请选择,输入数字或按0退出:");
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
switch (a) {
case 0:
System.out.println("谢谢您的使用!");
break;
case 1:
System.out.println("执行显示商品维护菜单");
loadmenu2();
break;
case 2:
System.out.println("执行前台收银");
loadmenu6();
break;
case 3:
System.out.println("执行商品管理");
loadmenu7();
break;
default:
break;
} } /* * 在商超购物管理系统中按1键时 */ static void loadmenu2() {
System.out.println(" 商超购物管理系统 商品维护");
System.out
.println("********************************************************************************");
System.out.println(" 1.添加商品 ");
System.out.println(" 2.更改商品 ");
System.out.println(" 3.删除商品 ");
System.out.println(" 4.显示所有商品 ");
System.out.println(" 5.查询商品 ");
System.out
.println("********************************************************************************");
System.out.println("请选择,输入数字或按0返回上一级菜单:");
Scanner scan = new Scanner(System.in);
int b = scan.nextInt();
switch (b) {
case 0:
loadmenu1();
break;
case 1:
addgoods();
break;
case 2:
System.out.println("执行更改商品操作");
loadmenu3();// 修改商品
break;
case 3:
System.out.println("执行商品删除操作");
loadmenu4();// 商品删除
break;
case 4:
System.out.println("显示所有商品");
System.out.println("商品名称 " + "商品价格 " + "商品数量 "
+ "备注");
showgoods();
break;
case 5:
System.out.println("执行查询商品操作");
loadmenu5();
break;
default:
break;
} } /* * 在商超购物管理系统中按2键时
*/ static void loadmenu6() {
System.out.println(" 商超购物管理系统 前台收银");
System.out
.println("********************************************************************************");
System.out.println(" 1.购物结算");
Scanner scan = new Scanner(System.in);
int ch = scan.nextInt();
switch (ch) {
case 0:
loadmenu1();
break;
case 1:
pay();
break;
default:
break;
}
} /* * 在商超购物管理系统中按3键时
*/ static void loadmenu7() {
Scanner scan = new Scanner(System.in);
System.out.println(" 商超购物管理系统 商品管理");
System.out
.println("********************************************************************************");
System.out.println(" 1.库存查询");
System.out.println(" 2.已出售商品");
System.out.println(" 3.售货员管理");
System.out.println("请选择,输入数字或按0返回上一级菜单:");
int ch = scan.nextInt();
switch (ch) {
case 0: loadmenu1();
break;
case 1:
System.out.println("执行库存查询操作:");
kusear();
break;
case 2:
System.out.println("执行已出售商品查询操作");
besold();
break;
case 3:
System.out.println("执行售货员管理操作");
salesman();
break;
default:
break;
}
} /* * 对售货员信息的增添,修改 */ static void salesman()
{
Scanner scan = new Scanner(System.in);
System.out.println("
1、添加售货员");
System.out.println("
2、修改售货员信息");
System.out.println("请选择,输入数字或按0返回上一级菜单:");
int b = scan.nextInt();
switch (b) {
case 0:
loadmenu7();//返回上一级
break;
case 1:
addsale();//选择1键,添加售货员
break;
case 2:
modifysale();//更改售货员的信息
break;
default:
break;
} } /* 添加售货员 * */ static void addsale() {
Scanner scan = new Scanner(System.in);
String f;
// sign1 = sign1 + 1;
do {
System.out.println("添加售货员姓名:");
String addname = scan.next();
add(cname, addname, sign1);//将新信息添加到相应数组中
System.out.println("添加售货员登陆密码:");
String addpass = scan.next();
add(cpass, addpass, sign1);//将新信息添加到相应数组中
// writeArray();
sign1++;//新信息添加后数组下标加1
writeArray();
System.out.println("是否继续(y/n)");
f = scan.next();
// writeArray();
} while (f.equals("y"));
salesman(); } /* * 更改售货员的信息 */ static void modifysale() {
String f;
Scanner scan = new Scanner(System.in);
System.out.println("输入更改员工名称:");
String newname = scan.next();
int k = searmember(newname);//查询需要改的售货员的信息,并返回其在数组中的下标
if (k >= 0) {//判断售货员是否存在
System.out.println("员工姓名" + " 密码");
System.out.println(cname[k] + " " + cpass[k]);
System.out.println("选择您要更改的内容:");
System.out.println("
1、更改员工姓名:");
System.out.println("
2、更改登录密码:");
int kk = scan.nextInt();
switch (kk) {
case 1:
System.out.println("请输入已更改员工姓名:");
String newnname = scan.next();
cname[k] = newnname;
writeArray();
System.out.println("是否继续(y/n)");
f = scan.next();
if (f.equals("y")) {
modifysale();
} else {
salesman();
}
break;
case 2:
System.out.println("请输入已更改密码:");
String newpass = scan.next();
cpass[k] = newpass;
writeArray();
System.out.println("是否继续(y/n)");
// System.out.println("是否继续(y/n)");
f = scan.next();
if (f.equals("y")) {
modifysale();
}
salesman();
break;
default:
break;
}
} } /* * 查询ename姓名的售货员在数组中的下标 */ static int searmember(String ename) {
for (int i = 0; i < cname.length; i++) {
if (cname[i].equals(ename)) {
return i;
}
}
return -1;// 不存在时
} /* * 查询已出售的商品信息 */ static void besold()
{
System.out.println("商品名称 " + "商品价格 " + "商品数量 " + "备注");
for (int i = 0; i < goodout.length; i++) {
if (goodout[i] != 0) {
System.out.println(goodname[i] + " " + goodprice[i]
+ " " + goodout[i]);
}
}
loadmenu7(); } /* * 查询库存中售的商品信息
*/ static void kusear() {
Scanner scan = new Scanner(System.in);
String f;
do {
System.out.println("输入要查询的商品名称:");
String sname = scan.next();
int t = ndimsear(sname);//按确切的商品名称进行查询,即非模糊查询,找出商品名称信息的下标
if (t >= 0) {
System.out.println("商品名称 " + "商品价格 " + "商品数量 "
+ "备注");
System.out.println(goodname[t] + " " + goodprice[t]
+ " " + goodnum[t] + " ");//按下标输出商品相应的信息
} else {
System.out.println("没有此商品");
}
System.out.println("是否继续(y/n)");
f = scan.next();
} while (f.equals("y"));
loadmenu7();
} /* * 按确切的商品名称进行查询,即非模糊查询,找出商品名称信息的下标
*/ static int ndimsear(String s) {
for (int i = 0; i < goodname.length; i++) {
if (goodname[i].equals(s)) {
return i;
}
}
return -1;//没查询到时
}
/* * 商品结算
*/ static void pay() {
Scanner scan = new Scanner(System.in);
double sum = 0;
String f;
do {
dimsearch1();//按关键字进行模糊查询,查找可能需要的商品
System.out.println("请选择商品:");
String bnam = scan.next();//按查询到的相关商品中选择要购买的商品
System.out.println("请输入购买数量:");
int bnum = scan.nextInt();
int fl = seargood(bnam);
System.out.println(bnam + " " + goodprice[fl] + " "
+ "购买数量" + bnum + " " + bnum * goodprice[fl]);
goodnum[fl] = goodnum[fl]sum));
writeArray();//将对数组的更改写入到文件中
loadmenu1();//结束购买返回
} /* * 查找商品返回下标 */ static int seargood(String bbnam) {
for (int i = 0; i <= goodname.length; i++) {
if (goodname[i].equals(bbnam)) {
return i;
}
}
return -1; }
/* * 对商品进行各种查找
*/
static void loadmenu5() {
Scanner scan = new Scanner(System.in);
System.out.println("
1、按商品数量升序查询");
System.out.println("
2、按商品价格升序查询");
System.out.println("
3、输入关键字查询商品");
System.out.println("请选择,输入数字或按0返回上一级菜单:");
int choice = scan.nextInt();
switch (choice) {
case 0:
loadmenu2();//返回上一级
break;
case 1:
numshenxu();//按商品数量升序进行查找
break;
case 2:
priceshenxu();//按商品价格升序进行查找
break;
case 3:
dimsearch();//按商品的关键字进行查找
break;
default:
break;
}
}
static void dimsearch1() {
int[] k;
Scanner scan = new Scanner(System.in);
System.out.println("输入商品关键字:");
String sear = scan.next();
k = Arrays.copyOf(index(sear), index(sear).length);
System.out.println("商品名称 " + "商品价格 " + "商品数量 " + "备注");
if (k != null) {
for (int i = 0; i < k.length; i++) {
System.out.println(goodname[k[i]] + " " goodprice[k[i]]
+ " " + goodnum[k[i]] + " ");
}
}
} /* * 按商品的关键字进行查找
*/ static void dimsearch()
+ {
String f;
do {
int[] k;
Scanner scan = new Scanner(System.in);
System.out.println("输入商品关键字:");
String sear = scan.next();
k = Arrays.copyOf(index(sear), index(sear).length);
System.out.println("商品名称 " + "商品价格 " + "商品数量 "
+ "备注");
if (k != null) {
for (int i = 0; i < k.length; i++) {
System.out.println(goodname[k[i]] + " "
+ goodnum[k[i]]
+ " ");
}
goodprice[k[i]]
+
" "
+
}
System.out.println("是否继续(y/n)");
f = scan.next(); } while (f.equals("y")); loadmenu2(); } static int[] index(String ss) { int countt = 0; int counttt = 0; for (int i = 0; i < goodname.length; i++) {
if (goodname[i].indexOf(ss) >= 0) {
countt++;
} } int[] location = new int[countt]; for (int i = 0; i < goodname.length; i++) {
if (goodname[i].indexOf(ss) >= 0) {
location[counttt] = i;
counttt++;
}
}
return location; } /* * 按商品数量升序进行查找
*/ static void numshenxu() {
int[] newnum = Arrays.copyOf(goodnum, goodnum.length);
double[]
newprice
=
Arrays.copyOf(goodprice, goodprice.length);
String[] goodname.length);
for (int i = 0; i < newnum.lengthi1; i++) {
for (int j = 0; j < newprice.length1; j++) {
if (newprice[j] < newprice[j + 1]) {
int temp = newnum[j];
newnum[j] = newnum[j + 1];
newnum[j + 1] = temp;
double temp1 = newprice[j];
newprice[j] = newprice[j + 1];
newprice[j + 1] = temp1;
String temp2 = newname[j];
newname[j] = newname[j + 1];
newname[j + 1] = temp2;//相应的下标在不同的数
newname
=
Arrays.copyOf(goodname, 组里进行挑换,商品的信息才能保持一致
}
}
}
System.out.println("商品名称 " + "商品价格 " + "商品数量 " + "备注");
for (int k = 0; k < newnum.length; k++) {
if (newprice[k] != 0) {
System.out.println(newname[k] + " " + newprice[k]
+ " " + newnum[k] + " ");
}
}
loadmenu5(); } /* *更改商品信息的操作
*/ static void loadmenu3() {
Scanner scan = new Scanner(System.in);
System.out.println("输入更改商品名称:");
String nam = scan.next();
int b = showflage(nam);
print(b);
System.out.println("选择您要更改的内容:");
System.out.println("
1、更改商品名称::");
System.out.println("
2、更改商品价格:");
System.out.println("
3、更改商品数量:");
int ch = scan.nextInt();
switch (ch) {
case 0:
break;
case 1:
int counnt = 0;
String f = "y";
while (f.equals("y")) {
if (counnt != 0) {
// Scanner scan = new Scanner(System.in);
System.out.println("输入更改商品名称:");
nam = scan.next();
b = showflage(nam);//查找需要更改商品的下标
print(b);//输出这个商品的各种信息
}
System.out.println("请输入已更改商品名称");
String cname = scan.next();
goodname[b] = cname;//更改名称
System.out.println("是否继续(y/n)");
f = scan.next();
counnt++;
writeArray();
}
loadmenu2();
break;
case 2:
counnt = 0;
f = "y";
while (f.equals("y")) {
if (counnt != 0) {
// Scanner scan = new Scanner(System.in);
System.out.println("输入更改商品名称");
nam = scan.next();
b = showflage(nam);
print(b);
}
System.out.println("请输入已更改商品价格");
double cprice = scan.nextDouble();
goodprice[b] = cprice;//新价格写入数组
System.out.println("是否继续(y/n)");
f = scan.next();
counnt++;
writeArray();
}
loadmenu2();
break;
case 3:
counnt = 0;
f = "y";
while (f.equals("y")) {
if (counnt != 0) {
// Scanner scan = new Scanner(System.in);
System.out.println("输入更改商品名称");
nam = scan.next();
b = showflage(nam);
print(b);
}
System.out.println("请输入已更改商品数量");
int cnum = scan.nextInt();
goodnum[b] = cnum;
counnt++;
writeArray();
System.out.println("是否继续(y/n)");
f = scan.next();
}
loadmenu2();
break;
default:
break;
}
} /* * 查询nama这个商品在goodname中的下标
*/ static int showflage(String nama) {
int flag = 0;
for (int i = 0; i < goodname.length; i++) {
if (goodname[i].equals(nama)) {
flag = i;
break;
}
}
return flag; }
static void print(int b) {
System.out.println("商品名称 " + "商品价格 " + "商品数量 " + "备注");
System.out.println(goodname[b] + " " + goodprice[b] + " "
+ goodnum[b] + " ");
} /* * 删除商品菜单
*/ static void loadmenu4() {
String f;
int d;
do {
Scanner scan = new Scanner(System.in);
System.out.println("请输入要删除的商品名称:
String dname = scan.next();
d = showflage(dname);
delete(d);
System.out.println("是否继续(y/n)");
f = scan.next();
writeArray();//删除之后重新写入文件
} while (f.equals("y"));
loadmenu2(); }
"); /* * 删除商品 */ static void delete(int dd) {
for (int i = dd; i < goodname.length1] = null;
goodprice[goodprice.length1] = 0;
} /* * 查询所有商品
*/ static void showgoods() {
int i = 0;
while (goodprice[i] != 0) {
System.out.print(goodname[i] +
" " goodprice[i] + " "
+
+ goodnum[i] + " ");
if (goodnum[i] < 10) {
System.out.println(" *该商品已不足10件!");
}
System.out.println();
i++;
}
loadmenu2();
} /* * 商品添加操作 */ static void addgoods() {
System.out.println("执行添加商品操作: ");
String a;
do {
Scanner scan = new Scanner(System.in);
System.out.println("输入商品名称:");
String na = scan.next();
add(goodname, na, sign);
System.out.println("输入添加商品价格:");
double pr = scan.nextDouble();
add(goodprice, pr, sign);
System.out.println("输入添加商品数量:");
int c = scan.nextInt();
add(goodnum, c, sign);
sign++;
System.out.println("是否继续(y/n)");
a = scan.next();
writeArray();
} while (a.equals("y"));
loadmenu2();
} /* * 将数组信息写入到相应的文件里,启动程序时就要调用这个函数 */ static void writeArray() {
BufferedWriter bw = null;
try {
bw
=
new
BufferedWriter(new FileWriter("d:gname.txt"));
String content1 = strToString(goodname);
bw.write(content1);
bw.close();
bw
=
new
BufferedWriter(new FileWriter("d:gprice.txt"));
String content2 = doubleToString(goodprice);
bw.write(content2);
bw.close();
bw
=
new
BufferedWriter(new FileWriter("d:gnum.txt"));
String content3 = intToString(goodnum);
bw.write(content3);
bw.close();
bw = new BufferedWriter(new FileWriter("d:cname.txt"));
String content4 = strToString(cname);
bw.write(content4);
bw.close();
bw
=
new
BufferedWriter(new FileWriter("d:cpass.txt"));
String content5 = strToString(cpass);
bw.write(content5);
bw.close();
bw
=
new
BufferedWriter(new FileWriter("d:gout.txt"));
String content6 = intToString(goodout);
bw.write(content6);
bw.close();
} catch (IOException e) {
e.printStackTrace();
} } /* * 添加商品名称 */ static void add(String[] aa, String n, int b) {
if (b == aa.length) {
aa = (String[]) Arrays.copyOf(aa, aa.length * 2);
}
aa[b] = n; } /* * 添加商品价格
*/ static void add(double[] aa, double pr, int b) {
if (b == aa.length) {
aa = (double[]) Arrays.copyOf(aa, aa.length * 2);
}
aa[b] = pr; } /* * 添加商品数量
*/ static void add(int[] aa, int cc, int b) {
if (b == aa.length) {
aa = (int[]) Arrays.copyOf(aa, aa.length * 2);
}
aa[b] = cc;
}
/** * 从文件中读取信息到相应的数组里
*/ static void readArrays(String name) throws Exception {
BufferedReader br = null;
try {
if ("goodname".equals(name)) {
br
=
new
BufferedReader(new FileReader("d:gname.txt"));
String content1 = br.readLine();
String[] arr = strToString(content1);
goodname arr.length);
for (int i = 0; i < goodname.length; i++) {
if (!goodname[i].equals("null")) {
sign++;
=
(String[])
Arrays.copyOf(arr,
}
}
} else if ("goodprice".equals(name)) {
br
=
new
BufferedReader(new FileReader("d:gprice.txt"));
String content2 = br.readLine();
double[] arr = doubleToString(content2);
goodprice arr.length);
} else if ("goodnum".equals(name)) {
br
=
new
BufferedReader(new
=
(double[])
Arrays.copyOf(arr, FileReader("d:gnum.txt"));
String content3 = br.readLine();
int[] arr = intToString(content3);
goodnum = (int[]) Arrays.copyOf(arr, arr.length);
} else if ("cname".equals(name)) {
br
=
new
BufferedReader(new FileReader("d:cname.txt"));
String content4 = br.readLine();
String[] arr = strToString(content4);
cname arr.length);
= (String[]) Arrays.copyOf(arr,
for (int i = 0; i < cname.length; i++) {
if (!cname[i].equals("null")) {
sign1++;
}
}
} else if ("cpass".equals(name)) {
br
=
new
BufferedReader(new FileReader("d:cpass.txt"));
String content5 = br.readLine();
String[] arr = strToString(content5);
cpass arr.length);
} else {
br
=
new
BufferedReader(new
=
(String[])
Arrays.copyOf(arr, FileReader("d:gout.txt"));
String content6 = br.readLine();
int[] arr = intToString(content6);
goodout = (int[]) Arrays.copyOf(arr, arr.length);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /* * 将字符串转换成字符串数组 */ static String strToString(String[] arry) {
// String arrys="";
// for(int i=0;i
// {
// arrys=arry+arry[i]+",";
// }
// //arrys=arrys+arry[arry.length-1];
// System.out.println(arrys);
// return arrys;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arry.length; i++) {
sb.append(arry[i]).append(",");
}
sb.deleteCharAt(sb.length() - 1);
// System.out.println(sb.toString());
return sb.toString(); } /* * 将字符串转换成字符串数组 */ static String[] strToString(String ar) {
String[] arry = ar.split(","); return arry; } /* * 将int型数组转换成字符串 */ static String intToString(int[] arrr) {
String ss = "";
ss = Arrays.toString(arrr);
String sss
=
ss.replace("[",
"").replace("]", "").replace(" ", "");
第二篇:基于Java的高速公路收费管理系统的设计与实现
【摘 要】本文阐述了基于Struts2+Spring+Hibernate开源框架实现高速公路收费管理子系统的开发流程。本文首先对Struts
2、Hibernate、Spring等框架进行论述,其次描述了系统的需求分析与总体架构设计,包括系统的功能需求、性能需求、功能结构设计和体系结构设计等;然后详细介绍了系统的各个模块的具体实现,主要模块有登陆模块、数据录入模块、维护模块等;最后,对系统进行的测试并对项目的主要工作和存在的不足做了论述。
【关键词】Struts2;Spring;Hibernate
0 引言
基于B/S结构的Web程序的开发,有非常大的灵活性,允许用户远程访问系统资源的同时能对数据平台和管理访问权限进行有效的保护。B/S结构软件的所有的客户端只是浏览器,也只需要管理服务器,更为快捷、方便、高效。与C/S体系结构相比,B/S体系结构不仅具有C/S体系结构的全部优点,而且具有客户端零维护、可扩展性好、安全性好、资源重用性好等新的优点。
1 系统需求分析
计算机收费系统式收费站的主要组成部分[3]。每个收费站由网络服务器、管理计算机构成的上端管理系统和若干个车道控制计算机构成 的车道控制系统组成局域网。高速公路计算机收费系统的目标是:按照每辆车的车型和实际行驶里程收费;提高收费的工作效率,尽量降低由于收费过程引起的交通延误,提高高速公路的通行能力;实现高速公路的现代化营运管理为智能运输系统的实现留有一定的接口。基于系统的以上目标,收费系统应该具有以下功能:
1)实行计算机管理,尽量减少人为干预,保证车型判别的正确性。
2)系统能自动检查设备运行状态,能准确并及时地给出故障信息和故障排除信息。
3)系统应该是全天候、实时的,如收费车道应该在任何时间有车辆通过时能正常使用。
4)具有一定的报警功能,如遇抢劫时的远程报警,与车辆冲关或进出口收费员判刑不一致时报警。
根据以上对系统需求的描述和功能的分析,对于收费管理系统,它主要处理的数据是收费数据,主要包括 4个模块:数据登录模块,录入模块,维护模块。
2 技术平台
2.1 MVC模式和Struts框架
MVC某种语言所特有的设计思想,而是所有面向对象程序设计语言都应该遵守的规范[4]。MVC思想将应用分为三个基本部分:模型、视图、控制器。这三个部分将以最少的耦合协同工作,从而提高应用的可扩展性及可维护性。
Struts2是Struts的下一代产品,是一个优雅的,可扩展的Java EE Web框架[5]。它是Struts和WebWork的技术基础上进行合并的全新的Struts2框架。但是,Struts2没有继承Struts1的血统,而是继承WebWork的血统。Struts框架作为MVC模式的典型实现,对Model、View和Controller都提供了对应的实现组件。
2.2 Spring框架
Spring框架是一个分层架构,由7个模块组成,各个模块之间是相互的。Spring其他模块构建在核心容器之上,其中,核心容器定义了创建、配置和管理bean的方式。
3 系统实现
在系统需求分析和设计的基础上,在系统的开发过程中,将SSH架构应用到实际的项目开发中,并且利用第三方报表开发软件开发报表部分,极大地简化了系统的开发,提高了效率。在整个系统的实现过程中,本文主要实现了收费管理系统模块。
3.1 数据登录模块
用户登录模块的设计中完全实现了MVC模式,实现了视图与数据处理的分离。登录页面、修改密码页面以及登录成功页面构成视图层;用户登录及修改密码的请求应答控制由控制器实现;具体的用户信息合法性由Struts2提供的客户端输入校验完成,保证输入信息的合法性。图1是用户登录的简要图。
3.2 录入模块
数据录入模块主要就是报表文件的开发,设计报表文件,首先要打开设计器,连接到数据源,然后开始进行报表文件的设计。本模块中报表文件,仅用于数据录入,因此可以创建的报表应该选择填报或参数表单。然后在快逸报表中的表格中填写选项,设置选项的属性要根据需求来设置,包括设置数据的格式,编辑的风格、是否可写,能否为空等。
3.3 维护模块
该模块主要是负责维护人员名单的相关信息。由于本系统是内部人员使用的系统,用户较少,不需要通过注册来添加人员,而是通过该模块来添加删除人员或者修改其权限。
主要涉及到的信息包括:站号、用户ID、用户名、用户密码、班次编号、录入权限、监视权限、统计权限、检索权限、稽查权限、维护权限、票据管理权限、卡管理权限等,如表1所示。其中各种管理权限来自于用户信息中purview字段,每个比特位代表一种权限。
4 结论
系统采用SSH(Struts2+Spring+Hibernate)轻量级框架,完成了高速公路收费管理系统的开发,对三个框架的使用和集成有了深刻的认识。本文详细介绍了三个框架的背景、相关技术以及内部实现原理,包括MVC的开发模式、ORM技术以及IOC和AOP,这些对于系统的开发有非常重要的帮助。项目基于MVC的思想进行开发,Struts2框架负责了表示层和控制层;采用Hibernate框架以面向对象的方式来访问数据库,极大地简化了数据库操作;Spring框架将业务层又细分为业务逻辑层和数据持久层,使得接口和实现进一步的分离,使开发者从繁杂的事务管理中解脱出来,而专注于业务逻辑的处理。
【参考文献】
[1]彭艳玲,胡松涛.高速公路收费现状与存在问题研究[J].山西科技,2008(04):10-12.doi:10.3969/j.issn.1004-6429.2008.04.005.
[2]吴炜,丁月华,文贵华.ETC车道控制系统的设计与实现[J].计算机工程,2001(05):162-163.doi:10.3969/j.issn.1000-3428.2001.05.065.
[3]郭敏.高速公路收费系统[M].北京:人民交通出版社,2002,7:15.
[4]李刚.较轻量级JavaEE企业应用实践[M].北京:电子工业出版社,2004,11:158.
[5][美]巴西亚,等,编.Java企业级持久化技术指南[M].叶斌,译.北京:科学出版社,2010,6:137.
[6]白广元.Java Web整合开发完全自学手册[S].北京:机械工业出版社,2009,8:144.
[责任编辑:丁艳]
第三篇:Java五子棋实现报告
一、实验目的
(1) 使用Java编写五子棋程序
(2) 掌握编写过程的一些类和类成员的使用,并且了解五子棋制作过程的一些步骤和了解一些算法。
二、实验环境
在电子楼2楼,装有My Eclipse 的计算机上进行
三、实验内容
编写一个五子棋程序。 程序主要实现以下功能:
1.实现五子棋界面,要求人性化界面简洁美观; 2.实现黑白色轮流下棋功能,能提示下棋方; 3.实现连成五子自动判断功能; 4.实现时间设置功能,认输功能;
核心代码如下:
1.我的第一步是设计界面。在这个过程的要使用到以下的步骤:
1.使用MyEclipse 创建一个Project关于这个工程,加入两个类,分别是ChessFrame和Chess,而ChessFrame是这个工程中最重要的一个部分。创建过程中要继承JFrame类,并且要继承Runnable 和 MouseListener 这两个接口,分别是用来监听鼠标的移动和时间的变化。 2.在给这个JFrame设置大小和颜色等一些东西。 这里最主要的是使用了两个函数,是以前没见过的:
1.这个是用来设置默认的窗口关闭事件的
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 2.这两个是用来获得屏幕的大小的
Toolkit.getDefaultToolkit().getScreenSize().height; Toolkit.getDefaultToolkit().getScreenSize().width;
3.把本地的背景图片加到这个窗口中,作为这个窗口的背景图:
使用的到的类有BufferedImage和 ImageIO这两个类,这两个类是专门用来处理这种功能的。主要的代码如下:
BufferedImage bg = null; bg = ImageIO.read(new File("e:/background.jpg")); g.drawImage(bg,0,0,this); 这样这个图片就加到了这个窗口的背景去了。
这里有一个改进就是双缓冲技术,可以防止闪屏。这个技术就是在界面和内存都有一幅图,我们的改动不是直接画界面,而是内存中先画好然后把内存中直接显示出来,那样就没有了一前一后的,那就没有了闪屏的事情发生了。
4.就是画棋盘和写一些游戏信息:
这步比较简单,也没什么可以说的,用到的一些画线的函数,和写String的一些函数。
以上做完以后就可以出现以下的界面:
1.我的第二步就是增加对mouse的点击和移动的处理,这样以后就可以用来下棋。在这个过程的要使用到以下的步骤: 1.增加对mouse的监视,然后重写它的一些函数:
1.我们在ChessFrame的构造函数中加入了addMouseListener()函数,然后重写关于这个的四个函数,我们这这里不重写所有的函数,就改写一个MousePress函数就可以了。改写的代码如下:
public void mousePress(MouseEvent arg0) {
this.x = arg0.getX(); this.y = arg0.getY(); if (this.canplay)
} this.repaint(); 现在要处理的就是加上棋子了,我在这个做了一下小改动可以更加准确的定位下棋的位置:
if (x >= 10 && x <= 374 && y >= 72 && y <= 450) {
int sx1 = (this.x72) / 20; int yx1 = (this.x72) % 20; if (yx1 >= 10) { } if (yy2 >= 10) { } sy2++; sx1++; 就是这个,我们通过监控鼠标的就可以得到点击的X,Y坐标,我在这里通过对它求余,假如余数大于10(就是一个格子的一半)那就给+1,不然不变。后面的画棋子是很简单的一个过程,使用的是现成的函数(drawoval)
2.这部要做的就是记录棋子和五子连的判断:
1.我们通过一个数组int给保存棋子,如果是0就是没子,1表示是黑子,2表示白子。在每次重绘的时候遍历这个数组显示,这样就可以保存棋子了。 2.判断五子连起来然后获胜的算法: 这个算法是鉴戒例子上的:
private boolean isline(int x, int y, int xchange, int ychange, int color) {
int tempx = xchange; int tempy = ychange; int count = 1; while (x + xchange >= 0 && y + ychange >= 0
&& color == chess1[x + xchange][y + ychange]) { count++; if (xchange != 0) { } if (ychange != 0) { if (ychange < 0) { xchange++;
}
}
}
} ychange--; ychange++; } else { xchange = tempx; ychange = tempy; while (xychange >= 0
} if (count >= 5) {
} return true; return false; } else { && color == chess1[xychange]) { count++; if (xchange != 0) { } if (ychange != 0) {
} if (ychange < 0) {
} ychange--; ychange++; } else { xchange++; 中心思想就是要判断就要判断8个方向,其中有的只是相反的方向,我们使用关于X,Y的相对的变化来判断,并且使用count来计数,如果到了5个就可以判断胜利啦。
1.我的第三步就是时间的变化和一些键的设置
1.关于时间的变化主要是在于线程的使用,这里我们这个JFrame它继承了Runnable 这个接口,不过我们要重写Run函数,这个run函数的代码如下: public void run() {
if (this.second > 0) {
while (true) {
this.repaint(); if (this.isblack) {
this.ss1--;
if (this.ss1 == 0) {
JOptionPane
.showMessageDialog(this, "黑方超时~~~~¡¤游戏结束");
this.message1="0:0:0";
{
"白方超时~~~~¡¤¡¤游戏结束"); this.message2="0:0:0"; this.canplay = false;
{
{ }
this.ss2--;
if (this.ss2 == 0) {
this.message1 = this.ss
1/ 3600 + " : "
+ (this.ss1 / 60this.ss1 / 60 *
this.ss1=-1;
this.canplay = false;
}else if(this.ss1>0) 3600 * 60) 60this.ss2 / 3600 + " : "
+ (this.ss2this.ss2 / 3600 * 60 * 60);
this.repaint(); }else { }
try {
}
Thread.sleep(1000); e.printStackTrace(); } catch (InterruptedException e) { 这个函数是用来事时间的变化,所以每操作以后就让线程sleep(1000)就可以了,那样就是一秒钟。这样就可以倒计时了。 2.现在我们要点击一个按钮要它有响应。
这里我们其实就没用到什么button,那为什么会有反应呢,因为我们通过鼠标的点击范围来确定要响应什么函数,这就是这里面的秘密.
在public void mouseClicked(MouseEvent arg0) 函数里有下面这些if的判断
if (x1 >= 404 && x1 <= 473 && y1 >= 74 && y1 <= 103) if (x1 >= 404 && x1 <= 473 && y1 >= 127 && y1 <= 155) if (x1 >= 404 && x1 <= 473 && y1 >= 179 && y1 <= 208) if (x1 >= 404 && x1 <= 473 && y1 >= 286 && y1 <= 316) if (x1 >= 404 && x1 <= 473 && y1 >= 338 && y1 <= 367) if (x1 >= 404 && x1 <= 473 && y1 >= 390 && y1 <= 419) 这就是为了确定鼠标的范围,然后相对调用函数。
其他还有就是一些Debug处理,在程序已经处理了,结果的还是蛮可以处理的,不过只能是人人对战。
四、实验心得与小结
这次试验总的来说没有想像中那么难,还有视屏的帮助,感觉起还是很容易动手的,不过由于自己没上心,没有做比较大的改动,最主要的人机的对战没做出来是满遗憾的,不过通过这个试验,让我学习了不少的知识,比如双缓冲,mouselistener 等许多许多的知识,还有关于五子棋算法的设计也是一部分。不管怎么说还是有学到知识的,没什么改动,但对现有的知识的掌握还是很可以的。
五、指导教师评议
成绩评定:
指导教师签名:
第四篇:Java登陆验证模块的实现及小结
登陆验证模块的实现
登陆页面验证首先是验证账号, 验证码是否填写,密码长度是否符合要求,验证码是否正确。这几个验证是通过自定义的几个$.fn扩展函数实现的($.fn.remote=Function(url,msg, msgCnt){})实现的,一般将这些自定义的函数放在一个js文件中,便于维护。
自定义函数一般包含相应的提示字符串,及节点对象$(“#id”)等参数。通过函数对节点的var value = this.val();value是否为空或空字符串的判断,相应的改变节点text属性的值。 1验证码正确验证
1)验证码正确与否的验证是通过采用了Ajax技术的函数实现的。对应的action的result的属性为json(result要配置ok的参数),action类要有布尔类型的名为ok的属性,通过返回值ok,更改相应的改变节点text属性的值。
如:
$.fn.remote=function(url,msg,msgCnt){ var value=this.val();//获得表单提交的数据,如你所填入的验证码/资费名称
var name=this.attr("name");//获得表单名称,如验证码文本框的name:verifiCode
var b=false; $.ajax({url:url+"?"+name+"="+value,dataType:"json",async:false,success:function(data){
if(data){
$(msgCnt).text("");
b=true;
}else{
$(msgCnt).text(msg);
}
}
}); return b; }; 2)验证码的点击更新是利用了result=stream的属性(要配置name="inputName",name="contentType"的参数),点击发送请求,对应的action(该类必须有InputStream类的属性,且名字要和result相应参数的属性值相同)生成验证码并存入session。
2账户和密码的验证
当前面一系列的验证结果都满足条件时,才能提交表单。可定义一个函数实现: if(b1 && b2 && b4) {$("#loginForm").submit();} 相应action 接受到数据后,根据账户和密码调用DAO的相关方法,查询返回admin。
如果admin存在则转发到主页面(通过result在admin的不同状态下返回的字符串实现不同的type="redirectAction"),此时将admin存入session。为后面的登陆检查验证做准备。
session.put(KEY_ADMIN, admin); 如果不存在就,还是停留在登陆页面。
3检查登陆验证。
为了防止未登录而访问数据,通过struts2的自定义拦截器功能实现登陆检查验证。
可通过实现接口Interceptor或者抽象类AbstractInterceptor,我选择继承AbstractIntercepto,相对较简洁。在接口定义的方法intercept(ActionInvocation in)实现验证逻辑。
通过ActionInvocation的getInvocationContext()方法获得action上下文对象ActionContext。通过action上下问对象获得session对象,在session对象中获取admin对象:
Admin admin = (Admin)session.get(Constants.KEY_ADMIN); 如果admin为空,则通过return 返回字符串及全局result回到登陆页面。 如果admin不为空,则通过ActionInvocation对象调用invoke()方法,调用后面的action。
权限管理:
每个用户具有不同的角色,不同的角色具有不同的权限。当用户登陆的时候,根据用户对象取得用户所具有的角色,根据角色id在privileges.xml(通过privilegereader类)文件中获得用户具有的所有权限,然后将此所有权限的集合存入session。当用户每一次发送请求时都要通过拦截器,在拦截器中截取用户的请求路径(request.getServletPath()),并检查是否存在于session中的用户所具有权限中。如果没有就返回到提示页面,如果有就调用invoke()方法执行后面的action,result。
拦截器的配置:
1. 首先注册拦截器
2. 然后定义拦截器栈,将默认拦截器栈也加进来。
3. 为当前package中所有Action指定默认的拦截器:
资费管理模块:
资费管的功能主要有资费信息的增加、管理、删除和修改等功能。采用三大框架整合技术实现的。
在applicationContext.xml文件中配置连接池(用户名、密码、驱动包、连接路径),将连接池注入SessionFactory中,在SessionFactory中配置Hibernate框架参数:如方言dialect,show_sql等,指定映射描述。然后开启组件扫描:
因为采用注解的形式,所以dao要继承HibernateDaoSupport,定义一个set方法调用父类的super.setSessionFactory(sf)方法,实例化HibernateTemplate。 在dao中利用getHibernateTemplate()实现一列的增删改查方法。 List list = getHibernateTemplate().find(hql,name);
关于事务:
在applicationContext.xml文件中定义事务管理Bean,然后定义通知,可以在里面()指定目标组件中的哪些方法采用哪种事务管理方式。然后定义,指定切入点,将指定的dao当做目标。然后关联通知和切入点:。
将dao用@Respository扫描进组件。
第五篇:使用java输入输出流实现文件的复制:
public class Test {
public static void copy(File source,File target){
InputStream in=null;
OutputStream out=null;
try {
in=new BufferedInputStream(new FileInputStream(source));out=new BufferedOutputStream(new FileOutputStream(target));byte[] buff=new byte[1024];
while(in.read(buff)>0){
out.write(buff);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
try {
if(in!=null)
in.close();
if(out!=null)
out.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}