标签归档:java

JDBC 参考

JDBC

下载JDBC驱动包(https://dev.mysql.com/downloads/connector/j/):
1 如果是一般Java项目,通过IDE添加包到项目
2 如果是Java Web项目,把包添加到WebContent/WEB-INF/lib中

在使用前,需要导入包(java.sql.*):

import java.sql.*;

<%@ page import="java.sql" %>

建立链接步骤:

import java.sql.*;

public class DB {

	public static void main(String[] args) {
                Connection conn = null;
                Statement stmt = null;
		try {
                        //Class.forName("oracle.jdbc.driver.OracleDriver");
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/test?useSSL=false&autoReconnect=true";
			String username = "root";
			String password = "root";
			
			conn = DriverManager.getConnection(url, username, password);
			if (conn != null) {
				System.out.println("数据库链接成功");
				stmt = conn.createStatement();
				ResultSet rs = stmt.executeQuery("SELECT * FROM tst");
				while (rs.next()) {
					System.out.println(rs.getInt("id"));
				}
				
				rs.close();
				stmt.close();
				conn.close();
			} else {
				System.out.println("数据库链接失败");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
	           try {
	    	       if (stmt != null) {
	                   stmt.close();
	    	       }
	           } catch (SQLException se2){
	           }
	
	           try {
	               if (conn!=null) {
	    	           conn.close();
	               }
	           } catch (SQLException se){
	               se.printStackTrace();
	           }
               }
	}

}

构建JDBC应用程序涉及以下六个步骤
导入包:需要包含包含数据库编程所需的JDBC类的包。 大多数情况下,使用import java.sql.*就足够了。
注册JDBC驱动程序:需要初始化驱动程序,以便可以打开与数据库的通信通道。
打开一个连接:需要使用DriverManager.getConnection()方法创建一个Connection对象,它表示与数据库的物理连接。
执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库。
从结果集中提取数据:需要使用相应的ResultSet.getXXX()方法从结果集中检索数据。
清理环境:需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集。
注意:url后添加了useSSL=false参数,这个是因为高版本MySQL默认启用SSL进行链接,这里是明确不使用SSL。autoReconnect=true在丢失链接或链接未正确关闭时,可以重新建立链接。finally块用来保证资源正确关闭。

JDBC API提供以下接口和类
DriverManager:此类管理数据库驱动程序列表。 使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序进行匹配。在JDBC下识别某个子协议的第一个驱动程序将用于建立数据库连接。
Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。 但会使用DriverManager对象来管理这种类型的对象。 它还提取与使用Driver对象相关的信息。
Connection:此接口具有用于联系数据库的所有方法。 连接(Connection)对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
Statement:使用从此接口创建的对象将SQL语句提交到数据库。 除了执行存储过程之外,一些派生接口还接受参数。
ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。 它作为一个迭代器并可移动ResultSet对象查询的数据。
SQLException:此类处理数据库应用程序中发生的任何错误。

JDBC驱动程序类型(分1,2,3,4,4是纯Java实现)

JDBC数据类型
下表总结了当调用PreparedStatement或CallableStatement对象或ResultSet.updateXXX()方法的setXXX()方法时,将Java数据类型转换为的默认JDBC数据类型。

SQL类型 JDBC/Java类型 setXXX updateXXX
VARCHAR java.lang.String setString updateString
CHAR java.lang.String setString updateString
LONGVARCHAR java.lang.String setString updateString
BIT boolean setBoolean updateBoolean
NUMERIC java.math.BigDecimal setBigDecimal updateBigDecimal
TINYINT byte setByte updateByte
SMALLINT short setShort updateShort
INTEGER int setInt updateInt
BIGINT long setLong updateLong
REAL float setFloat updateFloat
FLOAT float setFloat updateFloat
DOUBLE double setDouble updateDouble
VARBINARY byte[ ] setBytes updateBytes
BINARY byte[ ] setBytes updateBytes
DATE java.sql.Date setDate updateDate
TIME java.sql.Time setTime updateTime
TIMESTAMP java.sql.Timestamp setTimestamp updateTimestamp
CLOB java.sql.Clob setClob updateClob
BLOB java.sql.Blob setBlob updateBlob
ARRAY java.sql.Array setARRAY updateARRAY
REF java.sql.Ref SetRef updateRef
STRUCT java.sql.Struct SetStruct updateStruct

处理NULL值(SQL使用NULL值和Java使用null是不同的概念)

Statement stmt = conn.createStatement( );
String sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

int id = rs.getInt(1);
if( rs.wasNull( ) ) {
   id = 0;
}

事务:

try{
   //Assume a valid connection object conn
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();

   String SQL = "INSERT INTO Employees  " +
                "VALUES (106, 20, 'Rita', 'Tez')";
   stmt.executeUpdate(SQL);  
   //Submit a malformed SQL statement that breaks
   String SQL = "INSERTED IN Employees  " +
                "VALUES (107, 22, 'Sita', 'Singh')";
   stmt.executeUpdate(SQL);
   // If there is no error.
   conn.commit();
}catch(SQLException se){
   // If there is any error.
   conn.rollback();
}

Java Web 基础

JSP
1 了解JSP页面
2 指令标识
JSP指令标识的语法格式如下:

<%@ 指令名 属性1=“属性1” 属性2=“属性值2” ...%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

指令名称在JSP中包含page include和taglib。在一条指令中可设置多个属性,各属性使用逗号或空格分隔。

2.1 page指令
Page指令用于定义整个JSP页面的相关属性,这些属性在JSP被服务器解析成Servlet时会装换为相应的Java程序代码。Page指令包含属性有15个:
1 language属性

#当前固定值和默认值都为java
<%@ page language="java" %>

2 extends 属性
3 import 属性
导入类包:

<%@ page import="java.util.*" %>

4 pageEncoding 属性
定义JSP页面的编码格式:

<%@ page pageEncoding="UTF-8"%>

5 contentType 属性
该属性用于设置JSP页面的MIME类型和字符编码,流浪器会据此显示网页内容:

<%@ page contentType="text/html; charset=UTF-8" %>

6 session 属性
该属性指定JSP页面是否使用HTTP的session会话对象。属性值是boolean类型,默认值为true。

<%@ page session="false" %>

7 buffer 属性
该属性用于设置JSP的out输出对象使用的缓冲区,大小,默认为8KB,且单位只能使用KB。(out对象是JSP的内置对象之一)
8 autoFlush 顺序
该属性用于设置JSP页面缓存满时,是否自动刷新缓存。默认值为true。如果设置为false,则缓存被填满时将抛出异常。
9 isErrorPage属性
改过该属性可以将当前JSP页面设置成错误处理页面来处理另一个JSP页面的错误,也就是异常处理。
10 errorPage属性
该属性用于指定处理当前JSP页面异常错误的另一个JSP页面,指定的JSP错误处理页面必须设置isErrorPage属性为true。errorPage属性的属性值是一个url字符串。

<%@ page errorPage="error/loginErrorPage.jsp" %>

注:如果设置该属性,那么在web.xml文件中定义的任何错误页面都将被忽略。

2.2 include指令

<%@ include file="path" %>

该指令只有一个file属性,可以是绝对或相对路径。

2.3 taglib指令
在JSP文件中,可以通过taglib指令标识声明该页面中所随用的标签库,同时引用标签库,并指定标签的前缀。

<%@ taglib prefix="tagPrefix" url="tagURI" %>

3 脚本标识
3.1 JSP表达式
JSP表达式用于向页面中输出信息

<%= 表达式 %>

3.2 声明标识
格式:

<%! 声明变量或方法的代码 %>

服务器执行JSP页面时,会将JSP也爱你装换为Servlet类,在该类中会把使用JSP声明标识定义的变量和方法转换为类的成员变量和方法。

<%!
int number = 0;
int cout() {
    number++;
    return number;
}
%>

3.3 代码片段
代码片段在页面请求的处理期间被执行。

<% Java代码 %>

由于代码片段是在请求处理期间被执行的,所有的它的生命期是仅页面的,但是声明标识是对应到Servelet的,所有生命周期是整个应用的。

4 JSP注释
4.1 HTML中的注释
4.2 带有JSP表达式的注释
单行注释,多行注释,提示文档注释(会被Javadoc文档工具读取到)
4.3 隐藏注释

<%-- 注释内容 --%>

4.4 动态注释

<!-- <%= new Date() %> -->

5 动作标识
5.1 包含文件标识

<jsp:include page="url" flush="false|true">
    子动作标识<jsp:param>
</jsp:include>

JSP的动作标识用于向当前页面中包含其他的文件。被包含的文件可以是动态文件,也可以是静态文件(自动判断动态或静态,独立编译,把结果插入)。
子动作标识用来向被包含的文件传递参数。
指令include和动作标识有很大差别:
1)include指令通过file属性指定被包含的文件,并且file属性不支持任何表达式;动作标识通过page属性指定被包含的文件,并且page属性支持JSP表达式。
2) 使用include指令时,被包含的文件内容会原封不动地插入到包含页中,然后JSP编译器再将合并后的文件最终编译成一个Java文件;使用动作标识包含文件时,当该标识被执行时,程序会将请求转发(不是重定向)到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页继续执行后面的代码
3)在应用include指令包含文件时,由于被包含的文件最终会生成一个文件,所以在被包含文件,包含文件不能有重名的变量或方法;而在引用动作标识包含文件时,由于每个文件是单独编译的,所以在被包含文件和包含文件中重名的变量和方法是不冲突的。

5.2 请求转发标识
通过动作标识可以将请求转发到其他的Web资源。执行请求转发后,当前页面将不再被执行,而是去执行该标识指定的目标页面。

<jsp:forward page="url" />
<jsp:forward page="url">
    子动作标识<jsp:param>
</jsp:forward>

5.3 传递参数标识
JSP的动作标识可以作为其他标识的子标识,用于为其他标识传递参数。格式:

<jsp:param name="参数名“ value="参数值" />

例子:

<jsp:forward page="modify.jsp">
    <jsp:param name="userId" value="7" />
</jsp:forward>

通过动作标识指定的参数,以键值对的形式加入到请求中。它的功能与在文件名后面加?参数名=参数值是相同的。

JSP内置对象

1 JSP内置对象
JSP中一共预定义了9个内置对象:request、response、session、application、out、pageContext、config、page和exception

2 request对象
2.1 访问请求参数

// 参数不存在,返回null
request.getParameter("id");

2.2 在作用域中管理属性
在进行请求转发时,需要把一些数据传递到转发后的页面进行处理。这时,就需要使用request对象的setAttribute()方法将数据保存到request范围内的变量中。

request.setAttribute(String name, Object object)

在将数据保存到request范围内的变量中后,可以通过request对象的getAttribute()方法获取该变量的值:

request.getAttribute(String name);

注意:由于getAttribute()方法的返回值为Object类型,所以需要调用其toString()方法,将其转换为字符串类型(如果设置的是字符串)。

2.3 获取cookie
通过cookie的getCookies()方法可以获取所有cookie对象的集合;通过cookie对象的getName()方法可以获取到指定名称的cookie;通过getValue()方法可获取到cookie对象的值;将一个cookie对象发送到客户端,使用response对象的addCookie()方法。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>   
<%@ page import="java.net.URLDecoder" %> 

<% 
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (int i = 0; i < cookies.length; i++) {
        out.println(cookies[i].getName() + " = " +  URLDecoder.decode(cookies[i].getValue()));
    }
}

String cookieValue = URLEncoder.encode("饼干");
Cookie cookie = new Cookie("ifeeline", cookieValue);
cookie.setMaxAge(3600);
response.addCookie(cookie);
%>

在向cookie中保存的信息中,如果包括中文,需要调用java.net.URLEncode类的encode()方法将值进行编码,在取时需要用java.net.URLDecoder类的decode()方法进行解码。
2.4 解决中文乱码
发送请求的参数值编码和服务端编码不一致。
2.5 获取客户端信息

br />传送数据的方法(GET POST)<%= request.getMethod() %>
<br />协议名称<%= request.getProtocol() %>
<br />请求地址(不包括请求参数)<%= request.getRequestURL() %>
<br />客户端IP<%= request.getRemoteAddr() %>
<br />获取服务器端口号<%= request.getServerPort() %>
<br />获取服务器名称<%= request.getServerName() %>
<br />获取客户端主机名<%= request.getRemoteHost() %>
<br /><%= request.getServletPath() %>
<br />请求头(host)<%= request.getHeader("host") %>			
<br />请求头(user-agent)<%= request.getHeader("user-agent") %>
<br />当前请求文件的绝对路径<%= request.getRealPath("index.jsp") %>

2.6 显示国际化信息
流浪器通过accept-language的HTTP报头向Web服务器指明它所使用的本地语言。request对象中的getLocale()和getLocales()方法获取这部分信息。

<%
java.util.Locale locale = request.getLocale();
String str = "";
if (locale.equals(java.util.Locale.US)) {

}
if (locale.equals(java.util.Locale.CHINA)) {

}

3 response对象
3.1 重定向网页

response.sendRedirect(String path);

3.2 处理HTTP响应头
1)禁用缓存

response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);

2) 设置页面自动刷新

response.setHeader("refresh", "10");

3) 定时跳转网页

response.setHeader("refresh", "5;URL=login.jsp");

3.3 设置输出缓冲

flushBuffer() 强制将缓冲区输出到客户端
getBufferSize() 获取缓冲区大小
setBufferSize(int size) 设置缓冲区的大小
reset() 清除缓冲区的内容
isCommitted() 检测服务端是否已经把数据写入到客户端

4 session对象
4.1 创建及获取客户的会话

session.setAttribute(String name, Object obj)
session.getAttribute(String name);

注:getAttribute()方法返回值是Object类型。如果需要赋值给String变量,需要调用toString()方法(或强制类型转换)。

4.2 从会话中移动指定的绑定对象

removeAttribute(String name)

4.3 销毁session

session.invalidate()

销毁session后,将不可以再使用该sessiond对象。如果再调用session对象的任何方法,抛Session already invalidated异常。

4.4 会话超时的管理

session.getLastAccessedTime()
session.getMaxInactiveInterval() 两个请求允许的最大时间间隔(有效时长)
session.setMaxInactiveInterval() 设置时长

4.5 session对象的应用

5 application对象
5.1 访问应用程序初始化参数
在web.xml中通过标记配置应用程序初始化参数。

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://127.0.0.1:3306/test</param-value>
</context-param>

提供了两种访问应用程序初始化参数的方法:

application.getInitParameter(String name)
application.getAttributeNames() // 返回所有

实例:

<%@ page import="java.util.*" %>
<%
Enumeration enema = application.getInitParameterNames();
while (enema.hasMoreElements() ) {
    String name = (String)enema.nextElement();
    String value = application.getInitParameter(anme);
}
%>

5.2 管理应用程序环境属性

getAttributeNames()
getAttribute(String name);
setAttribute(String name, Object obj)
removeAttribute(String name)

6 out对象
6.1 向客户端输出数据
6.2 管理响应缓冲

clear() 清除缓冲区的内容(如响应已提交,产生IOException异常)
clearBuffer() 清除当前缓冲区中的内容
flush() 
isAutoFlush()
getBufferSize()

7 其它内置对象
7.1 获取会话范围的pageContent对象

forward(java.lang.String relativeUrlpath)

7.2 读取web.xml配置信息的config对象
主要用于取得服务器的配置信息。通过pageContext对象的getServletConfig()方法可以获取一个config对象。
7.3 应答或请求的page对象
page对象代表JSP本身,只有在JSP页面内才是合法的。page对象本质上是包含当前Servlet接口引用的变量,可以看作是this关键字的别名。
7.4 获取异常信息的exception对象
只有在page指令中设置为isErrorPage属性值为true的页面中才可以被使用。如果在JSP页面中出现没有捕捉到的异常,就会生成exception对象,并把exception对象传送到page指令中设定的错误页面中。

JavaBean
1 JavaBean介绍
2 JavaBean的应用
2.1 获取JavaBean属性信息
在JavaBean对象中,为了防止外部直接对JavaBean属性的调用,通常将JavaBean中的属性设置为私有,单需要为其提供公共的方法方法。

<jsp:useBean id="produce" class="com.ifeeline.bean.Product"></jsp:useBean>
<jsp:getProperty property="count" name="produce" />

实际是调用produce对象的getCount()方法。会自动实例化一个对象,所以Bean类型需要一个无参的构造函数。操作属性时需要提供getXxx方法。

2.2 对JavaBean属性赋值
如果对JavaBean对象的属性提供了setXxx方法,在JSP页面中可通过对其进行赋值。

2.3 在JSP页面中应用JavaBean
通过JSP动作标签 来实现对JavaBean对象的操作。将JavaBean对象应用到JSP页面中,JavaBean的生命周期可以自行进行设置,它存在于4种范围内:page,request,session和application。默认作用于page。
<
/jsp:useBean>

Servlet技术
1 基础
Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持。
1.1 Servlet结构体系
抽象类GenericServlet实现Servlet(javax.servlet)、ServletConfig(javax.servlet)、Serializable接口(java.io),HttpServlet继续GenericServlet。

1.2 Servlet技术特点

1.3 Servlet与JSP的区别

1.4 Servlet代码结构

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {
    public void init() throws ServletException {}
    public void destroy() {
	super.destroy();
    }

}

2 Servlet API编程常用接口和类
3 Servlet开发
3.1 Servlet创建
3.2 Servlet配置
要使Servlet对象正常地运行,需要进行适当的配置,以告知Web容器哪一个请求调用哪一个Servlet对象处理,对Servlet起到一个注册的作用。Servlet的配置包含在web.xml文件中,通过如下两步设置:
1)声明Servlet对象

<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.ifeeline.TestServlet</servlet-class>
</servlet>

2)映射Servlet

<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattem>/TestServlet</url-pattem>
</servlet-mapping>

Servlet过滤器与监听器
1 Servlet过滤器
1.1 过滤器
1.2 过滤器核心对象
过滤器对象放置在javax.servlet包中,名称为Filter,相关的有FilterConfig和FilterChain。
1.3 过滤器创建与配置
1.4 字符编码过滤器

2 Servlet监听器
2.1 Servlet监听器
2.2 Servlet监听器的原理
2.3 Servlet上下文监听
2.4 HTTP会话监听
2.5 Servlet请求监听

3 Servlet3.0 新特征

Java Web数据库操作
1 JDBC
1.1 JDBC
1.2 JDBC链接数据库的过程
下载驱动https://dev.mysql.com/downloads/connector/j/,得到mysql-connector-java-5.1.45-bin.jar,放入WEB-INF/lib中,重启应用:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%
try {
	Class.forName("com.mysql.jdbc.Driver");
	String url = "jdbc:mysql://localhost:3306/test";
	String username = "root";
	String password = "root";
	
	Connection conn = DriverManager.getConnection(url, username, password);
	if (conn != null) {
		out.println("数据库链接成功");
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("SELECT * FROM tst");
		while (rs.next()) {
			out.println(rs.getInt("id"));
		}

                PreparedStatement ps = conn.prepareStatement("INSERT INTO tst (name, price) values(?, ?)");
		ps.setString(1, "xxxxxx");
		ps.setDouble(2, 2.22);
		int row = ps.executeUpdate();
		ps.close();

		rs.close();
		stmt.close();
		conn.close();
	} else {
		out.println("数据库链接失败");
	}
} catch (ClassNotFoundException e) {
	e.printStackTrace();
} catch (SQLException e) {
	e.printStackTrace();
}
%>

2 JDBC API
2.1 Connection接口
Connection接口位于java.sql包中。

void close() throws SQLException
void commit() throws SQLException
Statement createStatement() throws SQLException
boolean getAutoCommit() throws SQLException
DatabaseMetaData getMetaData() throws SQLException
int getTransactionIsolation() throws SQLException
boolean isClosed() throws SQLException
boolean isReadOnly() throws SQLException
PreparedStatement PreparedStatement(String sql) throws SQLException
void releaseSavepoint(Savepoint savepoint) throws SQLException
void rollback() throws SQLException
void rollback(Savepoint savepoint) throws SQLException
void setAutoCommit(boolean autoCommit) throws SQLException
void setReadOny(boolean readOnly) throws SQLException
Savepoint setSavepoint() throws SQLException
void setSavepoint(String name) throws SQLException
void setTransactionIsolation(int level) throws SQLException

2.2 DriverManager类

public static Connection getConnection(String url) throws SQLException
void commit() throws SQLException

2.3 Statement接口

void close() throws SQLException
boolean execute(String sql) throws SQLException(执行指定的SQL语句)
ResultSet executeQuery(String sql) throws SQLException(执行查询)
int executeUpdate(String sql) throws SQLException(insert update delete, 返回影响的行数)
boolean isClosed() throws SQLException

2.4 PreparedStatement接口
PreparedStatement接口继承于Statement接口。

2.5 ResultSet接口

EL(表达式语言)
1 EL
1.1 EL的基本语法
${expression}
1.2 EL的特点
EL中会自动进行类型装换
EL不仅可访问一般变量,还可访问JavaBean中的属性已经嵌套属性和集合对象

2 禁用EL
3 保留的关键字
4 EL的运算符及优先级
4.1 通过EL访问数据
通过EL提供的[]和.运算符可以访问数据。[]和.运算符等价。
4.2 EL中的算术运算
4.3 EL中判断对象是否为空
${empty expression}
${not empty expression}
4.4 在EL中进行逻辑关系运算
4.5 在EL中进行条件运算

5 EL的隐含对象
5.1 页面上下文对象
页面上下文对象为pageContext,用于访问JSP内置对象(如request,response,out,session,exception和page等,但不能用于获取application,config和pageContext对象)和servletContext。

6 定义和使用EL函数


JSTL标签

Java Web 运行环境

2004年10月 JDK 1.5(Java SE 5)
2006年12月 JDK 1.6(Java SE 6)
2011年07月 JDK 1.7(Java SE 7) Oracle时代
2014年03月 JDK 1.8(Java SE 8)
2017年09月 JDK 1.9(Java SE 9)

JVM是一个虚拟机,只认识字节码。JRE包含虚拟机,还包含运行Java程序的其它环境支持。JDK也包含了JRE,除此还包含了一系列工具,比如编译Java程序的javac。

JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

Linux 和 Windows区分32位和64位。Mac OS X不区分。Windows下提供了exe安装包。Mac OS X下提供DMG安装包。Linux提供了RPM和GZ压缩包。

需要明确知道安装路径:
Windows上一般就是C:\Program Files\Java\jdk1.8.0_version,一般不应该放入到带空格的路径中。
Linux只要解压tar.gz文件到某个位置,如果使用RPM包安装,可以通过rpm -ql来确定安装位置(一般安装在/usr/java/jdk1.8.0,不需要单独设置环境变量,RPM安装做了一系列软连接)。
Mac OS X中,安装路径:/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/

安装完成后可设置环境变量,Linux中一般可以往~/.bash_profile中添加:
export PATH=”/usr/local/java/bin:$PATH”
Windows下设置Path环境变量。

注:除非是下载源代码,否则不需要再设置环境变量。


以上是Mac中的安装,安装完毕:

cd /Library/Java/JavaVirtualMachines/

ls
jdk-9.0.4.jdk		jdk1.8.0_144.jdk

which javac
/usr/bin/javac

javac --version
javac 9.0.4

当前安装了两个版本。可以看到,9之前的命名是1.8.0,从9开始就变成了9。

确认版本号:

which javac
javac -version

用于编译Java程序所使用的javac命令是使用Java编写的,这个类是lib路径下tools.jar文件中sun
tools\javac路径下的Main类,JDK的bin路径下的javac命令实际仅是包装了这个Java类,bin路径下大部分命令都是包装了tools.jar文件里的工具类。

库源代码在JDK中以src.zip的形式发布。文档:http://docs.oracle.com/javase/8/

Tomcat安装。

在Mac下可用brew install tomcat,也可以到https://tomcat.apache.org手动下载安装。Tomcat本身是一个Java软件,可以运行多个实例。

Tomcat目录:

bin:存放tomcat命令
conf:存放tomcat配置信息,里面的server.xml文件是核心的配置文件
lib:支持tomcat软件运行的jar包和技术支持包(如servlet和jsp)
logs:运行时的日志信息
temp:临时目录
webapps:共享资源文件和web应用目录
work:tomcat的运行目录.jsp运行时产生的临时文件就存放在这里

启动关闭:

catalina start
catalina stop

启动后:

/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/java 
-Dcatalina.base=/Users/vfeelit/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1 
-Dcatalina.home=/usr/local/Cellar/tomcat/9.0.6/libexec 
-Dwtp.deploy=/Users/vfeelit/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps 
-Djava.endorsed.dirs=/usr/local/Cellar/tomcat/9.0.6/libexec/endorsed 
-Dfile.encoding=UTF-8 

-classpath 
/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/resources.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/rt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/jsse.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/jce.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/charsets.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/jfr.jar:

/usr/local/Cellar/tomcat/9.0.6/libexec/bin/bootstrap.jar:
/usr/local/Cellar/tomcat/9.0.6/libexec/bin/tomcat-juli.jar:

/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/lib/tools.jar org.apache.catalina.startup.Bootstrap start

把Tomcat中libexec/bin/中的bootstrap.jar和tomcat-juli.jar在classpath中出现。启动Tomcat不过是启动一个Java虚拟机实例而已。