Java新手学习笔记——Java实战经典(李兴华)第三部分概述

  本部分介绍Java实战经典的第三部分:Java应用程序设计

  主要包括如下几个重点部分:

  重点一:多线程

  重点二:Java常用类库

  重点三:IO操作

  重点四:Java类集框架

  重点五:Java图形界面

  重点六:数据库编程

  重点七:Java新特性:泛型、枚举、Annotation

  重点八:Java反射机制

  重点九:Java网络程序设计

  重点十:Java新IO

  第一部分和第二部分重点介绍Java的基础,尤其是面向对象对象的理念。介绍基础语句、基本数据类型、如何构建类、实例化对象、对象的多态性、接口及抽象类的使用

  第九章:多线程

  本章要点:

  了解:进程和线程的区别、线程的状态变化、多线程操作方法、同步和死锁、线程的生命周期

  掌握:java多线程的实现方式及区别

  进程是代码加载、执行到执行完毕的一个完整过程,这个过程从生命周期上看也是进程产生、发展和消失的过程。由于现代操作系统实行的是分时机制,就是把一段时间分成极短的时间片,然后把时间片分配给各个进程交替执行,但是由于人对极短时间的感应迟钝,所以感觉不到任务是串行的,而是感觉任务是并行的,中间没有停顿。

  线程是比进程还要小的单位,运行一个进程可以产生很多个子线程。这些子线程可以同时运行、同时存在。例如打开一个word程序,word进程中可以存在很多个很小的线程,比如字体检查,线程关掉,进程还可以继续存在。

  使用多线程能让程序运行效率更高。

  JAVA多线程实现

  实现多线程有两种手段,一种是继承Thread类,一种是继承Runnable类

  方法一:继承Thread类

  Thread类在java.lang中定义

  多线程定义语法:

  class  类名称 extends Thread{

  属性;

  方法;

  public void run(){//覆写Thread类中的run方法,此方法是线程主体

  线程主体

  }

};

  调用时候调用Thread类的start()方法

  通过此方法调用时,调用时只能调用一次start()方法,大于一次会报IllegalThreadStatesException

  一般调用是通过Runnable来实现多线程的多次调用

  Runnable是一个接口,只有一个抽象函数publi void run(),需要实现。

  使用方式:

  Class 类名称 implements Runnable

  {

  属性;

  抽象方法;

  public void run(){

  线程主体//覆写Runnable的方法

  }

}

  启动多线程方式还是依靠Thread类,在Thread类中有两个构造方法

  public Thread(Runnable target)和public Thread(Runnable target,String name)

  通过先实例化Thread类,再将Thread类向上转型就可以Runnable实例调用start()方法

  区别与联系:

  Thread类实际上是Runnable类的实现。

  由定义可以看到

  class Thread extends Object implements Runnable

  继承Thread类不能实现资源共享,使用Runnable类好

  有如下两段代码,都是展示Runnable实现多线程的

  class ThreadDemo004 implements Runnable{

    public void run(){
    for( int i = 5 ;i < 100&i > 0;i--){
    System.out.println("余票:" + i); 
      }
    }
  };

 public class ThreadDemo003 {

  public static void main(String args[]){
  ThreadDemo004 td1 = new ThreadDemo004();
  new Thread(td1).start();
  new Thread(td1).start();
  }
};

上述程序运行结果是: 

余票:5

余票:4
余票:3
余票:2
余票:1
余票:5
余票:4
余票:3
余票:2
余票:1

  也就是没有实现多线程的资源共享,这个例子中,第一个例子开启了一个进程i是局部变量,属于第一个进程的,不可能共享,需要用下面的程序实现。

  另一个程序是:

  class ThreadDemo004 implements Runnable{

  private int ticket = 5;
  public void run(){
  for( int i = 5 ;i < 100;i++){
  if(ticket > 0)
  System.out.println("余票:" + ticket--); 
    }
  }
};

public class ThreadDemo003 {

  public static void main(String args[]){
  ThreadDemo004 td1 = new ThreadDemo004();
  new Thread(td1).start();
  new Thread(td1).start();
   }
};

 实现Runnable接口相对于Thread类有如下优势:

 

1、 适合多个相同程序代码的线程处理同一资源的情况

2、 避免java单继承带来的缺陷

3、 增强代码健壮性,代码可以被多个线程共享,使代码与数据独立

总之:建议使用Runnable

线程的状态:

  要想实现多线程,必须在主线程(主方法)中创建多个线程对象,线程一般具有5种状态:

创建、就绪、运行、阻塞、终止

1、 创建状态

在程序中用构造方法创建一个线程对象后,新的线程就处于创建状态,此时有相应的内存空间和其他资源,但处于不可运行状态。新建一个线程可以使用Thread类进行。如Thread a = new Thread

2、 就绪状态

创建完后,使用start()方法启动,启动完线程后,程序就进入就绪状态,线程进入线程队列排队,等待CPU服务

3、 运行状态

当就绪状态的线程获得CPU资源后,进入运行状态,自动调用该线程的run()方法,run()方法定义了改方法的的操作和功能

4、 堵塞状态

正在执行的线程遇到突发情况,被人为挂起,或遇到耗时的输入输出操作,将让出CPU,并暂时中止执行,进入堵塞状态,也可以叫暂停状态。在可执行的状态下,调用sleep(),suspend(),wait()方法,都可以进入堵塞状态。堵塞状态时,线程不能进入线程队列排队,只有解除堵塞状态后,才可以转入就绪状态。

5、 死亡状态

程序执行完毕,或调用stop()方法后,线程将死亡,处于死亡状态的线程,不具有继续执行的能力。线程死亡也意味着其占用的资源被回收

线程的操作方法

线程的主要操作方法在Thread类中,并不在Runnable中

介绍常用的线程方法:

1、 取得和设置线程名称

getName()方法获取名称,setName()设置名称。线程名称一般在启动时候设置,但允许运行时候进行设置。允许两个Thread对象有相同名称,但尽量避免发生。如果没有设置名称,系统会自动为线程分配名称。主方法也是一个线程。

JAVA程序每次运行时候,至少启动两个线程,一个是main线程,一个是垃圾回收线程

2、 判断线程是否启动

使用isAlive方法,通过Thread类的start()方法通知CPU这个线程已经准备好启动,然后等待CPU分配资源。运行此线程,java通过isAlive()方法来测试进程是否已经在启动而且仍然在启动。

由于线程操作的不确定性,主线程可能比其他进程先执行完。。。奇怪。。。

3、线程的强制运行

使用join()方法能够使一个线程强制运行。线程强制运行期间,其他线程禁止运行,直到此线程运行结束。

4、线程的休眠

使用Thread.sleep()进行休眠,sleep()方法中间的参数是时间,单位是毫秒。Ms

5、中断线程

使用方法interrupt()方法中断线程

6、设置后台进程

使用方法setDaemon()方法

7、线程的优先级

线程操作时,所有的线程就已经处于就绪状态,那么哪个线程先运行是个问题。解决方法是使用优先级策略,优先级高的优先可能被处理。

使用方法setPriority()

Max :10

Norm :5

Min:1

实际使用时候,并非设置优先级高就一定先执行,具体由CPU调度执行

主方法的优先级

使用方法getPriority

8、线程的礼让

使用方法yield()

同步与死锁

使用Runnable进行多线程处理的特点是资源被多个线程共享。这样可能导致一个问题是多个线程操作同一个资源的同步问题。比如卖票为负数的问题。

解决方法是使用同步方法:思想是,同一个资源被某个线程占用时候,其他线程禁止访问,直到操作结束。具体操作方法上有两种:1

1、  使用同步代码块。2、使用同步方法

方法一:使用同步代码块

使用关键字synchronized(同步对象){

         需要同步的代码块

}

使用synchronized时候,需要设置同步对象,一般使用this,设置当前操作对象为同步对象,就是this表示后面的大括号部分,作为一个整体,设置为同步对象。

方法二:使用同步方法

同步方法是将代码块包起来变成一个方法而已。语法如下:

Synchronized 方法返回值 方法名称(参数列表){

}

Synchronized是本书的最后一个关于方法的关键字。

访问权限{public,default,protected,private}【final,static,synchronized】

【返回值类型,void】 方法名称(参数类型 参数名称)【throws Exception1,Exception2】{

         Return 返回值|返回调用

}

死锁:

死锁是两个线程都以对方完成为条件才能继续下去,也就是都等待对方完成。

死锁是资源同步过多造成的。

泛型

泛型从字面理解是泛泛的数据类型,就是数据类型是不固定的。什么时候不固定呢?定义变量时候可以定义一个返回类型不固定的类型,具体使用时候,再根据实际情况返回所需要的类型。

泛型可以解决安全性问题。

使用语法:

在类声明时候通过一个泛类型标识表示类的某个属性的类型,或者某个方法的返回值及参数类型。这样在类实例化或声明时候,指定好类型即可。

泛型类的定义:

访问权限 class 类名称 <泛型类型标识1,泛型类型标识2,泛类型标识3>

访问权限 泛类型标识 变量名称;

访问权限 泛类型标识 方法名称(){}

访问权限 泛类型标识 返回值类型 方法名称(泛类型标识 变量名称){
}

例如

         class  JiaWei<泛型类型>{

         修饰符 泛型类型 属性名称

         public 泛型类型 setter(){}

         public void 泛型类型 getter(泛型类型 变量)

}

泛型对象定义

类名称<具体类> 对象名 = new 类名称<具体类>()

class Point < T >{

     private T var;

     public T getVar(){

        return var;

     }

     public void setVar(T var){

        this.var = var;

     }

}

<T>表示泛型,类型T是由外部调用本类时候指定的,可以使用任意字母表示<A>、<B>等等,T是type的首字母大写,这样比较好理解。

加入泛型的最大好处就是避免了类的转换异常

泛型应用中的构造方法

构造方法可以为类中的属性初始化,如果类中的属性类型通过泛型指定,而又需要通过属性设置构造内容时,构造方法和之前并没有异同,不需要像声明类那样指定泛型

访问权限 构造方法(泛型类型 参数名称)

指定类的多个泛型

类中涉及到的属性可能不止一个类型,可以在声明类的时候加上多个泛型。

class TangBao<K,V>

在实例化泛型时候最好同时写出实例化对象的泛型类型,否则会有安全警告

比如有个类class TangBao<K,V>

在主类实例化时候:可以这样写Tangbao jiawei = new Tangbao();

这样的写法是不安全的。要指明类型带上泛型。

TangBao<String,Integer>jiawei = new TanBao<String,Integer>();

也可以不具体指明是哪种,指出是Object统一接收。这样的好处是虽然没有写明是哪个,但是可以消除警告信息。

通配符:

在泛型类型中,可以设置通配符来接收任意类型的对象。通配符是:?

泛型传递后面跟上?表示接收任意类型对象

泛型的范围:

主要从继承 的角度来限定对象传递的范围

使用两个关键字:一个是super,一个是extends

Super是规定对象传递下限的,extends规定上限的

定义上限:

类的定义:访问权限 类名称 <泛型标识 extends 类名称>

对象的定义:类名称<? Extends 类名称> 对象名

设置下限

类定义:访问权限 类名称<泛型标识 extends 类>{}

对象声明:类名称<泛型标识 ? super 类> 对象名

泛型与子类继承的限制

一个子类可以通过对象的多态性为其父类实例化,在泛型中,子类的泛型类型,无法使用父类的泛型来接收。如Info<String>不能用Info<Object>

泛型接口

也可以定义泛型接口

访问权限 interface 接口名称<泛型标识>.

本章是将泛型重新应用于类、对象、方法、接口的定义上,使
相应的处理能够一般化

Annotation注释

本章是讲在程序中嵌入注释的,与之前的//形式注释不同,这种注释可以明确在程序中展现,并且可以在出错时候打印出来,在控制台展现。

@Override用于覆写父类方法

@Deprecated用于声明一个不建议使用的方法

使用后不建议使用的方法名称上会被打上横线

@Deprecated也可以用于类上面

@SuppressWarnings压制警告,例如声明一个类时候,没有声明泛型,就会出现警告,使用该注释可以压制警告 

使用语法:

@SuppressWarnings({“unchecked”,“deprecation”})

被压制的警告有如下:

deprecation  使用了不赞成使用的类或方法时的警告

unchecked       执行了未检查的转换时警告,例如泛型操作中没有指定泛型类型

fallthrough       switch操作时case后未加入break操作,导致程序继续执行其他case语句时出现的警告

path          设置了一个错误的类路径、源文件

serial    当在可序列化的类上缺少serialVersionUID定义时的警告

finally   任何finally子句不能正常完成时的警告

all 以上所有警告

反射机制

反射机制是正常机制的逆行

例如声明了一个类Person后,可以通过对象反向找出实例化对应的类名

比如per是Person类的一个对象,调用方法getClass(),per.getClass()将反向获得类,再使用getName()方法获取类名

per.getClass().getName()

getClass是Object类的方法

正常方式:引入需要的“包.类”名称→通过构造方法实例化→取得实例化对象

反射模式(逆向模式):实例化对象→getClass()方法找到对应的类→取得完整的“包.类”名称

Object类是一切类的父类,所有类的对象是Class类的实例。Class也是一种类,是java.lang.Class

删除指定范围内的字符串

使用方法delete();

indexOf查找指定字符串内容,如果未查到返回-1.

Runtime类 运行时操作类,一个封装JVM进程的类,可以进行JVM级别的底层操作。每一个JVM都对应一个Runtime类的实例。获取JVM实例的方法是:

Runtime run = Runtime.getRuntime();

介绍Runtime类常用的方法:

内存信息类:

maxMemory 最大内存空间

freeMemory 空闲内存空间

没有最小内存量

Runtime类与Process类

可以Runtime类运行本机可执行程序

可以用exec()方法,返回的是Process,可以用Process类来控制进程。

使用destroy()方法

国际化程序

使程序适用于多个国家语言。使用Locale类、属性文件及ResourceBundle支持

 

属性文件是后缀名为.properties的文件,文件内容结构为key = value

 

 

 

如:

 

WizardFrame.install = 安装

 

WizardFrame.uninstall = 卸载

 

WizardFrame.Verify = 校验

 

WizardFrame.next = 下一步

 

WizardFrame.nextCMD = 下一步>

 

WizardFrame.previous = < 上一步

 

WizardFrame.previousCMD = 上一步

 

WizardFrame.cancel = 取消

 

WizardFrame.hint = 提示

 

WizardFrame.confirmation = 确认

 

WizardFrame.InstallAffirmCancel = 确定取消安装吗?

 

WizardFrame.UninstallAffirmCancel = 确定取消卸载吗?

 

WizardFrame.VerifyAffirmCancel = 确定取消校验吗?

 

WizardFrame.UpdateAffirmCancel = 确定取消升级吗?

 

ResourceBundle类

getBundle(资源名),getBundle(资源名,区域码)

 

 

动态文本:

动态文本也可以叫可变文本,就是文本的部分内容不是写死的,需要用户的交互输入。

比如说需要输出:你好,XXX!

XXX就需要用占位符来表述{0},如果需要多个占位符,就用{1},{2}表示。可以使用MessageFormat类来处理占位符内容。起使用的方法是:

format

format(String pattern,Object···arguments),其中Object···arguments表示任意多个参数,没有个数限制

这个是java的新特性

返回值类型     方法名称         (Object ···arguments),表示方法可以接受任意多个参数,然后按照数组方式输出

 

除了使用资源文件保存属性信息外,还可以使用类来保存属性信息。不过这样比较少见

 

 

 

System类

System类是与系统相关的一些属性和方法集合,这些属性和方法都是静态的,都是使用static来定义。

getProperty可以用来获取系统的一系列属性

 

垃圾对象的回收:

Runtime类有个垃圾回收方法是gc(),System类也有一个gc()方法用于回收垃圾,这个是对Runtime垃圾回收的封装事实上。

一个对象如果不被任何一个栈内存所引用,这个就成为垃圾,需要等待被回收,等待时间不确定。可以直接调用System.gc()方法来进行回收

使用gc()方法时,会默认调用一个finalize()方法,进行一些处理,所以System的gc方法是一些方法的封装,

对象的生命周期

类的初始化——对象的实例化——对象的垃圾收集——对象的终结——程序卸载对象

一个类加载后进行初始化,然后可以对对象实例化,对象实例化由构造方法来完成,当一个对象不再使用时等待被垃圾回收,然后对象终结,最终被程序卸载

日期操作类

Date类

使用date()方法获取一个完整的日期

Calendar类

这是一个抽象类,需要利用多态性,转成父类,再调用子类覆写的方法

用子类的构造方法在栈内存中实例化

DateFormat类

DateFormat类和MessageFormat类都属于Format类,用于专门格式化数据。也是一个抽象类,需要子类实例化

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素概览 2.2.2、创建显示WEB页 2.2.3、创建表单WEB页 2.3、JavaScript简介 2.3.1、JavaScript的基本语法 2.3.2、事件处理 2.3.3、window对象 2.4、本章摘要 2.5、开发实战讲解 第3章 XML简介 3.1、认识XML 3.2、XML解析 3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 4.1、Web容器简介 4.2、Tomcat简介 4.3、Tomcat服务器的下载及配置 4.3.1、Tomcat下载 4.3.2、Tomcat安装 4.3.3、服务器配置 4.4、编写第一个jsp文件 4.5、交互性 4.6、本章摘要 4.7、开发实战讲解 第5章 JSP基础语法 5.1、JSP注释 5.2、Scriptlet 5.2.1、第一种Scriptlet: 5.2.2、第二种Scriptlet: 5.2.3、第三种Scriptlet: 5.3、Scriptlet标签 5.4、page指令 5.4.1、设置页面的MIME 5.4.2、设置文件编码 5.4.3、错误页的设置 5.4.4、数据库连接操作 5.5、包含指令 5.5.1、静态包含 5.5.2、动态包含 5.6、跳转指令 5.7、实例操作:用户登陆程序实现(JSP + JDBC实现) 5.7.1、创建数据库表 5.7.2、程序实现思路 5.7.3、程序实现 5.8、本章摘要 5.9、开发实战讲解(基于Oracle数据库) 第6章 JSP内置对象 6.1、JSP内置对象概览 6.2、四种属性范围 6.2.1、page属性范围(pageContext范围) 6.2.2、request属性范围 6.2.3、session属性范围 6.2.4、application属性范围 6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 6.4.3、操作Cookie 6.5、session对象 6.5.1、取得Session Id 6.5.2、登陆及注销 6.5.3、判断新用户 6.5.4、取得用户的操作时间 6.6、application对象 6.6.1、取得虚拟目录对应的绝对路径 6.6.2、范例讲解:网站计数器 6.6.3、查看application范围的属性 6.7、WEB安全性及config对象 6.7.1、WEB安全性 6.7.2、config对象 6.8、out对象 6.9、pageContext对象 6.10、本章摘要 6.11、开发实战讲解(基于Oracle数据库) 第7章 JavaBean 7.1、JavaBean简介 7.2、在JSP中使用JavaBean 7.2.1、WEB开发的标准目录结构 7.2.2、使用JSP的page指令导入所需要的JavaBean 7.2.3、使用指令 7.3、JavaBean与表单 7.4、设置属性: 7.4.1、设置指定的属性 7.4.2、指定设置属性的参数 7.4.3、为属性设置具体内容 7.5、取得属性: 7.6、JavaBean的保存范围 7.6.1、page范围的JavaBean 7.6.2、request范围的JavaBean 7.6.3、session范围的JavaBean 7.6.4、application范围的JavaBean 7.7、JavaBean的删除 7.8、实例操作:注册验证 7.9、DAO设计模式 7.9.1、DAO设计模式简介 7.9.2、DAO开发 7.9.3、JSP调用DAO 7.10、本章摘要 7.11、开发实战讲解(基于Oracle数据库) 第8章 文件上传 8.1、smartupload上传组件 8.1.1、上传单个文件 8.1.2、混合表单 8.1.3、为上传文件自动命名 8.1.4、批量上传 8.2、FileUpload 8.2.1、使用FileUpload接收上传内容 8.2.2、保存上传内容 8.2.3、开发FileUpload组件的专属操作类 8.3、本章摘要 8.4、开发实战讲解(基于Oracle数据库) 第9章 Servlet程序开发 9.1、Servlet简介 9.2、永远的“HelloWorld”:第一个Servlet程序 9.3、Servlet与表单 9.4、Servlet生命周期 9.5、取得初始化配置信息 9.6、取得其他内置对象 9.6.1、取得HttpSession实例 9.6.2、取得ServletContext实例 9.7、Servlet跳转 9.7.1、客户端跳转 9.7.2、服务器端跳转 9.8、WEB开发模式:Mode I与Mode II 9.8.1、Mode I 9.8.2、Mode II:Model-View-Controller 9.9、实例操作:MVC设计模式应用 9.10、过滤器 9.10.1、过滤器的基本概念 9.10.2、实现过滤器 9.10.3、过滤器的应用 9.11、监听器 9.11.1、对application监听 9.11.2、对session监听 9.11.3、对request监听 9.11.4、监听器实例 —— 在线人员统计 9.12、本章摘要 9.13、开发实战讲解(基于Oracle数据库) 第10章 表达式语言 10.1、表达式语言简介 10.2、表达式语言的内置对象 10.2.1、访问四种属性范围的内容 10.2.2、调用内置对象操作 10.2.3、接收请求参数 10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 11.3、查找数据源 11.4、本章摘要 第12章 JSP标签编程 12.1、标签编程简介 12.2、定义一个简单的标签 —— 空标签 12.3、定义有属性的标签 12.4、TagSupport类 12.5、定义有标签体的标签库 12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 标准标签库(JSTL) 13.1、JSTL简介 13.2、安装JSTL 1.2 13.3、核心标签库 13.3.1、标签 13.3.2、标签 13.3.3、标签 13.3.4、标签 13.3.5、标签 13.3.6、、、标签 13.3.7、标签 13.3.8、标签 13.3.9、标签 13.3.10、标签 13.3.11、标签 13.4、国际化标签库 13.4.1、标签 13.4.2、标签 13.4.3、读取资源文件 13.4.4、数字格式化标签 13.4.5、日期时间格式化标签 13.4.6、设置时区 13.5、SQL标签库 13.5.1、 13.5.2、数据库操作标签 13.5.3、事务处理 13.6、XML标签库 13.6.1、XPath简介 13.6.2、标签 13.6.3、标签 13.6.4、标签 13.6.5、标签 13.6.6、、、标签 13.6.7、标签 13.7、函数标签库 13.8、本章摘要 13.9、开发实战讲解(基于Oracle数据库) 第14章 AJAX开发技术 14.1、AJAX技术简介 14.2、XMLHttpRequest对象 14.3、第一个AJAX程序 14.4、异步验证 14.5、返回XML数据 14.6、本章摘要 14.7、开发实战讲解(基于Oracle数据库) 第15章 Struts基础开发 15.1、Struts简介 15.2、配置Struts开发环境 15.3、开发第一个Struts程序 15.4、Struts工作原理 15.5、深入Struts应用 15.6、本章摘要 15.7、开发实战讲解(基于Oracle数据库) 第16章 Struts常用标签库 16.1、Struts标签库简介 16.2、Bean标签 16.2.1、标签 16.2.2、标签 16.2.3、资源访问标签 16.2.4、标签 16.2.5、标签 16.2.6、标签 16.2.7、国际化与标签 16.3、Logic标签 16.3.1、标签和标签 16.3.2、标签和标签 16.3.3、关系运算标签 16.3.4、标签 16.3.5、重定向标签: 16.4、Html标签 16.4.1、<html:form>标签 16.4.2、<html:text>与<html:password>标签 16.4.3、<html:radio>标签 16.4.5、<html:textarea>标签 16.4.6、<html:hidden>标签 16.4.7、按钮标签 16.4.8、实例:编写基本表单 16.4.9、复选框标签 16.4.10、下拉列表框 16.5、本章摘要 16.6、开发实战讲解(JSP + Oracle) 第17章 Struts高级开发 17.1、Struts多人开发 17.2、Token 17.3、文件上传 17.4、动态ActionForm 17.5、Action深入 17.5.1、ForwardAction 17.5.2、IncludeAction 17.5.3、DispatchAction 17.6、验证框架 附录A:实用工具 18.1、JavaMail 18.1.1、James邮件服务器的下载及配置 18.1.2、JavaMail简介及配置 18.1.3、发送普通邮件 18.1.4、发送带附件的HTML风格邮件 18.2、操作Excel文件 18.2.1、JExcelAPI简介 18.2.2、创建一个Excel文件 18.2.3、读取Excel文件 18.2.4、格式化文本 18.3、本章摘要 附录B:MyEclipse开发工具 19.1、MyEclipse简介 19.2、MyEclipse的安装 19.3、MyEclipse的使用 19.4、配置Tomcat服务器 19.5、MyEclipse卸载 19.6、本章摘要 附录C:HTTP状态码及头信息 20.1、HTTP状态码 20.2、HTTP头信息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值