[关闭]
@artman328 2019-09-10T03:27:56.000000Z 字数 21785 阅读 1136

Java 快速入门与 Web 应用开发

competition java


第一部分 Java 语言快速入门

一、Java 语言的特点

二、第一个 Java 程序

在某个文件夹建立一个文件 MyApp.java。内容如下:

  1. public class MyApp {
  2. public static void main(String[] args) {
  3. System.out.println("Hello");
  4. }
  5. }

保存后,打开命令窗口,进入 MyApp.java 所在的文件夹(如:D:\work):

  1. D:\work>javac MyApp.java
  2. D:\work>_
  3. D:\work>java MyApp
  4. Hello
  5. D:\work>_

三、Java 程序的一些规定

四、Java 的类定义

  1. /**
  2. 类的说明
  3. ...
  4. */
  5. public class Student {
  6. // 属性
  7. public String name;
  8. public String gender;
  9. // 构造函数
  10. public Student(){
  11. }
  12. // 构造函数
  13. public Student(String name, String gender){
  14. this.name = name;
  15. this.gender = gender;
  16. }
  17. // 方法
  18. public void Greet(String someone){
  19. System.out.println("Hi, "+someone+"!");
  20. }
  21. }

五、测试类定义

在某个文件夹中创建 MyApp.java 文件,内容如下:

  1. public class MyApp {
  2. public static void main(String[] args){
  3. Student st; // 声明一个可装载 Student 对象的变量
  4. st = new Student(); // 生成一个对象给 st
  5. st.name = "Billy"; // 给对象的 name 赋值
  6. st.gender = "Male"; // 给对象的 gender 赋值
  7. System.out.println(st.name + " " + st.gender);
  8. // 传入参数给构造函数生成对象
  9. Student st2 = new Student("Tracy","Female");
  10. System.out.println(st2.name + " " + st2.gender);
  11. st2.greet("Tina"); // 调用 st2 对象的 greet 方法
  12. }
  13. }
  14. class Student {
  15. // 属性
  16. public String name;
  17. public String gender;
  18. // 空构造函数,可用 new Student() 的形式生成(构造)对象
  19. public Student(){}
  20. // 带参数的构造函数,可用 new Student("Tracy","Female") 的形式构造
  21. public Student(String name, String gender){
  22. this.name = name;
  23. this.gender = gender;
  24. }
  25. // 方法
  26. public void greet(String someone_name){
  27. System.out.println("Hello, "+someone_name+".");
  28. }
  29. }

六、Java 内置的基本数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是 -128(-2^7);
- 最大值是 127(2^7-1);
- 默认值是 0;
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
- 例子:byte a = 100,byte b = -50。

short:

int:

long:

float:

double:

boolean:

char:

七、引用其它类

在某个目录下,比如 D:\LearnJava 下,创建一个名为 Student.java 的文件,内容如下:

  1. public class Student {
  2. public String name;
  3. public String gender;
  4. public Student(){}
  5. public Student(String name, String gender){
  6. this.name = name;
  7. this.gender = gender;
  8. }
  9. public void greet(String someone_name){
  10. System.out.println("Hello, "+someone_name+".");
  11. }
  12. }

然后再在此目录下创建一个名为 MyApp.java 的文件,内容如下:

  1. public class MyApp {
  2. public static void main(String[] args){
  3. Student st;
  4. st = new Student();
  5. st.name = "Billy";
  6. st.gender = "Male";
  7. System.out.println(st.name + " " + st.gender);
  8. Student st2 = new Student("Tracy","Female");
  9. System.out.println(st2.name + " " + st2.gender);
  10. st2.greet("Tina");
  11. }
  12. }

接着在命令窗口中:

  1. D:\LearnJava> javac *.java
  2. D:\LearnJava>_
  3. D:\LearnJava> java MyApp
  4. [输出]
  5. D:\LearnJava>_

结论: MyApp 类运行时,能从当前文件夹找到 Student.class 类程序文件。

八、创建软件包

打开命令窗口,输入以下命令(如果没有D盘,可替换为C盘):

  1. mkdir d:\java_lib\com\yntc\school

然后在创建的 school 文件夹下创建 Studeny.java 文件,内容如下:

  1. package com.yntc.school; // 指定命名空间
  2. public class Student {
  3. public String name;
  4. public String gender;
  5. public Student(){}
  6. public Student(String name, String gender){
  7. this.name = name;
  8. this.gender = gender;
  9. }
  10. public void greet(String someone_name){
  11. System.out.println("Hello, "+someone_name+".");
  12. }
  13. }

然后到命令窗口:

  1. cd /d d:\java_lib\com\yntc\school
  2. D:\java_lib\com\yntc\school>_
  3. D:\java_lib\com\yntc\school>javac *.java
  4. D:\java_lib\com\yntc\school>cd ..\..\..
  5. D:\java_lib>_
  6. D:\java_lib>jar cvf school.jar com\yntc\school\*.class

这时,D:\java_lib 文件夹下会有一个 school.jar 文件,这就是我们创建的软件包。

九、引用软件包

在某个文件夹(比如 D:\LearnJava)中,创建 MyApp.java 文件,内容如下:

  1. import com.yntc.school.*; // 引入 com\yntc\school 下的所有 .calss 文件。
  2. public class MyApp {
  3. public static void main(String[] args){
  4. Student st;
  5. st = new Student();
  6. st.name = "Billy";
  7. st.gender = "Male";
  8. System.out.println(st.name + " " + st.gender);
  9. Student st2 = new Student("Tracy","Female");
  10. System.out.println(st2.name + " " + st2.gender);
  11. st2.greet("Tina");
  12. }
  13. }

然后:

  1. D:\LearnJava> javac -cp .;d:\java_lib\school.jar MyApp.java
  2. D:\LearnJava>_
  3. D:\LearnJava> java -cp .;d:\java_lib\school.jar MyApp
  4. [输出]
  5. D:\LearnJava>_

-cp 告诉 java 虚拟机,在当前位置(.)和 d:\java_lib\school.jar 软件包中搜索类文件(.class 文件)。

十、Java 面向对象编程 —— 继承

在面向对象编程(Obejct-Oriented Programming, OOP)中,所有涉及的事物都被分了类(class)。有时候,一些类可能有较多的共同点——共同的属性、共同的方法(行为)。这样,在定义这些类时,会出现重复代码。比如以下“学生”类和“教师”类。

学生类
D:\LearnJava\Student.java

  1. import java.time.*;
  2. import java.time.format.*;
  3. public class Student {
  4. public String studentNo;
  5. public String name;
  6. public String gender;
  7. public LocalDate dateOfBirth;
  8. public Student(){}
  9. // 此构造函数可能抛出错误:DateTimeParseException
  10. public Student(String studentNo, String name, String gender, String dateOfBirth) throws DateTimeParseException{
  11. this.studentNo = studentNo;
  12. this.name = name;
  13. this.gender = gender;
  14. try{
  15. this.dateOfBirth = LocalDate.parse(dateOfBirth);
  16. }
  17. catch(DateTimeParseException e){
  18. System.out.println("Parse Date Error On: " + e.getParsedString());
  19. throw e;
  20. }
  21. }
  22. // 获取年龄
  23. public int getYearsOld(){
  24. return this.dateOfBirth.until(LocalDate.now()).getYears();
  25. }
  26. }

教师类
D:\LearnJava\Teacher.java

  1. import java.time.*;
  2. import java.time.format.*;
  3. public class Teacher {
  4. public String name;
  5. public String gender;
  6. public LocalDate dateOfBirth;
  7. punlic String level; // 职称
  8. public Teacher(){}
  9. // 此构造函数可能抛出错误:DateTimeParseException
  10. public Teacher(String name, String gender, String dateOfBirth, String level) throws DateTimeParseException{
  11. this.name = name;
  12. this.gender = gender;
  13. try{
  14. this.dateOfBirth = LocalDate.parse(dateOfBirth);
  15. }
  16. catch(DateTimeParseException e){
  17. System.out.println("Parse Date Error On: " + e.getParsedString());
  18. throw e;
  19. }
  20. this.level = level
  21. }
  22. // 获取年龄
  23. public int getYearsOld(){
  24. return this.dateOfBirth.until(LocalDate.now()).getYears();
  25. }
  26. }

这时,可将他们共性的部分抽取出来,作为一个新类,如:“个人”,Person。

个人类

  1. import java.time.*;
  2. import java.time.format.*;
  3. public class Person {
  4. public String name;
  5. public String gender;
  6. public LocalDate dateOfBirth;
  7. public Person(){}
  8. // 此构造函数可能抛出错误:DateTimeParseException
  9. public Person(String name, String gender, String dateOfBirth) throws DateTimeParseException{
  10. this.name = name;
  11. this.gender = gender;
  12. try{
  13. this.dateOfBirth = LocalDate.parse(dateOfBirth);
  14. }
  15. catch(DateTimeParseException e){
  16. System.out.println("Parse Date Error On: " + e.getParsedString());
  17. throw e;
  18. }
  19. }
  20. // 获取年龄
  21. public int getYearsOld(){
  22. return this.dateOfBirth.until(LocalDate.now()).getYears();
  23. }
  24. }

然后,让“学生”类和“教师”类都继承(扩展:extends)“个人”类。

学生类

  1. import java.time.*;
  2. public class Student extends Person {
  3. public String studentNo;
  4. public Student(){}
  5. // 此构造函数可能抛出错误:DateTimeParseException
  6. public Student(String studentNo, String name, String gender, String dateOfBirth) throws DateTimeParseException{
  7. super(name,gender,dateOfBirth); // 调用父类构造函数
  8. this.studentNo = studentNo;
  9. }
  10. }

教师类

  1. import java.time.*;
  2. public class Teacher extends Person {
  3. public String level;
  4. public Teacher(){}
  5. // 此构造函数可能抛出错误:DateTimeParseException
  6. public Teacher(String name, String gender, String dateOfBirth, String level) throws DateTimeParseException{
  7. super(name,gender,dateOfBirth); // 调用父类构造函数
  8. this.level = level;
  9. }
  10. }

以下测试。

D:\LearnJava\MyApp.java

  1. import java.time.*;
  2. public class MyApp {
  3. public static void main(String[] args){
  4. Student st;
  5. try{
  6. st = new Student("S001","Billy","Male","1982-10-10");
  7. System.out.printf("%s's StudentNo is %s and is %d years old.\n", st.name,st.studentNo, st.getYearsOld());
  8. }
  9. catch(DateTimeParseException e){
  10. System.out.println("Parse Date Error! Create Student Object Failed!");
  11. }
  12. Teacher te;
  13. try{
  14. te = new Teacher("Tina","Female","1996-03-28","Senior");
  15. System.out.printf("%s' level is %s and is %d years old.\n", te.name, te.level,te.getYearsOld());
  16. }
  17. catch(DateTimeParseException e){
  18. System.out.println("Parse Date Error! Create Teacher Object Failed!");
  19. }
  20. }
  21. }

十一、Java 面向对象编程 —— 继承(方法覆盖)

在继承中,子类(继承者)可以覆盖父类(被继承者)的方法。

  1. public class MyApp {
  2. public static void main(String[] args) {
  3. Parent p = new Parent();
  4. p.doSomething();
  5. Child c = new Child();
  6. c.doSomething();
  7. }
  8. }
  9. class Parent{
  10. public void doSomething(){
  11. System.out.println("Parent");
  12. }
  13. }
  14. class Child extends Parent{
  15. @Override
  16. public void doSomething(){
  17. System.out.println("Child");
  18. }
  19. }

如果继承的是抽象类(abstract class, 一种不能被实例化,即不能生成对象的类), 其中的抽象方法就必须被覆盖。如下例:

  1. public class MyApp {
  2. public static void main(String[] args) {
  3. // Shape s = new Shape(); // error!
  4. Circle c = new Circle(10);
  5. System.out.printf("The circle's area is: %.2f\n",c.getArea());
  6. System.out.println(c.getName()); // "Shape"
  7. }
  8. }
  9. abstract class Shape{
  10. abstract public float getArea(); //抽象方法没有函数体
  11. public String getName(){
  12. return "Shape";
  13. }
  14. }
  15. class Circle extends Shape {
  16. public float radius;
  17. public Circle(float radius){
  18. this.radius = radius;
  19. }
  20. // 自己不是抽象类,就必须覆盖父类的抽象方法
  21. @Override
  22. public float getArea(){
  23. return 3.14f * radius * radius;
  24. }
  25. }

十二、Java 面向对象编程 —— 继承(接口)

为不使问题复杂化,Java 语言的采用的是单继承,即一个类最多只能继承一个类。如果要实现从多个类继承的效果,可用接口(interface)替代类。一个类“实现(implement)”多个接口,意味着它就具有了所有这些接口的特征。
接口是一种“契约”,当一个类声称自己“实现(implement)”了某个接口时,就必须实现该接口。

一个类可以实现多个接口:

  1. public class MyApp{
  2. public static void main(String[] args){
  3. HouseCar houseCar = new HouseCar();
  4. houseCar.clean();
  5. houseCar.lock();
  6. houseCar.start();
  7. houseCar.stop();
  8. }
  9. }
  10. interface House {
  11. public void clean();
  12. public void lock();
  13. }
  14. interface Car {
  15. public void start();
  16. public void stop();
  17. }
  18. class HouseCar implements House, Car {
  19. @Override
  20. public void clean(){
  21. System.out.println("Cleaning...")
  22. }
  23. public void lock(){
  24. System.out.println("Locking...")
  25. }
  26. public void start(){
  27. System.out.println("Starting...")
  28. }
  29. public void stop(){
  30. System.out.println("Stopped.")
  31. }
  32. }

一个接口可以继承多个接口:

  1. public class MyApp{
  2. public static void main(String[] args){
  3. HouseCar houseCar = new HouseCar();
  4. houseCar.clean();
  5. houseCar.lock();
  6. houseCar.start();
  7. houseCar.stop();
  8. }
  9. }
  10. interface House {
  11. public void clean();
  12. public void lock();
  13. }
  14. interface Car {
  15. public void start();
  16. public void stop();
  17. }
  18. interface IHouseCar extends House, Car{
  19. public void move();
  20. }
  21. class HouseCar implements IHouseCar {
  22. public void clean(){
  23. System.out.println("Cleaning...");
  24. }
  25. public void lock(){
  26. System.out.println("Locking...");
  27. }
  28. public void start(){
  29. System.out.println("Starting...");
  30. }
  31. public void stop(){
  32. System.out.println("Stopped.");
  33. }
  34. public void move(){
  35. System.out.println("Moving...");
  36. }
  37. }

十三、Java 面向对象编程 —— 封装

封装,是指控制类和类成员的访问权限。
一个类是 public 的,那么,这个类可以为全世界使用。
一个类没有 public 修饰,那么这个类就只能被在同一个包中的其它类访问。

类的属性和方法可以有四个等级的访问权限:

如果一个类的属性是 private 或 protected 的,为了让外界能够访问,就需要编写一些 public 的方法来对这些属性进行存(set)取(get)。在这些方法中,可用程序逻辑对存取进行合理控制(如:存的值的合法性检查、取值者的身份核验等。)

  1. public class MyApp{
  2. public static void main(String[] args){
  3. Person p = new Person("Tina","Female");
  4. System.out.println("Name: " + p.getName() + ", Gender: " + p.getGender());
  5. }
  6. }
  7. class Person {
  8. protected String name;
  9. protected String gender;
  10. public Person(String name, String gender){
  11. this.setName(name);
  12. this.setGender(gender);
  13. }
  14. // setter
  15. public void setName(String name){
  16. // 这里可插入 name 值合法性检查的代码
  17. this.name = name;
  18. }
  19. // getter
  20. public String getName(){
  21. // 这里可插入读取 name 的权限检查的代码
  22. return this.name;
  23. }
  24. public void setGender(String gender){
  25. // 这里可插入 gender 值合法性检查的代码
  26. this.gender = gender;
  27. }
  28. public String getGender(){
  29. // 这里可插入读取 gender 的权限检查的代码
  30. return this.gender;
  31. }
  32. }

十四、Java 面向对象编程 —— 多态

在 Java 中,用父类声明的变量可以用来装载其各级子类的对象,但只能访问到子类从父类继承过去的成员(属性和方法)。因为装载的对象的子类的不同,从而造成访问某个被子类重写的方法时,表现有所不同。
如:学生、老师都继承自“个人”类,“个人”类中有一个“work”的方法,在学生、老师类中都进行了重写。当用以“个人”类声明的一个变量 person 来装载学生和老师的对象时,同样的 person.work() 表现就不同。

用接口声明的变量,可以装载实现了该接口的类的对象,但只能访问到该接口拥有的方法。由于装载的对象的类的不同,访问同一个方法,表现有所不同。
如:有一些类都实现了 IPerson 接口,其中有一个方法是 work。由于类的不同,实现的这个方法也不同。当用 IPerson 声明的变量 person 来装载这些类的对象时,由于类的不同,同样的 person.work()表现也就不同。

以上两个现象就是多态——同样类事物(对象)的同一个方法,可能得到不同的行为。

子类的例子:

  1. public class MyApp{
  2. public static void main(String[] args){
  3. Person person;
  4. person = new Student();
  5. person.work();
  6. person = new Teacher();
  7. person.work();
  8. }
  9. }
  10. abstract class Person {
  11. public String name;
  12. abstract public void work();
  13. }
  14. class Student extends Person{
  15. @Override
  16. public void work(){
  17. System.out.println("Studying...");
  18. }
  19. }
  20. class Teacher extends Person{
  21. @Override
  22. public void work(){
  23. System.out.println("Teaching...");
  24. }
  25. }

接口的例子:

  1. public class MyApp{
  2. public static void main(String[] args){
  3. IPerson person;
  4. person = new Student();
  5. person.work();
  6. person = new Teacher();
  7. person.work();
  8. }
  9. }
  10. interface IPerson {
  11. public void work();
  12. }
  13. class Student implements IPerson{
  14. public void work(){
  15. System.out.println("Studying...");
  16. }
  17. }
  18. class Teacher implements IPerson{
  19. public void work(){
  20. System.out.println("Teaching...");
  21. }
  22. }

第二部分 Java Servlet 与 JSP Web 应用开发

一、Web 应用的结构

Web 应用由两部分组成:一是用户用于交互的用户代理(User agent),通常是浏览器;二是用于提供信息服务的 web 服务器。双方通过 HTTP 协议进行 请求/响应 模式的通信。

Created with Raphaël 2.1.2浏览器浏览器服务器服务器-- HTTP 请求(GET/POST/HEAD/PUT/DELETE)--服务器端客户端HTTP 响应

二、HTTP请求与响应

HTTP/1.1 (版本 1.1)的请求和响应都是特定格式的字符串。

1、请求

样例:

  1. POST /cgi-bin/process.cgi HTTP/1.1
  2. User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
  3. Host: www.tutorialspoint.com
  4. Content-Type: application/x-www-form-urlencoded
  5. Content-Length: 49
  6. Accept-Language: en-us
  7. Accept-Encoding: gzip, deflate
  8. Connection: Keep-Alive
  9. licenseID=string&content=string&/paramsXML=string

第 1 行为请求行,包含了请求方法(POST),请求的资源相对地址:/cgi-bin/process.cgi,以及请求所用的协议及其版本号:HTTP/1.1;

第 2 ~ 8 行为请求头,第行说明不同的内容;
第 9 行为一个空行,是请求头和请求体的分界线(有的请求没有请求体,如 GET 请求);
第 10 行为请求体。(请求体内容可以很长,头部:Content-Length 说明了请求体的字节数)。

2、响应

样例:

  1. HTTP/1.1 200 OK
  2. Date: Mon, 27 Jul 2009 12:28:53 GMT
  3. Server: Apache/2.2.14 (Win32)
  4. Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
  5. Content-Length: 88
  6. Content-Type: text/html
  7. Connection: Closed
  8. <html>
  9. <body>
  10. <h1>Hello, World!</h1>
  11. </body>
  12. </html>

第 1 行为响应行,说明了协议及其版本号:HTTP/1.1,响应状态编码:200,响应结果信息:OK;
第 2 ~ 7 行为响应头;
第 8 行为空行,作为响应头与响应体的分界;
第 9 行开始为响应体。(字节数由响应头 Content-Length 决定)

三、Cookie 和 Session

HTTP 协议是无状态协议,如果要记住访问服务器的用户,则可采用 Session 和 Cookie 技术。

1、Cookie

Cookie 是在客户端保存用户信息的方法,它要保存的信息由响应头带回来,并保存在用户的计算机中。浏览器在访问某个网址时,会将这个网址保存在本地的 Cookie 信息(如果有的话)带给服务器。这样服务器就可通过读取 Cookie 信息了解该用户了。

Created with Raphaël 2.1.2浏览器浏览器服务器服务器HTTP 请求(第一次请求,无 Cookie)服务器端客户端HTTP 响应(服务器设置 Cookie,保存到客户端)HTTP 请求(带上保存的 Cookie)查阅用户送来的Cookie 信息

2、Session

与 Cookie 不同,Session 是将用户信息保存到服务器的技术。服务器保存了用户信息后,会分配给该用户一个 ID ,并将该 ID 传回客户端进行保存(Cookie 或其它方法)。当该用户再次访问该网站时,ID 会被送回服务器(通过 Cookie 或其它手段)。服务器得到用户的 ID 后,即可从保存的 Session 信息中查阅该用户(比如是否已登录等)。

Created with Raphaël 2.1.2浏览器浏览器服务器服务器HTTP 请求(第一次请求,无 Session ID)服务器端客户端HTTP 响应(服务器建立用户Session,保存信息,把 Session ID 传回客户端)HTTP 请求(带上保存的 Session ID)根据 Session ID,查阅保存在服务器端 Session 中的用户信息

四、用 jsp 开发一个联系人的增、删、改、查 Web 应用

1、首先建立联系人数据库和表

用以下命令进入 MySql 数据库服务器

  1. mysql -uroot -p

然后,建立数据库 contact_db 和数据表 contacts:

  1. create database contact_db default charset utf8;
  2. use contact_db;
  3. create table contacts(id serial primary key, name varchar(50) not null, gender varchar(10) not null, mobile varchar(30) not null);

插入几条样例数据:

  1. insert into contacts values (1,'Billy','Male','13098098767'),(2,'Tina','Female','13908876785');
  2. select * from contacts;

2、在 eclipse 中新建一个 Dynamic Web Application,在 Java Resources 的 src 下建立一个 package: net.yntc.contact。

3、在 net.yntc.contact 包中新建一个 Class,名为 Contact,内容如下:

  1. package net.yntc.contact;
  2. public class Contact {
  3. private int id;
  4. private String name;
  5. private String gender;
  6. private String mobile;
  7. }

然后,利用 Eclispe 自动生成构造函数及 getter 和 setter。

  1. package net.yntc.contact;
  2. public class Contact {
  3. private int id;
  4. private String name;
  5. private String gender;
  6. private String mobile;
  7. public Contact(int id, String name, String gender, String mobile) {
  8. super();
  9. this.id = id;
  10. this.name = name;
  11. this.gender = gender;
  12. this.mobile = mobile;
  13. }
  14. public int getId() {
  15. return id;
  16. }
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public String getGender() {
  27. return gender;
  28. }
  29. public void setGender(String gender) {
  30. this.gender = gender;
  31. }
  32. public String getMobile() {
  33. return mobile;
  34. }
  35. public void setMobile(String mobile) {
  36. this.mobile = mobile;
  37. }
  38. }

4、创建数据处理类

将 mysql 驱动的 jar 包复制到 WebContent\WEB_INF\lib 文件夹下。
接着,在同一个包中新建一个名为 ContactDAO 的 Class,内容如下:

  1. package net.yntc.contact;
  2. import java.sql.*;
  3. import java.util.ArrayList;
  4. public class ContactDAO {
  5. // 数据库连接
  6. private java.sql.Connection conn;
  7. public ContactDAO(String db, String user, String pass) {
  8. try {
  9. // 加载数据库驱动类
  10. Class.forName("com.mysql.jdbc.Driver");
  11. // 获取到数据库的连接
  12. this.conn = DriverManager.getConnection(db,user,pass);
  13. // 用于测试
  14. System.out.println("Connection to DB established!");
  15. } catch (ClassNotFoundException | SQLException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. this.conn = null;
  19. }
  20. }
  21. /*
  22. * 获取联系人(参数 key 为姓名过滤关键字)
  23. * @param key
  24. * @return ArrayList<Contact>
  25. */
  26. public ArrayList<Contact> getAll(String key){
  27. if(conn==null) {
  28. return null;
  29. }
  30. try {
  31. // 新建一个数组集合,用于装载联系人
  32. ArrayList<Contact> contacts = new ArrayList<Contact>();
  33. // 用连接创建一个语句对象
  34. java.sql.Statement st = conn.createStatement();
  35. // 用语句对象执行查询语句,获取结果集
  36. ResultSet rs = st.executeQuery("select * from contacts");
  37. // 取出下一条结果,没有则为 null(false)
  38. while(rs.next()) {
  39. // 生成一个联系人对象
  40. Contact c = new Contact(
  41. rs.getInt("id"),
  42. rs.getString("name"),
  43. rs.getString("gender"),
  44. rs.getString("mobile")
  45. );
  46. // 把联系人对象加到联系人集合
  47. contacts.add(c);
  48. }
  49. return contacts;
  50. } catch (SQLException e) {
  51. // TODO Auto-generated catch block
  52. e.printStackTrace();
  53. return null;
  54. }
  55. }
  56. /**
  57. * 获取一个联系人对象
  58. * @param id 联系人编号
  59. * @return 联系人对象或空对象
  60. */
  61. public Contact get(int id) {
  62. if(conn==null) return null;
  63. try {
  64. java.sql.Statement st = conn.createStatement();
  65. ResultSet rs = st.executeQuery("select * from contacts where id="+id);
  66. if(rs.next()) {
  67. Contact c = new Contact(
  68. rs.getInt("id"),
  69. rs.getString("name"),
  70. rs.getString("gender"),
  71. rs.getString("mobile")
  72. );
  73. return c;
  74. }
  75. return null;
  76. } catch (SQLException e) {
  77. // TODO Auto-generated catch block
  78. e.printStackTrace();
  79. return null;
  80. }
  81. }
  82. /**
  83. * 删除联系人
  84. * @param id 联系人编号
  85. * @return 成功为真,失败为假
  86. */
  87. public boolean delete(int id) {
  88. if(conn==null) return false;
  89. try {
  90. java.sql.Statement st = conn.createStatement();
  91. return st.execute("delete from contacts where id="+id);
  92. } catch (SQLException e) {
  93. // TODO Auto-generated catch block
  94. e.printStackTrace();
  95. return false;
  96. }
  97. }
  98. /**
  99. * 插入或更新数据库记录
  100. * @param c,联系人对象
  101. * @return 成功为真,失败为假
  102. */
  103. public boolean save(Contact c) {
  104. if(conn==null) return false;
  105. if(c.getId()>0) { // update
  106. String sql = "update contacts set name=?, gender=?, mobile=? where id=?";
  107. try {
  108. java.sql.PreparedStatement ps = conn.prepareStatement(sql);
  109. //设置第一个 ? 号为字符串值,联系人的姓名
  110. ps.setString(1, c.getName());
  111. ps.setString(2, c.getGender());
  112. ps.setString(3, c.getMobile());
  113. ps.setInt(4, c.getId());
  114. return ps.execute();
  115. } catch (SQLException e) {
  116. // TODO Auto-generated catch block
  117. e.printStackTrace();
  118. return false;
  119. }
  120. }
  121. else { // insert
  122. String sql = "insert into contacts values(null,?,?,?)";
  123. try {
  124. java.sql.PreparedStatement ps = conn.prepareStatement(sql);
  125. ps.setString(1, c.getName());
  126. ps.setString(2, c.getGender());
  127. ps.setString(3, c.getMobile());
  128. return ps.execute();
  129. } catch (SQLException e) {
  130. // TODO Auto-generated catch block
  131. e.printStackTrace();
  132. return false;
  133. }
  134. }
  135. }
  136. }

5、配置项目 Build Path, 把 Tomcat 服务器 lib 目录下的 servlet-api.jar 加到项目的 classpath。

6、在 WenContent 目录下分别创建以下 jsp 文件

1、index.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="net.yntc.contact.*,java.util.*" %>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="UTF-8">
  8. <title>联系人列表</title>
  9. </head>
  10. <body>
  11. <%
  12. request.setCharacterEncoding("utf-8");
  13. response.setCharacterEncoding("utf-8");
  14. String key = request.getParameter("key");
  15. key = key!=null? key:"";
  16. key = new String(key.getBytes("ISO-8859-1"),"utf-8");
  17. System.out.println(key);
  18. %>
  19. <h1>联系人管理</h1>
  20. <a href="add.jsp">添加联系人</a>
  21. <br><br>
  22. <form action="index.jsp">
  23. <input type="text" name="key" value="<%= key %>" placeholder="输入姓名关键字">
  24. <input type="submit" value="搜索 "/>
  25. </form>
  26. <br><br>
  27. <table>
  28. <thead>
  29. <tr>
  30. <th>编号</th>
  31. <th>姓名</th>
  32. <th>性别</th>
  33. <th>手机</th>
  34. <th></th>
  35. </tr>
  36. </thead>
  37. <tbody>
  38. <%! ContactDAO dao = new ContactDAO("jdbc:mysql://127.0.0.1:3306/contact_db?useUnicode=true&characterEncoding=utf8","root","");%>
  39. <%
  40. ArrayList<Contact> cts = dao.getAll(key);
  41. Iterator<Contact> it = cts.iterator();
  42. while(it.hasNext()){
  43. Contact c = it.next();
  44. %>
  45. <tr>
  46. <td id="contact_id"><%= c.getId() %></td>
  47. <td><%= c.getName() %></td>
  48. <td><%= c.getGender() %></td>
  49. <td><%= c.getMobile() %></td>
  50. <td>
  51. <a href="edit.jsp?id=<%= c.getId() %>">编辑</a>
  52. <a href="#" onclick="needConfirm(<%= c.getId() %>)">删除</a>
  53. </td>
  54. </tr>
  55. <% } %>
  56. </tbody>
  57. </table>
  58. <script>
  59. function needConfirm(id){
  60. if(confirm("你确实要删除编号为:"+id+" 的联系人吗?")){
  61. window.location="delete.jsp?id="+id;
  62. }
  63. }
  64. </script>
  65. </body>
  66. </html>

2、add.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <h1>新增联系人</h1>
  11. <form action="save.jsp" method="post">
  12. 姓名:<input type="text" name="name"><br><br>
  13. 性别:<select name="gender">
  14. <option value="M"></option>
  15. <option value="F"></option>
  16. </select>
  17. <br><br>
  18. 手机:<input type="text" name="mobile">
  19. <br><br>
  20. <input type="submit" value="保存" />
  21. </form>
  22. </body>
  23. </html>

3、edit.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="net.yntc.contact.*,java.util.*" %>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <%! ContactDAO dao = new ContactDAO("jdbc:mysql://127.0.0.1:3306/contact_db","root","");%>
  12. <%
  13. int id = Integer.parseInt(request.getParameter("id"));
  14. Contact c = dao.get(id);
  15. %>
  16. <h1>新增联系人</h1>
  17. <form action="save.jsp" method="post">
  18. <input type="hidden" name="id" value="<%= id %>" />
  19. 姓名:<input type="text" name="name" value="<%= c.getName() %>"><br><br>
  20. 性别:<select name="gender">
  21. <option value="M" <% if(c.getGender().startsWith("M")){ %> selected <% } %>>男</option>
  22. <option value="F" <% if(c.getGender().startsWith("F")){ %> selected <% } %>>女</option>
  23. </select>
  24. <br><br>
  25. 手机:<input type="text" name="mobile" value="<%= c.getMobile() %>">
  26. <br><br>
  27. <input type="submit" value="保存" />
  28. </form>
  29. </body>
  30. </html>

4、save.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="net.yntc.contact.*" %>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <%! ContactDAO dao = new ContactDAO("jdbc:mysql://127.0.0.1:3306/contact_db?useUnicode=true&characterEncoding=utf8","root","");%>
  12. <%
  13. String str_id = request.getParameter("id");
  14. str_id = str_id==null?"0":str_id;
  15. int id = Integer.parseInt(str_id);
  16. request.setCharacterEncoding("utf-8");
  17. String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8");
  18. String gender = new String(request.getParameter("gender").getBytes("ISO-8859-1"),"utf-8");
  19. String mobile = new String(request.getParameter("mobile").getBytes("ISO-8859-1"),"utf-8");
  20. Contact c = new Contact(id,name,gender,mobile);
  21. dao.save(c);
  22. %>
  23. <% response.sendRedirect("index.jsp"); %>>
  24. </body>
  25. </html>

5、delete.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="net.yntc.contact.*" %>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <%! ContactDAO dao = new ContactDAO("jdbc:mysql://127.0.0.1:3306/contact_db","root","");%>
  12. <%
  13. int id = Integer.parseInt(request.getParameter("id"));
  14. dao.delete(id);
  15. response.sendRedirect("index.jsp");
  16. %>
  17. </body>
  18. </html>

7、在 Tomcat 上运行项目。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注