JSP程序设计【五】

一、MVC


1、什么是MVC

MVC是一种开发模型。

Model——View——Controller

模型 ——视图——控制器

JavaBean擅长数据存储与业务处理:Model–>实体 + 业务

JSP擅长数据提交与数据表示:View–>提交 + 显示

Servlet擅长逻辑控制与动作协调:Controller—>控制 + 逻辑

2、Model – JavaBean

  • 数据Bean:用于直接存储数据,属于最一般的Bean。一般形式就是成员变量及其getter/setter方法

  • 业务Bean:用于业务数据处理,含有若干功能实现,如数据库访问操作等。一般以方法(可使用static)提供业务处理功能,这样通过类名就可以使用。

  • 混合Bean:既有数据存储也有处理方法的Bean,但一般不使用。耦合高

3、View – JSP

JSP使用一般的HTML 和Bean 进行视图显示

  • <jsp:useBean id= "bean" type= "bean.Bean" scope= "…" />
  • <jsp:getProperty name="bean" property="…"/>
  • Set很少用。因为为了符合MVC模式,数据的存储会在servlet中设置

注意:

  • 使用type而不使用class,目的是避免在JSP中重新创建新的bean,否则可能会把Servlet中创建的bean覆盖掉
  • scope应与Servlet中存储bean时使用的生命周期一致
  • property中指定的属性值应在bean中能够获取(getter方法)
  • 有时某些Bean也可以在JSP中创建(class;setProperty)

4、Controller – Servlet

1、创建、存储、使用Bean

通过构造方法创建Bean,获取值,将存储进Bean,调用业务Bean处理任务

2、Bean的存储(三种生命周期:request、session、application)

  • request.setAttribute(“bean”, bean);

  • HttpSession session = request.getSession();

    session.setAttribute(“bean”, bean);

    //有时可直接写成:request.getSession().setAttribute(“bean”, bean);

  • ServletContext application = getServletContext();

    application.setAttribute(“bean”, bean);

    //有时可直接写成:getServletContext().setAttribute(“bean”, bean);

3、控制JSP

使用Java语言,进行逻辑控制,处理业务后使用合适的转发语句转入显示页面。

  • 重定向
    response.sendRedirect(location);
  • 转发 / 包含
    RequestDispatcher rdisp = request.getRequestDispatcher(path);
    rdisp.forward(request, response); //转发
    rdisp.include(request, response); //包含
  • 自动刷新
    response.setHeader(“refresh”, “3;url=location”);

5、总结

输入JSP页面,显示网页用户输入数据—>送入到servlet,使用Bean进行存储、处理,最后转发到输出JSP页面—>输出JSP页面调用Bean进行相应输出。

二、数据库应用


DBMS:MySQL、Derby(Java DB)、…

管理工具:SQLyog、Navicat、Squirrel、…

JDBC:Java DataBase Connectivity

1、MySQL的安装注意事项

①在设置编码时刻选择UTF-8防止乱码

②安装目录中的主要文件

  • my.ini:配置文件
  • bin文件夹下
    • mysqld.exe:MySQL服务器
    • mysql.exe:客户端控制台
    • MySQLInstanceConfig.exe:MySQL实例配置(安装SQL过程中会自动运行,也可再单独运行进行配置数据的修改)
    • mysqladmin.exe:管理用客户端

③MySQL服务的启动与停止

  • 通过Windows服务,若安装配置过程中设为Windows服务,则可以自动启动
    • 在计算机管理中可以查看、启动、关闭、设置MySQL服务
  • 在Windows命令窗口中
    • 启动:net start mysql
    • 停止:net stop mysql

启动后在Windows任务管理器中会有“mysqld.exe”进程

一般不直接使用MySQL 5.5 Command Line Client,需要记住很多命令,很麻烦!可以使用例如SQLyog的管理工具进行可视化管理比较方便

④MySQL的卸载

  • 停止服务
  • 卸载程序
  • 删除C:\ProgramData\MySQL(数据库相关数据!)
  • 删除相关注册表项

删除不彻底,重装出问题

二、连接数据库


1、JDBC体系结构

(1)一些基础概念

数据库:数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。

RDBMS:关系数据库管理系统(Relational Database Management System:RDBMS)是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。关系数据库管理系统就是管理关系数据库,并将数据逻辑组织的系统。

DBMS和RDBMS:DBMS是过去的50年中所出现的不同类型数据库管理技术的总称。RDBMS是DBMS的一种

它的特点是使用一个基于行的表结构,将相关数据元素连接到一起,保证事务完整性,并维护数据的准确性和一致性。RDBMS的另一个显著属性是支持结构化查询语言(SQL)。近年来,一些非关系型数据库系统开始兴起但是目前关系数据库仍然是大多数IT架构的中心。

JAVA DB(Derby): javadb就是一种关系数据库管理系统。Java DB是Apache Derby项目(Apache软件基金会(ASF)的开源关系数据库项目)的Oracle版本Apache Derby是纯Java,基于标准的关系数据库引擎

API:Application Programming Interface应用程序编程接口,是软件系统不同组成部分衔接的约定

JDBC:JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。比如建立数据库连接、执行SQL语句进行数据的存取操作。

(2)JDBC体系

一般情况下,在应用程序中进行数据库连接,调用JDBC接口,首先要将特定厂商的JDBC驱动实现加载到系统内存中,然后供系统使用。

应用程序–>链接数据库——>调用JDBC API接口——>特定厂商的JDBC驱动加载和JDBC Driver对接–>使用DriverMannager对多个Driver 管理—>连接完成通过JDBC API中的各种类对数据库进行操作

  • 最上层的Application:使用Java语言编写App,利用JDBC API,实现CRUD操作
    • Create(增)
    • Retrieve(查)
    • Update(改)
    • Delete(删)
  • JDBC API:提供数据库访问接口
    • 连接(Connection)
    • SQL声明(Statement、PreparedStatement、CallableStatement)
    • 结果集(ResultSet)
    • 元数据(DatabaseMetaData、ResultSetMetaData)
  • JDBC Drivers:提供对数据库进行访问的驱动程序。与数据库类型有关,由开发方提供,jar文件格式
    需要添加到项目的“库”中,连接数据库前需要载入。
  • 最底层的DB:使用管理工具创建数据库,SQLyog + MySQL、NetBeans + Derby

(3)JDBC核心组件

JDBC核心组件

DriverManager:此类管理数据库驱动程序列表。使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。

Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象

Connection:该界面具有用于联系数据库的所有方法。连接对象通信上下文,即,与数据库的所有通信仅通过连接对象。

Statement:使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。

ResultSet: 在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。

SQLException:此类处理数据库应用程序中发生的任何错误

(4)数据库访问步骤

  • (0)添加驱动程序:在项目的“库”中添加相应数据库的jar
  • (1)加载驱动程序:Class.forName(“com.mysql.jdbc.Driver”);
  • (2)获取连接对象:Connection conn = DriverManager.getConnection()
    • jdbc:主协议;固定为:jdbc
    • subprotocol:子协议;由 DBMS 类型确定,如:derby、mysql
    • subname:数据库信息;由具体的数据库名字确定
  • (3)执行SQL语句
  • (4)关闭连接对象:conn.close();

1、通过DriverManager获取Connection对象,链接数据库

使用DriverManager类来获取的Connection连接,是无法重复利用的。如果close()后要想再利用,必须重新创建连接,所以没有完成对数据库的所有操作之前,一般不要close掉

常用方法:

  • public static Connection getConnection(String url, String user, String password)返回Connection对象

2、通过Connection对象方法,建立该链接数据库的Statement类或者其子类对象用于执行SQL指令等。

​ 主要方法:

  • Statement stmt = conn.createStatement(int, int);创建向数据库发送sql的statement对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
参数1:结果集游标的滚动类型及对数据库变化的反映
ResultSet.TYPE_FORWARD_ONLY
//默认参数结果集的游标只能向下滚动。 ;
ResultSet.TYPE_SCROLL_INSENSITIVE
//结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
ResultSet.TYPE_SCROLL_SENSITIVE
//返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
参数2:是否能用结果集对数据库进行更新
ResultSet.CONCUR_READ_ONLY
//默认参数不能用结果集更新数据库中的表。
ResultSet.CONCUR_UPDATABLE
//能用结果集更新数据库中的表。

Statement stmt = conn.createStatement(); //参数取默认值

PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement

  • PreparedStatement prepareStatement(String sql);该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译;
1
2
3
4
5
6
7
例如:
PreparedStatement stmt = conn.prepareStatement("select * from choice where knowledge=? and difficulty=?", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY );
设定参数
stmt.setXxx(n, x); //n – 参数位置,x – 参数值
例如:
stmt.setInt(1, 3);
stmt.setInt(2, 1);
  • prepareCall(sql):创建执行存储过程的callableStatement对象。

3、通过Statement类或者其子类对象方法,执行SQL指令等,返回指令的结果集

主要方法:

  • ResultSet executeQuery(String sql)该方法用于执行查询语句,并返回查询结果对应ResultSet对象。该方法只能用于执行查询语句。
  • int executeUpdate(String sql)用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零 可以配合PreparedStatement对象,完成参数设置后,执行executeUpdate()即可更新数据库
  • boolean execute(String sql) 该方法可以执行任何sql语句。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false;

4、通过ResultSet对象接受Statement类或者其子类对象用于执行SQL指令后的结果集。

​ 主要方法:

  • boolean next() 将结果集的记录指针定位到下一行,如果移动后的记录指针指向一条有效的记录,则该方法返回true;
  • boolean Previous()移动到前一行
  • boolean absolute( int row )将结果集的记录指针移动到第row行,如果row是负数,则移动到倒数第row行,如果移动后的记录指针指向一条有效记录,则该方法返回true;
  • beforeFirst()移动resultSet的最前面。
  • afterLast()移动到resultSet的最后面。

值得注意的是,在ResultSet集合中初始指针指向为表头(行0,是表格的描述一行非数据行)

在ResultSet集合,行从0开始列从1开始

  • int getInt(int); //使用列号,从 1 开始计,从左到右获取指针指向的行的某列数据
  • int getInt(String); //使用列名获取指针指向的行的某列数据
  • boolean last()将结果集的记录指针定位到最后一行,如果移动后的记录指针指向一条有效的记录,则该方法返回true;
  • void close()释放ResultSet对象;

5、异常处理

​ try-catch

常用方法如上,其他方法建议查阅文档或者网络搜索。

参考和建议阅读文章:

JAVA数据库链接基础知识

关于JDBC的简介(简介)(体系)(核心)(语法)

JDBC层次结构和基本构成

JDBC常用接口和类

createStatement的参数

JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查

jdbc就是这么简单

-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~