java程序设计实验报告2.docx
- 文档编号:7905733
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:15
- 大小:791.79KB
java程序设计实验报告2.docx
《java程序设计实验报告2.docx》由会员分享,可在线阅读,更多相关《java程序设计实验报告2.docx(15页珍藏版)》请在冰豆网上搜索。
java程序设计实验报告2
山东大学软件学院
java课程设计实验报告
学生:
骆大峰
学号:
201100300115
班级:
11级软件三班
Java简介
Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
一、课程设计任务及要求
自己独立完成一个具有独立客户端以及服务器的
二、需求分析
(1)服务器
(2)客户端
(3)数据库
(4)图形界面
(5)IO流技术
(6)线程
(7)异常
三、设计思路
------------刚开始看课程设计时,主要关注的是浏览器,于是就想着怎样设计出美观的界面,正如XX等网页的界面类似,以及让它具有相当完整的功能,除了能用button前进,后退外,考虑到用鼠标也可以实现同样的功能;同时还应具备查看源代码,历史记录等功能,忽略了服务器的功能。
----------在不断的学习.查阅资料中,逐渐了解到当今互联网的工作模式。
在c/s工作模式下,将主要工作交给了后台工作的服务器,客户端的浏览器将客户的请求交给服务器,服务器对客户的请求进行分析与服务,大大方便了客户端。
-----------编写miniIE与miniApache,即使模拟当今互联网的工作模式,,需要定义自己的标签,并能解析它,你需要设计好一个大致的排版样式,使你能写的网页易于解析,且使它的样式多样,直观。
这样就能根据客户端在浏览器上输入的网址查找网页,解析出来后呈现给用户观看(只不过这里的网页是你自己预先存放在服务器工作目录下的且是自己定义的书写标准)。
在连接浏览器与服务器的工作中,编写一个线程池,每一个线程处理一个socket的连接,这样就能实现多用户的接入。
展现给用户的最直接的当然是一个浏览界面,因此在实现好主要功能的基础上可以尽量的让界面更美观,可以引用一些图片,设置一下字体的格式,这样工作就基本完成;
------------实现声音的播放,可以使用Java中AudioClip的play()方法实现;----实现动画功能其实就是使画面不断改变,如何变静态为动态,可以使用timer函数,在每隔指定的时间触发一次事件,已达到动画的效果;
—————实现了在互联网上的浏览,通过关联一个和独立的ie浏览器实现了功能
四、详细设计
(过程)
--------开学不久,对Java课程设计的要求不是很理解,感觉十分的困难,对整体把握缺乏理解,于是便未开始编写代码,准备整个3月用来查阅资料,收集这方面的相关信息,于是学习了swing,系统的掌握了关于界面的组件
---------一个月的学习,感觉收获不小,对于浏览器的编写有了一定的想法,于是准备编写程序了。
清明期间,用了一天的时间将界面写出来了,并实现了相关功能;并花了一天的时间完善,使代码更健壮,不会因为操作的原因使程序中段,并能显示出现各种情况的原因,内心颇为高兴。
接下来我仔细分析了一下实验要求,发现按自己的思想服务器的功能根本不用实现,因为已经能看网页了,于是我暂停了编程工作。
-----
---------在暂停编程工作后,我并没有放弃,我在不断的思考服务器与浏览器之间的关系,并从网上下了Tomactapache服务器以及不断在图书馆查找相关知识,终于有所收获,终于明白了老师的要求。
浏览器是用户查看网页时的一个工具,一个网页显示给用户观看的区域,服务器则是能将用户网页展示给的关键。
对于自定义的互联网工作模式,我们需要自己定义一些标签,以及这些标签的使用规则,对于这些标签的解析规则,使编写的标签代码直观的显示,因此最终确定编程要点:
1.定义一些基本标签以及它们的使用规则;2,定义解析规则;
3,设计线程池,使接受多用户请求;
4实现服务器与浏览器的连接;、
----------思路最终确定下来,并且还能确定思路正确,于是又进入了整日的编程工作中。
虽然具体的思路确定,但具体表现在程序上,还有着不小的差距,但脑子长时间高度集中在一件事上,两天,代码大致完成,虽然很多地方不够完善,具体功能与所想有所差距,但至少已经成型。
五、运行调试与分析讨论
分别启动miniIE.jar和miniApache.jar,这两个文件分别在miniIE和miniApache文件夹中。
目前实现操作:
一、服务器
1.1服务器端假设了两个网页
1.www.miniIE.com
2.
3.www.miniA.com
4.
所以miniIE的浏览器只能访问这两个网页,如果想要增加新的网页,这样做:
\miniApache\webs\目录下放置新的网页内容,目录结构为(以miniA举例)
:
\miniApache\webs\miniA\放置children、this两个文件夹
\miniApache\webs\miniA\this\下放置三个文件夹html、image、other,其中html必须要有内容,其他两个可以没有。
如图:
1.2服务器网页内容管理
如图,直接在服务器页面实现html的修改,createnewhtml尚未实现,感兴趣的同学可以实现。
打开miniA的html后,可以修改内容,并且保存。
1.3历史记录管理
采用与access数据库连接方式。
记录为自动模式,每次访问都写入数据库。
并且可以查看次数。
1.4服务器实时监控
如下图中,每次访问都有记录,并且网页内容发送状态也显性的出现。
2、浏览器
未实现工具栏功能,未实现关闭网页。
排版引擎目前只支持标签的识别,标题的识别。
HTML是自定义中文格式。
六参考文献摘录
(一)
一、我们在编程的时候想实现界面的切换:
界面的切换主要有两种方法,一种就是利用菜单的形式,当点击菜单的时候就会出现界面的切换;另外一种就是利用按钮。
下面就这两种的方法与主Frame之间切换的方法实现说明:
方法一:
菜单切换界面,菜单在Swingmenus栏中有,首先就是把JMenuBar拖到Frame中,一般式拖到它的上端会出现,紧接着就是出现填写JMenuBar的名称,一般的填写就是直接用这个。
然后就是点击JMenu拖到JMenuBar中,出现填写名字,一般就是写JMenu1JMenu2等名字,随后就是托JMenuItem到图中,要放在那个JMenu菜单下就停在哪个的上面,然后填写名字,一般的缩写是Jmi_addJmi_del等名字;同时在左边的JavaBeans中会出现菜单的所属关系。
当然可以拖动改变他们的所属关系,一般就是JMenu可以处在JMenu下面,也可以处在JMenuBar下面,JMenu处在JMenu下面的时候就实现了多级目录,因为JMenu下面还可以插入JMenuItem。
但是JMenuItem下面不能再插入子目录了,所以目前可以做到二级目录;我们可以在JavaBeans中的目录中选取你要添加的事件的目录然后右键,Evens加入事件,然后在事件中加入to-add();函数,并且再外面定义,定义如下:
publicvoidto_add(){this.setContentPane(newAddPanel(this));}其中的AddPanel是两外面板,意思就是说点击菜单之后会自动跳转到AddPanel面板,其实就是AddPanel面板替换当前的面板的意思;方法二:
按钮切换界面,在每次新建一个Frame的时候都会出现三个函数,分别是构造函数,就是calss名字那个函数,里面有{super();initialize();}initialize()当中有包括{this.setSize(300,200);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");}这三个函数,分别是设置大小,名字以及Frame中放什么面板,就是this.setContentPane(getJContentPane());这个函数控制用什么面板,其中的getJContentPane()又是一个函数,函数中主要有if(jContentPane==null){
jContentPane=newJPanel();
jContentPane.setLayout(newBorderLayout());//一般我们把newBorderLayout()这种分成东南西北的布局改成null形式;
}
returnjContentPane;
}这是我们生成Frame后自动会生成的,老师的在Telbook代码中Frame的面板中首先放的是一个登陆面板,代码是if(jContentPane==null){
jContentPane=newLoginPanel(this);
jContentPane.setLayout(null);
}
returnjContentPane;
}老师的代码与自动生成的代码不同之处在与jContentPane=newJPanel()(自动生成的);和jContentPane=newLoginPanel(this);(老师的),老师放的是登陆面板LoginPanel()并且里面放的是this,指的是LoginPanel放在当面的Frame中,因为这个类是MainFrame类就是主面板。
上面所讲的还只是在主面板中首先要放我们的面板。
接下来讲如何进行按钮的切换界面,同样的我们必须要对按钮右键添加事件,其中改动的代码是if(tf_username.getText().equals("admin")&&pf_password.getText().equals("1234")){
f.setContentPane(newMainPanel(f));
}
else{
JOptionPane.showMessageDialog(null,"用户名或密码错误");}//弹出一个窗口,显示你的用户名或者密码错误的窗口,点击确定会消失,又可以重新输入数字。
这段是老师做的Login中的登陆按钮,它表示如果账号和密码都跟设置的匹配的话就执行f.setContentPane(newMainPanel(f));代码,这个代码执行的就是当正确的时候就会转到MainPanel主面板上,相应的我们在主面板上如果点击添加联系人的按钮后,其实就是对这个按钮添加一个事件f.setContentPane(newAddPanel(f));我们可以看到当我们要进入哪个面板的时候只需要更换MainPanelAddPanel等,比如当我们进入添加联系人面板之后要返回到主面板我们只需要在“返回”的按钮上添加事件f.setContentPane(newMainPanel(f));就是回到主面板。
前面我们只是说了主界面Frame新建的时候在构造函数里面有自动生成super()和initialize()初始化两个函数,在面板生成的时候也会自动出现这两个函数,但是我们面板都是在主界面Frame上面操作的,所以我们必须把面板的构造函数中增加参数MainFramef并且在super()之后协商this.f=f;这条语句。
所有的面板都要写面板是基于哪个主界面上操作的参数。
二、每次新建一个JTextField和JPassWordField之后都会同步出现一个函数,比如gettf_name.这个tf_name是我们在新建JTextField的时候给它命的名字,前面加个get就是这个函数名字。
而JLableJButton等是不会自动出现函数的。
一般缩写是JLable缩写成l;JButton缩写成btn;JTextField缩写成tf;JPassWordField缩写成pf;
三、老师的新增联系人按钮事件的代码是f.telbook.put(tf_name.getText(),tf_no.getText());
JOptionPane.showMessageDialog(null,"添加成功");
tf_name.setText("");
tf_no.setText("");
四、有关调用runtime.getruntime.exec();这条命令可以打开另外一些程序,比如打开计算器,桌面的文档。
如在括号里面填"C:
/ProgramFiles/MicrosoftOffice/OFFICE11/WINWORD.EXE"可以打开桌面的一个windword。
五、获取当前系统时间并且用一个JLable现实出来的代码:
Threadt=newThread(newMyThread(l_time));
t.start();//灰色的这段代码是挡在初始化的函数中,主要就是初始化一个进程,并且MyThread这也是一个类,在下面的代码中。
l_time是一个JLable的对象,在下面MyThread类中构造函数中放的JLabell意思就是将l_time这个JLable是用来放时间的,后面的run函数是一运行这个线程就会运行的。
}
classMyThreadimplementsRunnable{
JLabell;
MyThread(JLabell){
this.l=l;
}
publicvoidrun(){
while(true){
l.setText("当前时间:
"+newSimpleDateFormat("yyyy年MM月dd日hh:
mm:
ss").format(newDate()));
try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
六:
以前老是写的事件监听器一般都是按按钮就实现界面的切换,有时候我们要讲按钮上的数字输进去,代码如下:
Stringcomm=e.getActionCommand();//获得按钮上的内容存到comm中
if("0123456789".indexOf(comm)!
=-1)//indexof表示如果按到的内容是属于0123456789的,即用comm的内容与0123456789比较,用!
=-1表示取到的内容是正确的。
如果成立那就执行后面{}的代码,假如前面只有一个字符要与后面匹配的话就是用equal就可以,例如:
if("=".equals(comm))就是问=时候与后面的comm时候相等,相等为真,执行后面的代码,否则为假。
if(temp.indexOf(".")==-1)其实indexof还可以用在前面是一个变量,与后面的进行匹配。
七、doubled1=Double.parseDouble(op1);这个代码表示的将String类型的op1转化成double类型的数字。
Java中t.setText(d1+"");其中d1是double类型的,到那时settext()中的必须是String类型的,所以我们可以在输出的时候在后面加上+””就可以输出了。
Double类型的数字转化成String类型的代码是:
doublenum=12.30;
Stringstr=String.valueOf(num);
退出系统可以用System.exit(0);
age=Integer.parseInt(txtAge.getText());String转化成int型
ØJava中各个界面之间的切换的关系:
首先就是登陆界面跳转到主界面,
publicLoginFrame(){
super();
initialize();
}这是登陆面板的构造函数。
MainFramef=newMainFrame();
f.setVisible(true);
hide1();黄色这部分字登陆界面按钮登陆的事件监听代码。
publicMainFrame(){
super();
initialize();
}这是主界面的构造函数。
即就是如下图的这个界面。
上面这个图是一个JFrame,后面的jpanel都是在这个Jframe上。
然后就是Jframe
Ø选择男女以及选择地址的编程:
Stringsex="";
if(rb1.isSelected())
sex="男";
elseif(rb2.isSelected())
sex="女";
if(sex==null||sex.equals("")){
JOptionPane.showMessageDialog(this,"请选择性别!
","错误提示",JOptionPane.WARNING_MESSAGE);
flag=1;
}
上面的程序表示的是选择男女的程序。
参考文献摘录
(二)
JAVA数据库相关编程:
ODBC数据库连接:
需要数据源:
shuju
Connectioncon;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//数据库驱动
con=DriverManager.getConnection("jdbc:
odbc:
shuju");//连接源
Statementstat=con.createStatement();
Stringqu="select*fromxinji";//选择
ResultSetrs=stat.executeQuery(qu);
while(rs.next()){//函数体}
ODBC数据库:
不需要数据源
Stringurl="jdbc:
odbc:
;DRIVER={MicrosoftAccessDriver(*.mdb)};DBQ=路径";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection(url);
Statementstat=con.createStatement();
Stringqu="select*fromxinji";
ResultSetrs=stat.executeQuery(qu);
while(rs.next()){}
OBDC数据库的新增:
//数据库连接代码//
Stringquery1="insertintoxinji(xuhao,xuehao,name,chengji)values("+"+'"+i+"','"+str2+"','"+str3+"','"+str4+"')";
stat.executeUpdate(query1);
ODBC数据库更改指定位置信息:
Stringquery3="updatexinjisetchengji=?
wherexuehao=?
";
PreparedStatementps=con.prepareStatement(query3);
ps.setString(1,str1);
ps.setString(2,xuehaos);
ps.executeUpdate();
获取图片相对路径:
jLabel22=newJLabel(newImageIcon(JiaoXuan.class.getClassLoader().getResource("图片名")));
获取绝对路径:
Stringpath=System.getProperty("user.dir");//classpath路径
Stringhv=path+"数据相对路径";
提示信息框:
JOptionPane.showMessageDialog(null,"添加失败,请重新添加!
","提示信息",3);//最后的3是决定信息框的样式的,参数有多种,可以查文档
获取当前星期几:
Calendarcalendar=Calendar.getInstance();
intk=calendar.get(Calendar.DAY_OF_WEEK);//k=1,是星期天,星期天是第一天
获取当前时间:
SimpleDateFormatsdf=newSimpleDateFormat("yyyy年MM月dd日");
Strings=sdf.format(newDate());
获取电脑屏幕宽和高的方法:
publicstaticintheight(){
Dimensiond=Toolkit.getDefaultToolkit().getScreenSize();
returnd.height/2;
}
publicstaticintwidth(){
Dimensiond=Toolkit.getDefaultToolkit().getScreenSize();
returnd.width/2;
}
this.setLocation(width()-窗体宽的/2,height()-窗体高/2);//窗体居中
给静态文本框JLabel添加鼠标点击事件:
privateJLabelgetjlb(){
if(jLabel22==null){
jLabel22=newJLabel(newImageIcon(JiaoXuan.class.getClassLoader().getResource("wang.jpg")));
jLabel22.setBounds(newRectangle(390,30,79,84));
jLabel22.addMouseListener(newMouseAdapter(){//鼠标事件监听
publicvoidmouseClicked(MouseEvente){
try{
Runtime.getRuntime().exec("cmd.exe/cstart"+"http:
//wudewen68.w5w5.info");
}catch(Exceptionex){
ex.printStackTrace();
}
}
});
}
returnjLabel22;
}
选中单选按钮:
jRadioButton.setSelected(true);
判断是否选中单选按钮:
jRadioButton.isSelected()//返回值类型:
bool
参考文献(深入浅出jdk6.0,java程序设计)
六、设计体会与小结
学习java也有半年多的时间了可是觉得自己的功力还是不足够自己的很多的想法总是实现不了自己的许多代码报错很多这一次的课程设计就更加暴漏了自己的缺点感觉自己每天都在看java书也是感觉自己学了很多东西自己每天都会在电脑前编一段时间的程序可是就是进步很小很小不能实现自己的很小的想法而且自己积累的东西很容易遗忘每每看书的时候总是觉得书上写的东西太过浅显总要自己的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 程序设计 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)