一)jQuery常用AJAX-API
目的:簡(jiǎn)化客戶端與服務(wù)端進(jìn)行局部刷新的異步通訊
1)取得服務(wù)端當(dāng)前時(shí)間
- 簡(jiǎn)單形式:
jQuery對(duì)象.load(url)
- 返回結(jié)果自動(dòng)添加到j(luò)Query對(duì)象代表的標(biāo)簽中間; 如果是Servlet的話, 采用的是GET方式
- 復(fù)雜形式:
jQuery對(duì)象.load(url,sendData,function(backData,textStatus,ajax){... ...}); sendData = {"user.name":"jack","user.pass":"123"}; ( 以JSON格式文本方式發(fā)送宽菜,使用POST方式發(fā)送,服務(wù)端能收到數(shù)據(jù) )
- load()方法參數(shù)解釋:
- 參數(shù)一:url發(fā)送到哪里去
- 參數(shù)二:sendData發(fā)送請(qǐng)求體中的數(shù)據(jù)竿报,符合JSON格式铅乡,例如:{key:value,key:value}
- 參數(shù)三:function處理函數(shù),類似于傳統(tǒng)方式ajax.onreadystatechange = 處理函數(shù)
- 其中參數(shù)三為function處理函數(shù)最多可以接收三個(gè)參數(shù)烈菌,含義如下
- 第一個(gè)參數(shù):服務(wù)端返回的數(shù)據(jù)阵幸,例如:backData
- 第二個(gè)參數(shù):服務(wù)端狀態(tài)碼的文本描述,例如:success芽世、error挚赊、
- 第三個(gè)參數(shù):ajax異步對(duì)象,即XMLHttpRequest對(duì)象
- 以上所有參數(shù)的名字可以任意济瓢,但必須按順序書(shū)寫(xiě)咬腕,盡量做到見(jiàn)名知意
- 注意:對(duì)于load方法而言,如果請(qǐng)求體無(wú)參數(shù)發(fā)送的話葬荷,load方法采用GET方式提交; 如果請(qǐng)求體有參數(shù)發(fā)送的話,load方法采用POST方式提交; 使用load方法時(shí)纽帖,自動(dòng)進(jìn)行編碼宠漩,無(wú)需手工編碼
<script type="text/javascript">
$(":button").click(function(){
var url = "${pageContext.request.contextPath}/loadTimeRequest?time"+new Date().getTime();
var sendData = null;
$.load(url,sendData,function(a,b,ajax){
var jsonJAVA = ajax.responseText;
var jsonJS = eval("("+jsonJAVA+")");
var strTime = jsonJS.strTime;
$("span:first").html(strTime).css("color","red");
$("span:last").html(strTime).css("color","blue");
});
//$("span").load(url);
});
</script>
2)檢查注冊(cè)用戶名和密碼是否存在
$.get(url,sendData,function(backData,textStatus,ajax){... ...})
-
$.post(url,sendData,function(backData,textStatus,ajax){... ...})
-> 提倡 - 注意 : 使用get或post方法時(shí),自動(dòng)進(jìn)行編碼懊直,無(wú)需手工編碼
3)jQuery對(duì)象.serialize()
- 作用:自動(dòng)生成JSON格式的文本
- 注意:為每個(gè)jQuery對(duì)象設(shè)置一個(gè)name屬性扒吁,因?yàn)閚ame屬性會(huì)被認(rèn)為請(qǐng)求參數(shù)名
- 注意:必須用<form>標(biāo)簽元素
- 適用:如果屬性過(guò)多,強(qiáng)烈推薦采用這個(gè)API
<script type="text/javascript">
//定位按鈕室囊,同時(shí)添加單擊事件
$(":button").click(function(){
//獲取用戶名和密碼
var username = $(":text:first").val();
var password = $(":text:last").val();
//去空格
username = $.trim(username);
password = $.trim(password);
//異步發(fā)送到服務(wù)端
var url = "${pageContext.request.contextPath}/checkRequest?time="+new Date().getTime();
/*手工書(shū)寫(xiě)JSON文本
var sendData = {
"user.username":username,
"user.password":password
};
*/
/*工具生成JSON文本*/
var sendData = $("form").serialize();
$.post(url,sendData,function(backData,textStatus,ajax){
//backData是一個(gè)JSON文本/對(duì)象雕崩,你得通過(guò).號(hào)訪問(wèn)其屬性值
var tip = backData.tip;
//創(chuàng)建img節(jié)點(diǎn)
var $img = $("")
//清空span節(jié)點(diǎn)中的內(nèi)容
$("span").text("");
//將img節(jié)點(diǎn)添加到span節(jié)點(diǎn)中
$("span").append( $img );
});
});
</script>
public class RegisterAction extends ActionSupport{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
/**
* 檢查注冊(cè)用戶名和密碼是否存在
*/
public String checkMethod() throws Exception {
tip = "images/MsgSent.gif";
if("帥帥".equals(user.getUsername()) && "123".equals(user.getPassword())){
tip = "images/MsgError.gif";
}
return "ok";
}
private String tip;
public String getTip() {
return tip;
}
/**
* var backData = {
* "tip":"images/MsgError.gif"
* }
*/
}
4)jQuery解析XML
- xml :
<?xml version="1.0" encoding="UTF-8"?>
<root>
<city>廣州</city>
<city>中山</city>
<city>深圳</city>
<city>佛山</city>
<city>珠海</city>
</root>
- jQuery :
<script type="text/javascript">
$(":button").click(function(){
var url = "${pageContext.request.contextPath}/03_city.xml";
var sendData = null;
$.get(url,sendData,function(backData,textStatus,ajax){
/*
//將xml文件轉(zhuǎn)成jquery對(duì)象魁索,目的是用jquery api解析xml文件
var $xml = $(backData);
var $city = $xml.find("city");
$city.each(function(){
//獲取每一個(gè)city節(jié)點(diǎn)
var city = $(this).text();
alert(city);
});
*/
var xml = ajax.responseXML;
var $xml = $(xml);
var $city = $xml.find("city");
$city.each(function(){
//獲取每一個(gè)city節(jié)點(diǎn)
var city = $(this).text();
alert(city);
});
});
});
</script>
5)省份-城市,基于jQuery的AJAX二級(jí)聯(lián)動(dòng)盼铁,用Struts2整合AJAX【非數(shù)據(jù)庫(kù)版】
- js :
<select id="province">
<option>選擇省份</option>
<option>廣東</option>
<option>湖南</option>
</select>
<select id="city">
<option>選擇城市</option>
</select>
<script type="text/javascript">
$("#province").change(function(){
//刪除原城市下拉框中的內(nèi)容粗蔚,除第一項(xiàng)外
$("#city option:gt(0)").remove();
var province = $("#province option:selected").text();
if("選擇省份" != province){
$.ajax({
"type":"POST",
"url":"${pageContext.request.contextPath}/findCityByProvince?time="+new Date().getTime(),
"sendData":{"province":province},
"success":function(backData,textStatus,ajax){
//js對(duì)象
var city = backData.cityList;
//jquery對(duì)象
var $city = $(city);
//each()
$city.each(function(){
//this表示每個(gè)城市
var $option = $("<option>" + this + "</option>");
$("#city").append( $option );
});
}
});
}
});
</script>
- java :
public class ProvinceCityAction extends ActionSupport{
private String province;//廣東
public void setProvince(String province) {
this.province = province;
}
public String findCityByProvince() throws Exception {
cityList = new ArrayList<String>();
if("廣東".equals(province)){
cityList.add("湛江");
cityList.add("汕頭");
}else if("湖南".equals(province)){
cityList.add("邵陽(yáng)");
cityList.add("瀏陽(yáng)");
}
return "ok";
}
private List<String> cityList;
public List<String> getCityList() {
return cityList;
}
/**
* var backData = {
* "cityList":["邵陽(yáng)","瀏陽(yáng)"]
* }
*/
}
- struts :
<struts>
<package name="timePackage" extends="json-default" namespace="/">
<global-results>
<result name="ok" type="json"/>
</global-results>
<!-- 獲取服務(wù)端時(shí)間 -->
<action
name="loadTimeRequest"
class="cn.itcast.javaee.js.time.TimeAction"
method="loadTimeMethod"/>
<!-- 檢查用戶名和密碼是否存在 -->
<action
name="checkRequest"
class="cn.itcast.javaee.js.register.RegisterAction"
method="checkMethod"/>
<!-- 根據(jù)省份查詢城市 -->
<action
name="findCityByProvince"
class="cn.itcast.javaee.js.provincecity.ProvinceCityAction"
method="findCityByProvince"/>
</package>
</struts>
二)掌握J(rèn)ava調(diào)用Oracle過(guò)程與函數(shù)
- 寫(xiě)一個(gè)計(jì)算個(gè)人所得稅的應(yīng)用
- sql :
--定義過(guò)程
create or replace procedure get_rax(salary in number,rax out number)
as
--需要交稅的錢(qián)
bal number;
begin
bal := salary - 3500;
if bal<=1500 then
rax := bal * 0.03 - 0;
elsif bal<=4500 then
rax := bal * 0.1 - 105;
elsif bal<=9000 then
rax := bal * 0.2 - 555;
elsif bal<=35000 then
rax := bal * 0.25 - 1005;
elsif bal<=55000 then
rax := bal * 0.3 - 2755;
elsif bal<=80000 then
rax := bal * 0.35 - 5505;
else
rax := bal * 0.45 - 13505;
end if;
end;
/
--調(diào)用過(guò)程
declare
--交稅
rax number;
salary number := &salary;
begin
get_rax(salary,rax);
dbms_output.put_line(salary||'元工資需要交'||rax||'元稅');
end;
/
- java :
public class TestCallOracleProc {
public static void main(String[] args) throws Exception{
String sql = "{call get_rax(?,?)}";
Connection conn = JdbcUtil.getConnection();
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.setInt(1,10000);
cstmt.registerOutParameter(2,Types.INTEGER);
cstmt.execute();
Integer rax = cstmt.getInt(2);
System.out.println("10000元需要交" + rax + "元稅");
JdbcUtil.close(cstmt);
JdbcUtil.close(conn);
}
}
- 查詢7788號(hào)員工的的姓名,職位饶火,月薪
- sql語(yǔ)句 :
--定義函數(shù)
create or replace function findEmpNameAndJobAndSal(pempno in number,pjob out varchar2,psal out number)
return varchar2
as
pename emp.ename%type;
begin
select ename,job,sal into pename,pjob,psal from emp where empno = pempno;
return pename;
end;
/
--調(diào)用函數(shù)
declare
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
pename := findEmpNameAndJobAndSal(7788,pjob,psal);
dbms_output.put_line('7788'||'--'||pename||'--'||pjob||'--'||psal);
end;
/
- java :
public class TestCallOracleFunc {
public static void main(String[] args) throws Exception{
String sql = "{?=call findEmpNameAndJobAndSal(?,?,?)}";
Connection conn = JdbcUtil.getConnection();
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.registerOutParameter(1,Types.VARCHAR);
cstmt.setInt(2,7788);
cstmt.registerOutParameter(3,Types.VARCHAR);
cstmt.registerOutParameter(4,Types.INTEGER);
cstmt.execute();
String ename = cstmt.getString(1);
String job = cstmt.getString(3);
Integer sal = cstmt.getInt(4);
System.out.println(ename+":"+job+":"+sal);
JdbcUtil.close(cstmt);
JdbcUtil.close(conn);
}
}
三)mysql的優(yōu)化
為什么要優(yōu)化:隨著實(shí)際項(xiàng)目的啟動(dòng)鹏控,數(shù)據(jù)庫(kù)經(jīng)過(guò)一段時(shí)間的運(yùn)行,最初的數(shù)據(jù)庫(kù)設(shè)置肤寝,會(huì)與實(shí)際數(shù)據(jù)庫(kù)運(yùn)行性能會(huì)有一些差異当辐,這時(shí)我們就需要做一個(gè)優(yōu)化調(diào)整
-
數(shù)據(jù)庫(kù)優(yōu)化這個(gè)課題較大,可分為四大類:
- 主機(jī)性能
- 內(nèi)存使用性能
- 網(wǎng)絡(luò)傳輸性能
- SQL語(yǔ)句執(zhí)行性能【軟件工程師】
-
下面列出一些數(shù)據(jù)庫(kù)SQL優(yōu)化方案:
-1)選擇最有效率的表名順序(筆試忱鹂矗考)- 數(shù)據(jù)庫(kù)的解析器按照從右到左的順序處理FROM子句中的表名缘揪,F(xiàn)ROM子句中寫(xiě)在最后的表將被最先處理,在FROM子句中包含多個(gè)表的情況下,你必須選擇記錄條數(shù)最少的表放在最后义桂,如果有3個(gè)以上的表連接查詢,那就需要選擇那個(gè)被其他表所引用的表放在最后找筝。
- 例如:查詢員工的編號(hào),姓名澡刹,工資呻征,工資等級(jí),部門(mén)名
select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dname
from salgrade,dept,emp
where (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal)
- 1)如果三個(gè)表是完全無(wú)關(guān)系的話罢浇,將記錄和列名最少的表陆赋,寫(xiě)在最后,然后依次類推
- 2)如果三個(gè)表是有關(guān)系的話嚷闭,將引用最多的表攒岛,放在最后,然后依次類推
-2)WHERE子句中的連接順序(筆試嘲蹋考)
- 數(shù)據(jù)庫(kù)采用自右而左的順序解析WHERE子句,根據(jù)這個(gè)原理,表之間的連接必須寫(xiě)在其他WHERE條件之左, 那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫(xiě)在WHERE子句的之右灾锯。
- 例如:查詢員工的編號(hào),姓名嗅榕,工資顺饮,部門(mén)名
select emp.empno,emp.ename,emp.sal,dept.dname
from emp,dept
where (emp.deptno = dept.deptno) and (emp.sal > 1500)
-3)SELECT子句中避免使用*
號(hào)
- 數(shù)據(jù)庫(kù)在解析的過(guò)程中,會(huì)將*
依次轉(zhuǎn)換成所有的列名,這個(gè)工作是通過(guò)查詢數(shù)據(jù)字典完成的凌那,這意味著將耗費(fèi)更多的時(shí)間 : select empno,ename from emp;
-4)用TRUNCATE替代DELETE
-5)盡量多使用COMMIT : 因?yàn)镃OMMIT會(huì)釋放回滾點(diǎn)
-6)用WHERE子句替換HAVING子句, WHERE先執(zhí)行兼雄,HAVING后執(zhí)行
-7)多使用內(nèi)部函數(shù)提高SQL效率
-8)使用表的別名 : salgrade s
-9)使用列的別名 : ename e