??xml version="1.0" encoding="utf-8" standalone="yes"?> package cal.test; import java.awt.*; public class CalTest extends JFrame implements ActionListener private JButton getBackspace() { private JButton getClear() { private JButton getBt7() { private JButton getBt8() { private JButton getBt9() { private JButton getBt11() { private JButton getSqrt() { private JButton getBt4() { private JButton getBt5() { private JButton getBt6() { private JButton getBt12() { private JButton getBt13() { private JButton getBt1() { private JButton getBt2() { private JButton getBt3() { private JButton getBt14() { private JButton getJButton() { private JButton getBt0() { private JButton getBt16() { private JButton getBt17() { private JButton getBt18() { private JButton getBt19() { public static void main(String[] args) public CalTest() private JPanel getJContentPane() { ?span> 面向q程 在一个结构体中定义窗口的大小Q位|,颜色Q背景等属性,对窗口操作的函数与窗口本w的定义没有M关系Q如HideWindow,MoveWindow,MinimizeWindowQ这些函数都需要接受一个代表要被操作的H口参数Q是一U谓语与宾语的关pR?/span> ?span> 面向对象 定义H口Ӟ除了要指定在面向q程中规定的那些属性,如大,位置Q颜Ԍ背景{外Q还要指定该H口可能h的动作,如隐藏,UdQ最化{。这些函数被调用Ӟ都是以某个窗口要隐藏某个H口要移动的语法格式来用的Q这是一U主语与谓语的关pR?/span> ?span> 面向对象的三大特?/span> ?/span>装 ?/span>l承 ▂多?/span> cM对象 cLҎ一cM物的描述Q是抽象的,概念上的定义;对象是实际存在的该类事物的每个个体,因而也U实例(instanceQ?/span> 如果对象比作汽车,那么cd是汽车的设计囄。所以面向对象程序设计的重点是类的设计,而不是对象的设计?/span> cȝ定义 public class Person() { int age; void shout() { System.out.println("I am age "+age); } } ?span> age是类的属性,也叫cL员变?/span> ?span> shout是方法也叫类的成员函数?/span> ?span> shoutҎ可以直接讉K同一cM?/span>age变量Q如果一个方法中有与成员同名的局部变量,该方法中对这?br> 变量名的讉K是局部变量,而不是成员变量?/span> 在类中创建的成员变量会被初始化,局部变量不会被初始?/strong>?/span> 对象的?/strong> 创徏新的对象之后Q我们就可以使用“对象?/span>.对象成员”的格式,来访问对象的成员Q包括属性和ҎQ?/span> class Person { int age; void shout() { System.out.println("age="+age); } } class TestPerson { public static void main(String[]args) { Person p1=new Person(); p1.age=20; p1.shout(); Person p2=new Person(); p2.shout(); } } 上面E序q行的内存布局如下Q?/span> 对象的比?/span> ?span> “==”q算W与equals()Ҏ的区?/span> “==”用来比较值是否相{,equals()Ҏ用来比较两个对象的内Ҏ否相{?/span> ?nbsp; 怎样比较两个数组对象的内Ҏ否相{?/span> arrays.equals(ary1[],ary2[]); 匿名对象 ?span> 我们也可以不定义对象的句柄,而直接调用这个对象的Ҏ。这L对象叫做匿名对象Q?br> 如:new Person().shout(); ?nbsp; 如果对一个对象只需要进行一ơ方法调用,那么可以用匿名对象?/span> ?span> 我们l常匿名对象作为实参传递给一个函数调用?/span> 实现cȝ装?/span> ?span> 如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,p一个hw高Q不能被外部随意修改Q只能通过各种摄取营养的方法去修改q个属性?/span> ?span> 在定义一个类的成员(包括变量和方法)Ӟ使用private关键字说明这个成员的讉K权限Q这个成员成?nbsp;cȝU有成员Q只能被q个cd他成员方法调用,而不能被其他cM的方法所调用?/span> ?span> Z实现良好的封装性,我们通常类的成员变量声明ؓprivateQ再通过publicҎ来对q个变量q行讉K。对一个变量操作,一般都有读取和赋值操作,我们分别定义两个Ҏ来实现这两种操作Q一个是getXxx()ҎQ?/span>Xxx表示要访问的成员变量的名字)Q用来读取这个成员变量操作,另外一个是setXxx()用来对这个变量赋倹{?/span> ?span> 一个类通常是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内宏V我们在q行E序的详l设计时Q应量避免一个模块直接修Ҏ操作另外一个模块的数据Q模块设计追求强内聚Q许多功能尽量在cȝ内部独立完成Q不让外面干预)Q弱耦合Q提供给外部量的Ҏ调用Q?/span> class Person class TestPerson ?span> 构造函数的特征 ?/span>它具有与cȝ同的名称Q?/span> ▁它不含q回?/span> ▁它不能在方法中?span>return语句q回一个?/span> 注意Q在构造方法里不含q回值的概念是不同于“void”的,在定义构造方法时加了”voiid”Q结果这个方法就不再被自动调用?/span> ?span> 构造方法的作用Q当一个类的实例对象刚产生Ӟq个cȝ构造方法就会被自动调用Q我们可以在q个Ҏ中加入要完成初始化工作的代码?/span> 构造方法的重蝲 ?span> 和一般的Ҏ重蝲一P重蝲的构造方法具有不同个数或不同cd的参敎ͼ~译器就可以Ҏq一点判断出?/span>new 关键字生对象时Q该调用哪个构造方法了。生对象的格式是:new cdQ参数列表)Q?/span> ?span> 重蝲构造方法可以完成不同初始化的操作,如:p3=new Person(“Tom”18);语句Q会做这样几件事Q创建指定类的新实例对象Q在堆内存中为实例对象分配内存空_q调用指定类的构造方法,最后将实例对象的首地址赋值给引用变量p3?/span> This引用句柄的应?/span> ?span> 一个类中成员方法可以直接调用同cM的其他成员,其实我们在一个方法内部?#8220;this.其他成员”的引用方式和直接使用“其他成员”的效果是一LQ那thisq有多大的作用呢Q在有些情况下,我们是非得用this关键字不可的Q?/span> ▁让cȝ成员变量名和对其q行赋值的成员Ҏ的Ş参变量同名是必要的,q样的代码谁看了都能明白q两个变量是彼此相关的?/span> ▁假设我们有一个容器类和一个部件类Q在容器cȝ某个Ҏ中创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数?/span> ▁构造方法是在生对象时?span>javapȝ自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。但我们可以在一个构造方法里调用其他重蝲的构造方法,不是用构造方法名Q而是用this(参数列表)形式Q根据其中的参数列表Q选择相应的构造方法?/span> 垃圾回收q程分析 ?span> c++中的析构Ҏ ?span> java中的finalize()Ҏ ?span> System.gc的作?/span> Static静态变?/span> 当我们编写一个类Ӟ其实是在描q其对象的属性和行ؓQ而ƈ没有产生实质上的对象Q只有通过new关键字才会生出对象Q这时系l才会分配内存空间对象,其方法才可以供外部调用。我们有时候希望无论是否生了对象或无Z生了多少对象的情况下Q某些特定的数据在内存空间里只有一份?/span> ~写使用静态变量统计一个类产生的实例对象的个数的程序?/span>
class Person { private String name; private static int count=0; static String country="中国"; public Person() { System.out.println(name+":"+ ++count); } public Person(String name) { this.name=name; System.out.println(name+":"+ ++count); } void shout() { System.out.println(name); } } class TestPerson { public static void main(String[]args) { Person p=new Person("张三"); new Person(); p.shout(); new Person("李四").shout(); System.out.println(Person.country); } } q行l果Q?/span> 张三:1 null:2 张三 李四:3 李四 中国 Static静态方?/span> ?span> 在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法)Q而不能直接访问类中的非静态成员。这是因为,对于非静态的Ҏ和变量,需要先创徏cȝ实例对象后才可用,而静态方法在使用前不用创ZQ何对象?/span> ?span> 静态方法不能以M方式引用this?/span>super关键字。与上面的道理一P因ؓ静态方法在使用前不用创ZQ何实例对象,当静态方法被调用Ӟthis所引用的对象根本就没有产生?/span> ?span> main()Ҏ是静态的Q因?/span>JVM在执?/span>mainҎ时不创徏mainҎ所在的cȝ实例对象Q因而在main()Ҏ中,我们不能直接讉K该类中的非静态成员,必须创徏该类的一个实例对象后Q才能通过q个对象去访问类中的非静态成员?/span> 单态设计模?/span> ?span> 设计模式是在大量的实践中ȝ和理论化之后优选的代码l构、编E风根{以及解决问题的思考方式?/span> ?span> 所谓类的单态设计模式,是采取一定的Ҏ保证在整个的软gpȝ中,Ҏ个类只能存在一个对象实例,q且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能生一个对象,我们首先必须类的构造方法的讉K权限讄?/span>privateQ这样就不能?/span>new操作W在cȝ外部产生cȝ对象了,但在cȝ内部仍可以生该cȝ对象。因为在cȝ外部开始还无法{到cȝ对象Q只能调用该cȝ某个静态方法以q回cd部创建的对象Q静态方法只能访问类中的静态成员变量,所以,指向cd部生的该类对象的变量也必须定义成静态的?/span> class Chinese { static Chinese obj=new Chinese(); public static Chinese getInstance() { return obj; } private Chinese() { System.out.println("ss"); } } class TestChinese { public static void main(String[]args) { Chinese obj1=Chinese.getInstance(); Chinese obj2=Chinese.getInstance(); System.out.println(obj1==obj2); //如果相等q回true,否则q回false. } } q行l果Q?br>ss ——在cM直接定义的内部类(嵌套c?/span>) ?span> 内部c?嵌套c?可以直接讉K外部c?嵌套它的c?的成员,包括private成员Q但是,内部c?嵌套c?的成员却不能被外部类(嵌套它的c?直接讉K?/span> ?span> 在内部类对象保存了一个对外部cd象的引用Q当内部cȝ成员Ҏ中访问某一变量Ӟ如果在该Ҏ和内部类中都没有定义q这个变量,内部cM?/span>this的引用会被传递给那个外部cd象的引用?/span> ?span> 如果?/span>static修饰一个内部类Q这个类q当于是一个外部定义的c,所?/span>static的内部类中可声明static成员Q但是,?/span>static的内部类中的成员是不能声明ؓstatic?/span>Static的内部类不能再用外层封装的?/span>static的成员变量,q个道理不难惌Q所?/span>static嵌套cd用?/span> class Outer { int outer_i=100; void test() { Inner inner=new Inner(); inner.display(); } class Inner { void display() { System.out.println(outer_i); } } public static void main(String[]args) { Outer outer=new Outer(); outer.test(); } } ?span> 如果函数的局部变量(函数的参C是局部变量)、内部类的成员变量、外部类的成员变量重名,我们应该按下面的E序代码所使用的方式来明确指定我们真正要访问的变量?/span> public class Outer { private int size; public class Inner { private int size; public void doStuff(int size) { size++;//引用的是doStuff函数的Ş?/span> this.size++;//引用的是InnercM的成员变?/span> Outer.this.size++;//引用的是OutercM的成员变?/span> } } } 内部cd何被外部引用 class Outer { private int size=100; public class Inner { public void doStuff() { System.out.println(++size); } } } public class TestInner { public static void main(String[]args) { Outer outer=new Outer(); Outer.Inner inner=outer.new Inner(); inner.doStuff(); } } 在方法中定义的内部类 ?span> 嵌套cdƈ非只能在cM定义Q也可以在几个程序块的范围之内定义内部类。例如,在方法中Q或甚至?/span>for循环体内部,都可以定义嵌套类?/span> ?span> 在方法中定义的内部类只能讉KҎ?/span>fianlcd的局部变量,?/span>final定义的局部变量相当于是一个常量,它的生命周期出Ҏq行的生命周期?/span>
import java.awt.event.*;
import javax.swing.*;
{
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JTextField tf = null;
private JButton Backspace = null;
private JButton clear = null;
private JButton bt7 = null;
private JButton bt8 = null;
private JButton bt9 = null;
private JButton bt11 = null;
private JButton sqrt = null;
private JButton bt4 = null;
private JButton bt5 = null;
private JButton bt6 = null;
private JButton bt12 = null;
private JButton bt13 = null;
private JButton bt1 = null;
private JButton bt2 = null;
private JButton bt3 = null;
private JButton bt14 = null;
private JButton jButton = null;
private JButton bt15 = null;
private JButton bt0 = null;
private JButton bt16 = null;
private JButton bt17 = null;
private JButton bt18 = null;
private JButton bt19 = null;
boolean com=false;//用来判断是否点击q?+-*/"
boolean rs=false;//是否点击q?='
boolean qm=false;//取模
int flag=0;
int i=0;
String beforeNum=""; // @jve:decl-index=0:
String afterNum=""; // @jve:decl-index=0:
private JTextField getTf()
{
if (tf == null)
{
tf = new JTextField();
tf.setBounds(new Rectangle(5, 3, 283, 24));
}
return tf;
}
if (Backspace == null) {
Backspace = new JButton();
Backspace.setBounds(new Rectangle(35, 41, 80, 28));
Backspace.setText("C");
Backspace.setForeground(Color.RED);
Backspace.setFont(new Font("",Font.BOLD,15));
Backspace.addActionListener(this);
}
return Backspace;
}
if (clear == null) {
clear = new JButton();
clear.setBounds(new Rectangle(150, 41, 110, 28));
clear.setText("Backspace");
clear.setForeground(Color.RED);
clear.setFont(new Font("",Font.BOLD,15));
clear.addActionListener(this);
}
return clear;
}
if (bt7 == null) {
bt7 = new JButton();
bt7.setBounds(new Rectangle(3, 83, 53, 30));
bt7.setText("7");
bt7.setForeground(Color.BLUE);
bt7.setFont(new Font("",Font.BOLD,15));
bt7.addActionListener(this);
}
return bt7;
}
if (bt8 == null) {
bt8 = new JButton();
bt8.setBounds(new Rectangle(59, 83, 53, 30));
bt8.setText("8");
bt8.setForeground(Color.BLUE);
bt8.setFont(new Font("",Font.BOLD,15));
bt8.addActionListener(this);
}
return bt8;
}
if (bt9 == null) {
bt9 = new JButton();
bt9.setBounds(new Rectangle(117, 83, 53, 30));
bt9.setText("9");
bt9.setForeground(Color.BLUE);
bt9.setFont(new Font("",Font.BOLD,15));
bt9.addActionListener(this);
}
return bt9;
}
if (bt11 == null) {
bt11 = new JButton();
bt11.setBounds(new Rectangle(175, 83, 53, 30));
bt11.setText("/");
bt11.setForeground(Color.RED);
bt11.setFont(new Font("",Font.BOLD,15));
bt11.addActionListener(this);
}
return bt11;
}
if (sqrt == null) {
sqrt = new JButton();
sqrt.setBounds(new Rectangle(233, 83, 53, 30));
sqrt.setText("sqrt");
sqrt.setForeground(Color.BLUE);
sqrt.addActionListener(this);
//sqrt.setFont(new Font("",Font.BOLD,10));
}
return sqrt;
}
if (bt4 == null) {
bt4 = new JButton();
bt4.setBounds(new Rectangle(3, 125, 53, 30));
bt4.setText("4");
bt4.setForeground(Color.BLUE);
bt4.setFont(new Font("",Font.BOLD,15));
bt4.addActionListener(this);
}
return bt4;
}
if (bt5 == null) {
bt5 = new JButton();
bt5.setBounds(new Rectangle(59, 125, 53, 30));
bt5.setText("5");
bt5.setForeground(Color.BLUE);
bt5.setFont(new Font("",Font.BOLD,15));
bt5.addActionListener(this);
}
return bt5;
}
if (bt6 == null) {
bt6 = new JButton();
bt6.setBounds(new Rectangle(117, 125, 53, 30));
bt6.setText("6");
bt6.setForeground(Color.BLUE);
bt6.setFont(new Font("",Font.BOLD,15));
bt6.addActionListener(this);
}
return bt6;
}
if (bt12 == null) {
bt12 = new JButton();
bt12.setBounds(new Rectangle(175, 125, 53, 30));
bt12.setText("*");
bt12.setForeground(Color.RED);
bt12.setFont(new Font("",Font.BOLD,18));
bt12.addActionListener(this);
}
return bt12;
}
if (bt13 == null) {
bt13 = new JButton();
bt13.setBounds(new Rectangle(233, 125, 53, 30));
bt13.setText("%");
bt13.setForeground(Color.BLUE);
bt13.setFont(new Font("",Font.BOLD,15));
bt13.addActionListener(this);
}
return bt13;
}
if (bt1 == null) {
bt1 = new JButton();
bt1.setBounds(new Rectangle(3, 167, 53, 30));
bt1.setText("1");
bt1.setForeground(Color.BLUE);
bt1.setFont(new Font("",Font.BOLD,15));
bt1.addActionListener(this);
}
return bt1;
}
if (bt2 == null) {
bt2 = new JButton();
bt2.setBounds(new Rectangle(59, 167, 53, 30));
bt2.setText("2");
bt2.setForeground(Color.BLUE);
bt2.setFont(new Font("",Font.BOLD,15));
bt2.addActionListener(this);
}
return bt2;
}
if (bt3 == null) {
bt3 = new JButton();
bt3.setBounds(new Rectangle(117, 167, 53, 30));
bt3.setText("3");
bt3.setForeground(Color.BLUE);
bt3.setFont(new Font("",Font.BOLD,15));
bt3.addActionListener(this);
}
return bt3;
}
if (bt14 == null) {
bt14 = new JButton();
bt14.setBounds(new Rectangle(175, 167, 53, 30));
bt14.setText("-");
bt14.setForeground(Color.RED);
bt14.setFont(new Font("",Font.BOLD,18));
bt14.addActionListener(this);
}
return bt14;
}
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle());
jButton.setText("1/x");
jButton.addActionListener(this);
}
return jButton;
}
private JButton getBt15() {
if (bt15 == null) {
bt15 = new JButton();
bt15.setBounds(new Rectangle(233, 167, 53, 30));
bt15.setText("1/x");
bt15.setForeground(Color.BLUE);
bt15.setFont(new Font("",Font.BOLD,15));
bt15.addActionListener(this);
}
return bt15;
}
if (bt0 == null) {
bt0 = new JButton();
bt0.setBounds(new Rectangle(3, 209, 53, 30));
bt0.setText("0");
bt0.setForeground(Color.BLUE);
bt0.setFont(new Font("",Font.BOLD,15));
bt0.addActionListener(this);
}
return bt0;
}
if (bt16 == null) {
bt16 = new JButton();
bt16.setBounds(new Rectangle(59, 209, 53, 30));
bt16.setText("+/-");
bt16.setForeground(Color.BLUE);
bt16.setFont(new Font("",Font.BOLD,15));
bt16.addActionListener(this);
}
return bt16;
}
if (bt17 == null) {
bt17 = new JButton();
bt17.setBounds(new Rectangle(117, 209, 53, 30));
bt17.setText(".");
bt17.setForeground(Color.BLUE);
bt17.setFont(new Font("",Font.BOLD,18));
bt17.addActionListener(this);
}
return bt17;
}
if (bt18 == null) {
bt18 = new JButton();
bt18.setBounds(new Rectangle(175, 209, 53, 30));
bt18.setText("+");
bt18.setForeground(Color.RED);
bt18.setFont(new Font("",Font.BOLD,15));
bt18.addActionListener(this);
}
return bt18;
}
if (bt19 == null) {
bt19 = new JButton();
bt19.setBounds(new Rectangle(233, 209, 53, 30));
bt19.setText("=");
bt19.setForeground(Color.RED);
bt19.setFont(new Font("",Font.BOLD,15));
bt19.addActionListener(this);
}
return bt19;
}
{
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
CalTest thisClass = new CalTest();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
{
super();
initialize();
this.setResizable(false);
}
private void initialize()
{
this.setSize(296, 284);
this.setContentPane(getJContentPane());
this.setTitle("计算?);
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize=this.getSize();
if(frameSize.width>screenSize.width)
{
frameSize.width=screenSize.width;
}
if(frameSize.height>screenSize.height)
{
frameSize.height=screenSize.height;
}
this.setLocation((screenSize.width-frameSize.width)/5, (screenSize.width-frameSize.width)/5);
tf.setHorizontalAlignment(JTextField.RIGHT);//使数字从双昄
tf.setEditable(false);
tf.setText("0.");
}
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getTf(), null);
jContentPane.add(getBackspace(), null);
jContentPane.add(getClear(), null);
jContentPane.add(getBt7(), null);
jContentPane.add(getBt8(), null);
jContentPane.add(getBt9(), null);
jContentPane.add(getBt11(), null);
jContentPane.add(getSqrt(), null);
jContentPane.add(getBt4(), null);
jContentPane.add(getBt5(), null);
jContentPane.add(getBt6(), null);
jContentPane.add(getBt12(), null);
jContentPane.add(getBt13(), null);
jContentPane.add(getBt1(), null);
jContentPane.add(getBt2(), null);
jContentPane.add(getBt3(), null);
jContentPane.add(getBt14(), null);
jContentPane.add(getJButton(), null);
jContentPane.add(getBt15(), null);
jContentPane.add(getBt0(), null);
jContentPane.add(getBt16(), null);
jContentPane.add(getBt17(), null);
jContentPane.add(getBt18(), null);
jContentPane.add(getBt19(), null);
}
return jContentPane;
}
public void actionPerformed(ActionEvent e)
{
//变量com为true点击q?+-*/"Q反之变量com为false没有点击q?+-*/"
//数字?
if(e.getSource()==bt1)
{
if(com)
{
if(tf.getText().trim().equals("0."))
{
tf.setText("1");
com=false;
}
else
{
tf.setText(tf.getText().trim()+"1");
}
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("1");
}
else
{
tf.setText(tf.getText().trim()+"1");
}
}
}
//数字?
else if(e.getSource()==bt2)
{
if(com==true)
{
tf.setText(tf.getText().trim()+"2");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("2");
}
else
{
tf.setText(tf.getText().trim()+"2");
}
}
}
//数字?
else if(e.getSource()==bt3)
{
if(com==true)
{
tf.setText(tf.getText().trim()+"3");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("3");
}
else
{
tf.setText(tf.getText().trim()+"3");
}
}
}
//数字?
else if(e.getSource()==bt4)
{
if(com)
{
tf.setText(tf.getText().trim()+"4");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("3");
}
else
{
tf.setText(tf.getText().trim()+"4");
}
}
}
//数字?
else if(e.getSource()==bt5)
{
if(com)
{
tf.setText(tf.getText().trim()+"5");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("5");
}
else
{
tf.setText(tf.getText().trim()+"5");
}
}
}
//数字?
else if(e.getSource()==bt6)
{
if(com)
{
tf.setText(tf.getText().trim()+"6");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("6");
}
else
{
tf.setText(tf.getText().trim()+"6");
}
}
}
//数字?
else if(e.getSource()==bt7)
{
if(com)
{
tf.setText(tf.getText().trim()+"7");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("7");
}
else
{
tf.setText(tf.getText().trim()+"7");
}
}
}
//数字?
else if(e.getSource()==bt8)
{
if(com)
{
tf.setText(tf.getText().trim()+"8");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("8");
}
else
{
tf.setText(tf.getText().trim()+"8");
}
}
}
//数字?
else if(e.getSource()==bt9)
{
if(com)
{
tf.setText(tf.getText().trim()+"9");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("9");
}
else
{
tf.setText(tf.getText().trim()+"9");
}
}
}
//数字?
else if(e.getSource()==bt0)
{
if(tf.getText().trim().equals("0."))
{}
else
{
tf.setText(tf.getText().trim()+"0");
}
}
//q算W?
else if(e.getSource()==bt18)
{
if(com==true)
{}
else
{
beforeNum=tf.getText().trim();
tf.setText(tf.getText().trim()+"+");
com=true;
flag=1;
}
}
//q算W?
else if(e.getSource()==bt14)
{
if(com==true)
{}
else
{
beforeNum=tf.getText().trim();
tf.setText(tf.getText().trim()+"-");
flag=2;
com=true;
}
}
//q算W?
else if(e.getSource()==bt12)
{
if(com==true)
{}
else
{
beforeNum=tf.getText().trim();
tf.setText(tf.getText().trim()+"*");
flag=3;
com=true;
}
}
//q算W?
else if(e.getSource()==bt11)
{
if(com==true)
{}
else
{
beforeNum=tf.getText().trim();
tf.setText(tf.getText().trim()+"/");
flag=4;
com=true;
}
}
//q算W?
else if(e.getSource()==bt13)
{
tf.setText(tf.getText().trim()+"%");
qm=true;
}
//q算W?/x
else if(e.getSource()==bt15)
{
if(com==false&&rs==false)
{
double d=Double.valueOf(tf.getText().trim());
tf.setText(String.valueOf(1/d));
}
}
//q算Wsqrt
else if(e.getSource()==sqrt)
{
if(com==false&&rs==false)
{
double d=Double.valueOf(tf.getText().trim());
tf.setText(String.valueOf(Math.sqrt(d)));
}
}
//退?br />
else if(e.getSource()==clear)
{
if(tf.getText().trim().length()<1)
{
tf.setText("0.");
}
else
{
if(tf.getText().trim().equals("0."))
{
tf.setText("0.");
}
else
{
tf.setText(tf.getText().trim().substring(0, tf.getText().trim().length()-1));
}
if(tf.getText().trim().indexOf('=')==-1)
{
rs=false;
}
if(tf.getText().trim().indexOf('+')==-1)
{
com=false;
}
else
{
com=true;
}
if(tf.getText().trim().indexOf('-')==-1)
{
com=false;
}
else
{
com=true;
}
if(tf.getText().trim().indexOf('*')==-1)
{
com=false;
}
else
{
com=true;
}
if(tf.getText().trim().indexOf('/')==-1)
{
com=false;
}
else
{
com=true;
}
if(tf.getText().trim().indexOf('%')==-1)
{
qm=false;
}
else
{
qm=true;
}
}
}
else if(e.getSource()==Backspace)
{
//清除文本框中的全部内?br />
tf.setText("0.");
com=false;
rs=false;
qm=false;
}
//q算W?/-
else if(e.getSource()==bt16)
{
if(com==false&&rs==false&&qm==false)
{
String str=tf.getText().trim();
double d=Double.parseDouble(str);
if(d>0)
{
tf.setText(String.valueOf(-d));
}
else
{
tf.setText(String.valueOf(Math.abs(-d)));
}
}
}
//q算W?."
else if(e.getSource()==bt17)
{
//如果点击q?+-*/"
if(com==true)
{
int index=0;
if(flag==1)//点击'+'
{
index=tf.getText().trim().indexOf('+');
String str=tf.getText().trim().substring(index);
if(str.indexOf('.')==-1)
{
tf.setText(tf.getText().trim()+".");
}
}
else if(flag==2)//点击'-'
{
index=tf.getText().trim().indexOf('-');
String str=tf.getText().trim().substring(index);
if(str.indexOf('.')==-1)
{
tf.setText(tf.getText().trim()+".");
}
}
else if(flag==3)//点击'*'
{
index=tf.getText().trim().indexOf('*');
String str=tf.getText().trim().substring(index);
if(str.indexOf('.')==-1)
{
tf.setText(tf.getText().trim()+".");
}
}
else if(flag==4)//点击'/'
{
index=tf.getText().trim().indexOf('/');
String str=tf.getText().trim().substring(index);
if(str.indexOf('.')==-1)
{
tf.setText(tf.getText().trim()+".");
}
}
}
//如果没有点击q?+-*/"
else
{
if(tf.getText().trim().indexOf('.')==-1)
{
tf.setText(tf.getText().trim()+".");
}
}
}
//数字?='
else if(e.getSource()==bt19)
{
//先判断取模键是否为true,如果为trueQ就q行取模q行Q否则进?#8220;+-*/”q算
if(qm==true)
{
if(com==false&&rs==false)
{
int index=tf.getText().trim().indexOf('%');
String beforeStr=tf.getText().trim().substring(0, index);
String afterStr=tf.getText().trim().substring(index+1);
if(afterStr.length()>0)
{
double d1=Double.valueOf(beforeStr);
double d2=Double.valueOf(afterStr);
tf.setText(tf.getText().trim()+"="+String.valueOf((int)(d1%d2)));
qm=false;
}
}
}
else
{
//先判?#8220;=”键是否存在,假如不存在执行下列语句,否则下面的else语句?br />
if(rs==false)
{
Double result=0.0;
switch (flag)
{
case 1://点击'+'
{
int index=0;
index=tf.getText().trim().indexOf('+');
afterNum=tf.getText().trim().substring(index+1);
result=Double.valueOf(beforeNum)+Double.parseDouble(afterNum);
tf.setText(tf.getText().trim()+"="+result.toString());
break;
}
case 2://点击'-'
{
int index=0;
index=tf.getText().trim().indexOf('-');
afterNum=tf.getText().trim().substring(index+1);
result=Double.valueOf(beforeNum)-Double.parseDouble(afterNum);
tf.setText(tf.getText().trim()+"="+result.toString());
break;
}
case 3://点击'*'
{
int index=0;
index=tf.getText().trim().indexOf('*');
afterNum=tf.getText().trim().substring(index+1);
result=Double.valueOf(beforeNum)*Double.parseDouble(afterNum);
tf.setText(tf.getText().trim()+"="+result.toString());
break;
}
case 4://点击'/'
{
int index=0;
index=tf.getText().trim().indexOf('/');
afterNum=tf.getText().trim().substring(index+1);
if(Double.valueOf(afterNum)==0)
{
tf.setText("除数不能为零");
}
else
{
result=Double.valueOf(beforeNum)/Double.parseDouble(afterNum);
tf.setText(tf.getText().trim()+"="+result.toString());
}
break;
}
}
rs=true;
}
else
{
Double result=0.0;
switch (flag)
{
case 1://点击'+'
{
int index=0;
int x=0;
index=tf.getText().trim().indexOf('+');
x=tf.getText().trim().indexOf('=');
afterNum=tf.getText().trim().substring(index+1, x);
result=Double.valueOf(beforeNum)+Double.parseDouble(afterNum);
tf.setText(tf.getText().trim().substring(0,x+1)+result.toString());
break;
}
case 2://点击'-'
{
int index=0;
int x=0;
index=tf.getText().trim().indexOf('-');
x=tf.getText().trim().indexOf('=');
afterNum=tf.getText().trim().substring(index+1, x);
result=Double.valueOf(beforeNum)-Double.parseDouble(afterNum);
tf.setText(tf.getText().trim().substring(0,x+1)+result.toString());
break;
}
case 3://点击'*'
{
int index=0;
int x=0;
index=tf.getText().trim().indexOf('*');
x=tf.getText().trim().indexOf('=');
afterNum=tf.getText().trim().substring(index+1, x);
result=Double.valueOf(beforeNum)*Double.parseDouble(afterNum);
tf.setText(tf.getText().trim().substring(0,x+1)+result.toString());
break;
}
case 4://点击'/'
{
int index=0;
int x=0;
index=tf.getText().trim().indexOf('/');
x=tf.getText().trim().indexOf('=');
afterNum=tf.getText().trim().substring(index+1, x);
if(Double.valueOf(afterNum)==0)
{
tf.setText("除数不能为零");
}
else
{
result=Double.valueOf(beforeNum)/Double.parseDouble(afterNum);
tf.setText(tf.getText().trim().substring(0,x+1)+result.toString());
}
break;
}
}
}
}
}
}
} // @jve:decl-index=0:visual-constraint="220,8"
]]>
]]>
]]>
]]>
]]>
]]>
理解面向对象的概?/span>
{
private int age;
void shout()
{
System.out.println(age);
}
public void setAge(int x)
{
if(x<0)
return;
age=x;
}
public int getAge()
{
return age;
}
}
{
public static void main(String[]args)
{
Person p=new Person();
p.setAge(18);
p.shout();
System.out.println(p.getAge());
}
}
构造函数的定义与作?/span>
true
内部c?/strong>
]]>
Q?/span>Lesson02A.rmvbQ?/span>
?/span>字符帔R
‘\r’表示接受键盘输入Q相当于按下了回车键;
‘\n’是换?/span>;
‘\t’是制表符Q相当于table?/span>;
‘\b’是退格键Q相当于BackSpace;
‘\’’是单引号
‘\”’是双引号;
‘\\’是一个斜?/span>
变量的概念与作用
?span> 变量是pȝ为程序分配的一块内存单元,用来存储各种cd的数据。根据所存储的数据类型的不同Q有各种不同cd的变量。变量名代表q块内存中的数据?/span>
?span> int x=0,y;
y=x+3;
x在被取值前必须被初始化?/span>
Java的变量类?/span>
变量的字节大?/span>
byte占用1个字?/p>
Boolean占用1个字?/p>
short占用2个字?/p>
char占用2个字?/p>
int占用4个字?/p>
float占用4个字?/p>
long占用8个字?/p>
double占用8个字?span>
cd转化
?span> 自动cd转换Q也叫隐式类型{换)
?span> 强制cd转换Q也叫显式类型{换)
?span> cd转换的原理,及什么时候要用强制类型{?/span>
?span> 表达式的数据cd自动提升
?span> 所?/span>byte型?/span>short型和char的值将被提升到int?/span>
?span> 如果一个操作数?/span>long型,计算l果是long?/span>;
?span> 如果一个操作数?/span>float型,计算l果是float?/span>;
?span> 如果一个操作数?/span>double型,计算l果是double?/span>;
术q算W的应用技?/span>
?span> 思考题1Q某个培训中心要为新到的学员安排戉KQ假讑օ?/span>X个学员,每个戉K可以?/span>6个,让你用一个公式计他们要住的戉K敎ͼ
{案Q?/span>(x+5)/6。这U算法还可用在查看留a板的分布昄上:其中x是d的留a敎ͼ6是每|C的留言敎ͼl果是d有多页?/span>
?span> 思考题2:假设你要?/span>x 的值在0?/span>9之间循环变化Q请写出相应的程序代码?/span>
class A
{
public static void main(String[]args)
{
int i=0;
while(true)
{
i=(i+1)%10;
System.out.println(i);
}
}
}
逻辑q算W?/span>
q算W?/span> q算 & AND(?/span>) |
范例 False & True |
l果 False |
| OR(?/span>) ^ XOR(异或) |
False | true False ^ true |
True True |
! NOT(?/span>) && AND(短\) |
!TRUE False && True |
False False |
|| OR(短\) |
False !! True |
True |
?/span>1Q逻辑q算W用于对boolean型结果的表达式进行运,q算的结果都?/span>boolean型?/span>
?/span>2Q?/span>”&”?/span>”&&”的区别在于,如果使用前者连接,那么无论M情况Q?/span>”&”两边的表辑ּ都会参与计算。如果用后者连接,?/span>”&&”的左边ؓfalseQ则不会计其双的表辑ּ?/span>”|”?/span>”||”的区别与”&”?/span>”&&”的区别一栗?/span>
位运符
?span> M信息在计机中都是以二进制的形式保存的,&|^除了可以作ؓ逻辑q算W,也可以做Zq算W它们对两个操作C的每一个二q制位都q行q算?/span>
?span> 只有参加q算的两位都?/span>1Q?/span>&q算的结果才?/span>1Q否则就?/span>0?/span>
?span> 只有参加q算的两位都?/span>0Q?/span>|q算的结果才?/span>0Q否则就?/span>1?/span>
?span> 只有参加q算的两位不同,^q算的结果才?/span>1Q否则就?/span>0?/span>
?span> 我们可以Ҏ据按二进制位q行UM操作Q?/span>java的移位运符有三U:
?span> <<左移
?span> >>右移
?span> >>>无符号右U?/span>
UMq算的注意事及技?/span>
?span> UMq算W适用数据cd?/span>byte?/span>short?/span>char?/span>int?/span>long?/span>
?span> 对低?/span>int型的操作数将先自动{换ؓint型再UM?/span>
?span> ?/span>int型整数移?/span>a>>bQ系l先?/span>b?/span>32取模Q得到的l果才是真正UM的位数。例如:a>>33?/span>a>>1l果是一LQ?/span>a>>32l果q是a原来的数字?/span>
?span> 对于long型整数移位时a>>bQ则是先移位位?/span>b?/span>64取模?/span>
?span> UM不会改变量本w的倹{?/span>A>>1;在行语句中单独存在,毫无意义?/span>
?span> x>>1的结果和x/2的结果是一LQ?/span>x<<2?/span>X*4的结果也是一L。MQ一个数左移n位,是{于q个C?/span>2?/span>nơ方Q一个数右移n位,是{于q个数除?/span>2?/span>nơ方。请思考:如何用程序实现求2?/span>xơ方。答案:y=1<<x;
(Lesson02B.rmvb)
E序的流E控?/span>
?span> 序l构
?span> 选择l构
?span> 循环l构
if语句的选择l构
?span> if(表达?/span>)语句
?span> if(表达?/span>)语句1;else语句2;
?span> if(表达?/span>1)语句1;
else if(表达?/span>2)语句2;
else if(表达?/span>3)语句3;
……
else语句n;
?span> 每个语句可以是用{}组成的复合语句
?span> 变量=布尔表达式?语句1:语句2;
?span> if语句q可以嵌套?/span>
if(表达?/span>1)
if(表达?/span>2)语句1;
else语句2;
else
if(表达?/span>3)语句3;
else语句4;
嵌套时用{}确定层ơ界限,举例说明
switch语句的选择l构
Switch(表达?/span>)
?/span>
case 帔R表达?/span>1Q语?/span>1;
case 帔R表达?/span>2Q语?/span>2;
……
case 帔R表达?/span>nQ语?/span>n;
default:语句n;
?/span>
?span> default语句是可选的Q它接受除上面接受值有其他|通俗的讲Q就是谁是也不要的都归它?/span>
?span> case后面可以跟多个语句,q些语句可以不用在括hh?/span>
?span> switch语句判断条g可以接受int,byte,char,short型,不可以接受其他类型?/span>
?span> 一旦碰到第一?/span>case匚wQ就会开始顺序执行以后所有的E序代码Q而不后面的case条g是否匚wQ后?/span>case条g下的代码都会被执行,直到到break语句为止。我们可以利用这个特Ҏ用同一D语句处理多?/span>case条g?/span>
While循环语句
While(表达?/span>)
语句;
int x=1;
while(x<3)
{
System.out.println(“x=”+x);
X++;
}
脚下留心Q?/span>while表达式的括号后面一定不要加“;”
do-while循环语句
do 语句
while(表达?/span>);
do..while 循环则先执行Q再判断是否要l执行,也就是说循环臛_执行一ơ,有点像是先斩后奏的方法。只有条件计结果ؓ true
时语句才会执行?span>
public class TestDO
{
public static void main(String[]args)
{
int x=3;
while(x==0)
{
System.out.println("ok1");
x++;
}
int y=0;
do
{
System.out.println("ok2");
y++;
}
while(y==0);
}
}
~写一个程序,q个E序不断地读取从键盘上输入的字符Q直到讲到字W?/span>’q’ӞE序l束。提C:调用System.in.read();可以dC个从键盘上输入的字符对应的整数。通过q个E序Q你一定体会到在什么样的情况下Q用do-while循环语句l?/span>while循环语句方便?/span>
public class TestWhile
{
public TestWhile()
{
}
public static void main(String[] args)
{
// TODO code application logic here
int ch=0;
/* try
{
ch=System.in.read();
while(ch!='q')
{
System.out.println((char)ch);
try
{
ch=System.in.read();
}catch(Exception e){}
}
}
catch(Exception e)
{
e.printStackTrace();
//e.getMessage();
}
*/
do
{
try
{
ch=System.in.read();
}
catch(Exception e)
{
e.printStackTrace();
//e.getMessage();
}
System.out.println((char)ch);
//System.out.println(ch);
}
while(ch!='q');
}
}
for循环语句
for(表达?/span>1, 表达?/span>2, 表达?/span>3) 语句
break?/span>continue语句
break语句可以中止循环中的子语?/span>switch语句。一个无标号?/span>break语句会把控制传给当前Q最内)循环Q?/span>while,do,for?/span>switchQ的下一条语句。如果有标号Q控制会被传递给当前Ҏ中的带有q一标号的语句?/span>
St:while(true)
{
while(true)
{
break st;
}
}
continue语句在能出现在@环语?/span>(while,do,for)的子语句块中Q无标号?/span>continue语句的作用是跌当前循环的剩余语句块Q接着执行下一ơ@环。用continue语句的打印出0?/span>10之间的所有奇数的E序例子?/span>
public class TestContinue
{
public TestContinue()
{
}
public static void main(String[] args)
{
// TODO code application logic here
for(int i=0;i<10;i++)
{
if(i%2==0)
continue;
System.out.println(i);
}
}
}
数组
?span> 静态数l?/span>
?/span>int ia[]={1,2,3,4};
?span>int[]ia=new int[]{3,4,5};
?span>int a[5];//声明数组Ӟ不能指定光度,~译时将出错
▂a=null;
?span> 使用数组时要注意的问?/span>
▂空指针异常
▂如何计数l长?/span>
▂数l越界异?/span>
多维数组
?span> java中ƈ没有真正的多l数l,只有数组的数l,Java中多l数l不一定是规则矩阵形式?/span>
?span> 定义一个多l数l?/span>
int [][]xx;
xx=new int [3][];
xx[0]=new int[3];
xx[1]=new int[2];
xx[2]=new int[8];
public class hello
{
public static void main(String[] args)
{
int[][]xx=new int[2][3];
xx[0][0]=2;
xx[1][2]=6;
for(int i=0;i<xx.length;i++)
{
for(int j=0;j<xx[i].length;j++)
{
System.out.println("xx["+i+"]["+j+"]="+xx[i][j]);
}
}
}
}
数组的排序:
class ArrayTest
{
public static void main(String[]args)
{
int []x=new int[]{1,5,2,7,4};
for(int i=0;i<x.length;i++)
{
System.out.println("x["+i+"]="+x[i]);
}
java.util.Arrays.sort(x);
for(int i=0;i<x.length;i++)
{
System.out.println("x["+i+"]="+x[i]);
}
}
}
数组的拷贝:
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
class ArrayTest
{
public static void main(String[]args)
{
int []x=new int[]{1,5,2,7,4};
for(int i=0;i<x.length;i++)
{
System.out.println("x["+i+"]="+x[i]);
}
int[]y=new int[10];
System.arraycopy(x,0,y,1,4);
for(int i=0;i<y.length;i++)
{
System.out.println("y["+i+"]="+y[i]);
}
}
}
public class OtherContextServlet extends HttpServlet
{
public void service(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException
{
PrintWriter pwout=response.getWriter();
ServletContext rootContext=getServletContext().getContext("/");
if(rootContext!=null)
{
pwout.println(rootContext.getRealPath("/"));
}
else
{
pwout.println("getServlet failed!");
}
}
}
注:要想在某一WEB应用E序中获得其他WEB应用E序的ServletContext 对象Q必?nbsp;加入U字部分?nbsp; <Context path="/it315" docBase="d:\myweb" debug="0" reloadable="true" crossContext="true" >
public class ResourceServlet extends HttpServlet
{
public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{
response.setContentType("text/html;charset=GB2312");
PrintWriter pwout=response.getWriter();
URL urlIt=getServletContext().getResource("/WEB-INF/classes/longin.properties");
pwout.println(urlIt.toString());
pwout.println("<br>");
/*下面的两条语句可以实CL功能Q但被注释的部分我没有实玎ͼ哪位好心帮我实现好了,谢谢?br> it315.propertiesq个文g我放在了WEB-INF\classes目录中?/
//InputStream ips=getServletContext().getResourceAsStream("longin.properties");
InputStream ips=getClass().getResourceAsStream("longin.properties");
Properties props = new Properties();
try
{
props.load(ips);
pwout.println("database=" + props.getProperty("database"));
pwout.println("username=" + props.getProperty("username"));
pwout.println("password=" + props.getProperty("password"));
}
catch(Exception e)
{
e.printStackTrace();
}
ips.close();
}
}
注:getClass().getResourceAsStreamҎ只能加蝲位于classloader搜烦目录中的资源文gQ如果将longin.properties文g攑֜WEB-INF目录外的其它目录Q就只能使用getServletContext().getResourceAsStreamҎ?/p>
1.1 - Server
A Server element represents the entire Catalina servlet container. (Singleton)
1.2 - Service
A Service element represents the combination of one or more Connector components that share a single Engine
Service是这样一个集合:它由一个或者多个Connectorl成Q以及一个EngineQ负责处理所有Connector所获得的客戯?br>
1.3 - Connector
一个Connector在某个指定端口上侦听客戯求,q将获得的请求交lEngine来处理,从Engine处获得回应ƈq回客户
TOMCAT有两个典型的ConnectorQ一个直接侦听来自browser的httphQ一个侦听来自其它WebServer的请?br>Coyote Http/1.1 Connector 在端?080处侦听来自客户browser的httph
Coyote JK2 Connector 在端?009处侦听来自其它WebServer(Apache)的servlet/jsp代理h
1.4 - Engine
The Engine element represents the entire request processing machinery associated with a particular Service
It receives and processes all requests from one or more Connectors
and returns the completed response to the Connector for ultimate transmission back to the client
Engine下可以配|多个虚拟主机Virtual HostQ每个虚拟主机都有一个域?br>当Engine获得一个请求时Q它把该h匚w到某个Host上,然后把该h交给该Host来处?br>Engine有一个默认虚拟主机,当请求无法匹配到M一个Host上的时候,交l该默认Host来处?br>
1.5 - Host
代表一个Virtual HostQ虚拟主机,每个虚拟L和某个网l域名Domain Name相匹?br>每个虚拟L下都可以部v(deploy)一个或者多个Web AppQ每个Web App对应于一个ContextQ有一个Context path
当Host获得一个请求时Q将把该h匚w到某个Context上,然后把该h交给该Context来处?br>匚w的方法是“最长匹?#8221;Q所以一个path==""的Context成Host的默认Context
所有无法和其它Context的\径名匚w的请求都最l和该默认Context匚w
1.6 - Context
一个Context对应于一个Web ApplicationQ一个Web Application׃个或者多个Servletl成
Context在创建的时候将Ҏ配置文g$CATALINA_HOME/conf/web.xml?WEBAPP_HOME/WEB-INF/web.xml载入Servletc?br>当Context获得hӞ在自己的映表(mapping table)中寻扄匚w的Servletc?br>如果扑ֈQ则执行该类Q获得请求的回应Qƈq回
该文件描qC如何启动Tomcat Server
<!----------------------------------------------------------------------------------------------->
<!-- 启动Server
在端?005处等待关闭命?
如果接受?SHUTDOWN"字符串则关闭服务?
-->
<Server port="8005" shutdown="SHUTDOWN" debug="0">
<!-- Listener ???
目前没有看到q里
-->
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>
<!-- Global JNDI resources ???
目前没有看到q里Q先略去
-->
<GlobalNamingResources>
... ... ... ...
</GlobalNamingResources>
<!-- Tomcat的Standalone Service
Service是一lConnector的集?
它们q一个Engine来处理所有Connector收到的请?
-->
<Service name="Tomcat-Standalone">
<!-- Coyote HTTP/1.1 Connector
className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
port : 在端口号8080处侦听来自客户browser的HTTP1.1h
minProcessors : 该Connector先创?个线E等待客戯求,每个h׃个线E负?
maxProcessors : 当现有的U程不够服务客户hӞ若线EL不75个,则创建新U程来处理请?
acceptCount : 当现有线E已l达到最大数75Ӟ为客戯求排?
当队列中h数超q?00Ӟ后来的请求返回Connection refused错误
redirectport : 当客戯求是httpsӞ把该h转发到端?443?
其它属性略
-->
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080"
minProcessors="5" maxProcessors="75" acceptCount="100"
enableLookups="true"
redirectPort="8443"
debug="0"
connectionTimeout="20000"
useURIValidationHack="false"
disableUploadTimeout="true" />
<!-- Engine用来处理Connector收到的Httph
它将匚wh和自q虚拟LQƈ把请求{交给对应的Host来处?
默认虚拟L是localhost
-->
<Engine name="Standalone" defaultHost="localhost" debug="0">
<!-- 日志c,目前没有看到Q略d -->
<Logger className="org.apache.catalina.logger.FileLogger" .../>
<!-- RealmQ目前没有看刎ͼ略去?-->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>
<!-- 虚拟Llocalhost
appBase : 该虚拟主机的根目录是webapps/
它将匚wh和自qContext的\径,q把h转交l对应的Context来处?
-->
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- 日志c,目前没有看到Q略d -->
<Logger className="org.apache.catalina.logger.FileLogger" .../>
<!-- ContextQ对应于一个Web App
path : 该Context的\径名?"Q故该Context是该Host的默认Context
docBase : 该Context的根目录是webapps/mycontext/
-->
<Context path="" docBase="mycontext" debug="0"/>
<!-- 另外一个ContextQ\径名?wsota -->
<Context path="/wsota" docBase="wsotaProject" debug="0"/>
</Host>
</Engine>
</Service>
</Server>
<!----------------------------------------------------------------------------------------------->
一个Context对应于一个Web AppQ每个Web App是由一个或者多个servletl成?br>当一个Web App被初始化的时候,它将用自qClassLoader对象载入“部v配置文gweb.xml”中定义的每个servletc?br>它首先蝲入在$CATALINA_HOME/conf/web.xml中部|的servletc?br>然后载入在自qWeb App根目录下的WEB-INF/web.xml中部|的servletc?br>web.xml文g有两部分Qservletcd义和servlet映射定义
每个被蝲入的servletc都有一个名字,且被填入该Context的映表(mapping table)中,和某UURL PATTERN对应
当该Context获得hӞ查询mapping tableQ找到被h的servletQƈ执行以获得请求回?br>
分析一下所有的Context׃n的web.xml文gQ在其中定义的servlet被所有的Web App载入
<!----------------------------------------------------------------------------------------------->
<web-app>
<!-- 概述Q?
该文件是所有的WEB APPq的部|配|文Ӟ
每当一个WEB APP被DEPLOYQ该文g都将先被处理Q然后才是WEB APP自己?WEB-INF/web.xml
-->
<!-- +-------------------------+ -->
<!-- | servletcd义部? | -->
<!-- +-------------------------+ -->
<!-- DefaultServlet
当用LHTTPh无法匚wM一个servlet的时候,该servlet被执?
URL PATTERN MAPPING : /
-->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- InvokerServlet
处理一个WEB APP中的匿名servlet
当一个servlet被编写ƈ~译攑օ/WEB-INF/classes/中,却没有在/WEB-INF/web.xml中定义的时?
该servlet被调用,把匿名servlet映射?servlet/ClassName的Ş?
URL PATTERN MAPPING : /servlet/*
-->
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- JspServlet
当请求的是一个JSP面的时候(*.jspQ该servlet被调?
它是一个JSP~译器,请求的JSP面~译成ؓservlet再执?
URL PATTERN MAPPING : *.jsp
-->
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- +---------------------------+ -->
<!-- | servlet映射定义部分 | -->
<!-- +---------------------------+ -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<!-- +------------------------+ -->
<!-- | 其它部分Q略d | -->
<!-- +------------------------+ -->
... ... ... ...
</web-app>
<!----------------------------------------------------------------------------------------------->
假设来自客户的请求ؓQ?br>http://localhost:8080/wsota/wsota_index.jsp
1) h被发送到本机端口8080Q被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该h交给它所在的Service的Engine来处理,q等待来自Engine的回?br>3) Engine获得hlocalhost/wsota/wsota_index.jspQ匹配它所拥有的所有虚拟主机Host
4) Engine匚w到名为localhost的HostQ即使匹配不C把请求交l该Host处理Q因Host被定义ؓ该Engine的默认主机)
5) localhost Host获得h/wsota/wsota_index.jspQ匹配它所拥有的所有Context
6) Host匚w到\径ؓ/wsota的ContextQ如果匹配不到就把该h交给路径名ؓ""的Contextd理)
7) path="/wsota"的Context获得h/wsota_index.jspQ在它的mapping table中寻扑֯应的servlet
8) Context匚w到URL PATTERN?.jsp的servletQ对应于JspServletc?br>9) 构造HttpServletRequest对象和HttpServletResponse对象Q作为参数调用JspServlet的doGet或doPostҎ
10)Context把执行完了之后的HttpServletResponse对象q回lHost
11)Host把HttpServletResponse对象q回lEngine
12)Engine把HttpServletResponse对象q回lConnector
13)Connector把HttpServletResponse对象q回l客户browser
前面我们把Tomcat+JDK1.5+MySQL+Eclipse架构搭v来了Q接下去的工作是举一个小例子让初学者明白如何创建和发布Web应用Q有了一个ȝ框架Q这样大家在做JSP和Servlet的时候就不会有一U破损残~、缺乏系l的感觉Q我的学习方式历来是q到细Q先看树木再俯瞰林会把我弄疯的......
1、首先创建Web应用的目录结构,我这里在Tomcat?webapps下面创徏一个Web应用的目录helloapp,q是Web应用的根目录Q所有JSP和HTML文g都存攑֜此目录下Q它下一U有个WEB-INF文g夹,它存放web.xml文g和classes、lib文g夹,详细后面再说Q先Z?
2、介lweb.xml文g。这是一个发布描q文Ӟ用来配置发布信息Q包括:Servlet定义QServlet初始化参敎ͼServlet以及JSP的映;安全域配|参敎ͼwelcome文g清单Q资源引用;环境变量的定义。闲话少_创徏web.xml文gQ内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
</web-app>
W一行指定XML的版本和字符~码Q第二行指定文档cdQ?lt;web-app>中放着关于Web应用的配|元素?
3、在server.xml中加?lt;Context>元素。server.xml?conf?打开后在<host>后面加入如下<Context>元素
<Context path="/helloapp" docBase="helloapp" debug="0"
reloadable="true"/>
其中Qpath指定讉K该Web应用的URL入口QdocBase指定Web应用的文件\径;reloadable如果为true,一旦class文g被更斎ͼ服务器会自动重新加蝲Web应用Q当然这样会加重服务器运行负荗?
4、部|HTML文g。在helloapp下创建index.html文gQ内容如下:
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<p><font size="7">Welcome to Alec's Home</p>
<p><a href="login.jsp?language=English">English version</a>
</body>
</html>
在浏览器地址栏键?a href="http://localhost:8080/helloapp/index.html">http://localhost:8080/helloapp/index.html
5、部|JSP。创Z个JSP文gQ一个login.jsp,一个hello.jsp。前者显C登陆页面,要求输入用户名和口oQ这个页面链接到名ؓDispatcherServlet的Servlet。后者被q个Servlet调用Q显Chello面。如前面所_JSP文g都放在helloapp下?
<html>
<head>
<title>Alex's Addressing</title>
</head>
<body>
<br>
<form name="loginForm" method="post" action="dispatcher">
<table>
<tr>
<td><div align="right">用户名:</div></td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td><div align="right">密码Q?lt;/div></td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="Submit" name="Submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
上述是login.jsp文g内容?
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<b>Ƣ迎Q?lt;%=request.getAttribute("USER")%></b>
</body>
</html>
q是hello.jsp文g内容?
6、部|Servlet。创建名为DispatcherServlet.java的文件编译成ServletQ它调用HttpServletRequest对象的getParameterҎd提交的loginForm表单数据Q获取用户名和口令,然后用户名和口令保存在HttpServletRequest对象的属性中Q在把请求{发给hello.jsp?
package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class DispatcherServlet extends HttpServlet
{
public String target="/hello.jsp";
public void init(ServletConfig config)
throws ServletException{
super.init(config);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
doPost(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
String username=request.getParameter("username");
String password=request.getParameter("password");
request.setAttribute("USER",username);
request.setAttribute("PASSWORD",password);
//请求定向到目标文g
ServletContext context=getServletContext();
System.out.println("重定向到"+target);
RequestDispatcher dispatcher=context.getRequestDispatcher(target);
dispatcher.forward(request,response);
}
public void destroy(){
}
}
上述是DispatcherServlet.java文gQ用来编译成servlet。编译成class文g后存放位|ؓ/helloapp/WEB-INF/classes/mypack/DispatcherServlet.classQ然后在/helloapp下的web.xml中作如下修改Q?
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
'-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN'
'http://java.sun.com/j2ee/dtds/web-app_2_3.dtd'>
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>mypack.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
</web-app>
说明一下,<servlet-name>定义Servlet的名字;<servlet-class>指定实现q个Servlet的类Q?lt;init-param>定义Servlet的初始化参数Q包括参数名和参数|Q一?lt;servlet>元素中可以有多个<init-param>元素Q?lt;load-on-startup>指当Web应用启动Ӟ装蝲Servlet的次序。当q个gؓ正数或零ӞServlet容器先加载数值小的servletQ再依次加蝲其他数值大的servletQ如果这个gؓ负数或者没有设定,那么Servlet容器在Web客户首次讉Kq个Servlet时加载它。我q里没用到后两个元素?
7、部|JSP Tag Library
Tag Library向用h供了自定义JSP标签的功能。我们定义一个名为mytaglib的标{ֺQ包含一个简单的hello标签Q它能将JSP面中所有的<mm:hello/>解析为字W串“Hello”?
Q?Q?
package mypack;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
public class HelloTag extends TagSupport
{
public void HelloTag(){}
public int doEndTag() throws JspException{
try{
pageContext.getOut().print("Hello");
}
catch(Exception e){
throw new JspTagException(e.getMessage());
}
return SKIP_BODY;
}
public void release(){
super.release();
}
}
q是HelloTag.java文gQ编译成用于处理hello标签的类?
Q?Q创建Tag Library的描q文件mytaglib.tld文gQ这个文件定义mytaglib标签库和hello标签。它存放?WEB-INF/mytaglib.tld。源码如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>mytaglib</shortname>
<uri>mytaglib</uri>
<tag>
<name>hello</name>
<tagclass>mypack.HelloTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Just Says Hello</info>
</tag>
</taglib>
Q?Q在/helloapp/WEB-INF下的web.xmld<taglib>元素Q如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>mypack.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/dispatcher</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/mytaglib</taglib-uri>
<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>
</web-app>
<taglib>中包?lt;taglib-uri>?lt;taglib-location>属性。前者指定Tag Library标示W;后者指定Tag Library的描q文?TLD)的位|?
Q?Q在hello.jsp文g中加入hello标签。prefix用来指定引用mytaglib标签库时的前~Q修改后如下Q?
<%@ taglib uri="/mytaglib" prefix="mm"%>
<html>
<head>
<title>Alec's Addressing</title>
</head>
<body>
<b><mm:hello/><%=request.getAttribute("USER")%></b>
</body>
</html>
l测试OKQ?
8、创建ƈ发布WAR文g。一般来_在Web应用的开发阶D,Z方便调试Q采用开攑ּ的目录结构来发布Web应用Q这h便更新或替换文g。品发布时Q应整个Web应用打包为WAR文gQ再q行发布?
Q?QMS-DOS下进?helloapp目录下键入如下命令:jar cvf helloapp.war *.*Q?
Q?Q把helloapp.war拯?webapps目录下;
Q?Q删除原来的helloapp目录Q?
Q?Q启动Tomcat服务器?
Tomcat服务器启动时Q会把webapps下所有WAR文g自动展开为开攑ּ的目录结构,变ؓ/webapps/helloapp目录?br>文章来源Q?a >http://syneer1981.spaces.live.com/blog/cns!6F8B2C7500427759!120.entry?_c=BlogPart
?span style="FONT: 7pt 'Times New Roman'">
|络~程的基知识?span style="FONT: 7pt 'Times New Roman'"> |络协议?/span> TCP/IP
?span style="FONT: 7pt 'Times New Roman'"> IP 地址?/span> Port Q端口号Q?/span>
▼本地回路的 IP 地址Q?/span> 127.0.0.1
▼端口号的范围ؓ 0 ?/span> 65535 之间Q?/span> 0 ?/span> 1023 之间的端口数是用于一些知名的|络服务和应用?/span>
?span style="FONT: 7pt 'Times New Roman'"> UDP |络E序
?/span> UDP Q用h据报协议Q?/span> User Datagram Protocol Q,是无q接通信协议?/span>
?span style="FONT: 7pt 'Times New Roman'"> TCP |络E序
?span style="FONT: 7pt 'Times New Roman'"> TCP Q传输控制协议( Transmission Control Protocol Q?/span> , 是面向连接的通信协议?/span>
TCP ?/span> UDP 的数据格式单图例:
协议cd |
?/span> IP |
目标 IP |
源端?/span> |
目标端口 |
帧序?/span> |
帧数?/span> |
其中协议cd用于区分 TCP Q?/span> UDP
?span style="FONT: 7pt 'Times New Roman'"> Socket 是网l驱动层提供l应用程序编E的接口和一U机制?/span>
?span style="FONT: 7pt 'Times New Roman'"> 可以?/span> Socket 比喻成是一个港口码_应用E序只要把货物放到港口码头上Q就完成了货物的运送。应用程序只需{待货物到达码头后,货物取走?/span>
?span style="FONT: 7pt 'Times New Roman'"> Socket 是应用程序中创徏Q通过一U绑定机制与驱动E序建立关系Q告诉自己所对应?/span> IP ?/span> Port ?/span>
?span style="FONT: 7pt 'Times New Roman'"> Socket 数据发送过E?/span>
?span style="FONT: 7pt 'Times New Roman'"> Socket 数据接收q程
Java
中的|络~程c?/span>
?span style="FONT: 7pt 'Times New Roman'"> 位于 java.net 包中
?span style="FONT: 7pt 'Times New Roman'"> DatagramSocket cȝ?/span> UDP 通信
?span style="FONT: 7pt 'Times New Roman'"> ServerSocket cȝ?/span> TCP 通信的服务器端(接受客户端连接的Q?/span>
?span style="FONT: 7pt 'Times New Roman'"> Socket cȝ?/span> TCP 通信的服务器Q专用于和客Lq行数据传输的)和客L
UDP
|络E序
?span style="FONT: 7pt 'Times New Roman'"> DatagramSocket c?/span>
此类表示用来发送和接收数据报包的套接字?span lang="EN-US">
数据报套接字是包投递服务的发送或接收炏V每个在数据报套接字上发送或接收的包都是单独~址和\q。从一台机器发送到另一台机器的多个包可能选择不同的\由,也可能按不同的顺序到达?span lang="EN-US">
?span lang="EN-US"> DatagramSocket 上L启用 UDP q播发送。ؓ了接收广播包Q应该将 DatagramSocket l定到通配W地址。在某些实现中,?DatagramSocket l定C个更加具体的地址时广播包也可以被接收?
CZQ?/font>
DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888));
q等价于Q?/font>
DatagramSocket s = new DatagramSocket(8888);
两个例子都能创徏能够?UDP 8888 端口上接收广播的 DatagramSocket
?span style="FONT: 7pt 'Times New Roman'"> 构造函?/span>
?span lang="EN-US">DatagramSocket
()
构造数据报套接字ƈ其l定到本CZM可用的端口?/span>
?span lang="EN-US">DatagramSocket
(int
port)
创徏数据报套接字q将其绑定到本地L上的指定端口
?span lang="EN-US">DatagramSocket
(int
port, InetAddress
laddr)
创徏数据报套接字Q将其绑定到指定的本地地址?/span>
?span style="FONT: 7pt 'Times New Roman'">
close
()
关闭此数据报套接字?/span>
?span style="FONT: 7pt 'Times New Roman'">
send
(DatagramPacket
p)
从此套接字发送数据报包?/span>
?span style="FONT: 7pt 'Times New Roman'">
receive
(DatagramPacket
p)
从此套接字接收数据报包?/span>
?span style="FONT: 7pt 'Times New Roman'"> DatagramPacket c?/span>
如果?/span> DatagramSocket 比作创徏的港口码_那么 DatagramPacket 是发送和接收数据的集装箱?/span>
?span style="FONT: 7pt 'Times New Roman'"> 构造函敎ͼ
?span lang="EN-US">DatagramPacket
(byte[]
buf, int
length)
构?/span>
DatagramPacket
Q用来接攉度ؓ
length
的数据包
?span lang="EN-US">DatagramPacket
(byte[]
buf, int
length, InetAddress
address, int
port)
构造数据报包,用来长度ؓ
length
的包发送到指定L上的指定端口受?/span>
?span style="FONT: 7pt 'Times New Roman'">
getAddress
()
q回某台机器?/span>
IP
地址Q此数据报将要发往该机器或者是从该机器接收到的?/span>
?span style="FONT: 7pt 'Times New Roman'">
getPort
()
q回某台q程L的端口号Q此数据报将要发往该主机或者是从该L接收到的?/span>
?span style="FONT: 7pt 'Times New Roman'">
getData
()
q回数据~冲区?/span>
?span style="FONT: 7pt 'Times New Roman'">
getLength
()
q回要发送或接收到的数据的长度?/span>
?span style="FONT: 7pt 'Times New Roman'"> InetAddress c?/span>
?span style="FONT: 7pt 'Times New Roman'"> InetAddress 是用于表C机 IP 地址的一个类Q而在日常应用中的计算机地址是用?/span> 192.168.0.1 ”?/span> www.it315.org {字W串格式来表C的?/span>
?span style="FONT: 7pt 'Times New Roman'">
getByName
(String
host)
在给定主机名的情况下定L?/span>
IP
地址?/span>
?span style="FONT: 7pt 'Times New Roman'">
getHostAddress
()
q回
IP
地址字符Ԍ以文本表现Ş式)?/span>
?span style="FONT: 7pt 'Times New Roman'">
getHostName
()
获取?/span>
IP
地址的主机名?/span>
?span style="FONT: 7pt 'Times New Roman'">
getLocalHost
()
q回本地L?/span>
?span style="FONT: 7pt 'Times New Roman'"> 最单的 UDP E序
?span style="FONT: 7pt 'Times New Roman'"> 字符串与字节数组之间的双向{?/span>
?span style="FONT: 7pt 'Times New Roman'"> UDP 接收E序必须先启动运行,才能接收 UDP 发送程序发送的数据?/span>
?span style="FONT: 7pt 'Times New Roman'"> ?/span> start 命o来打开新命令行H口的好处?/span>
?span style="FONT: 7pt 'Times New Roman'"> 解决发送中文字W串的问题?/span>
?span style="FONT: 7pt 'Times New Roman'">
?/span>
UDP
~写|络聊天E序
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import java.net.*;
public class UdpSend
{
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args)
{
// TODO: Add your code here
try
{
DatagramSocket ds=new DatagramSocket();
/*
String strInfo="hello ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.length(),InetAddress.getByName("192.168.0.239"),2000));
*/
String str="hello 中国";
ds.send(new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.0.239"),2500));
ds.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.net.*;
public class UdpReceive
{
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args)
{
// TODO: Add your code here
try
{
DatagramSocket ds=new DatagramSocket(2500);
byte []buf=new byte [1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
ds.receive(dp);
System.out.println(new String(dp.getData(),0,dp.getLength())+
" from:"+" IP: "+dp.getAddress().getHostAddress()+" Port: "+dp.getPort());
ds.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
/**
* Method actionPerformed
*
*
* @param e
*
*/
public void actionPerformed(ActionEvent e)
{
// TODO: Add your code here
jtf.setText(jtf.getText()+e.getActionCommand());
//d.setText(jfd.getText()+e.getActionCommand());
}
}
for(int i=0;i<16;i++)
{
ch=str.charAt(i);
b=new JButton(ch.toString());
//b=new JButton(new Integer(i+1).toString());
b.addActionListener(this);
jpl.add(b);
}
/*b=new JButton("1");
b.addActionListener(this);
jpl.add(b);
b=new JButton("2");
b.addActionListener(this);
jpl.add(b);
b=new JButton("3");
b.addActionListener(this);
jpl.add(b);
b=new JButton("+");
b.addActionListener(this);
jpl.add(b);
b=new JButton("4");
b.addActionListener(this);
jpl.add(b);
b=new JButton("5");
b.addActionListener(this);
jpl.add(b);
b=new JButton("6");
b.addActionListener(this);
jpl.add(b);
b=new JButton("-");
b.addActionListener(this);
jpl.add(b);
b=new JButton("7");
b.addActionListener(this);
jpl.add(b);
b=new JButton("8");
b.addActionListener(this);
jpl.add(b);
b=new JButton("9");
b.addActionListener(this);
jpl.add(b);
b=new JButton("*");
b.addActionListener(this);
jpl.add(b);
b=new JButton("0");
b.addActionListener(this);
jpl.add(b);
b=new JButton(".");
b.addActionListener(this);
jpl.add(b);
b=new JButton("=");
b.addActionListener(this);
jpl.add(b);
b=new JButton("\\");
b.addActionListener(this);
jpl.add(b);*/
}
public static void main(String[] args)
{
// TODO, add your application code
System.out.println("Hello World!");
TestCalculator mainFrame=new TestCalculator();
mainFrame.setTitle("TestCalculator");
mainFrame.setBounds(300,200,300,400);
mainFrame.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
// TODO: Add your code here
//||strnum.indexOf("-")!=-1||strnum.indexOf("*")!=-1||strnum.indexOf("\\")!=-1
String strnum=jfd.getText();
//System.out.println(strnum);
Character c1='+';
//Character c2='-';
int n1=0;
float num1=0;
float num2=0;
float sum=0;
Integer len=new Integer(0);
if(e.getActionCommand().equals("+")||e.getActionCommand().equals("-")||e.getActionCommand().equals("*")||e.getActionCommand().equals("\\"))
{
num1=new Float(strnum.substring(0,len));
System.out.println(num1);
if(strnum.indexOf(c1)!=-1||strnum.indexOf("-")!=-1||strnum.indexOf("*")!=-1||strnum.indexOf("\\")!=-1)
{
//System.out.println(strnum.length());
jfd.setText(jfd.getText());
//System.out.println(e.getActionCommand());
}
else
{
jfd.setText(jfd.getText()+e.getActionCommand());
//System.out.println("no find.");
}
}
else if(e.getActionCommand().equals("."))
{
if(strnum.indexOf(".")!=-1)
{
n1=strnum.indexOf(".");
//System.out.println(strnum.length());
if(strnum.substring(n1+1,n1+1).equals(".")==false)
{
//System.out.println(strnum.substring(n1+1,n1+1).equals("."));
jfd.setText(jfd.getText());
}
else
{
jfd.setText(jfd.getText()+e.getActionCommand());
}
}
else
{
jfd.setText(jfd.getText()+e.getActionCommand());
}
}
else
{
if(e.getActionCommand().equals("="))
{
if(strnum.indexOf("=")!=-1)
{
jfd.setText(jfd.getText());
}
else
{
jfd.setText(jfd.getText()+e.getActionCommand());
//System.out.println(strnum.substring(len+1,strnum.length()));
}
}
else
{
jfd.setText(jfd.getText()+e.getActionCommand());
}
}
}
}
?span style="FONT: 7pt 'Times New Roman'">
调用 Container.setLayout(null) Ҏ取消布局理器设|,在这U情况下Q可以调?/span> Component.setBounds Ҏ来用l对坐标讄容器上的每个lg的大和位置?/span>?span style="FONT: 7pt 'Times New Roman'">
不用布局理器将会给E序 带来一个潜在的问题Q当容器大小改变Ӟ所有组件仍保持原来的位|和大小Q将D整个E序界面比较“难看”?/span>
public static void main(String[] args)
{
// TODO, add your application code
System.out.println("Hello World!");
TestChoice mainFrame=new TestChoice();
mainFrame.setTitle("TestChoice");
mainFrame.setBounds(300,200,200,100);
mainFrame.setVisible(true);
}
}
class CbItemListener implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
Checkbox cb=(Checkbox)e.getItemSelectable();
/*if(cb.getLabel().equals("Are you a boy or gril?"))
{
....
}*/
if(cb==cb1)
{
if(cb.getState()==true)
{
System.out.println("你选择了复选框");
}
else
{
System.out.println("你取消选择复选框");
}
}
else if(cb==cb2)
{
if(cb.getState()==true)
{
System.out.println("你是个男?);
}
else
{
System.out.println("你是个女?);
}
}
else
{
if(cb.getState()==true)
{
System.out.println("你是个女?);
}
else
{
System.out.println("你是个男?);
}
}
}
}
public TestCheckbox()
{
FlowLayout fl=new FlowLayout();
setLayout(fl);
add(cb1);
add(cb2);
add(cb3);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
e.getWindow().dispose();
}
});
CbItemListener cbit=new CbItemListener();
cb1.addItemListener(cbit);
cb2.addItemListener(cbit);
cb3.addItemListener(cbit);
}
public static void main(String[] args)
{
// TODO, add your application code
System.out.println("Hello World!");
TestCheckbox mainFrame=new TestCheckbox();
mainFrame.setTitle("TestCheckbox");
mainFrame.setBounds(300,200,400,400);
mainFrame.setVisible(true);
}
}
fileM.add(fileM1);
fileM.add(fileM2);
fileM.add(fileM3);
fileM.add(fileM4);
fileM.addSeparator();
fileM4.add(printM);
fileM4.add(setM);
fileM.add(fileM5);
editM.add(editM1);
//editM1.addActionListener(this);
this.setMenuBar(menubar);
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
e.getWindow().dispose();
}
});
editM1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(editM1.getActionCommand().equals("connect"))
{
editM1.setActionCommand("disconnect");
editM1.setLabel("断开");
}
else if(editM1.getActionCommand().equals("disconnect"))
{
editM1.setActionCommand("connect");
editM1.setLabel("q接");
}
}
});
}
public static void main(String[] args)
{
System.out.println("Hello World!");
TestMenuBar mainFrame=new TestMenuBar();
mainFrame.setTitle("TestMenuBar");
mainFrame.setSize(400,400);
mainFrame.setVisible(true);
}
/*public void actionPerformed(ActionEvent e)
{
// TODO: Add your code here
if(e.getActionCommand().equals("connect"))
{
editM1.setActionCommand("disconnect");
editM1.setLabel("断开");
}
else if(e.getActionCommand().equals("disconnect"))
{
editM1.setActionCommand("connect");
editM1.setLabel("q接");
}
}*/
}
import java.awt.*;
import java.awt.event.*;
public class DrawLine extends Frame
{
private int begX;
private int begY;
private int endX;
private int endY;
Image oimg=null;
Graphics og=null;
public void paint(Graphics g)
{
/*
Image img=this.getToolkit().getImage("..\\我要学习?gif");
g.drawImage(img,100,100,this);
if(oimg!=null)
{
//g.drawImage(oimg,0,0,this);
}
*/
g.drawImage(oimg,0,0,this);
}
public DrawLine()
{
setTitle("DrawLines");
setSize(400,400);
setVisible(true);
Dimension d=this.getSize();
oimg=this.createImage(d.width,d.height);
og=oimg.getGraphics();
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
e.getWindow().dispose();
}
});
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
begX=e.getX();
begY=e.getY();
}
public void mouseReleased(MouseEvent e)
{
endX=e.getX();
endY=e.getY();
Graphics g=getGraphics();
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));
g.setColor(Color.RED);
g.drawString(begX+","+begY,begX,begY);
g.drawString(endX+","+endY,endX,endY);
g.drawLine(begX,begY,endX,endY);
og.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));
og.setColor(Color.RED);
og.drawString(begX+","+begY,begX,begY);
og.drawString(endX+","+endY,endX,endY);
og.drawLine(begX,begY,endX,endY);
}
});
}
public static void main(String[] args) {
// TODO, add your application code
System.out.println("Hello World!");
DrawLine mainFrame=new DrawLine();
}
}