環境變量-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;
}
目標:集成到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
在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]+\(\);
目錄結構
序號 |
目錄名 |
描述 |
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.xml中的路徑符號
url-pattern |
說明 |
實際地址 |
su |
沒法啓動 |
|
../su |
不容許../ 服務器沒法啓動 |
|
/su |
虛擬目錄/su |
頁面form 的路徑
sample1.htm
pattern |
說明 |
實際地址 |
<form action="su" |
與頁面同級的su |
|
<form action="../su" |
頁面父目錄的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
<%@ 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>
備註:
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[]
備註: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操做後,也被清除。
個數限制:最多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:
客戶端訪問服務器,服務器產生惟一的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
所屬類: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>
<%}%>
命名空間:javax.servlet.ServletConfig
表明:web.xml對象的init-param
取DbDriver, DbUrl, usr, psw. 參見 web.xml配置
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規範?
將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間使用服務端跳轉
|
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>姓 名</td><td><input type="text" name="name" value="<%=emp.getName()%>"/></td><td><%=emp.getError("erN")%></td></tr>
<tr><td>職 位</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>薪 資</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本質 |
繼承了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¶2=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¶2=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() |
結束過濾器,釋放資源 |
獲取記錄條數
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」);
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處理
解析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
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
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);