#
/**加密
*
*/
public static String doEncrypt(String xmlStr) {
try {
return URLEncoder.encode(xmlStr, "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "加密錯(cuò)誤";
}
/**
* 解密
* @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\\實(shí)物轉(zhuǎn)移_20110824030821.xml", "GBK"));
}
這是把文件內(nèi)容轉(zhuǎn)換成字符的方式
摘要: 前臺(tái):
<form action="uploadimage.jsp" method="post" enctype="multipart/form-data" name="form1">
<input type="file" name="file">
<input type="submit"&n...
閱讀全文
區(qū)別方法重寫(xiě)(覆蓋)和方法重載?
方法重寫(xiě):方法名字、參數(shù)列表和返回類型必須相同。類中只允許出現(xiàn)一次這樣的方法,要接著往子類當(dāng)中寫(xiě)入。類中的方法覆蓋,父類和子類都可以相同。
方法重載:方法名字相同,參數(shù)列表必須要不同,返回類型隨意。構(gòu)造器就是典型的方法重載。
this和super關(guān)鍵字的用法:this表示的本類的方法和成員;super表示父類的方法和成員。this()和super()都必須放在一個(gè)方法的開(kāi)頭。
如果子類構(gòu)造器中沒(méi)有顯式地調(diào)用父類構(gòu)造器,也沒(méi)有使用this關(guān)鍵字調(diào)用重載的其他構(gòu)造器,則系統(tǒng)默認(rèn)調(diào)用父類無(wú)參數(shù)的構(gòu)造器,super()。
塊執(zhí)行:
在一個(gè)類中有初始化塊要先執(zhí)行,然后再是構(gòu)造器。
如:
public class Test
{
String name;
int age;
String sex;
public Test()
{
System.out.println("Test1被調(diào)用");
sex ="Male";
System.out.println("name="+name+" ,age="+age+" ,sex="+sex);
}
public Test(String theName)
{
System.out.println("Test2被調(diào)用");
name = theName;
System.out.println("name="+name+" ,age="+age+" ,sex="+sex);
}
{
name = "Tony Blair";
age = 50;
sex = "Female";
System.out.println("Test初始化塊執(zhí)行后:name="+name
+" ,age="+age+" ,sex="+sex);
}
public static void main(String args[])
{
Test t=new Test();
}
}
static關(guān)鍵字可用在變量、方法和內(nèi)部類中。
在類的定義體中,方法的外部可包含static語(yǔ)句塊,在所屬的類被載入時(shí)執(zhí)行一次,用于初始化static屬性,但不能初始化非靜態(tài)變量,類變量在整個(gè)類中共享。
如:
public class Count {
private int serialNumber;
public static int counter;
static {
System.out.println("static自由塊被執(zhí)行"); //先執(zhí)行靜態(tài)塊
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是一個(gè)final類,不可被繼承,final變量是引用變量,則不可以改變它的引用對(duì)象,但可以改變對(duì)象的數(shù)據(jù),final方法不可以被覆蓋,但可以被重載。
如:
class Aclass
{
int a;
//構(gòu)造器
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;
}
}
//定義一個(gè)類來(lái)測(cè)試
public class TestFinal
{
//如果final變量是引用變量,則不可以改變它的引用對(duì)象,但可以改變對(duì)象的數(shù)據(jù)
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用在方法或類前。抽象類必須繼承,抽象方法必須重寫(xiě)。什么時(shí)候用呢? 當(dāng)兩個(gè)類分別有一個(gè)公共方法,然后分別繼承公共類并完善抽象方法,這樣實(shí)現(xiàn)一種框架對(duì)類起到一個(gè)管理的作用。
interface聲明方法和變量,特殊抽象類,和類不同的是,一個(gè)接口可以繼承多個(gè)父類接口,多個(gè)無(wú)關(guān)的類可以實(shí)現(xiàn)同一個(gè)接口,一個(gè)類可以實(shí)現(xiàn)多個(gè)無(wú)關(guān)的接口。
1 . request.setCharacterEncoding("utf-8");
只適合Post方法提交的數(shù)據(jù),
2 . 適合用Get方法提交的數(shù)據(jù)
String name = request.getParameter("name");
name=new String(name.getBytes(“ISO8859_1”),“UTF-8”);
3 .
針對(duì)Tomcat服務(wù)器,修改server.xml
<Connector port="8083" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
這個(gè)只使用GET方法,不適合Post方法
使用JDBC連接SQL SERVER 2008,很多人都在問(wèn),我自己也測(cè)試幾次,發(fā)現(xiàn)按照以前的方法連接會(huì)出現(xiàn)一點(diǎn)小問(wèn)題。原因在于,SQL SERVER 2008采用了動(dòng)態(tài)端口的機(jī)制,按照以前的方法連接會(huì)報(bào)告連接不了,其實(shí)端口寫(xiě)對(duì)了完全沒(méi)有問(wèn)題。連接方法如下:
1,微軟目前沒(méi)有發(fā)布針對(duì)SQL Server 2008專用的JDBC驅(qū)動(dòng)程序,使用SQL Server 2005 的就可以了,但是,需要注意: SQL Server 2008的新功能無(wú)法使用,這個(gè)必須等專用的JDBC發(fā)布之后才能使用。下載地址:
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,設(shè)置端口為固定端口:
SQL Server 配置管理器,按圖設(shè)置即可

注意:動(dòng)態(tài)端口設(shè)為空,即可禁用動(dòng)態(tài)端口
連接的寫(xiě)法:
jdbc:sqlserver://192.168.3.6:1368;databaseName=數(shù)據(jù)庫(kù)名稱;user=用戶名;password=密碼
概念:數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不再是重新建立一個(gè)連接;釋放空閑時(shí)間超過(guò)最大空閑時(shí)間的數(shù)據(jù)庫(kù)連接,以避免因?yàn)闆](méi)有釋放數(shù)據(jù)庫(kù)連接而引起的數(shù)據(jù)庫(kù)連接遺漏。
需要注意:
1. 最小連接數(shù)是連接池一直保持的數(shù)據(jù)庫(kù)連接,所以如果應(yīng)用程序?qū)?shù)據(jù)庫(kù)連接的使用量不大,將會(huì)有大量數(shù)據(jù)庫(kù)連接資源被浪費(fèi)。
2. 最大連接數(shù)是連接池能申請(qǐng)的最大連接數(shù),如果數(shù)據(jù)庫(kù)連接請(qǐng)求超過(guò)此數(shù),后面的數(shù)據(jù)庫(kù)連接請(qǐng)求將被加入到等待隊(duì)列中,這會(huì)影響之后的數(shù)據(jù)庫(kù)操作。
數(shù)據(jù)庫(kù)連接池的兩個(gè)任務(wù):
1. 限制每個(gè)應(yīng)用或系統(tǒng)可以擁有的最大資源,也就是確定連接池的大?。≒oolSize)。
2. 在連接池的大小(PoolSize)范圍內(nèi)、最大限度地使用資源,縮短數(shù)據(jù)庫(kù)訪問(wèn)的使用周期。
例如: 物理連接數(shù)200個(gè),每個(gè)連接提供250個(gè)Statemet,那么并發(fā)的Statement總數(shù)為200*250=50000個(gè)。
Java開(kāi)源連接池:
Jakarta DBCP 可直接在應(yīng)用程序中使用。(比較常用,集成在Tomcat和Struts中)
C3P0是Hibernate的默認(rèn)數(shù)據(jù)庫(kù)連接池。(常用,Hibernate)
其他的還有Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager。
DBCP代碼實(shí)現(xiàn):
//創(chuàng)建數(shù)據(jù)源
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;
}
//關(guān)閉數(shù)據(jù)源
public static void shutdownDataSource(DataSource ds) throws SQLException {
BasicDataSource bds = (BasicDataSource)ds;
bds.close();
}
//數(shù)據(jù)源的使用
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中配置數(shù)據(jù)庫(kù)連接池:
我們使用Tomcat中l(wèi)ib文件夾下的tomcat-dbcp.jar。
1. 修改server.xml文件在<Service>中寫(xiě)入以下代碼:
<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:數(shù)據(jù)源的類。
factory:指定生成的DataReource的factory類名;默認(rèn)DBCP工廠類。
driverClassName:數(shù)據(jù)庫(kù)驅(qū)動(dòng)名。
url:數(shù)據(jù)庫(kù)連接的URL。
username:數(shù)據(jù)庫(kù)用戶名。
password:數(shù)據(jù)庫(kù)密碼。
maxActive:最大連接數(shù)據(jù)庫(kù)數(shù),設(shè)為0表示沒(méi)有限制。
maxIdle:最大等待數(shù)量,設(shè)為0表示沒(méi)有限制。
maxWait:最大等待秒數(shù),單位為ms。
removeAbandoned:是否自我中斷,默認(rèn)為false。
removeAbandonedTimeOut:幾秒后會(huì)自我中斷,removeAbandoned必須為true。
logAbandoned:是否記錄中斷事件,默認(rèn)為false。
2. 修改web.xml文件,增加一個(gè)標(biāo)簽,輸入以下代碼:
<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代碼進(jìn)行獲?。?br />
Context ctx = new InitalContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/CompanyDB");
Connection conn = ds.getConnection();
注意:java:comp/env/ 是java中JNDI固定寫(xiě)法。
注意:如果該配置出現(xiàn)錯(cuò)誤,采用另一種方式進(jìn)行配置
在tomcat中的server.xml不進(jìn)行配置,而在context.xml中進(jìn)行設(shè)置
代碼如下:
<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的設(shè)置同上一個(gè)配置一樣。
JSp的session內(nèi)置對(duì)象取值方法
//創(chuàng)建session對(duì)象
HttpSession session =requst.getSession();
//設(shè)置session 對(duì)象的屬性值
session.setAttribute("屬性名",值);
取值
Object object=session.getAttibute("屬性名")
設(shè)置方法
//設(shè)置響應(yīng)回去的類型
response.setContentType("text/html");
//設(shè)置響應(yīng)的字符編碼格式
response.setCharacterEncoding("UTF-8");
request(請(qǐng)求)
//獲取請(qǐng)求屬性的值
request.getParameter("屬性名");
多用于表單提交和URL參數(shù)的傳遞的取值
JSp內(nèi)置對(duì)象生命周期:
out 只在本jsp頁(yè)面使用 無(wú)生命周期
request 生命周期 一次請(qǐng)求
response 生命周期 一次響應(yīng)
session 生命周期 項(xiàng)目瀏覽器關(guān)閉時(shí),生全周期結(jié)束,默認(rèn)不操作項(xiàng)目超過(guò)30分鐘生命周期結(jié)束
application 生命周期 當(dāng)開(kāi)啟Tomcat服務(wù)器時(shí)創(chuàng)建,關(guān)閉Tomcat服務(wù)器時(shí)結(jié)束生命周期 (作用:統(tǒng)計(jì)服務(wù)器訪問(wèn)人數(shù)或流量)
頁(yè)面跳轉(zhuǎn):
response.sendRedirect("admin/one.jsp") 重定向
RequestDispatcher 請(qǐng)求跳轉(zhuǎn)
兩者實(shí)現(xiàn)的效果相同
二者的區(qū)別:
1、
URL 地址的變化用response.sendRedirect時(shí),RequestDi.spatcher不會(huì)使URL地址進(jìn)行變化。
RepuestDispatcher 是服務(wù)器端請(qǐng)求機(jī)制的跳轉(zhuǎn)
response.sendRedirect 是客戶端請(qǐng)求機(jī)制的重定向
2、
RequestDispatcher傳值通過(guò)JSP-Servlet-JSp形式直接傳入到下一個(gè)JSp頁(yè)面
response.sendRedirect 傳值通過(guò)JSP-Servlet-JSP形式,只能夠傳遞到請(qǐng)求機(jī)制重定向這之前
3、
如果項(xiàng)目要跳轉(zhuǎn)到另外一個(gè)服務(wù)器的頁(yè)面時(shí),用response.sendRedirect進(jìn)行重定向
4、
我們盡量使用RequestDispatcher方式,因?yàn)槭欠?wù)器響應(yīng),所以在web容器執(zhí)行效率較高
RequestDispatcher什么時(shí)候使用呢?
項(xiàng)目中不進(jìn)行頁(yè)面的交互跳轉(zhuǎn)的時(shí)候,例如一個(gè)界面的增、刪、改、查,或者相關(guān)聯(lián)同類型模塊之間的跳轉(zhuǎn)
response.sendRedirect重定向什么時(shí)候使用呢?
無(wú)關(guān)聯(lián)的不同模塊間跳轉(zhuǎn)使用,例如,用戶界面模塊跳轉(zhuǎn)到產(chǎn)品信息界面模塊
5、
RequestDispatcher基本上認(rèn)定使用在Servlet里面
response.sendRedirect 用在Servlet和JSP頁(yè)面較多
重定向傳值 只影響request,不影響session的傳值
session何時(shí)使用?
傳值時(shí)盡量不要使用session
購(gòu)物車的實(shí)現(xiàn)必須使用session對(duì)象
session.removeAttribute("name") 全部刪除物品
如果選擇性刪除?
傳入要?jiǎng)h除的購(gòu)物信息主鍵id值,根據(jù)id值支查找集合中的對(duì)應(yīng)信息,然后做集合中的刪除操作
for(Product product : list){
if(deleteid==product.getid()){
list.remove(product);
}
}
session.setAttribute("gouwu",list)
兩種提交方式的亂碼處理:
post提交方式亂碼處理
中文亂碼問(wèn)題
request.setcharacterEncoding("UTF-8");
處理get方式提交的亂碼方式處理
String names=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8")
DAO程序設(shè)計(jì)
在用DAO設(shè)計(jì)模式編寫(xiě)程序時(shí),根據(jù)以下幾個(gè)步驟:
1、定義接口;
2、定義底層JavaBean;
3、數(shù)據(jù)庫(kù)連接;
4、實(shí)現(xiàn)接口;
5、工廠;
6、主函數(shù);
根據(jù)你的項(xiàng)目,在不同的包里面寫(xiě)相應(yīng)的代碼!
下面是一個(gè)簡(jiǎn)單的例子:
1、定義接口:
package com.qhit.s2.t13.dao;
import java.util.List;
import com.qhit.s2.t13.javaben.User;
public interface IUserDAO {
public List<User> findAll();
}
2、JavaBean:
package com.qhit.s2.t13.javaben;
public class User {
private Integer id;
private String username;
private String password;
public User() {
super();
}
public User(Integer id, String username, String password) {
super();
this.id = id;
this.username = username;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3、數(shù)據(jù)庫(kù)連接:
package com.qhit.s2.t13.dao.impl;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private java.sql.Connection conn = null;
// public final static String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
// public final static String URL = "jdbc:sqlserver://localhost:1433;DataBaseName=Company";
// public final static String DBUSER = "sa";
// public final static String DBPASS = "root";
public java.sql.Connection getConnection() {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection(
"jdbc:sqlserver://localhost:1433;DataBaseName=Company",
"sa", "root");
return conn;
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
public void closeConnection() {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
4、實(shí)現(xiàn)接口:
package com.qhit.s2.t13.dao.impl;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.qhit.s2.t13.dao.IUserDAO;
import com.qhit.s2.t13.javaben.User;
public class UserDAOImpl implements IUserDAO {
public List<User> findAll() {
List<User> userList = new ArrayList<User>();
String sql = "select * from users";
DBConnection db = new DBConnection();
try {
// System.out.println(db.getConnection());
PreparedStatement ps = db.getConnection().prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if(rs != null) {
while(rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("userName"));
user.setPassword(rs.getString("password"));
userList.add(user);
}
}
rs.close();
ps.close();
db.closeConnection();
return userList;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
5、工廠
package com.qhit.s2.t13.dao.impl;
import com.qhit.s2.t13.dao.IUserDAO;
public class DAOFactory {
public static IUserDAO getUserDAO() {
return new UserDAOImpl();
}
}
6、主函數(shù):
package main;
import java.util.List;
import com.qhit.s2.t13.dao.impl.DAOFactory;
import com.qhit.s2.t13.javaben.User;
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<User> list = DAOFactory.getUserDAO().findAll();
if(list != null) {
System.out.println("chenggong");
} else {
System.out.println("shipai");
}
}
}