J2EE与中间件是我们的一门课程。然后非常悲惨的是,我一点也不会这门课的技术,需要从零开始学习一波。我写日志来记录自己的学习过程。主要依托于上课的课件和给出的示例代码,还有网上的教程。这系列的文章中很大可能出现很多错误,希望各位不吝指正。
上图是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
考虑到我根本没有写过原生的J2EE,因此我根本看不懂PPT。。。。。。我还是老老实实看菜鸟教程吧。
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。这个方法我们还是要写点东西在里面的。
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() 方法处理。
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
生命周期如下图
我搞了好久,发现一直搞不出来helloworld,最后找到了一篇博文:
参考文章
效果能跑出来
要注意一下请求路径的问题。总之,细节挺重要的,难倒是不难。至于后面的技术,我想说的是,还是要对着菜鸟教程看例子实际操作一下。
Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
HTTP 是一种”无状态”协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:
目标: 实现Java程序与数据库之间的交互
原理:
应该说,这种方式是人们比较常用的做法。下面的代码就是一个连接本地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机制的弊端:
实际上这是一门非常重要的技术,但是我刚开始接触,之后看有没有时间补一篇细说一下。
JNDI:
Java命名和目录接口(Java Naming and Directory Interface),为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。(中央注册中心,储存了各种对象、用户和应用的变量及其值,开发大型的分布式应用,使分布式的Java程序找到分布式的对象)
分布式应用程序通过RMI或CORBA向JNDI注册对象,其他任何客户机上的应用程序只需知道数据源对象在服务器JNDI中的逻辑名称,就可以通过RMI向服务器查询数据源,然后与数据库建立连接
连接池:重用连接,而非建立新连接;允许共享数据库连接,不是为每个客户分别提供单独的连接
Type1:JDBC-ODBC Bridge
Type2:Native-API Partly Java
上面两种类型都不适用于Internet,是因为,他们都是直接访问的数据库。同时,以上两种,都是两层架构,下面的两种,都是三层架构,当然说是三层架构,其实可以是多层架构的。
Type3:Net-Protocol Fully Java
Type4:Native-protocol Fully Java
我的代码:
我的github仓库 可能目前还是私有的,等到这门课结束了就会公开了。写的不好的话希望各位多批评指正。