J2EE与中间件 学习笔记1 JDBC Session Servlet

前言

J2EE与中间件是我们的一门课程。然后非常悲惨的是,我一点也不会这门课的技术,需要从零开始学习一波。我写日志来记录自己的学习过程。主要依托于上课的课件和给出的示例代码,还有网上的教程。这系列的文章中很大可能出现很多错误,希望各位不吝指正

J2EE概论

发展历史

J2EE与中间件 学习笔记1 JDBC Session Servlet_第1张图片

上图是J2EE的一个发展情况,根据老师的描述,这门技术已经非常稳定了。我看了一下Oracle官网,现在貌似是出到8了。但是我之前从来没有关心过这个,不知道6-8都有哪些新特性。

EE8新特性

EE6新特性

在Oracle官网上的7新特性被8新特性覆盖了。就是说,搜标题搜出来了7的新特性网页,但是显示出来的是8的新特性。。。

推荐学习资料

官方推荐资料

目标

increasingly recognize the need for distributed, transactional, and portable applications that leverage the speed, security, and reliability of server-side technology

特点

  • 通过JCP开发
  • XML不是必要的,可以通过注解实现
  • 是依赖注入的

Servlet

考虑到我根本没有写过原生的J2EE,因此我根本看不懂PPT。。。。。。我还是老老实实看菜鸟教程吧。

生命周期

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

init()

init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。这个方法我们还是要写点东西在里面的。

service()

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

也就是说,一般情况下,我根本不需要写service()方法,只要重写doGet()和doPost()

GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

destory()

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

生命周期如下图

J2EE与中间件 学习笔记1 JDBC Session Servlet_第2张图片

实践

我搞了好久,发现一直搞不出来helloworld,最后找到了一篇博文:

参考文章

效果能跑出来

J2EE与中间件 学习笔记1 JDBC Session Servlet_第3张图片

要注意一下请求路径的问题。总之,细节挺重要的,难倒是不难。至于后面的技术,我想说的是,还是要对着菜鸟教程看例子实际操作一下。

心得

  • @WebServlet注解可以替换web.xml文件中的配置

Cookie & Session

Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。

Session

HTTP 是一种”无状态”协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。

但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:

  • Cookies
  • 隐藏的表单字段
  • URL重写
    • URL 重写是一种更好的维持 session 会话的方式,它在浏览器不支持 cookie 时能够很好地工作,但是它的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此。

JDBC

目标及原理

目标: 实现Java程序与数据库之间的交互

原理:

  • Java程序调用JDBC API的方法;
  • JDBC 驱动程序将调用转换为数据库可以理解的形式;
  • 执行操作,JDBC 驱动程序从数据库得到结果,将结果转换为JDBC API 类;
  • Java程序得到结果。

使用JDBC读取数据

  • 建立数据库连接:使用DriverManager机制或DataSource机制
  • 向数据库提交查询请求
  • 读取查询结果
  • 处理查询结果
  • 释放连接

建立数据库连接

DriverManager机制

应该说,这种方式是人们比较常用的做法。下面的代码就是一个连接本地test数据库的代码。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DbUtil {

    public static final String URL = "jdbc:mysql://localhost:3306/test";
    public static final String USER = "root";
    public static final String PASSWORD = "";

    public static void main(String[] args) throws Exception {
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获得数据库连接
        Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
        //3.操作数据库,实现增删改查
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess");
        //如果有数据,rs.next()返回true
        while(rs.next()){
            System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
        }
    }
}

按代码来看,其实1、2是必须的,3根据情况来修改。

对于1注册驱动程序

Class.forName(JDBCDriverName);

是一种隐式写法,还有一种显式写法:

DriverManager.registerDriver (new JDBCDriverName());

DriverManager机制的弊端

  • 是一个同步的类,一次只有一个线程可以运行
  • 与数据库相关的连接信息都包含在类中,如果用户更换另一台计算机作数据库服务器,就需要重新修改URL变量、重新编译、部署
  • 用户的用户名、口令也包含在类中,丧失了安全性

DataSource机制

JNDI

实际上这是一门非常重要的技术,但是我刚开始接触,之后看有没有时间补一篇细说一下。

JNDI:

Java命名和目录接口(Java Naming and Directory Interface),为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。(中央注册中心,储存了各种对象、用户和应用的变量及其值,开发大型的分布式应用,使分布式的Java程序找到分布式的对象)

分布式应用程序通过RMI或CORBA向JNDI注册对象,其他任何客户机上的应用程序只需知道数据源对象在服务器JNDI中的逻辑名称,就可以通过RMI向服务器查询数据源,然后与数据库建立连接

连接池

J2EE与中间件 学习笔记1 JDBC Session Servlet_第4张图片

连接池:重用连接,而非建立新连接;允许共享数据库连接,不是为每个客户分别提供单独的连接

JDBC驱动类型

  • Type1:JDBC-ODBC Bridge

    J2EE与中间件 学习笔记1 JDBC Session Servlet_第5张图片

  • Type2:Native-API Partly Java

    J2EE与中间件 学习笔记1 JDBC Session Servlet_第6张图片

    上面两种类型都不适用于Internet,是因为,他们都是直接访问的数据库。同时,以上两种,都是两层架构,下面的两种,都是三层架构,当然说是三层架构,其实可以是多层架构的。

  • Type3:Net-Protocol Fully Java

    J2EE与中间件 学习笔记1 JDBC Session Servlet_第7张图片

  • Type4:Native-protocol Fully Java

    J2EE与中间件 学习笔记1 JDBC Session Servlet_第8张图片

JDBC最佳实践

  • 尽可能使查询更灵活更准确:SQL语句
  • 调整数据库的参数设置:适当的数据库缓冲策略等
  • 把初始化代码放到init()方法中:只执行一次
  • 使用批量更新:一次连接完成所有动作
  • 尽可能做现场更新:使用UPDATE而不使用INSERT,DELETE,REMOVE
  • 使用适当的方法取得JDBC连接:DataSource
  • 适当的释放JDBC资源:finally代码块中释放connection资源
  • 不要闲置JDBC连接:尽快释放
  • 尽快的提交或回滚事务
  • 适当设置连接池的容量
  • 不要让事务涵盖用户的输入:事务耗费数据库和应用服务器的资源,应避免使用长时间的事务
    • 例如:一个事务从加载浏览器页面开始,用户单击submit按钮才提交——耗费资源!
  • 尽可能利用数据库的功能:数据库触发器等

我的代码:

我的github仓库 可能目前还是私有的,等到这门课结束了就会公开了。写的不好的话希望各位多批评指正。

你可能感兴趣的:(J2EE与中间件,J2EE与中间件)