第十四周课程总结&实验报告(简单记事本的实现)
一、实验报告
1-1、实验代码
import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.filechooser.FileNameExtensionFilter; public class WWH implements ActionListener { JFrame frame; //窗体 JTextArea jta; //多行文本框 JMenuBar jmb; //菜单 File file; //新建文件 JMenu WMenu,BMenu,GMenu,CMenu; //菜单栏 JMenuItem newMenu,openMenu,saveMenu,saveasMenu,closeMenu; //菜单-文件-菜单项 JMenuItem c,v,z,x,a; //菜单-编辑-菜单项 JMenuItem wMenu; //菜单-格式-菜单项 JMenuItem bigMenu,smallMenu; //菜单-查看-菜单项 public WWH() { //记事本 frame = new JFrame("记事本"); //多行文本框 jta = new JTextArea(); //菜单栏 jmb = new JMenuBar(); //菜单项 WMenu = new JMenu("文件(F)"); BMenu = new JMenu("新建(E)"); GMenu = new JMenu("格式(O)"); CMenu = new JMenu("查看(Q)"); //菜单栏-文件 newMenu = new JMenuItem("新建(N)"); openMenu = new JMenuItem("打开(T)"); saveMenu = new JMenuItem("保存(S)"); saveasMenu = new JMenuItem("另存为(A)"); closeMenu = new JMenuItem("关闭(W)"); //菜单栏-编辑 c = new JMenuItem("复制(C)"); v = new JMenuItem("粘贴(V)"); z = new JMenuItem("撤销(Z)"); x = new JMenuItem("剪贴(X)"); a = new JMenuItem("全选(A)"); //菜单栏-格式 wMenu = new JMenuItem("自动换行(B)"); //菜单栏-查看 bigMenu = new JMenuItem("放大(K)"); smallMenu = new JMenuItem("缩小(L)"); //菜单栏-助记符 WMenu.setMnemonic('F'); BMenu.setMnemonic('E'); GMenu.setMnemonic('O'); CMenu.setMnemonic('Q'); //菜单栏-文件-助记符 newMenu.setMnemonic('N'); openMenu.setMnemonic('T'); saveMenu.setMnemonic('S'); saveasMenu.setMnemonic('A'); closeMenu.setMnemonic('W'); //菜单栏-编辑-助记符 c.setMnemonic('C'); v.setMnemonic('V'); z.setMnemonic('Z'); x.setMnemonic('X'); a.setMnemonic('A'); //菜单栏-格式-助记符 wMenu.setMnemonic('B'); //菜单栏-查看-助记符 bigMenu.setMnemonic('K'); smallMenu.setMnemonic('L'); //菜单栏-文件-快捷键 newMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK)); openMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, ActionEvent.CTRL_MASK)); saveMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK)); saveasMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK)); closeMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.CTRL_MASK)); //菜单栏-编辑-快捷键 c.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); v.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK)); z.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK)); x.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK)); a.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK)); //菜单栏-格式-快捷键 wMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, ActionEvent.CTRL_MASK)); //菜单栏-查看-快捷键 bigMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, ActionEvent.CTRL_MASK)); smallMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, ActionEvent.CTRL_MASK)); //菜单栏-文件-监听器 newMenu.addActionListener(this); openMenu.addActionListener(this); saveMenu.addActionListener(this); saveasMenu.addActionListener(this); closeMenu.addActionListener(this); //菜单栏-编辑-监听器 c.addActionListener(this); v.addActionListener(this); z.addActionListener(this); x.addActionListener(this); a.addActionListener(this); //菜单栏格式-监听器 wMenu.addActionListener(this); //菜单栏-查看-监听器 bigMenu.addActionListener(this); smallMenu.addActionListener(this); //把菜单项加到菜单栏-文件中 WMenu.add(newMenu); WMenu.add(openMenu); WMenu.add(saveMenu); WMenu.add(saveasMenu); WMenu.addSeparator(); //分隔线 WMenu.add(closeMenu); //把菜单项加到菜单栏-编辑中 BMenu.add(c); BMenu.add(x); BMenu.add(z); BMenu.add(x); BMenu.addSeparator(); //分隔线 BMenu.add(a); //把菜单项加到菜单栏-格式中 GMenu.add(wMenu); //把菜单项加到菜单栏-查看中 CMenu.add(bigMenu); CMenu.add(smallMenu); //把菜单栏加到菜单中 jmb.add(WMenu); jmb.add(BMenu); jmb.add(GMenu); jmb.add(CMenu); //添加滚动条 frame.getContentPane().add(new JScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED)); //记事本布局 frame.setJMenuBar(jmb); frame.setSize(800, 600); //设置窗体大小 frame.setLocation(500, 200);//设置窗体的显示位置 frame.setVisible(true); //让组件显示 } public void actionPerformed(ActionEvent ae) { Object obj= ae.getSource();// 获得事件监听的对象 if(obj instanceof JMenuItem) //判断是否同一类 { JMenuItem item = (JMenuItem) obj; //强制转换 if(item == newMenu) //新建 { new WWH(); } else if(item == openMenu) //打开 { JFileChooser jfc1 = new JFileChooser();//选择文件 jfc1.showOpenDialog(null); file = jfc1.getSelectedFile(); try { FileInputStream fis = new FileInputStream(file);//建立输入流 byte b[] = new byte[fis.available()];//创建文件缓冲区 fis.read(b);//读取文件 jta.append(new String(b)); fis.close();//关闭 } catch(FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch(IOException ioe1) { ioe1.printStackTrace(); } } else if(item == saveMenu) //保存 { if(file != null) { try { PrintStream ps = new PrintStream(new FileOutputStream(file));//建立输出流 ps.print(this.jta.getText()); ps.close();//关闭 } catch (FileNotFoundException fnfe2) { fnfe2.printStackTrace(); } } } else if(item == saveasMenu) //另存为 { JFileChooser jfc2 = new JFileChooser();//选择文件 jfc2.showOpenDialog(null); file = jfc2.getSelectedFile(); try { if(!file.exists()) //文件不存在则创建新文件 { file.createNewFile(); } FileOutputStream fos = new FileOutputStream(file); byte b[] = jta.getText().getBytes();//获得文件内容 fos.write(b);//读写操作 fos.close();//关闭 } catch(IOException ioe2) { ioe2.printStackTrace(); } } else if(item == closeMenu) //关闭 { System.exit(1); } } } }
1-2、实验代码
public class Text { public static void main(String[] args) { new MyTextPad(); } }
2-1、运行结果截图
总结:这次的记事本都是老师讲过的,相对于写起来不是特别难,但细节要掌握好
学习总结
1、JDBC
有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBC API写一个程序就够了,它可向相应数据库发送SQL调用。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言"编写一次,处处运行"的优势。
Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。
Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。而 JDBC 正是作为此种用途的机制。
JDBC 扩展了 Java 的功能。例如,用 Java 和 JDBC API 可以发布含有 applet 的网页,而该 applet 使用的信息可能来自远程数据库。企业也可以用 JDBC 通过 Intranet 将所有职员连到一个或多个内部数据库中(即使这些职员所用的计算机有 Windows、 Macintosh 和UNIX 等各种不同的操作系统)。随着越来越多的程序员开始使用Java 编程语言,对从 Java 中便捷地访问数据库的要求也在日益增加。
MIS管理员们都喜欢 Java 和 JDBC 的结合,因为它使信息传播变得容易和经济。企业可继续使用它们安装好的数据库,并能便捷地存取信息,即使这些信息是储存在不同数据库管理系统上。新程序的开发期很短。安装和版本控制将大为简化。程序员可只编写一遍应用程序或只更新一次,然后将它放到服务器上,随后任何人就都可得到最新版本的应用程序。对于商务上的销售信息服务, Java 和JDBC 可为外部客户提供获取信息更新的更好方法。
JDBC的主要操作及接口
1)使用JDBC的步骤
加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
a.注册驱动 (只做一次)
方式一:Class.forName(“com.MySQL.jdbc.Driver”);
推荐这种方式,不会对具体的驱动类产生依赖。
方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。
b.建立连接
Connection conn = DriverManager.getConnection(url, user, password);
URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
其他参数如:useUnicode=true&characterEncoding=utf8
c.创建执行SQL语句的statement
//Statement String id = "5"; String sql = "delete from table where id=" + id; Statement st = conn.createStatement(); st.executeQuery(sql); //存在sql注入的危险 //如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录 //PreparedStatement 有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令) String sql = “insert into user (name,pwd) values(?,?)”; PreparedStatement ps = conn.preparedStatement(sql); ps.setString(1, “col_value”); //占位符顺序从1开始 ps.setString(2, “123456”); //也可以使用setObject ps.executeQuery();
d.处理执行结果(ResultSet)
ResultSet rs = ps.executeQuery(); While(rs.next()){ rs.getString(“col_name”); rs.getInt(1); //… }
e.释放资源
//数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放 //都要加try catch 以防前面关闭出错,后面的就不执行了 try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (st != null) { st.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
总结:数据库听的一脸懵逼,要继续努力去学习