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)对象。
     2int 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 的屬性值。

請特別注意兩點:

  1. 屬性的大小寫。在 JSP 裡面,屬性的名稱是完全小寫的 "age",但是 getter 和 setter methods 的名稱卻是 getAge() 和 setAge(),這種名稱的轉換對應規則是固定的,照這個規則來命名,Web container 就能夠找到正確的存取方法。
  2. 對於 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"); %>
  請輸入 210000 之間的整數。<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

posted on 2012-04-15 09:46  小影帆  阅读(296)  评论(0编辑  收藏  举报

导航