什么是SSH呢?SSH是Struts,Spring和Hibernate的缩写,具体介绍如下:
Struts只是一个MVC框架(Framework),用于快速开发Java Web应用。Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的Action,也为V(View)提供了一系列定制标签(Custom Tag)。但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业逻辑
Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成,就是说可将两者一起使用,达到将两者自身的特点进行互补。
Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑如何把它们从神秘的数据库表中取出(或放回到数据库表中)。它解放了您,使您可以专注于应用程序的对象和功能,而不必担心如何保存它们或稍后如何找到它们。
那么个人理解分层设计就是将整个程序设计模块化,分成若干个部分,这一点在前面几篇博文例子中已经体现过了。那么分层设计的好处就是封装化,功能专一化。出现BUG和错误后缩小搜索范围,精确的锁定到那个功能模块出了故障,便于修改和维护,对于业务的发展需求进行灵活的变化,而不需要大篇幅的修改和重写。
这个项目业务需求:通过在控制台输出数据进行选择具体的操作项,然后后台进行操作,并将结果显示出来。模拟实现对人员简单信息的录入,保存,浏览和修改等操作,并将数据通过IO流技术方式保存在设定的文件里。
设计的思路为:将各项操作功能独立出来,进行归类,分布式开发。按照实现业务的需要进行分层,那些属于行为处理层,那些属于数据保存的业务层等等。那么具体的实现代码如下:
①:创建Persoon类,并放在独立的一个包中:
import java.io.Serializable;
@SuppressWarnings("serial")
public class Person implements Serializable{
//定义类的几个属性
private String name;
private int age;
private float score;
public Person(){}
//重载构造函数
public Person(String name , int age , float score){
super();
this.name = name;
this.age = age;
this.score = score;
}
//对类的属性进行封装
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
//重写toString方法
public String toString(){
return "姓名:"+this.getName()+",年龄"+this.getAge()+",分数"+this.getScore();
}
}
②:创建工具包,包内含有两个工具类
FileOperate类是对和文件有关操作的处理类,包括对文件的写入和读取
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class FileOperate {
public static final String FILENAME = "E:\\person.ser";
//把对象保存在文件之中
public void save(Object obj){
ObjectOutputStream out = null;
try{
out = new ObjectOutputStream(new FileOutputStream(new File(FILENAME)));
//写入对象
out.writeObject(obj);
}catch(Exception e){
try{
throw e;
}catch(Exception e1){}
}finally{
try{
out.close();
}catch(Exception e){}
}
}
//把对象从文件中读出来
public Object read() throws Exception{
Object obj = null;
ObjectInputStream input = null;
try{
input = new ObjectInputStream(new FileInputStream(new File(FILENAME)));
obj = input.readObject();
}catch(Exception e){
throw e;
}finally{
try{
input.close();
}catch(Exception e){}
}
return obj;
}
}
InputData类,是对输入数据进行判断的类,区别那些数据是符合要求的,不符合要求的给出提示
import java.io.*;
public class InputData {
//定义缓冲流
private BufferedReader buf = null;
public InputData()
{
buf = new BufferedReader(new InputStreamReader(System.in));
}
//对数据录入,并且保存
public String getString()
{
String str = null;
try{
str = buf.readLine();
}catch(IOException e){}
return str;
}
//该方法判断输入的数据是否符合要求,符合则转换并且返回,不是给出提示信息
public int getInt()
{
int temp = 0;
String str = null;
boolean b = true;
while(b)
{
str = this.getString();
if(!(str.matches("\\d+")))
{
//如果输入的不是一个数字,则必须重新输入
System.out.print("输入的内容必须是整数,请重新输入:");
}
else{
temp = Integer.parseInt(str);
//结束循环
b = false;
}
}
return temp;
}
//判断输入的数据是不是要求的数据
public float getFloat()
{
float f = 0.0f;
String str = null;
boolean b = true;
while(b){
str = this.getString();
if (!(str.matches("\\d+?.\\d{1,2}"))){
//如果输入的不是一个数字,则必须重新输入
System.out.print("输入的内容必须是小数(小数点后两位),请重新输入:");
}else{
//输入的是一个符合要求的数字,则可以进行转换
f = Float.parseFloat(str);
//结束循环
b = false;
}
}
return f;
}
}
③:创建op包,存放对Person对象操作的PersonOperate类
import com.dr.demo.util.FileOperate;
import com.dr.demo.util.InputData;
import com.dr.demo.vo.Person;
public class PersonOperate {
private InputData input = null;
public PersonOperate()
{
this.input = new InputData();
}
//构造一个添加对象的方法
public void add()
{
String name = null;
int age = 0;
float score = 0.0f;
//对录入信息的处理
System.out.print("输入姓名:");
name = this.input.getString();
System.out.print("输入年龄:");
age = this.input.getInt();
System.out.print("输入成绩:");
score = this.input.getFloat();
//生成Person对象,把对象保存在文件中
Person p = new Person(name,age,score);
try{
//IO层输入流操作将P保存到指定的文件里
new FileOperate().save(p);
System.out.println("保存成功!");
}catch(Exception e){
System.out.println("保存失败!");
}
}
//构造读取已保存信息的方法
public void show()
{
Person p = null;
try{
//IO层输出流的操作,读取文件内的信息
p = (Person)new FileOperate().read();
}catch(Exception e){
System.out.println("读取失败");
}
if(p != null)
{
System.out.println("个人信息如下:");
System.out.println(p);
System.out.println("*************************************************");
}
}
//构造更新信息的方法
public void update()
{
Person p = null;
try{
//IO层输出流的操作,读取文件内的信息
p = (Person)new FileOperate().read();
}catch(Exception e){
System.out.println("读取失败");
}
if(p != null)
{
//信息重置
String name = null;
int age = 0;
float score =0.0f;
System.out.print("请输入新的姓名(原姓名:"+p.getName()+")");
name = this.input.getString();
System.out.print("请输入新的年龄(原年龄:"+p.getAge()+")");
age = this.input.getInt();
System.out.print("请输入新的成绩(原成绩:"+p.getScore()+")");
score = this.input.getFloat();
p.setName(name);
p.setAge(age);
p.setScore(score);
try{
new FileOperate().save(p);
System.out.println("信息更新成功!");
}catch(Exception e){
System.out.println("信息更细失败!");
}
}
}
}
④:创建menu包,存放Menu类,实现界面上的系统操作
import com.dr.demo.op.PersonOperate;
import com.dr.demo.util.InputData;
public class Menu {
InputData input = null;
public Menu()
{
this.input = new InputData();
//死循环,显示选择菜单
while(true)
{
this.show();
}
}
//第一初始界面中的菜单
public void show()
{
//输出界面显示的信息
System.out.println("\t\t\t1、增加人员信息");
System.out.println("\t\t\t2、浏览人员信息");
System.out.println("\t\t\t3、修改人员信息");
System.out.println("\t\t\t4、退出系统");
System.out.print("\n\n请选择要使用的操作:");
int temp = input.getInt();
switch(temp)
{
case 1 : { //添加一个新成员,调用业务层的添加方法
new PersonOperate().add();
break;
}
case 2 : { //浏览人员,调用业务层的读取方法
new PersonOperate().show();
break;
}
case 3 : { //修改成员信息,调用业务层的更新信息方法
new PersonOperate().update();
break;
}
case 4 : { //退出正在运行的程序
System.out.println("选择 4 退出系统");
System.out.println("系统退出!");
System.exit(1);
}
default:{
System.out.println("输入的内容不符合格式要求");
break;
}
}
}
}
⑤:创建main包,存放Main类,主要的程序入口
import com.dr.demo.menu.Menu;
public class Main {
public static void main(String args[])
{
new Menu(); //实例化菜单Menu类
运行结果如下:
1、增加人员信息
2、浏览人员信息
3、修改人员信息
4、退出系统
请选择要使用的操作:1
输入姓名:soapssoap
输入年龄:23
输入的内容必须是整数,请重新输入:23
输入成绩:23
输入的内容必须是小数(小数点后两位),请重新输入:32.0
保存成功!
1、增加人员信息
2、浏览人员信息
3、修改人员信息
4、退出系统
请选择要使用的操作:2
个人信息如下:
姓名:soapssoap,年龄23,分数32.0
*************************************************
1、增加人员信息
2、浏览人员信息
3、修改人员信息
4、退出系统
请选择要使用的操作:3
请输入新的姓名(原姓名:soapssoap)soap
请输入新的年龄(原年龄:23)32
请输入新的成绩(原成绩:32.0)32.1
信息更新成功!
1、增加人员信息
2、浏览人员信息
3、修改人员信息
4、退出系统
请选择要使用的操作:2
个人信息如下:
姓名:soap,年龄32,分数32.1
*************************************************
1、增加人员信息
2、浏览人员信息
3、修改人员信息
4、退出系统
请选择要使用的操作:4
选择 4 退出系统
系统退出!
体会:这次练习,我进一步体会到了主程序或者说主类的内部非常简洁,所有处理数据和命令的方法和函数全部定义在后台的各个分类,充分的体现了封装和分布式思想。将整个程序分成不同的板块,进行不同的处理,哪里出了错方便快捷的锁定到哪个板块。这种布局不仅增强了程序的可读性,代码不在是胡乱的堆在一起,按照类别功能分成不同的类,需要的时候直接相互调用即可;而且扩展了程序的灵活性,对于业务的需求变化只需稍加修改即可,例如我只需要另外新建一个包含有窗体的UI包,将后台的各项处理结果通过传递参数的方式显示在窗口中,即可完成改程序由控制台向UI界面的变换。
posted on 2010-11-06 17:33
Soap MacTavish 阅读(1559)
评论(0) 编辑 收藏