Java 回顾
连接JNDI
import java.util.*; import java.sql.*; import oracle.jdbc.pool.*; import javax.naming.*; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class JNDIExample1 { public JNDIExample1() { } public static void main(String[] args) throws SQLException,NamingException{ //第一步:生成一个OracleDataSource 对象 System.out.println("creating an OracleDataSource object"); OracleDataSource myODS=new OracleDataSource(); //第二步:对OracleDataSource对象的属性set值 System.out.println("Setting the attribute of the OracleDataSource object"); myODS.setServerName("localhost"); myODS.setDatabaseName("testDb"); myODS.setPortNumber(1521); myODS.setDriverType("thin"); myODS.setUser("myUser"); myODS.setPassword("myPassword"); //第三步:生成一个properties对象 System.out.println("creating a Properties object"); Properties myProperties=new Properties(); //第四步:把JNDI的属性加到Properties对象里面 System.out.println("adding the JNDI properties"); myProperties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); myProperties.setProperty(Context.PROVIDER_URL,"file:e:/JAVA/tmp"); //第五步:生成一个JNDI Context对象 System.out.println("creating a JNDI Context object"); Context myContext=new InitialContext(myProperties); //第六步:把OracleDataSource数据源绑定到JNDI System.out.println("binding the OracleDataSource object to JDNI "+ "using the name 'myBoundODS'"); myContext.bind("myBoundODS",myODS); } }
可以使用Java语句以程序方式将数据源绑定到JNDI,步骤如下:
1、创建一个OracleDataSource对象
OracleDataSource myODS=new OracleDataSource();
2、设置OracleDataSource对象的属性
myODS.setServerName(“localhost“);
myODS.setDatabaseName(“ORCL“);
myODS.setPortNumber(1521);
myODS.setDriverType(“thin“);
myODS.setUser(“admin“);
myODS.setPassword(“helloworld“);
3、创建一个Properties对象
java.util.Properties myProperties=new Properties();
4、将JNDI属性添加到Properties对象,使用setProperties方法将JNDI属性添加到
Properties对象。
myProperties.setProperties(Context.INITIAL_CONTEXT_FACTORY, “com.sun.jndi.fscontext.RefFSContextFactory“);
myProperties.setProperties(Context.PROVIDER_URL,“file:C:/TEMP“);
Context.INITIAL_CONTEXT_FACTORY-->该属性指定使用JNDI文件系统存储JNDI绑定信息文件。
Context.PROVIDER_URL------------->该属性指定文件系统中存储绑定文件的目录。
5、创建一个JNDI Context对象
Context myContext=new InitialContext(myProperties);
InitialContext构造器创建一个Context对象,这个对象引用最初的JNDI命名上下文。
6、使用Context对象将OracleDataSource对象绑定到JNDI。这里使用Context对象的bind()方法。
bind()方法接受两个参数:一个是给JNDI对象起的名字,第二个是要绑定的Java对象。
myContext.bind(“myNamedODS“,myODS);
以上六个步骤做完,我们就可以在Context.PROVIDER_URL属性指定的目录中找到.bindings文件。
这个.binding文件包含数据源的细节。以后,可以使用myNamedODS这个名称查找这个JNDI对象,
并且使用它连接数据库。
连接数据库(JDBC)
连接JDBC的步骤
前提是导入 java.sql.*;
(1) : 加载驱动程序
Class.forName("com.microsoft.sqlserver.jdbc.SQLserverDriver");
(2) : 建立连接(通过驱动管理器)
Connection con = DriverManager.getConnection(URL, userName,userPwd);
(这里的URL = "jdbc:sqlserver://服务器名称:1433; DatabaseName = 数据库名称")
(后两个参数userName和userPwd分别是用户和密码,,如果没有的话,可以不写)
(3) : 建立Statement (通过Connection对象进行创建),,
Statement st = con.createStatement();
//建立 Statement 之后,就可以使用Statement的对象 st 来执行sql语句了。。
例如: st.executeUpdate("sql语句")。。。。详情请查阅API
(4) : 关闭连接
JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现。 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ System.out.println("找不到驱动程序类 ,加载驱动失败!"); e.printStackTrace() ; } 成功加载后,会将Driver类的实例注册到DriverManager类中。 2、提供JDBC连接的URL ?连接URL定义了连接数据库时的协议、子协议、数据源标识。 ?书写形式:协议:子协议:数据源标识 协议:在JDBC中总是以jdbc开始 子协议:是桥连接的驱动程序或是数据库管理系统名称。 数据源标识:标记找到数据库来源的地址与连接端口。 例如:(MySql的连接URL) jdbc:mysql: //localhost:3306/test?useUnicode=true&characterEncoding=gbk ; useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为 gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。 3、创建数据库的连接 ?要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。 ?使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。 例如: //连接MySql数据库,用户名和密码都是root String url = "jdbc:mysql://localhost:3306/test" ; String username = "root" ; String password = "root" ; try{ Connection con = DriverManager.getConnection(url , username , password ) ; }catch(SQLException se){ System.out.println("数据库连接失败!"); se.printStackTrace() ; } 4、创建一个Statement ?要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型: 1、执行静态SQL语句。通常通过Statement实例实现。 2、执行动态SQL语句。通常通过PreparedStatement实例实现。 3、执行数据库存储过程。通常通过CallableStatement实例实现。 具体的实现方式: Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ; 5、执行SQL语句 Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute 1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句 ,返回一个结果集(ResultSet)对象。 2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等 3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的 语句。 具体实现的代码: ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ; boolean flag = stmt.execute(String sql) ; 6、处理结果 两种情况: 1、执行更新返回的是本次操作影响到的记录数。 2、执行查询返回的结果是一个ResultSet对象。 ? ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些 行中数据的访问。 ? 使用结果集(ResultSet)对象的访问方法获取数据: while(rs.next()){ String name = rs.getString("name") ; String pass = rs.getString(1) ; // 此方法比较高效 } (列是从左到右编号的,并且从列1开始) 7、关闭JDBC对象 操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声 明顺序相反: 1、关闭记录集 2、关闭声明 3、关闭连接对象 if(rs != null){ // 关闭记录集 try{ rs.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(stmt != null){ // 关闭声明 try{ stmt.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(conn != null){ // 关闭连接对象 try{ conn.close() ; }catch(SQLException e){ e.printStackTrace() ; } }
Java Web应用
Java Web应用包括JSP、Servlet组件,JavaBean是处理JSP请求的一个java类
JSP技术包括:JSP+JavaBean和JSP+JavaBean+Servlet
圖 1. page-centric 架構
圖 2. servlet-centric 架構
JSP+JavaBean阶段开发:
要讓 JSP 能夠使用你的 bean,你的 bean 必須提供一組屬性,JSP 便可以透過特殊的標籤來存取這個 bean 的屬性。所謂的屬性,其實是一組 getter 和 setter methods,兩者統稱為 access methods(存取方法),透過這組存取方法來間接地存取類別的私有成員,當然,這組存取方法必須宣告為 public。例如,有個 bean 類別 EmployeeBean,它要提供一個年齡的屬性給外界(JSP)存取,此類別的定義如下:
public class EmployeeBean { private int age; public int getAge() { return age; } public void setAge(int age) { self.age = age; } }在 JSP 裡面使用時,是這麼個寫法:
<jsp:useBean id="emp" class="com.huanlin.EmployeeBean" scope="request"/> <jsp:setProperty name="emp" property="age" value="25" /> 員工的年齡是: <jsp:getProperty name="emp" property="age" />
其中
- <jsp:useBean> 標籤就是指明要使用一個 bean 物件,id 代表該物件的名稱,class 指明了要使用什麼類別的 bean,scope 則代表物件的生命週期。
- <jsp:setProperty> 標籤用來設定 bean 的屬性值,property 指明了要設定哪個屬性,value 就是數值,要別注意的是,HTML 表單傳入的資料一定是字串,但我們的 age 屬性卻是整數,這個部分的轉換會由 Web container 幫我們處理掉。
- <jsp:getProperty> 標籤是用來取得 bean 的屬性值。
請特別注意兩點:
- 屬性的大小寫。在 JSP 裡面,屬性的名稱是完全小寫的 "age",但是 getter 和 setter methods 的名稱卻是 getAge() 和 setAge(),這種名稱的轉換對應規則是固定的,照這個規則來命名,Web container 就能夠找到正確的存取方法。
- 對於 OOP 觀念不熟的人來說,可能會誤以為在 JSP 裡面存取的 "age" 屬性,就是類別定義裡面的那個宣告為 private 成員(age),其實兩者只有字面上相同而已,實際運作是可以毫無關聯的,因為 JSP 完全是透過 getter 和 setter 方法來存取屬性,況且外界本來就無法存取類別的私有成員。
你也許會發現,即使不寫 package 那行,程式也可以通過編譯,但由於這個 bean 是要用在 JSP 裡面的,如果你不為 package 命名的話,在 JSP 裡面使用這個 bean 時,Web container 會找不到這個 bean。請到相關書籍中找尋 package 的相關說明。
JSP页面代码:
<%-- 檢查某個數字是否為質數的 JSP 程式 --%> <%@ page language="java" contentType="text/html;charset=big5" %> <% request.setCharacterEncoding("big5"); String num = request.getParameter("number"); // 取得 HTTP request 的參數 %> <html> <body> <jsp:useBean id="checker" class="com.huanlin.util.CheckPrimeBean" scope="request"/> <jsp:setProperty name="checker" property="number" value="<%= num %>" /> <% if (!checker.isValidNumber()) { %> <% response.setHeader("Refresh", "5; URL=prime2.htm"); %> 請輸入 2~10000 之間的整數。<p> 五秒後將自動回到 prime2.htm。 <% return; } %> <%-- 顯示錯誤訊息後結束,亦即後續的指令不會被處理 --%> <% if (checker.isPrimeNumber()) { %> <%= num %> 是質數 <% } else { %> <%= num %> 不是質數 <% } %> </body> </html>
JavaBean代码:
package com.huanlin.util; public class CheckPrimeBean { private int number; public String getNumber() { return Integer.toString(number); // 整數轉成字串 } public void setNumber(String s) { try { number = Integer.parseInt(s); // 字串轉成整數 } catch (NumberFormatException e) { number = -1; } } public boolean isValidNumber() { // 檢查輸入的數字是否合法 if ((number < 2) || (number > 10000)) return false; return true; } public boolean isPrimeNumber() { // 判斷是否為質數 for (int i = 2; i <= number/2; i++) { if (number % 2 == 0) return false; } return true; } }
其中JavaBean由于需要给JSP访问,所以一定要用package,否则JSP将会找不到相应的JavaBean
JSP+Servlet+JavaBean阶段:
Web.xml文件设置:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name> HelloWorldServlet </servlet-name> <servlet-class> HelloWorldServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldServlet</url-pattern> </servlet-mapping> </web-app>
JSP代码:
<%@ page contentType="text/html;charset=big5" %> <jsp:useBean id="userInfo" class="com.huanlin.UserInfoBean" scope="session"/> <html> <body> <p>從 servlet 傳入的 UserInfoBean.userName 是: <b> <jsp:getProperty name="userInfo" property="userName"/> </b> </body> </html>
Servlet代码:
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import com.huanlin.UserInfoBean; public class HelloServlet2 extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 下面兩行讓中文字能正確顯示 response.setContentType("text/html; charset=big5"); request.setCharacterEncoding("big5"); // 建立 userInfo 物件,並指定一個 session 的 attribute 與之繫結 UserInfoBean userInfo = new UserInfoBean(); userInfo.setUserName("令狐沖"); HttpSession session = request.getSession(); session.setAttribute("userInfo", userInfo); // 前往指定的網頁 RequestDispatcher rd; rd = getServletContext().getRequestDispatcher("/HelloFromServlet2.jsp"); rd.forward(request, response); } }
JavaBean代码:
package com.huanlin; public class UserInfoBean { private String userName; public void setUserName(String userName) { this.userName = userName; } public String getUserName() { return this.userName; } }
JSF的使用
JSP代码:
welcome.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@page contentType="text/html;charset=Big5"%> <html> <head> <title>第一個JSF程式</title> </head> <body> <f:view> <h:outputText value="#{user.name}"/> 您好! <h3>歡迎使用 JavaServer Faces!</h3> </f:view> </body> </html>
index.jsp
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@page contentType="text/html;charset=Big5"%> <html> <head> <title>第一個JSF程式</title> </head> <body> <f:view> <h:form> <h3>請輸入您的名稱</h3> 名稱: <h:inputText value="#{user.name}"/><p> <h:commandButton value="送出" action="login"/> </h:form> </f:view> </body> </html>
JavaBean代码:
package onlyfun.caterpillar; public class UserBean { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
faces-config.xml代码:
<?xml version="1.0"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"> <faces-config> <navigation-rule> <from-view-id>/pages/index.jsp</from-view-id> <navigation-case> <from-outcome>login</from-outcome> <to-view-id>/pages/welcome.jsp</to-view-id> </navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class> onlyfun.caterpillar.UserBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>
http://www.oracle.com/technetwork/java/javaee/download-139288.html
Java Server Faces Technology 下载地址,Myeclipse提供的好像是1.2,最新的是2.0,看个人需要
需要导入相应的jar包,Myeclipse里面可以直接导入,而用eclipse则需要自己下载jsf的包,并且需要导入到/WEB-INF/lib
- jsf-impl.jar
- jsf-api.jar
- commons-digester.jar
- commons-collections.jar
- commons-beanutils.jar
- jstl.jar
- standard.jar
大概包含此些jar包
其中相关内容:JSTL(页面标准标签库)和EL(统一表达式)
JSTL1.2标签
JSTL 功能 URI 前缀 核心 变量支持
流程管理
URL管理
其他http://java.sum.com/jsp/jstl/core c XML 核心
流程管理
转换http://java.sum.com/jsp/jstl/xml x 国际化 本地化
消息格式化
数字和日期格式化http://java.sum.com/jsp/jstl/fmt fmt SQL SQL http://java.sum.com/jstl/sql sql 函数 集合长度
字符串操作http://java.sun.com/jsp/sjtl/functions fn EL
即时表达式:${name}
延迟表达式:#{name}
值表达式:<taglib:tag value=”${name}”>、<taglib:tag value=”#{name}”>、${name+20}
方法表达式:<h:inputText id=”name” value=”#{name}” validator=”#{name.validateName}"/>
运算符:
算术运算符:+,-,*,/或div,%或mod,-(负号)
关系运算符:==,eq,!=,ne,<,lt,>,gt,<=,ge,>=,le
逻辑运算符:and,&&,or,||,not,!
空运算符:empty
条件运算符:条件?表达式1:表达式2