李興華JavaWeb開發筆記

李興華JavaWeb開發筆記

1.Java語法-基礎

環境變量-JAVA_HOME, PATH, ClassPathjavascript

 

變量名css

做用html

舉例前端

JAVA_HOMEjava

指向JDK目錄nginx

C:\Program Files\Java\jdk1.7.0_21git

PATH程序員

指向java.exe目錄。web

 

%JAVA_HOME%\bin;ajax

%JAVA_HOME%\jre\bin

CLASSPATH

執行.jar文件、zip文件、.class文件所在目錄。

(程序要用到哪些.class文件,)

%JAVA_HOME%\lib\dt.jar;

 %JAVA_HOME%\lib\tools.jar;

 

 

 

 

 

控制語句  99 bottles of beer

 

public class GoJava2 {

 

   /**

    * @param args

    */

   public static void main(String[] args) {

 

       int beerNum=99;

       String word="bottles";

       while(beerNum>1){

          System.out.println(beerNum+" "+word+" of beer on the wall");

          System.out.println(beerNum+" "+word+" of beer");

          System.out.println("Take one down");

          System.out.println("pass it around");

          beerNum--;

       }

       if(beerNum==1){

          System.out.println(beerNum+" bottle of beer on the wall");

          System.out.println("Take one down, no more beers");

       }

   }

}

 


guessNumber 遊戲

 

 

public class Player {

    int number;

    public int Guess(){

        this.number=(int)(Math.random()*10);

        return this.number;

    }

   

 

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Player p1=new Player();

        Player p2=new Player();

        Player p3=new Player();

       

 

        boolean continueFlag=true;

        int answer=-1;

        while(continueFlag){

            answer=(int)(Math.random()*10);

            int n1=p1.Guess();

            int n2=p2.Guess();

            int n3=p3.Guess();

           

            System.out.println("answer is:"+answer);

            System.out.println("player1 guesses:"+n1);

            System.out.println("player2 guesses:"+n2);

            System.out.println("player3 guesses:"+n3);

         

            if(n1==answer||n2==answer||n3==answer){

                System.out.println("we have a winner among the p1,p2,p3");

                continueFlag=false;

            }

            else{System.out.println("no one guessed the answer,game continue");}

        }

        System.out.println("p1 guesses:"+(p1.number==answer));

        System.out.println("p2 guesses:"+(p2.number==answer));

        System.out.println("p2 guesses:"+(p3.number==answer));

    }

 

}

 

 

引用變量  遙控 對象

 

public class Dog {

    String name;

    public void bark(){

        System.out.println(this.name+" is barking");

    }

    /**

     * @param args

     */

    public static void main(String[] args) {

         Dog[] dogs=new Dog[3];

         dogs[2]=new Dog();

         dogs[0]=new Dog();

         dogs[0].name="Fido";

         dogs[2]=dogs[0];

         dogs[2].bark();

         if(dogs[2].name==dogs[0].name){

         System.out.println(true);

         }

         else{

         System.out.println(false);

         }

    }

 

}

輸出:

Fido is barking

true

 

 

 

 

 

 

 

super()

 


final

做用:修飾變量

效果:賦值以後 沒法改變。

.java文件中放多個類

 規則:

       最多隻能有一個public Class.                                                

若是存在public Class,那麼 .java的文件名必須是public Class的名字

 

 

 

.java-.class-.jar 文件

摘要

類型

說明

.java

寫代碼寫在這文件中

.jar

本質:多個.class文件的壓縮包。

如何生成:(1)IDE中Export JAR我那件

          (2)winzip將class文件壓縮成.jar

.class文件

本質:在java虛擬機中運行的二進制文件

----

如何生成:

 step1:進入到.java文件的目錄

   f:

   cd pkgSvt

 

step2:javac  java文件名

效果:相同位置產生.class文件

 

如何運行.class文件

step1  java –cp f:\pkgSvt ClsStrSB //設置classpath,要用哪些class

step2  cd pkgSvt        //進入父目錄

step3  java ClsStrSB   //執行class 中的 main

 

 

 

Object  爲空判斷

判斷對象爲null

 If(obj==null){//爲空

}

eclipse導出jar, classpath not found

工程文件夾應該會有個大紅感嘆號。右擊工程文件夾,properties 選擇java build class,查看各選項卡,有紅色錯誤提醒的remove之便可。


數組- List -ArrayList

 

數組

摘要:直接聲明。

      指定長度聲明。

      不可動態改變長度。

String[] IDNUMs={"US100","US120"};

String[] temp=new String[10];

 

數組隨機 專家術語機.

Index:Math.random,  String[] ={},

數組定義:

String[]  array1={「」,」」,」」}

 

 

public static void main(String[] args) {

 

      String[] wordListOne = {"24/7","multi-Tier","30,000 foot","B-to-B","win-win","frontend","web-based","pervasive", "smart", "sixsigma","critical-path", "dynamic"};

      String[] wordListTow={"process","tipping-point","solution","archetecture","core-competency","strategy","mind-care"};

      String[] wordListThree={"toomcat","apache","Linux","nginx"};

     

      String word1=wordListOne[(int)(Math.random()*wordListOne.length)];

      String word2=wordListTow[(int)(Math.random()*wordListTow.length)];

      String word3=wordListThree[(int)(Math.random()*wordListThree.length)];

     

      for(int i=0;i<=9;i++){

         System.out.println(word1+" "+word2+" "+word3);

      }

   }

 

輸出:

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

 

List

List<E>([]內的內容可省略),與數組相似:

      ArrayList<DisPoint> liPts=new ArrayList<DisPoint>();

      while(rs.next()){

         DisPoint pt=new DisPoint(rs.getInt("ID"),rs.getString("Name"),rs.getDouble("Longitude"),rs.getDouble("Latitude"));        

         liPts.add(pt);

              }
 

得到集合內元素個數:list.size();

添加元素:
默認添加:list.add(e);
指定下標添加(添加後下標後的元素向後挪一位):list.add(index,e);

刪除元素:
返回是否刪除:list.remove(e);
直接刪除指定下標的元素(只刪除找到的第一個相符合的元素):list.remove(index);

替換元素(替換掉指定下標的元素):list.set(index,e);

取出元素:list.get(index);

清空集合:list.clear();

判斷集合中是否存在某個元素(存在返回true,不存在返回false):list.contains(e);

對比兩個集合中的全部元素:
兩個對象必定相等:list.equals(list2);
兩個對象不必定相等:list.hashCode() == list2.hashCode();
(兩個相等對象的equals方法必定爲true, 但兩個hashcode相等的對象不必定是相等的對象。)

得到元素下標:
元素存在則返回找到的第一個元素的下標,不存在則返回-1:list.indexOf(e);
元素存在則返回找到的最後一個元素的下標,不存在則返回-1:list.lastIndexOf(e);

判斷集合是否爲空(空則返回true,非空則返回false):list.isEmpty();

返回Iterator集合對象:list.iterator();

將集合轉換爲字符串:list.toString();

截取集合(從fromIndex開始在toIndex前結束,[fromIndex,toIndex)):list.subList(fromIndex,toIndex);

將集合轉換爲數組:
默認類型:list.toArray();
指定類型(objects爲指定類型的數組對象,並將轉換好的數組賦值給objects數組):list.toArray(objects);

以上爲List經常使用的方法。

 

 

 

 

ArrayList

int數組

ArrayList<Integer> arID=new ArrayList<Integer>();

 

ArrayList轉Array

   public static Integer[] getUtfAr(String usr,int del){  

      ArrayList<Integer> ar=new ArrayList<Integer>();     

      for(int i=0;i<=usr.length()-1;i++){

         ar.add(usr.codePointAt(i));         

      }    

      Integer[] tm=(Integer[])ar.toArray(new Integer[ar.size()]);

      return tm;

   }

  

 

 

2.SVN操做

目標:集成到eclipse, 源代碼管理

1.下載 svn.jar包

2.解壓到 獲得兩個目錄:

        features,plugins

3.將features,plugins拷貝到ecplise/dropins目錄下

4.啓動eclipse,建立一個workSpace, 例如fareWeb

5.FileàNewàOtheràsvnà從svn檢出項目

6.輸入url

https://10.254.53.4:8443/svn/bii2ITA/trunk/src/SourceCode/fareWeb

 

用戶名:gaoxk

密碼:gaoxk123

 

3. 測試-調試

在java classc測試- main函數

  public static void main(String[] args) {

      Crud crud=new Crud();   

      Employee emp=new Employee("孔卡",26,"足球運動員");

      Employee inserted=crud.insertOne(emp);

      crud.printOne(inserted);   

     

      inserted.Name="穆裏奇";

      Employee updated=crud.updateOne(inserted);

      crud.printOne(updated);

     

      crud.showAll();

      crud.deleteRecs(updated.id);   

}

 

 

查看方法執行時間

       System.out.println("getCond時間:"+((new Date()).getTime()-now.getTime()));

 

System.out.println 調試

 描述:控制檯輸出

 參數:string

舉例

 System.out.println(「hello world」)

如何查看變量的值

1>    進入Debug View

2>    Window àShow View Expressions

3>    在Name中添加變量名/.變量值,Value中查看值

 

如何查看類型的全部方法/屬性  (API Documentation)

1>    鼠標放到類型上,按F2, Open Javadoc in Browser

 

獲取離線JavaSE Documentation

1>    網頁版

  訪問Oracle.com, JavaSE 下載頁面,頁面靠下的部分有 Java SE Documentation下載,是一個網站(Zip包)

 

2.>Chm版

 在baidu上搜 Java SE API Chm。

 

使用正則查找/替換

需求:

在 edit.html中 ,draw***();替換成空

 

 

譬如:

drawPeoples(); drawGender();

 

正則表達式

draw[a-zA-Z]+\(\);

 

 

 

 

Tomcat

目錄結構

 

序號

目錄名

描述

1

bin

可運行程序目錄。start,shutdown在此目錄下。

2

lib

放jar包

3

conf

放配置文件

4

logs

存放日誌文件

5

webapps

web項目(war包)在此即發佈

6

work

臨時目錄,jsp生成 .java文件將在此

 

 

端口號設置

http端口

conf/server.xml

 <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

 

SSL端口

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

               maxThreads="150" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" />

-->

 

AJP端口

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

 


role和用戶配置 tomcat-users.xml 

用途:管理用戶

      (設置某個web的jsp權限)

  字段:

    

 

舉例:

打開conf/tomcat-users.xml

添加兩個role,兩個 user

<role rolename="admin"/>

<role rolename="guest"/>

<user username="admin" password="admin" roles="admin"/>

<user username="guest" password="guest" roles="guest"/>

 

 

 

 

建立虛擬目錄

 原則:每個虛擬目錄存放一個Web項目

 

步驟

序號

詳細

概要

1

在硬盤上創建目錄,並在目錄中創建WEB-INF目錄

建立虛擬目錄

2

將tomcat/webapps/Root/web.xml拷貝到WEB-INF目錄下

添加配置文件web.xml

3

<Host>

......

<Context path=」/test1」 docBase=」E:\test1」></Context>

......

</Host>

 

將虛擬目錄關聯到conf/server.xml

4

在test1下寫 index.jsp:

 

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<h1><% out.println("Hello,JSP World");%></h1>

</body>

</html>

 

啓動tomcat,訪問地址

localhost/test1/

測試

 

 

 

第一個JSP

在已關聯的虛擬目錄下建立index.jsp,內容以下:

 

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<h1><% out.println("Hello,JSP World");%></h1>

</body>

</html>

 

效果:

 

 

 

 


 

 

 

 

 

虛擬目錄/WEB-INF/web.xml

web.xml中的路徑符號

 

url-pattern

說明

實際地址

su

沒法啓動

 

../su

不容許../ 服務器沒法啓動

 

/su

虛擬目錄/su

http://localhost/UI05/su

 

頁面form 的路徑

sample1.htm

 

pattern

說明

實際地址

<form action="su"

與頁面同級的su

http://localhost/UI05/su

<form action="../su"

頁面父目錄的su

http://localhost /su

 

 

 

Web標準目錄結構

 

 

 

WEB-INF必須存在

要點:

  (1)虛擬目錄下必須存在WEB-INF目錄。 WEB-INF必須包好web.xml文件。

  (2)by default, internet用戶無權限訪問WEB-INF下的內容。

  (3)不想被瀏覽器直接訪問的頁面,放在WEB-INF下。加強安全

web.xml  jsp映射

摘要:

<servlet>

       <servlet-name></servlet-name>

<jsp-file></jsp-file>

</servlet>

<servlet-mapping>

<servlet-name></servlet-name>

<url-pattern></ url-pattern>

</servlet-mapping>

 

jsp映射

  <servlet>

    <servlet-name>serA</servlet-name><!--servlet-name only works inside web.xml,to connect JSP-FILE with URL-PATTERN-->

       <jsp-file>/test.jsp</jsp-file><!--JSP-FILE-->

  </servlet>

  <servlet-mapping>

    <servlet-name>serA</servlet-name>

       <url-pattern>/hello</url-pattern><!--URL-PATTERN-->

</servlet-mapping>

 

 

web.xml servlet映射

servlet映射

摘要:

<servlet>

       <servlet-name></servlet-name>

<servlet-class></servlet-class>

</servlet>

<servlet-mapping>

<servlet-name></servlet-name>

<url-pattern></ url-pattern>

</servlet-mapping>

 

摘要:使用通配符 *

<web-app>

<servlet>

<servlet-name>SvtHello</servlet-name>

<servlet-class>pkgResiCrud.SvtHello</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>SvtHello</servlet-name>

<url-pattern>/hello/*</url-pattern>

</servlet-mapping>

</web-app>

 

init-param配置 驅動-dburl-用戶名-密碼

在web.xml中

注意:

(1)要放在servlet標籤下

   (2)客戶端請求url-pattern時,getInitParameter生效。

           客戶端直接請求jsp時, getInitParameter取值爲null.

<servlet>     

       <init-param>

              <param-name>DbDriver</param-name>

              <param-value>oracle.jdbc.driver.OracleDriver</param-value>

       </init-param>

<servlet-name>serA</servlet-name>   

<jsp-file>/test.jsp</jsp-file>

  </servlet>

  <servlet-mapping>

    <servlet-name>serA</servlet-name>

       <url-pattern>/hello</url-pattern>

</servlet-mapping>

 

在JSP頁面中:

  以config.getInitParameter(「」)獲取參數值

 


 

<error-page> 設置出錯處理頁面

 

  <error-page>

       <error-code>404</error-code>

       <location>error.jsp</location>

       <error-code>500</error-code>

       <location>error.jsp</location>

  </error-page>

</web-app>

 

效果:

index.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<h2>index.jsp</h2>

<%int result=10/0;%>

 

服務端跳轉:

 

 

 

error.jsp

 

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<h2>頁面發生了錯誤...</h2>

<a href="index.jsp">點擊此處返回主頁面</a>

 

備註:with web.xml,即便沒有<%@ page isErrorPage=」true」%>,it still works

 


security-contraint頁面權限  

備註:GET和Post Request都要求驗證

前件:要在tomcat-users.xml中 添加role,和role類的用戶

效果:訪問頁面須要輸入用戶名密碼

用途:保護管理員頁面

 

密碼傳輸方式:不是明文

 

 

配置方式:

<security-constraint><!--page and roles-->

       <web-resource-collection><!--pages are protected-->             

              <url-pattern>/check.jsp</url-pattern>

       </web-resource-collection>

       <auth-constraint><!--allowed roles-->

              <role-name>admin</role-name><!--must-->

       </auth-constraint>

  </security-constraint>

  <login-config><!--Login form for validation-->

       <auth-method>BASIC</auth-method>      

  </login-config>

  <security-role><!--withoud this,warning appears when start-->

       <role-name>admin</role-name>

</security-role>

 

 </web-app>

 

 

JSP

第一個JSP

<%@ page language=」Java」 contentType=」text/html;charset=utf-8」%>

<h1><%out.println("hello world");%></h1>

 

訪問:

http://localhost:8080/UI05/html/first.jsp

 

效果:

...

 

結論:

(1)jsp文件,能夠不寫<!DOCTYPE><head><body>

JSP本質是 java類

JSP文件最終都是以.java文件在服務端執行

 

後果:

 (1)第一次訪問.jsp比第二次以後慢

 (2)訪問後在硬盤上生成.java文件

 

 

 

 

第一個交互表單

在虛擬目錄下建立 index.jsp和index.html

 

 

index.html:

<!DOCTYPE HTML>

<html>

<head></head>

<body>

<form action='index.jsp'>

 <input type="text" name="info" value=""/><input type="submit" value="提交"/>

</form>

</body>

</html>

 

index.jsp:

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<h1><% out.println(request.getParameter("info"));%></h1>

</body>

</html>

 

訪問:index.html

 

點擊提交:

 

 


基礎語法

註釋符號

序號

舉例

1

<%-- out.println(「hello world」);--%>

2

<% //out.println(「hello world」);%>

3

<% /*out.println(「hello world」);*/ %>

 

java語句標籤

做用:java語句要寫在 java語句標籤內。

備註:不要將指令寫在語句標籤內

序號

舉例

說明

1

<%!public String HelloWorld(){

     return 「hello world」;

}%>

做用:

定義 類,方法,全局變量。

(備註:

不要在JSP中定義方法,類。

在JavaClass中定義。)

2

<% String one=」hello world」;

  out.println(one);

%>

執行語句。

3

<%=one%>

獲取變量。

(備註:

  不要在<%=%>中添加註釋)

4

<jsp:scriptlet></jsp:scriptlet>

 

 

 

舉例:

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<%!public String helloWorld(){

       return "hello world";

};//定義方法%>

<%String one="one";//定義變量%>

<h1><%=helloWorld()%></h1>

<h2><%=one%><%//取變量%></h2>

</body>

</html>

 


out.print vs <%=%>

<%=%> 稱做 表達式輸出。

 

結論:

 使用<%=%> 取代<%out.println()%>

好處(1)效率高

(2)html代碼和 java代碼分離

 


if else寫法

正確:

<%if(info.equals("true")){%>

              <jsp:forward page="success.jsp">

                <jsp:param name="info" value="<%=paraU%>"></jsp:param>

              </jsp:forward>  

   <%}else{%>

 

 

錯誤:

 

<%if(info.equals("true")){%>

              <jsp:forward page="success.jsp">

                <jsp:param name="info" value="<%=paraU%>"></jsp:param>

              </jsp:forward>  

   <%}%>

 

<%else{%>

 

 

 

 

Page指令索引

 

經常使用的4種:

 contentType , pageEncoding, errorPage ,import,


Page import指令

導入Jar包

 

 

備註:1個page指令 只能由1個import,1個import只能導1個jar

<%@ page contentType="text/html;" pageEncoding="GBK" import="java.util.*"%>

<%@ page import="java.io.*"%> <%// one page Dir can only import one jar%>

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

 

Page pageEncoding=」GBK」 顯示中文

 

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%><%//jsp要顯示中文%>

<table border=1>

<tr><td>序號</td><td>名稱</td><td>描述</td></tr>

</table>

 

 

 

 

Page指令contentType 顯示html

contentType=」mimeType;」

 

舉例

Mime類型

contentType=」text/html;」

text/html

 

<%@ Page language="Java" contentType="text/html; "%>

 

 

 

Page contentType vs response.setHeader控制編碼

 

Page設置 Content-Type 正常

 

<%@ page language="Java" contentType="text/html;" pageEncoding=」GBK」%>

<table border="1" cellpadding=0 cellspacing=0>

<tr><td>序號</td><td>名稱</td><td>描述</td><tr>

</table>

 

 

 

setHeader-ContentType亂碼

<%@ page language="Java"%>

<%response.setHeader("Content-Type","text/html;charset=GBK");%>

<table border="1" cellpadding=0 cellspacing=0>

<tr><td>序號</td><td>名稱</td><td>描述</td><tr>

</table>

 

 

結論:

 JSP頁面編碼,使用Page指令,不用response.setHeader

 


 

 

 

Page指令 設置出錯頁

 

show.jsp:

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<%@ page language="Java" errorPage="error.jsp"%>

<h2>index.jsp</h2>

<%int result=10/0;%>

 

error.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<%@ page isErrorPage="true"%><%//此頁可處理錯誤%>

<h2>頁面發生了錯誤...</h2>

<a href="index.jsp">點擊此處返回主頁面</a>

 

效果:

 

 

特色:

  服務端跳轉(客戶端只發送了一次請求。服務端執行了另外一個頁面的代碼)

 

 

 

 


Include指令 包含jsp,htm文件

原理:全部file被included into index.jsp,再編譯

應用:

 

index.jsp:

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<%@include file="left.htm"%>

<%@include file="middle.htm"%>

<%@include file="right.htm"%>

 

left.htm

<div style="display:inline-block; width:300px;">

<h1>We<h1>

</div>

 

middle.htm

<div style="display:inline-block; width:300px;">

<h1> are cellestial<h1>

</div>

 

 

right.htm

<div style="display:inline-block; width:300px;">

<h1> man<h1>

</div>

 

 

效果:

 


jsp:include指令 動態包含

區別:各部分被分別編譯,而後包含

 

 

 

 

 

 

jsp:forward指令 跳轉

 

 

 


jsp實現登陸功能

 

login.htm

<!DOCTYPE HTML>

<html>

<head></head>

<body>

<center>

<form action="login_check.jsp">

       <table cellspacing=0 cellpadding=0 style="border-collapse:collapse;border:1px solid rgb(0,0,0);">

              <tr><td colspan=2>登陸系統</td><td></td></tr>

              <tr><td>用戶名:</td><td><input type="text" name="usr" /></td></tr>

              <tr><td>密碼:</td><td><input type="text" name="psw" /></td></tr>

              <tr><td colspan=2><input type="submit" value="登陸" /><input type="reset" value="重置"></td><td></td></tr>

       </table>

</form>

</center>

</body>

</html>

 

 

 

 

login_check.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

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

<%

     final String DbDriver="oracle.jdbc.driver.OracleDriver";

     final String DbUrl="jdbc:oracle:thin:@localhost:1521:orcl";

     final String Usr="test";

     final String Psw="test";

  

   String paraU=request.getParameter("usr");

   String paraP=request.getParameter("psw");

  

   Class.forName(DbDriver);

   Connection conn=DriverManager.getConnection(DbUrl,Usr,Psw);

   Statement stmt=conn.createStatement();

   String sqlStr="select usr, psw from account";

   String info="false";

   ResultSet rs=stmt.executeQuery(sqlStr);

   while (rs.next()){

        if(rs.getString("usr").equals(paraU)){

           if(rs.getString("psw").equals(paraP)){

                info="true";

              }

              else{

                info="invalid password";

           }

        }

        else{

          continue;

        }

   }

   info=info.equals("false")?"user does not exist":info;

  

   rs.close();

   stmt.close();

   conn.close();   

   %>

<%if(info.equals("true")){%>

              <jsp:forward page="success.jsp">

                <jsp:param name="info" value="<%=paraU%>"></jsp:param>

              </jsp:forward>  

   <%}else{%>

              <jsp:forward page="fail.jsp">

                     <jsp:param name="info" value="<%=info%>"></jsp:param>

              </jsp:forward>

   <%}%>

 

 

 

success.jsp

<%@ page contentType="text/html;charset=GBK"%>

<h1>You're Welcome,<%=request.getParameter("info")%></h1>

 

 

 


fail.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<h1>登陸失敗...<%=request.getParameter("info")%></h1>

<a href="login.htm">返回登陸頁</a>

 

效果

 

 

 

 

 


服務端跳轉 和 客戶端跳轉

 

 

代碼

瀏覽器效果

服務端跳轉

<jsp:forward page=」other.jsp」></>

地址欄未改變

客戶端跳轉

<a href=<%=loc2%> />

地址欄變化

效率:服務端跳轉高

 

 

 

 


JSP 內置對象索引

 

 

經常使用5個:request, response, pageContext, session, application

 

做用範圍 request , session, application

 

 


page 範圍

用途:

       jsp頁面內存取變量

 

範圍:

在當前jsp頁面中有效

 

失效狀況(any)

<jsp: forward=」page2.jsp」></jsp:forward>

 

 


 

request 範圍

 

特色:

       比page略長,服務器端跳轉後 依然有效;

                客戶端跳轉後,無效

舉例-服務端跳轉,有效

 

request_01.jsp

 

 

 

 

request_02.jsp

 

 

 

request-客戶端跳轉

requst_01.jsp

 

 

 

 


session 範圍

特色:session.setAttribute(「info」,」Juptor Mind」)執行

      若是不關閉瀏覽器,則Webapp下其它頁面均可取

 

  沒法取得:

        瀏覽器關閉後

 

舉例:

session_01.jsp

 

 

 

session_02.jsp

 

 

 

application 範圍

特色:存在服務器上。全部session均可存取

停止:服務器重啓

 

舉例:

 application_1.jsp

 

 

application_2.jsp

 

 

 

 


request 範圍實驗(DIY)

 

req1.jsp

<%@ page language="java" contentType="text/html;charset=GBK"%>

<title>Req1.jsp</title>

<%request.setAttribute("info","Jupitor mind");%>

<span>request.getAttribute("info")=<%=request.getAttribute("info")%></span>

<a href="req2.jsp">anchor to req2.jsp</a></br><%//prove 客戶端跳轉%>

<jsp:forward page="req2.jsp"></jsp:forward> <%//prove 服務端跳轉.進行 服務端跳轉,請去除此語句%>

 

req2.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<title>req2.jsp</title>

<span>request.getAttribute("info") is:<b><%=request.getAttribute("info")%></b></span>

 

session範圍實驗(DIY)

 

req1.jsp

<%@ page language="java" contentType="text/html;charset=GBK"%>

<title>Req1.jsp</title>

<%session.setAttribute("info","Jupitor mind");%>

<span>session.getAttribute("info") is:<b><%=session.getAttribute("info")%></b></span></br>

<a href="req2.jsp">click to req2.jsp</a>

 

req2.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<title>req2.jsp</title>

<span>session.getAttribute("info") is:<b><%=session.getAttribute("info")%></b></span>

 


 

HttpServletRequest對象

備註:

 JSP頁面和Servlet中的request都是HttpServletRequest類型。

 

 

 

 

setCharacterEncoding 解析中文

應用:客戶端發送未編碼的中字,先使用此方法,不然亂碼

 

實驗

check.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%><%//jsp要顯示中文%>

<%

       request.setCharacterEncoding("GBK"); //解析中文字符串

       String usr=request.getParameter("usr");

%>

usr:<%=usr%>

 

login.htm

<!DOCTYPE HTML>

<html>

<head><meta content-type="text/html;charset=utf-8"></head>

<body>

 <form action="check.jsp" method="post">

    <table><tr><td>用戶名:</td><td><input type="text" name="usr" value="his name is 木星意志"/></td></tr>      

              <tr><td colspan=2><input type="submit" value="提交"></td><td></td></tr>

       </table>

 </form>

</body>

</html>

getParameter(name) 取一個value

 

 


getParameterValues(name) 獲取同name標籤values

背景:任何兩個html標籤容許同名。

login.htm

<!DOCTYPE HTML>

<html>

<head><meta content-type="text/html;charset=utf-8"></head>

<body>

 <form action="check.jsp" method="post">

    <table>

              <tr><td>姓名</td><td>

              <input type="text" name="name" value="木星"/>

              <input type="text" name="name" value=""/>

              </td></tr>

              <tr><td>愛好</td>

                     <td>

                            游泳<input type="checkbox" name="inter" value="游泳"/>

                            籃球<input type="checkbox" name="inter" value="籃球"/>

                            神風<input type="checkbox" name="inter" value="神風"/>

                     </td>                  

              </tr>

              <tr><td colspan=2><input type="submit" value="提交"/></td><td></td></tr>

       </table>

 </form>

</body>

</html>


 

check.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%><%//jsp要顯示中文%>

<%

       request.setCharacterEncoding("GBK"); //解析中文字符串

       String[] names=request.getParameterValues("name");

       String[] inters=request.getParameterValues("inter");

%>

<%

if(names!=null){

for(int i=0;i<=names.length-1;i++){%>

   name[<%=i%>]:<%=names[i]%></br>

<%}}%>

<%if(inters!=null){

for(int i=0;i<=inters.length-1;i++){

%>

interest[<%=i%>]:<%=inters[i]%>

<%}}%>

 

getParameterNames取全部name

用途:獲取全部傳入參數

舉例:獲取複選框項

適用於:存在複選框時

拓展:查詢條件組合,購物車

 

login.html

<!DOCTYPE HTML>

<html>

<head><meta content-type="text/html;charset=utf-8"></head>

<body>

 <form action="check.jsp" method="post">

    <table>

              <tr><td>姓名</td><td>

                     <input type="text" name="name" value="木星"/>           

              </td></tr>

              <tr><td>郵箱</td><td>

                     <input type="text" name="mail" value="1695539064@qq.com"/>             

              </td></tr>          

              <tr><td>愛好</td>

                     <td>

                            游泳<input type="checkbox" name="inter" value="游泳"/>

                            籃球<input type="checkbox" name="inter" value="籃球"/>

                            神風<input type="checkbox" name="inter" value="神風"/>

                     </td>                  

              </tr>

              <tr><td colspan=2><input type="submit" value="提交"/></td><td></td></tr>

       </table>

</form>

</body>

</html>

 

check.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%><%//jsp要顯示中文%>

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

<%

       request.setCharacterEncoding("GBK"); //解析中文字符串

       Enumeration pNames=request.getParameterNames();    //取全部names

       while(pNames.hasMoreElements()){//遍歷names

              String pName=(String)pNames.nextElement();

       %>

      

               參數名:<%=pName%>,參數值:<%String[] values=request.getParameterValues(pName);//retrive values of one Name

                     for(int i=0;i<=values.length-1;i++){%>

                            <%=values[i]%><span>  </span>

                     <%}

               %></br>

              <%}%>

效果:

 

 

 

 

 

 


Header Cookie, agent, IP , referer,method

舉例:遍歷request頭信息

 

<%@ page language="Java" contentType="text/html" pageEncoding="GBK" import="java.util.*"%>

<%

   Enumeration items=request.getHeaderNames();

   %>

   method:<%=request.getMethod()%></br>

   clientIP:<%=request.getRemoteAddr()%></br>

   <%while(items.hasMoreElements()){

        String hName=(String)items.nextElement();

        String value=(String) request.getHeader(hName);             

        %>

        <%=hName%>:<%=value%></br>

   <%}%>

 

clientIP:127.0.0.1
host:localhost
connection:keep-alive
content-length:80
cache-control:max-age=0
accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
origin:http://localhost
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36
content-type:application/x-www-form-urlencoded
referer:http://localhost/test1/login.htm
accept-encoding:gzip,deflate,sdch
accept-language:zh-CN,zh;q=0.8
cookie:JSESSIONID=816945B50F0C1130B0E00C99B90F731C

 

判斷role類型

前提:

(1)在tomcat-users.xml中添加了role和user

(2)在虛擬目錄-web.xml中配置security-constraint,login-config,security-role

 

效果:

 login驗證經過後,retrive用戶role.(不是username)

 

<%@ page language="Java" contentType="text/html" pageEncoding="GBK"%>

<%if(request.isUserInRole("admin")){%>

 Welcome,<b>Role admin</b>

<%}%>

 

getContextPath() 獲取應用名

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

host:<b><%=request.getHeader("host")%></b></br>

ContextPath:<b><%=request.getContextPath()%></b></br>

ServletPath:<b><%=request.getServletPath()%></b>

 

 

getServletPath() 取應用名以後部分

 


getCoockies()  Cookies[]

 

 

 

 

HttpServletReponse對象

備註:JSP頁面和Servlet中的request都是HttpServletRequest類型。

 

 

setHeader(「refresh」) 定時跳轉

摘要:setHeader(「refresh」,」3;url=login.htm」)

備註:客戶端跳轉

 

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%response.setHeader("refresh","3;url=login.htm");%><%//setHeader("refresh","2;url="),客戶端跳轉%>

3秒鐘後將跳轉到login.htm...

sendRedirect  客戶端跳轉

 

備註:客戶端跳轉

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%response.sendRedirect("login.htm");%>

 

response.setHeader 保存word

 

頁面:

<%@ page language="Java" pageEncoding="GBK"%>

<%response.setHeader("Content-Disposition","attachment;filename=test.doc");%>

<table border="1">

<tr><td>序號</td><td>名稱</td><td>描述</td><tr>

</table>

 

Mime設置:

打開conf/web.xml,

確認一下mime-mapping存在

 

<mime-mapping>

        <extension>dot</extension>

        <mime-type>application/msword</mime-type>

</mime-mapping>

 

效果:頁面不打開,直接下載

 

byte[]返回文件 (下載)

 

InputStream inStream=null;         

                     //所有             

                                   try {

                                             inStream=ResiCrud.createExcel(filePath);

                                      } catch (ClassNotFoundException | WriteException

                                                    | SQLException e) {

                                             // TODO Auto-generated catch block

                                             e.printStackTrace();

                                      }                            

                                

                                                                               

                                   response.reset();

                                   response.setHeader("Content-Disposition", "attachment;filename=" +response.encodeURL(fileUrl));                                                   

                                   response.setContentType("application/octet-stream");

                                 

                                   byte[] fileBytes=new byte[1024];                          

                                   int length=0;

                                   while((length=inStream.read(fileBytes))>0){

                                          response.getOutputStream().write(fileBytes,0,length);

                                   }                                                                                                                                                                      

                                   response.flushBuffer();                               

                                   response.getOutputStream().close();

                                   inStream.close(); 

                                   return;     


response返回文本數據

(1)   response.getOutputStream.write二進制流

//設置 數據編碼

      response.setHeader("Content-type", "text/plain;charset=utf-8");    

      String result="hello World";

      //傳送 二進制數組,將字符串以 utf-8變成 二進制數組

      response.getOutputStream().write(result.getBytes("utf-8"));

 

(2)response.getWriter.write() 字符串

    response.setHeader("Content-type","text/html;charset=UTF-8");

    PrintWriter writer = response.getWriter();

    writer.write("中國");

 

 

Cookie對象

 

意義:Cookie生存在客戶端上。經常使用於存放用戶名密碼等信息。

在週期滿後,會被清除。瀏覽器執行清空Cookie操做後,也被清除。

個數限制:最多300個

 

Cookie 索引

命名空間:javax.Servlet.http.Cookie

 

 

response.addCookie 添加Cookie

模擬登陸,Cookie遍歷,添加,

 

 

摘要:

      

取全部Cookies

Cookie[] cos=request.getCookies();

遍歷Cookies

for(int i=0;i<=cos.length-1;i++){

   String coName=cos[i].getName();

   String coVal=cos[i].getValue();

}

設置Cookies時長

coName.setMaxAge(600);//十分鐘

客戶端 延時跳轉

response.setHeader(「refresh」,」3;url=login.jsp」)

客戶端 當即跳轉

reponse.sendRedirect(「login.jsp」)

 

 

 

login.jsp

<%@ page language="Java" pageEncoding="GBK" contentType="text/html"%>

<%

       Cookie[] cos=request.getCookies();

       String usr=null;

       String psw=null;

%>

       <%if(cos!=null){

              for(int i=0;i<=cos.length-1;i++){

                     if(cos[i].getName().equals("usr")){

                            usr=cos[i].getValue();

                     }

                     if(cos[i].getName().equals("psw")){

                            psw=cos[i].getValue();

                     }

              }

              if(usr!=null&&psw!=null){%>

                     <jsp:forward page="index.jsp"></jsp:forward><%--服務端跳轉--%>

              <%}%>

       <%}%>

<!DOCTYPE HTML>

<html>

<head><meta content-type="text/html;charset=utf-8"></head>

<body>

 <form action="check.jsp" method="post">

    <table>

              <tr><td colspan=2>登陸系統</td><td></td></tr>

              <tr><td>用戶名</td><td><input type="text" name="usr"/></td></tr>

              <tr><td>密碼</td><td><input type="text" name="psw"/></td></tr>

              <tr><td colspan=2><input type="submit" value="登陸"></td><td></td></tr>

       </table>

 </form>

</body>

</html>

 

check.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%

       String usr=request.getParameter("usr");

       String psw=request.getParameter("psw");

       String info="用戶名不存在";

       if(usr.equals("test")){

              if(psw.equals("test")){

                     info="true";

              }

              else{info="密碼無效";}

       }    

%>

<%

       if(info=="true"){

              Cookie cName=new Cookie("usr",usr);

              Cookie cPsw=new Cookie("psw",psw);

              response.addCookie(cName);

              response.addCookie(cPsw);

              response.sendRedirect("index.jsp");

       }

       else{%>

              <%=info%>,<a href="login.htm">請從新登陸</a>

       <%}%>

 

index.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%

  Cookie[] cos=request.getCookies();//取全部Cookie

  String usr=null;

  String psw=null;

  for(int i=0;i<=cos.length-1;i++){

       if(cos[i].getName().equals("usr")){//取用戶名Cookie

              usr=cos[i].getValue();

       }

       %>

       CookieName:<%=cos[i].getName()%>,Value:<%=cos[i].getValue()%></br>

       <%}%>

  <%if(usr!=null){%>

   歡迎你,<b><%=usr%></b>

  <%}else{%>

  請先登陸,<a href="login.htm">點此前往登陸頁</a>

  <%}%>

 

Cookie.setMaxAge 存在時間

背景:

不設置Cookie時間,則瀏覽器關閉後,Cookie被清空。

co.setMaxAge(600) ,Cookie存在10分鐘

 

check.jsp

 

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%

       String usr=request.getParameter("usr");

       String psw=request.getParameter("psw");

       String info="用戶名不存在";

       if(usr.equals("test")){

              if(psw.equals("test")){

                     info="true";

              }

              else{info="密碼無效";}

       }    

%>

<%

       if(info=="true"){

              Cookie cName=new Cookie("usr",usr);

              cName.setMaxAge(600);

              Cookie cPsw=new Cookie("psw",psw);

              cPsw.setMaxAge(600);

              response.addCookie(cName);

              response.addCookie(cPsw);

              response.sendRedirect("index.jsp");

       }

       else{%>

              <%=info%>,<a href="login.htm">請從新登陸</a>

       <%}%>

 

 

 

Session對象

應用:用戶登陸-註銷

生存週期:瀏覽器關閉。

爲啥發明session:

  客戶端訪問服務器,服務器產生惟一的SessionID,用於 標記一次訪問

  專門用於身份驗證。

命名空間:javax.servlet.http.HttpSession

 

 

 

sessionID產生和 獲取

產生:服務端收到request以後,即產生session

獲取:session.getId();

         或者request.getCookies[「JSESSIONID」]

在客戶端,sessionID被存儲在Cookie中

 

 

session登陸和註銷

評定:

類別

思路

比較

Cookies進行登陸校驗

(1)login.jsp中,遍歷Cookies,判斷usr是否存在。

  不存在,進行登陸àreponse.AddCookie(「usrid」,usr)

à跳轉到index.jsp,index.jsp中取Cookie(「usrid」),存在,則容許訪問;不存在,則跳轉到登陸頁

 

 不存在à登陸

可設置時間長度。

Session進行登陸校驗

(1)login.jsp中,

 session.getAttribute(「usrid」)存在

則跳轉到index.jsp頁;

 不存在,則進行驗證。驗證完成

session.setAttribute(「usrid」)。跳轉到頁面index.jsp

 

比Cookie少一次遍歷。

 

 

摘要:

 

設置session

session.setAttribute(「uid」,usrName)

獲取session

session.getAttribute(「uid」)

清空session(註銷)

session.invalidate()

客戶端 延時跳轉

response.setHeader(「refresh」,」3;url=login.jsp」)

客戶端 當即跳轉

reponse.sendRedirect(「login.jsp」)

 

代碼:

login.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<form action="login.jsp" method="post">

<table>

<tr><td colspan=2>登陸系統</td><td></td></tr>

<tr><td>用戶名</td><td><input type="text" name="usr"></td></tr>

<tr><td>密碼</td><td><input type="password" name="psw"/></td></tr>

<tr><td colspan=2><input type="submit" value="登陸"></td><td></td></tr>

</table>

</form>

<% if(session.getAttribute("uid")!=null){

       response.addHeader("refresh","index.jsp;");

  }

  String usr=request.getParameter("usr");

  String psw=request.getParameter("psw");

  String info="";

  if(usr!=null){

         if(usr.equals("test")){

              if(psw.equals("test")){

                     info="true";

              }

              else{

                     info="密碼無效";

              }

         }

         else{info="用戶名不存在";  }

        

         if(info.equals("true")){

              session.setAttribute("uid",usr);

              response.sendRedirect("index.jsp");

         }

         else{%>

              <b><%=info%></b>

         <%}

}%>

 

index.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%//註銷分支

       String t=request.getParameter("t");

       if(t!=null&&t.equals("0")){

              session.invalidate();

              response.sendRedirect("login.jsp");

              return;

       }

%>

<% //校驗分支

       String uid=(String)session.getAttribute("uid");

       if(uid==null){    

              response.setHeader("refresh","3;url=login.jsp");%>

              <b>還沒有登陸系統..

              <span id="spT">3</span>

              <script type="text/javascript">

                     var count=2;

                     setInterval(function(){

                            document.getElementById("spT").innerHTML=count;

                            count--;

                     },1000);

              </script>s後跳轉到登陸頁</b></br><a href="login.jsp">點擊登陸系統</a>

       <%}else{%>

       <b>歡迎,<%=uid%></b></br>

       <a href="index.jsp?t=0">點擊此處註銷</a>

       <%}

%>

4種會話跟蹤

 

 

表單隱藏 和 地址重寫 不安全。

結論:使用session 活着Cookie進行 會話跟蹤。

 

session記錄 用戶的登陸 註銷時間

摘要:

session創建的時間

session.getCreationTime()

session結束的時間

session.getLastAccessedTime()

 

 

<%@ page contentType="text/html;" pageEncoding="GBK"%>

<%

       long start=session.getCreationTime();

       long end=session.getLastAccessedTime();  

       long time=(end-start)/1000;

       response.setHeader("refresh","1;url=test.jsp");

%>

您已經在頁面上提留了<%=time%>秒

 


isNew()判斷新session

 

 

 

 

application對象(this.getServerletContext)

所屬類:javax.servlet.ServletContext

備註:this.getServletContext() 等價於application

表明:整個虛擬目錄 (test1)

 

 

取虛擬目錄絕對路徑

摘要:

this.getServletContext().getRealPath("/")

 

<%@ page contentType="text/html;" pageEncoding="GBK"%>

虛擬目錄絕對路徑:<%=this.getServletContext().getRealPath("/")%></br>


寫文件內容

摘要:

引用的jar

import=」java.io.*」

初始化File對象

File file=new File(path)

判斷目錄存在

file.getParentFile().exists()

建立目錄

file.getParentFile().mkdir()

寫入內容

PrintStream ps=new PrintStream(new FileOutputStream(file));

ps.println(fC);

ps.close();

fos.close();

 

代碼:

test.jsp

<%@ page contentType="text/html;" pageEncoding="GBK"%>

<form action="file.jsp" method="post">

       <table>

       <tr><td>輸入文件名</td><td><input type="text" name="fNa" value="file.txt"></td></tr>

       <tr><td>文件內容</td><td><textarea name="fCo" style="height:200px"></textarea></td></tr>

       <tr><td colspan=2><input type="submit" value="保存"><input type="reset" value="清空"></td><td></td></tr>

       </table>

</form>

<%%>

 

file.jsp

<%@ page contentType="text/html;" pageEncoding="GBK" import="java.io.*"%>

<%

   request.setCharacterEncoding("GBK");

   String fN=request.getParameter("fNa");

   String fC=request.getParameter("fCo");

   String fPath=this.getServletContext().getRealPath("/")+"\\files\\"+fN;

   File file=new File(fPath);

   if(!file.getParentFile().exists()){

         file.getParentFile().mkdir();

   }

   FileOutputStream fos=new FileOutputStream(file);

   PrintStream ps=new PrintStream(fos);

   ps.println(fC);

   ps.close();

       fos.close();

%>

fN:<%=fN%></br>

fC:<%=fC%></br>

fPath:<%=fPath%></br>


讀文件

摘要:

FileInputStream存文件內容

FieInputStream fiStr=

new FileInputStream(this.getServletContext().getRealPath("/")+"\\files\\file.txt")

Scanner逐行取FileInputStream

Scanner scan=new Scanner(fiStr)

遍歷Scan,內容存到String中

String co="";

       while(scan.hasNext()){//逐行讀取

              co+=scan.next();

       }

scan.close();

fis.close();

 

備註:

  文件內容過長時,使用

StringBuffer  buf=new StringBuffer();

buf.append(scan.next());

 

test.jsp

<%@ page contentType="text/html;" pageEncoding="GBK" import="java.util.*" import="java.io.*"%>

<%

FileInputStream fis=new FileInputStream(this.getServletContext().getRealPath("/")+"\\files\\file.txt")

Scanner scan=new Scanner(fis);

       scan.useDelimiter("\n");//使用換行符

       StringBuffer buf=new StringBuffer();

       while(scan.hasNext()){//逐行讀取

              buf.append(scan.next());

       }

       scan.close();

       fis.close();

%>

<form action="file.jsp" method="post">

       <table>

       <tr><td>文件內容</td><td><textarea name="fCo" style="height:200px"><%=buf%></textarea></td></tr>

       <tr><td colspan=2><input type="submit" value="保存"><input type="reset" value="清空"></td><td></td></tr>

       </table>

</form>

<%%>

效果

 

 

訪量計數器

思路:

訪客總數寫到count.txt中

每當session.isNew()時,打開count.txt,取數並加1,保存,返回新數。

 

摘要:

 調試方法,在eclipse的console下進行。比用哪日誌快2h

 讀文件和寫文件

 BigInteger 來記錄數值

test.jsp

<%@ page contentType="text/html;" pageEncoding="GBK" import="java.util.*"%>

<%@ include file="fOper.jsp"%>

 

<%

       String path=this.getServletContext().getRealPath("/")+"\\files\\count.txt"; 

       BigInteger newNum;

    if(session.isNew()){

       synchronized(this){//同步操做,緣由不詳

              newNum=load(path);              

              newNum=newNum.add(new BigInteger("1"));

              save(path,newNum);

        }

   }

   else{

        newNum=load(path);

   }     

%>

您是第<b><%=newNum%></b>個訪;

 

fOper.jsp

<%@ page pageEncoding="GBK" import="java.io.*"%>

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

<%@ page import="java.math.BigInteger"%>

<%!

   public static void save(String path,BigInteger count){  

                 try{

                               FileOutputStream fos=new FileOutputStream(path);

                               PrintStream ps=new PrintStream(fos);

                               ps.println(count);

                               ps.close();

                               fos.close();                                   

                        }        

                      catch(Exception e){

                            e.printStackTrace();

                            return;

                      }            

                 }

   //測試,在eclipse下進行.

    public static BigInteger load(String path){

                     try{       

                            FileInputStream fis=new FileInputStream(path);                    

                            Scanner scan=new Scanner(fis);

                            scan.useDelimiter("\n");//使用換行符

                            BigInteger count=new BigInteger("0"); //can't use 0 for para

                            while(scan.hasNext()){//逐行讀取                            

                                   count=new BigInteger(scan.nextLine().trim());                

                            }                  

                            scan.close();

                            fis.close();                  

                            return count;

                     }

                     catch(Exception e){

                            e.printStackTrace();

                            return new BigInteger("0");

                     }

          }     

%>

 

 

 

 

getAttributeNames 遍歷屬性

 

摘要:

獲取AttrNames

this.getServletContext().getAttributeNames()

Enumeration

獲取某個attr的值

this.getServletContext().getAttribute(name)

 

<%@ page contentType="text/html;" pageEncoding="GBK"%>

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

<%

  Enumeration es=this.getServletContext().getAttributeNames(); 

  while(es.hasMoreElements()){

       String na=(String)es.nextElement();     

       %>

       Name:<%=na%>,Value:<%=this.getServletContext().getAttribute(na)%></br>

  <%}%>

config對象

命名空間:javax.servlet.ServletConfig

表明:web.xml對象的init-param

 

 

取DbDriver, DbUrl, usr, psw. 參見 web.xml配置

PageContext對象

 

 

 

pageContext的等價操做

page.Context

相同

pageContext.forward("login.jsp");

 

<jsp:forward page="login.jsp"></jsp:forward>

pageContext.include("login.jsp");

<jsp:include page="login.jsp"></jsp:include>

pageContext.getServletConfig()

config

 

 

 

不等價

pageContext.getServletRequest()取的對象是HttpServletRequest,不是request。

pageContext.getServletResponse()取的對象是HttpServletResponse,不是response.

 

備註:

pageContext在 jsp標籤開發中 常見。不多直接使用。

 

 


JavaBean 規範 C7

爲啥有JavaBean規範?

將Class寫成 JavaBean組件,提升開發效率。

 

JavaBean被誰用?

Servlet和JSP.

JavaBean 規範的內容(對class)

 

1. Class必須放在某個Package中

2. Class必須用public聲明

3.Class必須包含無參數構造函數

 

4. 屬性必須用private聲明

5. 要被外界操做的屬性,則必須聲明setter和Getter

6 屬性必須用小寫字母開頭(很重要!,不然jsp:setProperty 沒法自動賦值屬性)

 

上述5條都知足的class, 即符合JavaBean 的Class.

 

JavaBean的類別

1

簡單JavaBean

只包含 屬性,setter,getter

2

POJO

 

3

VO

 

4

TO

屬性,setter,getter, Serializable接口

 

 

 

 

簡單javaBean

備註: Java默認生成不帶參數的構造函數

class Person{

   private String name;

   private int age;

    public Person(){};

   public void setName(String name){

      this.name=name;

   }

   public String getName(){

      return this.name;

   }

   public void setAge(int age){

      this.age=age;

   }

   public int getAge(){

      return this.age;

   }

}

 

打包 和 調用兩種方式

摘要

打包

方法1:export jar包

方法2:javac –d  目錄

最後,扔到classes目錄下

調用

方法1:在jsp頁面中 import=」pkg.*」

方法2:

<jsp:useBean class="pkgTest.Person" id="p1" scope="page"></jsp:useBean>

scope的取值:page, request, session, application

 

 

import Jar調用JavaBean

<%@ page language="Java" pageEncoding="GBK" import="pkgTest.*"%>

<%

  Person p1=new Person();

  p1.setName("高承荀");

  p1.setAge(26);

%>

姓名:<%=p1.getName()%><br></br>

年齡:<%=p1.getAge() %>

jsp:useBean class=」」 scope=」page」 id=」objName」

 

<%@ page language="Java" pageEncoding="GBK""%>

<jsp:useBean class="pkgTest.Person" id="p1" scope="page"></jsp:useBean>

姓名:<%=p1.getName()%><br></br>

年齡:<%=p1.getAge() %>

jsp useBean-Property  簡化表單映射

 

摘要:

原始

jsp

 loop{ //n次

   obj.setPropertiy(request.getParameter)

}

jsp:setProperty

name=javaBeanId property=」*」

兩句將表單中全部 name值映射到

obj對應property上

備註:Model必須符合JavaBean規範6條。不然賦值爲null

 

login.htm

<!DOCTYPE HTML>

<html>

<head></head>

<body>

<form action="test.jsp" method="post">

 <div>姓名:<input type="text" name="name" value="高承荀"></div>

 <div>年齡:<input type="text" name="age" value="26"></div>

 <div>郵箱:<input type="text" name="email" value="1695539064@qq.com"></div> 

 <div><input type="submit" value="提交"></div>

</form>

</body>

</html>

test.jsp

<%@ page language="Java" pageEncoding="GBK"%>

<% request.setCharacterEncoding("GBK");%>

<jsp:useBean class="pkgTest.Person" id="p1" scope="page"></jsp:useBean>

<jsp:setProperty name="p1" property="*"/>

姓名:<%=p1.getName()%></br>

年齡:<%=p1.getAge()%></br>

郵箱:<%=p1.getEmail()%>

 

jsp:setPropery  4種設置方式

 

1

property=」*」

自動 name-property映射

2

property=」屬性名」

只爲某property賦值

3

property=」屬性名」 param=」參數名」

property 得到指定 name值

4

property=」屬性名」 value=」內容」

perperty得到value值

 

只爲某property賦值

<%@ page language="Java" pageEncoding="GBK"%>

<% request.setCharacterEncoding("GBK");%>

<jsp:useBean class="pkgTest.Person" id="p1" scope="page"></jsp:useBean>

<jsp:setProperty name="p1" property="name"/>

姓名:<%=p1.getName()%></br>

年齡:<%=p1.getAge()%></br>

郵箱:<%=p1.getEmail()%>

 

效果

 

property 得到指定 name

<jsp:useBean class="pkgTest.Person" id="p1" scope="page"></jsp:useBean>

<jsp:setProperty name="p1" property="name" param="age"/>

<jsp:setProperty name="p1" property="email" param="name"/>

姓名:<%=p1.getName()%></br>

年齡:<%=p1.getAge()%></br>

郵箱:<%=p1.getEmail()%>

 

姓名:26
年齡:0
郵箱:高承荀

 

property得到指定value

<jsp:useBean class="pkgTest.Person" id="p1" scope="page"></jsp:useBean>

<jsp:setProperty name="p1" property="name" value="姓名"/>

<jsp:setProperty name="p1" property="age" value="123"/>

<jsp:setProperty name="p1" property="email" value="jjkjkkj"/>

姓名:<%=p1.getName()%></br>

年齡:<%=p1.getAge()%></br>

郵箱:<%=p1.getEmail()%>

姓名:姓名
年齡:123
郵箱:jjkjkkj

 

jsp:getPropery 獲取屬性

摘要

取obj某個property

<jsp:getProperty name=」objID」 property=」屬性名」/>

效果等價於<%=obj.getProperty()%>

 

<jsp:setProperty name="p1" property="name" value="姓名"/>

姓名:<jsp:getProperty name="p1" property="name"/>

姓名:姓名

 

JavaBean scope 屬性

描述:obj的生存週期

1

page

頁面內有效,跳轉後失效。

2

request

請求內有效。(若是服務器端跳轉到b.jsp,則b.jsp中有效)。

迴應完請求則失效。

3

session

一次會話內有效。

瀏覽器關閉失效。

4

application

保存在服務器上。

服務器重啓/關閉 失效。

 

刪除JavaBean

摘要

序號

scope

刪除語句

1

page

pageContext.removeAttribute(id);

2

request

request.removeAttribute(id);

3

session

session.removeAttribute(id);

4

application

application.removeAttribute(id);

 

 

 


應用- 註冊功能

索引:Page 200

藍圖

 

 

詳情:jspCode\register

摘要:

1

index.jsp 同時具有顯示空白和提示功能

<%@ page language="Java" pageEncoding="GBK"%>

<jsp:useBean id="person" scope="request" class="pkgTest.Person"></jsp:useBean>

<form action="check.jsp" method="post">

<div>姓名:<input type="text" name="name" value="<%=person.getName()%>"/><%=person.getError("nameEr")%></div>

<div>年齡:<input type="text" name="age" value="<%=person.getAge()%>"/><%=person.getError("ageEr")%></div>

<div>郵箱:<input type="text" name="email" value="<%=person.getEmail()%>"/><%=person.getError("emailEr")%></div>

<div><input type="submit" value="提交"></div>

</form>

 

//構造函數中,默認設置Name,Age,Email爲空; JavaBean的無參數構造函數~

//getError中默認若是取到的是null,則返回」」

2

check.jsp

引用index.jsp中的javaBean對象

<jsp:useBean class="pkgTest.Person" id="person" scope="request"></jsp:useBean>

<jsp:setProperty name="person" property="*"></jsp:setProperty>

 

 

 

3

person.java中將age設置成String

 

   private String name;

   private String age;

   private String email;

   private Map<String,String> errors=null;

  

//好處:全部項都能用Regex校驗

//JavaBean的set,get不會出現type不匹配

 

 

4

無參數構造函數

  public Person(){

       this.name="";

       this.age="";

       this.email="";

       this.errors=new HashMap<String,String>();

    };

5

Map和HashMash

表示

[{key,value}]

//添加 errors.put("emailEr", "郵箱格式不正確");

//獲取 this.errors.get(key)

//Map是一個 [{key,value}]

//這樣初始化this.errors=new HashMap<String,String>();

6

正則驗證

姓名:if(!this.name.matches("\\w{6,15}")){

年齡:if(!this.age.matches("\\d+")){

郵箱:if(!this.email.matches("\\w+@\\w+\\.\\w+\\.?\\w*")){

 

7

兩種實現思路

第1: index.htm+Servlet

第2: index.jsp+check.jsp

 

index.jsp 和check.jsp 間使用服務端跳轉 到出錯頁

check.jsp和index.jsp間使用服務端跳轉

 

 


Web開發模式

JSP-JavaBean-數據庫 模式

 

摘要:

 

JSP單職責模式

職責

缺點

JSP

顯示,流程控制

流程控制和前端在一塊兒。

維護困難。

JavaBean

數據庫操做

 

數據庫

 

 

 

 

 

MVC模式

Model-View-Controller

 

 

Model層

JavaBean類。

View層

JSP頁。

接收Servlet內容,生成和顯示數據。

Controller層

處理全部http請求。

解析參數,進行流程控制。

 

 

 

關鍵:

Servlet中requestDistpatcher(「test.jsp」).forward(request,response)

Servlet到jsp使用request記錄屬性

 

 

 

MVC模式下,JSP的4規範

目的:確保jsp簡潔,

 

1. 接收屬性

2. 判斷屬性存在,流程控制

3. 使用迭代或者Model進行輸出

4. 只許import 「java.util.*」包

 

 

 

 


應用 MVC模式 的登陸功能

//不足:(1)界面不美觀(2)未加密post (比ajaxHtm+Servlet+JavaBean的MVC)

//做戰目的: 熟悉  JSP+Servelet+JavaBean的MVC

            記住 JSP頁面的4個規範

 

數據庫準備

 使用Account數據庫

 

代碼清單

ClsDbConfig

數據庫配置(driver,url,usr,psw)

取得Connection

關閉Connection

成員:

private,...

private Connection conn

 

方法:

public Connection getConnection

ClsDbOper

 

方法:

  public static boolean checkAccount

Account

JavaBean

成員:

 ID,usrName,password

 Map<String,String> 

 

方法:

 public boolean isValidate()

 public String getError(String key)

 

svt

 

接收requestParameter

調用isValidate

--

case 校驗不經過,

req.setAttribute(「info」,info);

request.getRequestDispatcher(「test.jsp」)

.forward(req,res);

 

case 校驗經過,isValidate未經過

req.setAttribute(「info」,info)

req.getRequestDispatcher(「url」)

.forward(req,res)

 

case 校驗經過,isValidate經過

session.setAttribute(「uid」,uid)

response.sendRedirect(url);

--

 

login.jsp

 

登陸界面

錯誤提示

輸入校驗

 

index.jsp

校驗session(「uid」)

case經過:歡迎

case未經過:

response.sendRedirect(「login.jsp」)

 

 

 

做戰開始:14:23

完成時間:16:18

2h

 

 

 

 

設計模式

數據訪問- DAO模式

DAO: Data Access Object

功能:實現CRUD功能

 

各層的功能

類別

功能

編碼規則

客戶層

瀏覽器(B/S架構)

 

顯示層

JSP/Servlet頁面效果顯示。

 

業務層

從客戶的角度,就是一個功能。

從代碼的角度,就是調用一組數據層函數。

 

數據層

CRUD操做。 直接操做數據庫

DAO類軍規:

1.DAO類名與表名相同

2.DAO類添加,更改,刪除 以 do開頭。

舉例:

Emp doCreat(Emp)

Emp doUpdate(Emp)

boolean doDelete(int ID)

 

3.DAO類查詢 以find,

get開頭

List<Emp>  doFind(String key)

Emp doGet(int ID)

 

Model類軍規:

Model類JavaBean規範

 

 

 

 

 

 

應用 DAO-僱員管理系統

戰鬥序列:

 數據庫設計

(1)字段-類型-約束

(2)建立表-添加數據

 

Model類設計

    (1)類名同表名

(2)JavaBean規範開發Model類

 

DataConnection類設計

   (1)定義Driver,DbUrl,usr,psw

(2)實現getConnection()和close方法

 

DAO類設計

 

數據庫設計

類型

約束

ID

Number

主鍵,自增

Name

varchar(10)

非空

Job

varchar(9)

非空

EmpDate

varchar(10)

僱傭日期

sal

number

薪水

min 10

 

Model類設計

 

package pkgEmp;

import java.util.HashMap;

import java.util.Map;

public class Emp{

   private int id;

   private String name;

   private String job;

   private String empDate;

   private String salary;  

   private Map<String,String> errors=null;

   public Emp(){

      this.id=-1;

      this.name="";

      this.job="";

      this.empDate="";

      this.salary="";

      this.errors=new HashMap<String,String>();

   }

   public boolean isValidate(){

      boolean flag=true;

      if(!this.name.matches("\\w{2,10}")){

         flag=false;

         this.errors.put("erN","姓名長度必須是2~10");

         System.out.println("Name:"+this.name+".  erN,姓名長度必須是2~10");

         return flag;

      }

      if(this.job!=null&&this.job.length()==0){

         flag=false;

         this.errors.put("erJ","工做不能爲空");

         System.out.println("erJ工做不能爲空");

         return flag;

      }

      if(!this.salary.matches("\\d+")){

         flag=false;

         this.errors.put("erS","薪水必須是數值");

         System.out.println("erS薪水必須是數值");

         return flag;

      }

      System.out.println(flag);

      return flag;

   }

   public String getError(String key){

      if(this.errors.get(key)==null){return "";}

      return this.errors.get(key);

   }

   public int getID(){

      return this.id;

   }

   public void setID(int id){

      this.id=id;

   }

   public String getName(){

      return this.name;

   }

   public void setName(String str){

      this.name=str;

   }

   public String getJob(){

      return this.job;

   }

   public void setJob(String str){

      this.job=str;

   }

   public String getEmpDate(){

      return this.empDate;

   }

   public void setEmpDate(String str){

      this.empDate=str;

   }

   public String getSalary(){

      return this.salary;

   }

   public void setSalary(String str){

      this.salary=str;

   }

}min5

 

DbConnection類

private DbDriver

 

private DbUrl

 

private Usr

 

private Psw

 

public static getCoonection

return this.conn

 

public class DbConnection {

   public static final String DbDriver="oracle.jdbc.driver.OracleDriver";

   public static final String DbUrl="jdbc:oracle:thin:@localhost:1521:orcl";

   public static final String Usr="test";

   public static final String Psw="test"; 

   public static Connection getConnection() throws ClassNotFoundException, SQLException{

      Connection con=null;

      Class.forName(DbDriver);

      con=DriverManager.getConnection(DbUrl, Usr, Psw);

      return con;

   }

}

min 10

 

 

 

 

DAO類設計

public Emp doCreate(Emp emp)

public List<Emp> find(String key)

public Emp getById(int ID)

 

 public static Emp doCreate(Emp emp) throws ClassNotFoundException, SQLException{

       Connection con=DbConnection.getConnection();   

       String sqlStr="insert into emp(Name,Job,EmpDate,Salary) values('"+emp.getName()+"','"+emp.getJob()+"','"+emp.getEmpDate()+"',"+emp.getSalary()+") returning ID into :1";

       OraclePreparedStatement pstmt =(OraclePreparedStatement)con.prepareStatement(sqlStr); 

       pstmt.registerReturnParameter(1, Types.NUMERIC); 

       pstmt.executeUpdate(); 

       ResultSet rs=pstmt.getReturnResultSet(); 

       rs.next(); 

       emp.setID(rs.getInt(1)); 

       rs.close(); 

       pstmt.close();         

       con.close();

       return emp;

   }

   public static List<Emp> find(String key) throws ClassNotFoundException, SQLException{

      List<Emp> li=new ArrayList<Emp>();

      Connection con=DbConnection.getConnection();

      String sqlStr="select ID,Name,Job,EmpDate,Salary from emp";

      if(!key.equals("")){sqlStr+=" where Name like '%"+key+"%'";}

      Statement stmt=con.createStatement();

      ResultSet rs=stmt.executeQuery(sqlStr);

      while(rs.next()){

         Emp emp=new Emp();

         emp.setID(rs.getInt("ID"));

         emp.setName(rs.getString("Name"));

         emp.setJob(rs.getString("Job"));

         emp.setEmpDate(rs.getString("EmpDate"));

         emp.setSalary(rs.getString("Salary"));

         li.add(emp);

      }

      return li;

   }

   public static Emp getById(int ID) throws SQLException, ClassNotFoundException{

      Connection con=DbConnection.getConnection();

      String sqlStr="select ID,Name,Job,EmpDate,Salary from emp where ID="+ID;

      Statement stmt=con.createStatement();

      ResultSet rs=stmt.executeQuery(sqlStr);

      Emp emp=new Emp();

      while(rs.next()){       

         emp.setID(rs.getInt("ID"));

         emp.setName(rs.getString("Name"));

         emp.setJob(rs.getString("Job"));

         emp.setEmpDate(rs.getString("EmpDate"));

         emp.setSalary(rs.getString("Salary"));        

      }

      return emp;

   }

 

min20

 

測試DAO

/*

      for(int i=0;i<=4;i++){

         Emp emp=new Emp();

         emp.setName("李興華"+i);

         emp.setJob("程序員"+i);

         emp.setEmpDate("2012-01-0"+i);

         emp.setSalary(String.valueOf(1000*(i+2)));

         doCreate(emp);

      }*/

      /*

      List<Emp> emps=find("李");

      for(int i=0;i<=emps.size()-1;i++){

         System.out.println(emps.get(i).getName());

      }

      */

      /*

      Emp emp=getById(2);

      System.out.println(emp.getName());

      */

min10

 


Jsp 添加

insert.jsp

字段信息輸入,提示信息錯誤

doCreate.jsp

校驗信息,執行添加。

添加成功則顯示。

添加失敗則跳轉到insert.jsp並提示錯誤。

insert.jsp

<%@ page language="Java" pageEncoding="GBK"%>

<%request.setCharacterEncoding("GBK");%>

<jsp:useBean id="emp" class="pkgEmp.Emp" scope="request"/>

<form action="doCreate.jsp" method="post">

<table>

   <tr><td>姓&nbsp;&nbsp;名</td><td><input type="text" name="name" value="<%=emp.getName()%>"/></td><td><%=emp.getError("erN")%></td></tr>

   <tr><td>職&nbsp;&nbsp;位</td><td><input type="text" name="job" value="<%=emp.getJob()%>"/></td><td><%=emp.getError("erJ")%></td></tr>

   <tr><td>受聘日期</td><td><input type="text" name="empDate" value="<%=emp.getEmpDate()%>"/></td><td><%=emp.getError("erE")%></td></tr>

   <tr><td>薪&nbsp;&nbsp;資</td><td><input type="text" name="salary" value="<%=emp.getSalary()%>"/></td><td><%=emp.getError("erS")%></td></tr>

   <tr><td colspan=3><input type="submit" value="提交"/></td></tr>

</table>

</form>

 

 

doCreate.jsp

<%@ page language="Java" pageEncoding="GBK" import="pkgEmp.*"%>

<%request.setCharacterEncoding("GBK");%>

<jsp:useBean class="pkgEmp.Emp" id="emp" scope="request"/>

<jsp:setProperty name="emp" property="*"/>

<%if(emp.isValidate()){

   Emp emp2=DbOper.doCreate(emp);

   if(emp2.getID()!=-1){%>

      <h1>添加成功</h1>

      姓名:<%=emp2.getName()%><br/>

      工做:<%=emp2.getJob()%><br/>

      受聘日期:<%=emp2.getEmpDate()%><br/>

      薪水:<%=emp2.getSalary()%>

   <%}else{%>

      <jsp:forward page="insert.jsp"/>

   <%}%>

<%}else{%>

      <jsp:forward page="insert.jsp"/>

<%}%>


 

Jsp顯示

list.jsp

查詢關鍵字輸入框

--

table顯示信息

list.jsp

<%@ page language="Java" pageEncoding="GBK" import="pkgEmp.*"%>

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

<%

    request.setCharacterEncoding("GBK");

   String key="";

   key=request.getParameter("key")==null?"":request.getParameter("key");  

   List<Emp> emps=DbOper.find(key);

   String dataStr="";

%>

<form action="emp_list.jsp" method="post">

<div>請輸入查詢關鍵字:<input type="text" value="" name="key"/><input type="submit" value="查詢"></div>

<table border=1><tr><td>姓名</td><td>工做</td><td>入職日期</td><td>薪資</td></tr>

<%for(int i=0;i<=emps.size()-1;i++){ %>

<tr><td><%=emps.get(i).getName()%></td><td><%=emps.get(i).getJob()%></td><td><%=emps.get(i).getEmpDate()%></td><td><%=emps.get(i).getSalary()%></td></tr>

<%}%>

</table>

</form>

 


文件上傳

smartUpload手冊

參考jspsmartupload.zip

 

圖片上傳

jar包:jspSmartUpload.jar

特色:(1)可限制類型

      (2)獲取文件名、類型、尺寸

額外依賴:

   jsp-api.jar    (tomcat自帶)

   servlet-api.jar  (tomcat自帶)

 

備註:放在lib目錄下

 

摘要:

  (1)表單中使用 <input type=」file」 name=」」/>上傳

任務

upload.htm

(1) <input type=」file」 name=」」/>

   input標籤 上傳

(2) form action=」su」

   指向svt

pkgUpload.ClsUpload

(1)取文件-檢查合法性-保存-頁面跳轉

 

依賴項

(1)jsp-api.jar

(2)servlet-api.jar

(3)jspSmartUpload.jar

 

 

upload.htm

<HTML>

<BODY BGCOLOR="white">

<H1>jspSmartUpload : Sample 1</H1>

<HR>

<FORM METHOD="POST" ACTION="su" ENCTYPE="multipart/form-data">

   <INPUT TYPE="FILE" NAME="FILE1" SIZE="50"><BR>  

   <INPUT TYPE="SUBMIT" VALUE="Upload">

   <input type="text" name="info" value="test photp"/>

</FORM>

</BODY>

</HTML>

 

ClsUpload.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      // TODO Auto-generated method stub

        //存儲路徑

          String filePath = "F:\\Workspaces\\UI05\\UI05\\WebContent\\upload\\";

           String messages="";

           String forward="";

          

           SmartUpload su = new SmartUpload();   

           long maxsize = 2 * 1024 * 1024;// 設置大小,爲2MB

           String allowedFilesList = "jpg,gif,bmp,png";//容許文件

//拒絕文件        

String denidFilesList = "exe,bat,jsp,htm,html,,";  

                  

           try {            

               su.initialize(this.getServletConfig(), request, response);        //初始化

               su.setMaxFileSize(maxsize);                                     // 限制上傳文件的大小

               su.setAllowedFilesList(allowedFilesList);                        // 設置容許上傳的文件類型

               su.setDeniedFilesList(denidFilesList);  

               su.upload();                                                    // 上傳文件                             

                                           

              // 獲取上傳的文件,由於只上傳了一個文件,因此可直接獲取

                File file = su.getFiles().getFile(0);

                // 若是選擇了文件

                if (!file.isMissing()) {            

                //獲取當前時間並格式化爲字符串

                    String now = new Date().getTime() + "";                  

                   //filePath值

                    String photoAddr=filePath + now + "."+file.getFileExt();       

                    System.out.println(photoAddr);                                 

                    file.saveAs(photoAddr,File.SAVEAS_PHYSICAL);

                }else{

                System.out.println("file is Missing()");

                    messages="請選擇要上傳的文件!";

                    forward="/admin/error.jsp";

                }               

                          

           }catch (java.lang.SecurityException e){

             System.out.println("上傳失敗82");

               messages="<li>上傳文件失敗!上傳的文件類型只容許爲:jpg,gif,bmp</li>";

               forward="/admin/error.jsp";           

           }catch (SmartUploadException e) {

             System.out.println("上傳失敗86");

               messages="上傳文件失敗!";

               forward="/admin/error.jsp";

               e.printStackTrace();

           } catch (SQLException e) {

             System.out.println("92");

               e.printStackTrace();

           }               

           request.setAttribute("messages",messages);       

           request.getRequestDispatcher(forward).forward(request, response);      

   }

}

 


混合表單處理

背景:客戶端form中包含照片 和 備註信息

 

摘要:

    SmartUpload su = new SmartUpload();

      su.initialize(this.getServletConfig(),request, response);

      su.setAllowedFilesList("jpg,gif,bmp,png");//容許文件 

      su.setMaxFileSize(2 * 1024 * 1024);// 設置大小,爲2MB

su.getRequest.getParameter(「info」)

取備註信息

su.getFiles().getFile(0)

取文件

 

htm

<!Doctype HTML>

<html><head><meta charset="GBK"/></head>

<body>

<form action="sa" method="post" enctype="multipart/form-data">

<table><tr><td>姓名</td><td><input type="text" name="name"/></td></tr>

<tr><td>照片</td><td><input type="file" name="photo"/></td></tr>

<tr><td colspan=2><input type="submit" value="提交"/><input type="reset" value="重置"/></td></tr>

</table>

</form>

</body>

</html>

 

svt

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

   request.setCharacterEncoding("GBK");

   SmartUpload su = new SmartUpload();

   su.initialize(this.getServletConfig(),request, response);

   su.setAllowedFilesList("jpg,gif,bmp,png");//容許文件 

   su.setMaxFileSize(2 * 1024 * 1024);// 設置大小,爲2MB 

   Map<String,String> info=new HashMap<String,String>();

  

   try {

      su.upload();

   } catch (SmartUploadException e1) {

      e1.printStackTrace();

      info.put("false", "上傳發生錯誤");

   }           

    String name=su.getRequest().getParameter("name");        

    File fi=su.getFiles().getFile(0);                      

    if(!info.isEmpty()){

       request.setAttribute("failReason",info.get("false"));

       request.getRequestDispatcher("/re.jsp").forward(request,response);

       return;

    }       

    String fiName=new Date().getTime()+"."+fi.getFileExt();

    System.out.println(fiName);

    try {

      fi.saveAs(this.getInitParameter("dirPic")+"\\"+fiName,File.SAVEAS_PHYSICAL);

   } catch (SmartUploadException e) {  

      e.printStackTrace();

      request.setAttribute("failReason","保存發生錯誤");

      request.getRequestDispatcher("/re.jsp").forward(request,response);

      return;

   }

    request.removeAttribute("failReason");

    System.out.println(name);

    request.setAttribute("name",name);

    //request.setAttribute("url","/pics/"+fiName);//host/pics/

    request.setAttribute("url","pics/"+fiName);//host/vir/pics

    request.getRequestDispatcher("/re.jsp").forward(request,response);

    return;

}

 

re.jsp

<%@ page language="Java" contentType="text/html" pageEncoding="GBK"%>

<% if(request.getAttribute("failReason")!=null){%>

<b>保存失敗,緣由:</b><h3><%=request.getAttribute("failReson")%></h3>

<%}else{%>

 <b>保存成功</b>

 <div>姓名:<%=request.getAttribute("name")%></div>

 <div><img alt="照片" src="<%=request.getAttribute("url")%>"/></div>

<%  }%>

 

 

 

Servlet

背景知識

Servlet本質

繼承了HttpRequest的 java類。 它是一個.java文件

依賴項

  將tomcat/lib/servlet-api.jar拷貝到Web-inf/lib目錄下

結構

pkgSvt

  ClsSvt

引用

Export jar到:

WebContent/WEB-INF/classes

web.xml映射

<web-app>

<servlet>

  <servlet-name>sA</servlet-name>

  <servlet-class>pkgSvt.ClsSvt</servlet-class>

</servlet>

<servlet-mapping>

  <servlet-name>sA</servlet-name>

  <url-pattern>pkgSvt.ClsSvt</url-pattern>

<servlet-mapping>

</web-app>

 

 

 

svt比CGI的優點

svt多線程, 項目比CGI高。

 

 

 

 

第一個Servlet

建立Servlet

1.建立servlet, 輸入package Name(對應nameSpace和className(servletName)

 

package servletPack;

public class ReqHandler extends HttpServlet {//繼承HttpServlet

 

備註:servletPack.ReqHandler 以後將寫入 servlet-class

 

2.把這個java的doGet寫上代碼。

 

// TODO Auto-generated method stub

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      // TODO Auto-generated method stub

      PrintWriter print=response.getWriter();

       String result="<html><head></head><body><h1>Hello World</h1></body></html>";

       print.print(result);

   }

 

 

 

 

 

 

 

 

 

 

 

 

將servletPackage導出成jar,並拷貝到WebContent/Web-inf/classes目錄下

 

 

web-inf\web.xml 配置信息

 

在Web-Inf的Web.xml中添加請求映射

 

 

<?xml version="1.0" encoding="utf-8"?>

<web-app>

<servlet>

<servlet-name>SvtHello</servlet-name>

<servlet-class>pkgResiCrud.SvtHello</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>SvtHello</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping>

</web-app>

 

 

備註:

1. <servlet>標籤下的<servlet-name>與<servlet-mapping>下的<servlet-name>相同

 2.s<servlet-class>寫packageName.servletName

 3.servlet-name不要和url-pattern徹底相同,不然tomcat沒法啓動,譬如

<servlet-mapping>

<servlet-name>SvtHello</servlet-name>

<url-pattern>/SvtHello</url-pattern>

</servlet-mapping>

 

便可

 

 

訪問url:

http://ip/webAppName/hello

訪問url,測試

 


獲取Ajax的postData

結論:request.getInputStream

//數據流

      ServletInputStream inpStream=request.getInputStream();

      //數據流總長

      int dataLength=request.getContentLength();

      //已讀長度

      int readLength=0;

      //本次讀取長度

      int curLength=0;     

      //存放數據流的 byte數組

      byte[] byteArr=new byte[dataLength];

      while(readLength<dataLength){

         curLength=inpStream.read(byteArr);

         readLength+=curLength;

      }

     

      String dataString=new String(byteArr,"utf-8");

      System.out.println("dataGet:"+dataString);


獲取form.submit的data

結論:request.getParameter(name)

 

test.html

<script>

function bindEvents(){

   $("#btnTest1").on("click",function(){

      $("#frmDownload")[0].action="../resiCrud";

      var postData={cmd:5,data:null};

      $("#inpPostData").val(JSON.stringify(postData));    

      $("#frmDownload")[0].submit();

   });

}

</script>

 

<body>

<input type="button" id="btnTest1" value="getXls"/>

<form id="frmDownload" method="post" style="display:none">

   <input type="text" name="postData" id="inpPostData"/>

</form>

</body>

 

 

servlet

String postData=request.getParameter("postData");

      System.out.println(postData);

 

獲取url中的參數

結論:request.getQueryString()

 

test.html

function bindEvents(){

   $("#btnTest1").on("click",function(){

      $("#frmDownload")[0].action="../resiCrud?para1=1&para2=2";

      var postData={cmd:5,data:null};

      $("#inpPostData").val(JSON.stringify(postData));    

      $("#frmDownload")[0].submit();

   });

}

</script>

</head>

<body>

<input type="button" id="btnTest1" value="getXls"/>

<form id="frmDownload" method="post" style="display:none">

   <input type="text" name="postData" id="inpPostData"/>

</form>

</body>

 

servlet

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      // TODO Auto-generated method stub         

      String postData=request.getParameter("postData");

      System.out.println("postData:"+postData);

      String queryStr=request.getQueryString();

      System.out.println("queryString:"+queryStr);

      ....

 

輸出結果:

postData:{"cmd":5,"data":null}

queryString:para1=1&para2=2

衝突 getParameter和getInputStream()

 

結論:

   對象HttpServletRequest, getParameter()執行以後,會讓getInputStream()的值發生改變。反之亦然。

 

because POST data can be read only once

 

  

解決方法:

在url中添加queryString。暗示使用getParameter仍是getInputStream來獲取request參數

 

 

        //從form來 

        String queryStr=request.getQueryString(); 

        System.out.println("queryString:"+queryStr);

      //從getInputStream中取參數

        if(queryStr==null){

         

       }

//從getParameter中取參數

    else if(queryStr.equals("para")){

    }

 


取config,session, application對象

 

config

this.getServletConfig()

session

request.getSession()

application

this.getServletContext()

 

 


svt中取servlet initParam

摘要:

 init-param 存在於 servlet標籤下。不能直接放在web-app目錄下。

 一個servlet標籤下能夠存放多個init-param

web.xml配置

在對應servlet標籤下 添加 <init-param>

svt中獲取

使用this.getServletContext.getInitParameter(「name」)

 

  <servlet>

    <servlet-name>sA</servlet-name>

    <servlet-class>pkgSu.ClsSu</servlet-class>

    <init-param>

      <param-name>dirPic</param-name>    <param-value>F:\\Workspaces\\UI05\\UI05\\WebContent\\pics</param-value>

    </init-param>

  </servlet>

 

      this.getServletContext().getInitParameter(「dirPic」)

 

 


svt 客戶端跳轉

 

response.sendRedirect("http://www.baidu.com");

 

svt服務端跳轉

摘要:等價於 <jsp:forward page=」」 />

request.getRequestDispatcher(url).forward(request, response);

 

參數:url-要跳轉的路徑。 request-傳遞參數,response-傳遞參數

 

 

Svt返回頁面

摘要:

設置頁面字符串

StringBuffer.append(「<html>...</html>」);

response 頁面字符串

 PrinterWriter pw=reponse.getWrite();

 pw.write(buf.toString());

 pw.close()

 

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      // TODO Auto-generated method stub

      this.doPost(request, response);

   }

 

   /**

    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

    */

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      // TODO Auto-generated method stub

      StringBuffer buf=new StringBuffer();

      response.setCharacterEncoding("utf-8");

      buf.append("<!Doctype html><html><head><meta charset='utf-8'></head><body>");

      buf.append("<h1>Page write by PrinterWriter</h1><h2>測試Svt輸出頁</h2></body><html>");

      PrintWriter pw=response.getWriter();

      pw.write(buf.toString());

      pw.close();//關閉響應

   }


ajax,jsp,svt製做頁面比較

結論:使用ajax製做頁面,使用svt處理請求

方便程度排序:

Ajax>jsp>svt

代碼分離程度:

Ajax>jsp>svt

 

思路

工具

ajax

html,css,jq,js

jsp

<%%>

html

svt

StringBuffer

PriterWriter

 

Servlet生命週期

 

階段

前件

時間

初始化

int()

(1)jar在class目錄下

(2)web.xml 中servletMapping

web容器啓動時

(tomcat\bin\startup)

服務

doGet(),doPost()

初始化完成

接到http請求

停止,釋放

destroy()

 

如下任意:

 (1)web容器關閉

 (2)接到卸載svt指令

 

 

 

過濾Servlet

摘要:

 

做用

限制客戶對WebContent中資源的訪問

本質

實現了 servlet.Filter的 java Class

 

主要方法:

init()

web容器啓動時,調用FilterConfig取得配置參數

doFilter()

完成過濾操做

destroy()

結束過濾器,釋放資源

 

 



 

                    

 


 

 

 

 

 


 

 

 

ResultSet

獲取記錄條數

   Class.forName("oracle.jdbc.driver.OracleDriver");

     

      Connection conn=DriverManager.getConnection("");

      Statement std=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

      String sqlStr="select * from Resident";

      ResultSet rs=std.executeQuery(sqlStr);

     

      //獲取記錄條數.

      int rowCount=0;      

      rs.last();

      rowCount=rs.getRow();

      System.out.println("rowCount:"+rowCount);

      //將cursor移到第一條

      rs.first();

     

     

      String result="[";      

      while(rs.next()){

         //Todo.....

      }

遍歷全部字段

停用:

rs.getString(0) 值會變化,停用

 

使用:

rs.getString(「Name」);                                  


正則-String

Java 正則

分組

String Str="{District:4,hyID:6,IsActivated:2}";

      //(?<dVal>\\d),將\\d存儲到group,dVal中

       Pattern pat = Pattern.compile("District:(?<dVal>\\d),");

       Matcher m = pat.matcher(Str);           

       while(m.find()) {

           System.out.println(m.group("dVal"));//group(para),para即分組號

        }

       

      //(\\d),()將被分組,從1開始編號.讀取 用m.group(1). 備註:group(0)對應整個匹配項

       Pattern pat2 = Pattern.compile("District:(\\d),"); 

       m=pat2.matcher(Str);

       while(m.find()) {

           System.out.println(m.group(1));//group(para),para即分組號

        }

 

輸出:

4

4

姓名-年齡-郵箱

姓名:if(!this.name.matches("\\w{6,15}")){

年齡:if(!this.age.matches("\\d+")){

郵箱:if(!this.email.matches("\\w+@\\w+\\.\\w+\\.?\\w*")){


String

replaceAll替換字符串中的全部 \」null\」

背景:rs.getString(「Address」)會將null值表示成 \」null\」.

返回給前端的JSON串要寫成Address:」」

 

  String oStr="\"null\" is null";

     String dStr=oStr.replaceAll("\"null\"","\"\"");

     System.out.println("dString is:"+dStr);

 

字符串相等

 在編程中,一般比較兩個字符串是否相同的表達式是「==」,但在Java中不能這麼寫。在Java中,若是要比較a字符串是否等於b字符串,須要這麼寫:

      if(a.equals(b)){

      }

 

緣由:

因爲字符串是對象類型,而使用equals()方法比較兩個對象的內容

 

字符串非空

if(queryStr!=null&&queryStr.length()>0){

}

字符串爲空

queryStr==null|| queryStr.length()==0

 


String byte[]互相 轉換

 

 

   String str="你";

      byte[] b=str.getBytes("UTF-8");

      for(int i=0;i<=b.length-1;i++){

         System.out.println(b[i]);

      }    

      String back=new String(b);

      System.out.println(back);

 

String+ 和 StringBuffer.append比較

 

摘要:

   String +被轉換成 StringBuffer執行 append操做。

   編碼中使用StringBuffer效率高。

public static String strPlus(String a,String b){

      /* StringBuffer sA=new StringBuffer(a);

       * sA.append(b);

       * return sA.toString();

       * */

      return a+b;

   }

   public static String strAppend(String a,String b){

      StringBuffer sb=new StringBuffer(a);

      sb.append(b);

      return sb.toString();

   }

 

 

JSON處理

客戶端JSON處理

解析responseString

 

即便是一個JSON對象,不用數組傳回去。eval提示字符串錯誤。

未知緣由。

建議用[]包裹字符串

 

將requestData 轉成JSONString

var reqData={cmd:0,data:null};

JSON.stringify(reqData)

 

服務端JSON處理

JSON字符串和JSON對象的差別(重要)

JSON字符串,要求屬性名加雙引號。若是屬性值是對象,對象花括號不要引號

舉例:

{"Done":true,"Info":{"ID":15090,"Longitude":116.32502,"Latitude":40.00006}}

 

JSON對象, 屬性名不要雙引號

 

JSONView的檢驗能經過,但JSON.parse出錯,必定是由於,有屬性名沒有加引號

 

 

 

 

      

 

將ResultSet寫成JSON字符串

  result+="{\"ID\":"+rs.getString("ID")+",\"Name\":\""+rs.getString("Name")+"\",\"Age\":"+rs.getString("Age")+",\"Job\":\""+rs.getString("Job")+"\"},";

 

屬性名也要加引號。不然前端沒法用JSON.parse轉

字符串值須要加引號。

Gson 的toJSON和fromJSON

Gson由google開發

 

 

Gson gson = new Gson(); // Or use new GsonBuilder().create();

 MyType target = new MyType();

 

//Class轉Json字符串

 String json = gson.toJson(target); // serializes target to Json

 

//Json字符串轉Class

 MyType target2 = gson.fromJson(json, MyType.class); // deserializes json into target2

 

 

 

jdbc

ojdbc位置:

Oracle安裝目錄

app\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar

放在javaProject的 src目錄下。

 

插入 (返回最新記錄)

 

http://blog.csdn.net/yzsind/article/details/6918506

 

//添加商戶, 返回最新添加

   public static String InsertShop(Shop shop) throws ClassNotFoundException, SQLException{              

       Class.forName("oracle.jdbc.driver.OracleDriver");

       Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "gxk", "gxk");        

                                 

       String vsql = "insert into shopmbase(ID,Num,InnerNum,Name,InstallDate,Address,Active,IsActivated) values(shm_sequence.nextval,'"+shop.Num+"','"+shop.InnerNum+"','"+shop.Name+"','"+shop.InstallDate+"','"+shop.Address+"','"+shop.Active+"','"+shop.IsActivated+"') returning ID into :1";      

       OraclePreparedStatement pstmt =(OraclePreparedStatement)conn.prepareStatement(vsql); 

       pstmt.registerReturnParameter(1, Types.NUMERIC); 

       pstmt.executeUpdate(); 

       ResultSet rs=pstmt.getReturnResultSet(); 

       rs.next(); 

       int ID=rs.getInt(1); 

       rs.close(); 

       pstmt.close();         

       shop.ID=ID;

      

      return new Gson().toJson(shop);

   }

 

 

 

更新

//更新商戶

   public static String UpdateShop(Shop[] shops) throws ClassNotFoundException, SQLException{     

       Report result=new Report();     

       result.Done=false;  

       Class.forName("oracle.jdbc.driver.OracleDriver");

       Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "gxk", "gxk");  

       Statement stmt=conn.createStatement(); 

           

       int updated=0;

       for(int i=0;i<=shops.length-1;i++){

          String sqlStr="update shopmbase set Num='"+shops[i].Num+"',InnerNum='"+shops[i].InnerNum+"',Name='"+shops[i].Name+"',InstallDate='"+shops[i].InstallDate+"',CZDate='"+shops[i].CZDate+"',CLDate='"+shops[i].CLDate+"',Address='"+shops[i].Address+"',IsActivated='"+shops[i].IsActivated+"',Active='"+shops[i].Active+"',Longitude="+shops[i].Longitude+",Latitude="+shops[i].Latitude+" where ID="+shops[i].ID; 

          int val=stmt.executeUpdate(sqlStr);

          if(val!=0){

             updated++;

          }

       }

       result.Done=true;

       result.Info=updated+" of "+shops.length+" are updated";                  

       stmt.close();

       conn.close();

       String report=new Gson().toJson(result);

       report="["+report+"]";

       System.out.println(report);

       return report;

   }

刪除

delete from where

 

 

 

查詢

select from where

 

rs.close 將觸發stmt.close

 

說明:

   rs1=stmt.executeQuery(sql1);

   rs2=stmt.executeQuery(sql2);

   rs2.close();//stmt也將被close()

 

   System.out.println(rs.next())  //false; stmt.close以後,rs1.close()

 

 

 

 

 

 

Connection conn = DriverManager.getConnection(ClsDbConfig.dbUrl,ClsDbConfig.userName, ClsDbConfig.password);  

       Statement  stmt = conn.createStatement(); 

       String sqlStr="select distinct type from shopothattr";

       

       /*結果

        * [{attrName:"設備狀態",values:[{text:'未激活',value:1}]},{attrName:"商戶類型"}..]

        * */

       String result="[";

       ResultSet rs=stmt.executeQuery(sqlStr);   

       while(rs.next()){

          result+="{\"attrName\":\""+rs.getString("type")+"\",\"values\":[";

          String sqlStr2="select id,type,value from shopothattr where type='"+rs.getString("type")+"'";

          Statement  stmt2 = conn.createStatement();

          ResultSet rs2=stmt2.executeQuery(sqlStr2);

          while(rs2.next()){

             result+="{\"text\":\""+rs2.getString("value")+"\",\"value\":"+rs2.getInt("id")+"},";

          }

          result=result.substring(0,result.length()-1);

          result+="]},";

                   

          rs2.close();

          stmt2.close();

       }

       result=result.substring(0,result.length()-1);

       result+="]";

          

       rs.close();

       stmt.close();

       conn.close();

 


 

 

 


數制-編碼-加密

編碼-數制

byte[] 和String 互相轉換

摘要:

  

字符串轉byte[]

byte[] b= str.getBytes(「UTF-8」)

byte[]轉字符串

String str=new String(b);

 

       String str="你好世界1234qwER~!@#$%^&*()_+";

      byte[] b=str.getBytes("UTF-8");                     

      String back=new String(b);

      System.out.println(back);

 

char和int的轉換

結論:Unicode中共65535個字符。

      使用0-65535這些數字,便可表示全球全部字符。

 

      //ASCII 字符和int互相轉換

      for(int i=0;i<=127;i++){       System.out.print(i+":"+(char)(i)+","+(int)((char)(i))+" ");

      }

 

全部Unicode字符

System.out.print("\n");

      for(int i=0;i<=65535;i++){

         System.out.print(i+":"+(char)(i)+"  ");

      }

 

 

     

char和Unicode互相轉換

本質:char和int的互相轉換

Unicode:萬國碼

       \uDFEF 

       \u 4個16進制位。

       總共有65535種取值。

       映射了全球全部字符。

 

備註:Java中int範圍是 -21.47億-21.47億。

      codePointAt(s) 的範圍徹底涵蓋unicode全部值

摘要:

   char轉unicode,\\u+Integer.toHexString(char);

   unicode轉char,(char)Integer.parseInt(uni.subString(2),16);

 

/*unicode轉字符

   */

   public static char unicodeToChar(String uni){       

      if(!uni.subSequence(0,2).equals("\\u")){

         return ' ';

      }          

      return (char)Integer.parseInt(uni.substring(2),16);

   }

   /*字符轉Unicode

    */

   public static String charToUnicode(char c){

      String result="\\u";    

      result+=Integer.toHexString(c);

      return result;

   }

 

 


String和int[]轉換

應用:用戶名加密發送

String usr="1234qwER你好世界";     

      //字符串轉 int[]數組

      int[] intAr=new int[usr.length()];

      StringBuffer sb1=new StringBuffer();   

      for(int i=0;i<=usr.length()-1;i++){

         intAr[i]=usr.codePointAt(i);

         sb1.append(intAr[i]).append(",");

      }          

      System.out.println(sb1.substring(0, sb1.length()-1));

      //int數組轉字符串

      StringBuffer sb=new StringBuffer();

      for(int i=0;i<=intAr.length-1;i++){

         sb.append((char)intAr[i]);

      }

      System.out.println(sb.toString());

 

輸出:

49,50,51,52,113,119,69,82,20320,22909,19990,30028

1234qwER你好世界

 

十進制-十六進制

 Integer.toHexString(120);

 

 Integer.parseInt(「8C」,16);

 


 


 

加密

備註:加密的基礎是 編碼轉換

sha256加密

 

//hash是單向的...無解密方式

//破解方式只有一個, 嘗試字符串,得到相同的hash序列,則代表明文

//結果:sha256的結果是64位字符串

   public static String ShaEncrypt(String mes){

      String result="";

      MessageDigest digest;

        try {

            digest = MessageDigest.getInstance("SHA-256");

            byte[] hash = digest.digest(mes.getBytes("UTF-8"));

            result = Hex.encodeHexString(hash); 

            return result;

        } catch (NoSuchAlgorithmException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();           

        }catch (UnsupportedEncodingException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return result;

}

 

 


對稱,unicode-偏移

 

摘要:

  編碼:將String 轉成int[]數組,每一個元素+10000

  還原:將每一個元素-10000,而後變成char

public static void main(String[] args) throws UnsupportedEncodingException{        

      String usr="1234qwER你好世界";

      System.out.println(encodeUsr(usr,10000));

      System.out.println(getUsr(encodeUsr(usr,10000),10000));

   }       

   //從數組獲取字符串

   public static String getUsr(int[] arInt,int delta){

      StringBuffer sb=new StringBuffer();

      for(int i=0;i<=arInt.length-1;i++){

         sb.append((char)(arInt[i]-delta));

      }

      return sb.toString();

   }

   //將字符串編碼成數組

   public static int[] encodeUsr(String str,int delta){

      int[] res=new int[str.length()];

      for(int i=0;i<=str.length()-1;i++){

         res[i]=str.codePointAt(i)+delta;

      }

      return res;

   } 


 

 

 

 

 

 

 

 

 

 

 


Excel操做 (jxl)

寫Excel

import java.io.File;

import jxl.*;

import jxl.write.*;

import jxl.write.biff.RowsExceededException;

 

  public static void main(String[] args) throws IOException, RowsExceededException, WriteException {     

 

 

         WritableWorkbook book=Workbook.createWorkbook(new File("WebContent/test.xls"));

         WritableSheet sheet=book.createSheet("fistPage", 0);

         //在col0,row0添加 內容爲test的cell

         Label lable=new Label(0,0,"test");

         sheet.addCell(lable);

 

 

         //在col1,row0添加數值789.123      

         jxl.write.Number number=new jxl.write.Number(1,0,789.123);

         sheet.addCell(number);

        

         //保存book

         book.write();

         book.close();

        

         System.out.println("Mission Done");

   }

 

備註:文件 默認輸出路徑是 Workspace目錄


讀取Excel

public static String getShopsFromXls(String path) throws IOException, BiffException{

      String result="[";

      Workbook book=Workbook.getWorkbook(new File(path));

      Sheet sheet=book.getSheet(0);

      //遍歷全部行

      for(int i=1;i<=sheet.getRows()-1;i++){

         result+="{No:"+i+",Num:'"+sheet.getCell(0,i).getContents()+"',InnerNum:'"+sheet.getCell(1,i).getContents()+"',Name:'"+sheet.getCell(2,i).getContents()+"',SDDate:'"+sheet.getCell(3,i).getContents()+"',CLDate:'"+sheet.getCell(4,i).getContents()+"',CZDate:'"+sheet.getCell(5,i).getContents()+"',Activated:'"+sheet.getCell(6,i).getContents()+"',Address:'"+sheet.getCell(7,i).getContents()+"',HYSH:'"+sheet.getCell(8,i).getContents()+"'},";

      }

      result=result.substring(0,result.length()-1);

      result+="]";

      return result;

   }

 


導出InputStream

 

 

   public static InputStream createExcel(String filePath) throws ClassNotFoundException, SQLException, IOException, WriteException{                   

           String[] arrCols={"身份證","姓名","教育程度","血型","工做單位","性別","曾用名","出生日期","身高(cm)","電話","地址","民族","婚姻情況"};

              String[] arrFields={"IDNUM","NAME","EDUCATION","BLOODTYPE","WORKUNIT","GENDER","OLDNAME","to_char(Birthdate,'yyyy-mm-dd') as BIRTHDATE","TALL","PHONE","ADDRESS","PEOPLE","MARRIAGE"};                       

              String[] arrFields2={"IDNUM","NAME","EDUCATION","BLOODTYPE","WORKUNIT","GENDER","OLDNAME","BIRTHDATE","TALL","PHONE","ADDRESS","PEOPLE","MARRIAGE"};

             

              String sqlStr="select ";

           for(int i=0;i<=arrFields.length-1;i++){

                 sqlStr+=arrFields[i]+",";

           }

           sqlStr=sqlStr.substring(0, sqlStr.length()-1);

           sqlStr+=" from Resident";

             

           System.out.println(sqlStr);

           Class.forName("oracle.jdbc.driver.OracleDriver");                

              Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "gxk", "gxk");

              Statement std=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);                                     

              ResultSet rs=std.executeQuery(sqlStr);

             

             

        WritableWorkbook book=Workbook.createWorkbook(new File(filePath));

              WritableSheet sheet=book.createSheet("fistPage", 0);

              //設置列寬  此單位非像素,比值是1:7

              int[] arrWidths={23,10,10,10,32,10,10,12,11,10,10,10,10};                 

              for(int i=0;i<=arrWidths.length-1;i++){

                     sheet.setColumnView(i, arrWidths[i]);                      

              }

             

              //表頭 (colNum,rowNum)

              WritableFont fontBold = new WritableFont(WritableFont.TIMES,12,WritableFont.BOLD);              

              WritableCellFormat headFormat=new WritableCellFormat(fontBold);

              headFormat.setAlignment(jxl.format.Alignment.CENTRE);

 

              for(int i=0;i<=arrCols.length-1;i++){

                     Label cell=new Label(i,0,arrCols[i],headFormat);

                     sheet.addCell(cell);   

              }                  

                                  

              //表體

              WritableFont fontNormal = new WritableFont(WritableFont.TIMES,12);

              WritableCellFormat bodyFormat=new WritableCellFormat(fontNormal);

              bodyFormat.setAlignment(jxl.format.Alignment.CENTRE);

             

              int j=1;

              while(rs.next()){

                     for(int i=0;i<=arrFields2.length-1;i++){             

                            //System.out.println(arrFields2[i]+":"+rs.getString(arrFields2[i]));

                            //Label cell=new Label(i,j,rs.getString(i)); rs.getString(序號) 值會變化,停用

                            Label cell=new Label(i,j,rs.getString(arrFields2[i]),bodyFormat);                             

                            sheet.addCell(cell);

                     }

                     j++;

              }

                           

              //保存book

              book.write();

              book.close();

              InputStream inStream=new FileInputStream(filePath);   

              return inStream;

   }

 

 

 

 

 

 

 

 

 

建立sheet

//獲取4個區域的商戶

   public static InputStream GetRegionShops(double lon,double lat,String filePath) throws ClassNotFoundException, SQLException, IOException, RowsExceededException, WriteException{   

       WritableWorkbook book=Workbook.createWorkbook(new File(filePath));

       String[] sheetNames={"西北區","東北區","西南區","東南區"};

     

          //第i頁

     for(int i=0;i<=sheetNames.length-1;i++){

WritableSheet sheet= book.createSheet(sheetNames[i],i);

}

 

       book.write();  //book.write如寫在循環裏面,只建立1sheet

       book.close();    

       System.out.println("Excel輸出完成");

       

       InputStream inStream=new FileInputStream(filePath);

       return inStream;

   }

獲取sheet

book.getSheet(i)

 

字體

//字體

          WritableFont wf=new WritableFont(WritableFont.TIMES,10,WritableFont.BOLD);

          WritableCellFormat cf=new WritableCellFormat(wf);

          new Label(0,0,"商戶內部編",cf)

        

設置列寬

 

WritableSheet.setColumnView(int i,int width);

 

居中

WritableFont wf=new WritableFont(WritableFont.TIMES,10,WritableFont.BOLD);

          WritableCellFormat cf=new WritableCellFormat(wf);

          cf.setAlignment(Alignment.CENTRE);

相關文章
相關標籤/搜索