随笔-10  评论-11  文章-20  trackbacks-0

什么是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)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: