2010年8月23日
#
/**加密
*
*/
public static String doEncrypt(String xmlStr) {
try {
return URLEncoder.encode(xmlStr, "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "加密錯誤";
}
/**
* 解密
* @param saveFile
*/
public static void decrypt(File saveFile) {
try {
BufferedReader reader = null;
reader = new BufferedReader(new FileReader(saveFile));
String tempString = null;
String str2 =null;
while ((tempString = reader.readLine()) != null) {
str2=URLDecoder.decode(tempString);
}
FileOutputStream fos = new FileOutputStream(saveFile);
fos.write(str2.getBytes());
fos.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println(URLDecoder.decode("C:\\Documents and Settings\\chenchangqing\\Desktop\\實物轉移_20110824030821.xml", "GBK"));
}
這是把文件內容轉換成字符的方式
摘要: 前臺:
<form action="uploadimage.jsp" method="post" enctype="multipart/form-data" name="form1">
<input type="file" name="file">
<input type="submit"&n...
閱讀全文
區別方法重寫(覆蓋)和方法重載?
方法重寫:方法名字、參數列表和返回類型必須相同。類中只允許出現一次這樣的方法,要接著往子類當中寫入。類中的方法覆蓋,父類和子類都可以相同。
方法重載:方法名字相同,參數列表必須要不同,返回類型隨意。構造器就是典型的方法重載。
this和super關鍵字的用法:this表示的本類的方法和成員;super表示父類的方法和成員。this()和super()都必須放在一個方法的開頭。
如果子類構造器中沒有顯式地調用父類構造器,也沒有使用this關鍵字調用重載的其他構造器,則系統默認調用父類無參數的構造器,super()。
塊執行:
在一個類中有初始化塊要先執行,然后再是構造器。
如:
public class Test
{
String name;
int age;
String sex;
public Test()
{
System.out.println("Test1被調用");
sex ="Male";
System.out.println("name="+name+" ,age="+age+" ,sex="+sex);
}
public Test(String theName)
{
System.out.println("Test2被調用");
name = theName;
System.out.println("name="+name+" ,age="+age+" ,sex="+sex);
}
{
name = "Tony Blair";
age = 50;
sex = "Female";
System.out.println("Test初始化塊執行后:name="+name
+" ,age="+age+" ,sex="+sex);
}
public static void main(String args[])
{
Test t=new Test();
}
}
static關鍵字可用在變量、方法和內部類中。
在類的定義體中,方法的外部可包含static語句塊,在所屬的類被載入時執行一次,用于初始化static屬性,但不能初始化非靜態變量,類變量在整個類中共享。
如:
public class Count {
private int serialNumber;
public static int counter;
static {
System.out.println("static自由塊被執行"); //先執行靜態塊
counter = 1;
}
public static int getTotalCount() {
return counter;
}
public Count() {
counter++;
serialNumber=counter;
}
public static void main(String[] args)
{
System.out.println("main() invoked");
System.out.println("counter = "+Count.counter);
Count t=new Count();
System.out.println("counter = "+Count.counter+" "+t.serialNumber);
}
}
java.lang.Math是一個final類,不可被繼承,final變量是引用變量,則不可以改變它的引用對象,但可以改變對象的數據,final方法不可以被覆蓋,但可以被重載。
如:
class Aclass
{
int a;
//構造器
public Aclass()
{
a = 100;
}
final public void paint(){
System.out.println("55555555");
}
final public void paint(int i){
System.out.println(i);
}
public void setA(int theA)
{
a = theA;
}
public int getA()
{
return a;
}
}
//定義一個類來測試
public class TestFinal
{
//如果final變量是引用變量,則不可以改變它的引用對象,但可以改變對象的數據
final Aclass REF_VAR=new Aclass();
public static void main(String[] args)
{
TestFinal tf = new TestFinal();
tf.REF_VAR.setA(1);
System.out.println(tf.REF_VAR.getA());
tf.REF_VAR.paint();
tf.REF_VAR.paint(1);
}
}
abstract用在方法或類前。抽象類必須繼承,抽象方法必須重寫。什么時候用呢? 當兩個類分別有一個公共方法,然后分別繼承公共類并完善抽象方法,這樣實現一種框架對類起到一個管理的作用。
interface聲明方法和變量,特殊抽象類,和類不同的是,一個接口可以繼承多個父類接口,多個無關的類可以實現同一個接口,一個類可以實現多個無關的接口。
1 . request.setCharacterEncoding("utf-8");
只適合Post方法提交的數據,
2 . 適合用Get方法提交的數據
String name = request.getParameter("name");
name=new String(name.getBytes(“ISO8859_1”),“UTF-8”);
3 .
針對Tomcat服務器,修改server.xml
<Connector port="8083" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
這個只使用GET方法,不適合Post方法
使用JDBC連接SQL SERVER 2008,很多人都在問,我自己也測試幾次,發現按照以前的方法連接會出現一點小問題。原因在于,SQL SERVER 2008采用了動態端口的機制,按照以前的方法連接會報告連接不了,其實端口寫對了完全沒有問題。連接方法如下:
1,微軟目前沒有發布針對SQL Server 2008專用的JDBC驅動程序,使用SQL Server 2005 的就可以了,但是,需要注意: SQL Server 2008的新功能無法使用,這個必須等專用的JDBC發布之后才能使用。下載地址:
Microsoft SQL Server 2005 JDBC Driver 1.2
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=c47053eb-3b64-4794-950d-81e1ec91c1ba
2,設置端口為固定端口:
SQL Server 配置管理器,按圖設置即可

注意:動態端口設為空,即可禁用動態端口
連接的寫法:
jdbc:sqlserver://192.168.3.6:1368;databaseName=數據庫名稱;user=用戶名;password=密碼
概念:數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不再是重新建立一個連接;釋放空閑時間超過最大空閑時間的數據庫連接,以避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。
需要注意:
1. 最小連接數是連接池一直保持的數據庫連接,所以如果應用程序對數據庫連接的使用量不大,將會有大量數據庫連接資源被浪費。
2. 最大連接數是連接池能申請的最大連接數,如果數據庫連接請求超過此數,后面的數據庫連接請求將被加入到等待隊列中,這會影響之后的數據庫操作。
數據庫連接池的兩個任務:
1. 限制每個應用或系統可以擁有的最大資源,也就是確定連接池的大小(PoolSize)。
2. 在連接池的大小(PoolSize)范圍內、最大限度地使用資源,縮短數據庫訪問的使用周期。
例如: 物理連接數200個,每個連接提供250個Statemet,那么并發的Statement總數為200*250=50000個。
Java開源連接池:
Jakarta DBCP 可直接在應用程序中使用。(比較常用,集成在Tomcat和Struts中)
C3P0是Hibernate的默認數據庫連接池。(常用,Hibernate)
其他的還有Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager。
DBCP代碼實現:
//創建數據源
public static DataSource setupDataSource(String connectURI) {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(org.gjt.mm.mysql.Driver);
ds.setUsername("username");
ds.setPassword("password");
ds.setUrl(connectURI);
return ds;
}
//關閉數據源
public static void shutdownDataSource(DataSource ds) throws SQLException {
BasicDataSource bds = (BasicDataSource)ds;
bds.close();
}
//數據源的使用
DataSource dataSource = getDataSource();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
pstmt = conn.prepareStatement("select * from users");
rs = pstmt.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt("id"));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
在Tomcat中配置數據庫連接池:
我們使用Tomcat中lib文件夾下的tomcat-dbcp.jar。
1. 修改server.xml文件在<Service>中寫入以下代碼:
<Context path="/WebProject" docBase="WebProject" reloadable="true" crossContext="true">
<Resource auth="Container" name="jdbc/CompanyDB" type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;DataBaseName=Company"
username="sa"
password="root"
maxActive="100"
maxIdle="30"
maxWait="10000"
removeAbandoned=“true”
removeAbandonedTimeOut="10"
logAbandoned="true"/>
</Context>
path:工程路徑。
docBase:工程名字。
name:JNDI的名字。
type:數據源的類。
factory:指定生成的DataReource的factory類名;默認DBCP工廠類。
driverClassName:數據庫驅動名。
url:數據庫連接的URL。
username:數據庫用戶名。
password:數據庫密碼。
maxActive:最大連接數據庫數,設為0表示沒有限制。
maxIdle:最大等待數量,設為0表示沒有限制。
maxWait:最大等待秒數,單位為ms。
removeAbandoned:是否自我中斷,默認為false。
removeAbandonedTimeOut:幾秒后會自我中斷,removeAbandoned必須為true。
logAbandoned:是否記錄中斷事件,默認為false。
2. 修改web.xml文件,增加一個標簽,輸入以下代碼:
<resource-ref>
<description>Company Connection</description>
<res-ref-name>jdbc/CompanyDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
res-ref-name:指定JNDI的名字。
res-type:指定資源類名。
res-auth:指定資源的Manager。
3. 代碼中使用JNDI代碼進行獲取:
Context ctx = new InitalContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/CompanyDB");
Connection conn = ds.getConnection();
注意:java:comp/env/ 是java中JNDI固定寫法。
注意:如果該配置出現錯誤,采用另一種方式進行配置
在tomcat中的server.xml不進行配置,而在context.xml中進行設置
代碼如下:
<Resource name="jdbc/CompanyDB" type="javax.sql.DataSource" password="root"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" maxIdle="2" maxWait="5000" username="sa" url="jdbc:sqlserver://localhost:1433;DataBaseName=Company" maxActive="100"/>
web.xml的設置同上一個配置一樣。