Javaweb開發遇到的問題及解決方案(2017.5.18)
1.利用eclipse新建的Javaweb專案沒有部署描述符web.xml檔案怎麼辦?
右鍵專案名稱->Java EE Tools->Generate Deployment descriptor stub
2.專案釋出時,src資料夾裡的java原始檔編譯後生成的.class位元組碼檔案在哪個資料夾裡?
釋出到tomcat時(在eclipse裡啟動tomcat),src資料夾裡的java檔案經過編譯後,會把.class檔案放在WEB-INF資料夾裡的classes資料夾中,編譯時會自動生成。
3.JavaScript中,history.go(-1)和History.back()的區別?
go(-1): 返回上一頁,原頁面表單中的內容會丟失;back(-1):返回上一頁,原頁表表單中的內容會保留,一般還是back(-1)用的多。
window.location.reload() //重新整理
window.history.go(1) //前進
window.history.go(-1) //後退
window.history.forward() //前進
window.history.back() 後退+重新整理
4.Javaweb專案開發中中文顯示亂碼問題,該如何解決?
Jsp前臺頁面出現亂碼:
①最主要原因就是jsp頁面編碼問題,給頁面新增如下<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">即可解決。
外部JS(JavaScript檔案)出現亂碼:
①這種比較頭疼,呼叫的外部*.js(獨立的JavaScript),其中js檔案中涉及向前臺輸入中文,比方:$("#divNameError").html("請輸入姓名");document.getElementById("theClock").innerHTML=”你好”;顯示亂碼,而如果把js程式碼直接寫在前端jsp頁面中就正常顯示,導致的原因是*.js與*.jsp檔案編碼不統一導致的,可以通過NotePad++轉換編碼即可。
servlet後臺獲取前端資料出現亂碼:
①後臺servlet新增:request.setCharacterEncoding
response.setCharacterEncoding("UTF-8");
②從不同編碼的前臺獲取資料新增:String linename = newString(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
③還有一種就是通過form表單提交資料時,沒有寫method屬性,導致後臺一直獲取到亂碼。
比較通用的方法可以,直接更改Tomcat server.xml檔案,
5.WEB-INF下如何實現*.jsp檔案的互相跳轉?
我們知道WEB-INF許可權比較高,不允許直接的公共訪問,也就意味著我們得新建servlet形式來進行訪問。但對於那種只要求實現跳轉頁面需求而不需要後臺進行資料處理的,顯然這種方式比較low。那能否在不建任何後臺中介軟體的情況下,實現頁面的跳轉呢?其實是可以的。
在web.xml檔案下配置:
前臺的獲取方式為:
注意:其中<jsp-file>名為實際跳轉頁面的路徑,檔案必須存在;而<url-pattern>名無特別限制可以任取,有意義就行。前臺的獲取採用專案名+url名的形式,這點比較特殊。
這種方法不是特別推薦,最好的方式是新建一個共通的servlet,通過傳參的形式實現。
後臺共通servlet程式碼:
前臺程式碼:
6.輸入框獲取焦點陰影特效的實現?(邊框效果)
box-shadow 屬性向框新增一個或多個陰影。基本語法是{box-shadow:[inset] x-offset y-offset blur-radius spread-radiuscolor}物件選擇器 {box-shadow:[投影方式] X軸偏移量 Y軸偏移量陰影模糊半徑陰影擴充套件半徑陰影顏色}
7. 用超連結進行頁面跳轉時日曆WdatePicker()控制元件不可用,而單獨執行此頁面時卻可以使用,這是為什麼?
如果將*.jsp放在WEB-INF目錄外,採用超連結href的方式確實可以正常跳轉頁面,但跳轉到的頁面,所有外部呼叫的js都沒有載入進來,所以是不可用的。建議如果跳轉頁面存在js載入,最好採用servlet後臺方式實現頁面跳轉。
8.Jsp頁面顯示時間,並同步實時更新如何實現?
9.Jsp圖片輪播的實現,並且可以進行滑鼠點選控制。下面程式碼採用jQuery實現,比較通用。
<script type="text/javascript">
$(function(){
//滑鼠滑過banner,左右按鈕進行顯示和隱藏
$(".banner").hover(function(){
$(".lr").show();
},function(){
$(".lr").hide();
});
//點選下面的小按鈕(小按鈕為列表li),圖片進行左右切換效果
$(".anniu li").click(function(){
//jQuery 遍歷,siblings()獲得匹配集合中每個元素的同胞。removeClass()方法移除被選元素
$(this).addClass("on").siblings().removeClass("on");
var num=$(this).index();
//jQuery animate()方法,動畫漸變。 marginLeft元素的左外邊距,slow速度等級
$(".pic").animate({marginLeft:-200*num},"slow");
});
//圖片自動輪播效果
var a=0;
varautomatic=setInterval(function(){
a++;
a=a%5;
$(".pic").animate({marginLeft:-200*a},"slow");
$(".anniuli").eq(a).addClass("on").siblings().removeClass("on");
},6000);
//點選左右按鈕,圖片進行切換效果
$(".pre").click(function(){
a--;
a=(a+5)%5;
$(".pic").animate({marginLeft:-200*a},"slow");
$(".anniuli").eq(a).addClass("on").siblings().removeClass("on");
});
$(".next").click(function(){
a++;
a=a%5;
$(".pic").animate({marginLeft:-200*a},"slow");
$(".anniuli").eq(a).addClass("on").siblings().removeClass("on");
});
});
</script>
<ulclass="pic">
<li>
<ahref="#"><img src="resource/images/ali.png"alt="頭像" width="200" height="200"></a>
</li>
<li>
<ahref="#"><img src="resource/images/ali2.png"alt="頭像" width="200"height="200"></a>
</li>
<li>
<ahref="#"><img src="resource/images/ali3.png"alt="頭像" width="200" height="200"></a>
</li>
<li>
<ahref="#"><img src="resource/images/drem.png"alt="頭像" width="200"height="200"></a>
</li>
<li>
<ahref="#"><img src="resource/images/kuer.png"alt="頭像" width="200"height="200"></a>
</li>
</ul>
<ulclass="anniu">
<liclass="on"></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<ulclass="lr">
<liclass="pre"><a href="#"> <</a></li>
<liclass="next"><a href="#"> ></a></li>
</ul>
10. button如何按鈕實現頁面傳參、跳轉?
··
11.從後臺取值,判斷前臺單選按鈕是否選中的實現方法。
12. jsp頁面中輸出百分比如何實現?
從程式碼最簡方面考慮可以採用jstl提供的方法,需要匯入<%@ taglib prefix="f"uri="http://java.sun.com/jsp/jstl/fmt"%>
13.比方說,資料插入到資料庫成功。後臺如何向前臺輸出提示資訊,或者後臺如何呼叫js到前臺?
14. eclipse匯入jQuery-1.8.2.min.js老是報錯,顯示紅色的叉叉,但不影響使用。有什麼辦法可以去掉紅色的錯誤嗎?
去除編譯器js的驗證:Window<Preferences<JavaScript<Validator<Errors/Warnings中Enable JavaScript semantic validation前面的鉤去掉。
刪除.project檔案中的
<buildCommand>
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
<arguments>
</arguments>
</buildCommand>
此時錯誤還沒消失,需要刪除專案,再重新匯入到工作區即可。
15.前端form表單的提交驗證,<input type=”button”>最好採用普通的button按鈕,書寫提交事件;而不推薦使用submit,主要是由於js如果出現錯誤它會直接跳出而不執行往後程式碼,從而導致js沒有驗證也提交。具體案例如下:
如果以上function函式中,由於疏忽拼寫錯誤等因素導致程式碼直接跳出,沒有進行驗證而直接進行submit提交,這樣豈不是一個巨大的bug?最好的方式是type改為button,進行手動的提交,這樣即使js程式碼出錯,form表單也不會提交。
16. 要求使用cookie儲存使用者登入資訊,並在前端Center.jsp頁面中顯示。主要application和session不能滿足要求(不想頻繁傳參於前後臺),主要因為通過Center跳轉到其它頁面,然後採用頁面重定向返回Center頁面時,建立的使用者登入資訊會消失。Session是由於伺服器認為開啟的新窗體而建立了新的session,認為不是同一個物件;而application是由於Tomcat重新載入而消失。
Controller層cookie建立:
前端jsp頁面的獲取:
注意:jsp頁面關於cookie的操作需要引入jquery.cookie.js,否則會獲取不到。
17.使用js進行表單驗證時,使用document.getElementById("divPwdError").hide();屬性一致報錯,這是為什麼?
hide()和show()對div進行顯示和隱藏時,必須匯入jquery-1.8.2.min.js,因為它為jQuery特定方法,原生 jsp不支援這麼方法,可用document.getElementById("divPwdError ").style.visibility="hidden";//隱藏
document.getElementById("divPwdError").style.visibility="visible"; //顯示
或:
document.getElementById("typediv1").style.display="none";//隱藏
document.getElementById("typediv1").style.display="";//顯示
js實現點選按鈕顯示和隱藏
functionshowhidediv(id){
varsbtitle=document.getElementById(id);
if(sbtitle){
if(sbtitle.style.display=='block'){
sbtitle.style.display='none';
}else{
sbtitle.style.display='block';
}
}
}
18.js想獲取jsp頁面某個標籤的值時,發現標籤是div或者其它什麼標籤並沒有value屬性怎麼辦?還是實行不了?
答案可以實現:<divid="divuser" value="<%=cookies[i].getValue()%>">當前使用者:<%=cookies[i].getValue() %></div>
Js可以通過attr("value")方法獲取var user = $("#divuser").attr("value");
19.後臺controller層cookie的建立,以及前臺cookie的獲取?
Controller層建立cookie實現(建立到伺服器端):
Jsp前臺頁面獲取(從伺服器端獲取):
Jsp前臺頁面獲取(從客戶端獲取):
19.eclipse如何匯入apache Tomcat包?
Build Path ->Configure Build Path -> Add Variable -> Server Runtime
JavaSpring MVC框架開發
1.字串String轉map?
確認你的字串是否是json格式的,如果是json格式,那你可以使用Gson.jar或json-lib-xx-jdk.jar兩個包來自動解析解析。
使用Gson更簡單些,只需要匯入一個包就可以,但是他如果使用Object解析到int型的話或自動轉成double型,需要定義一個準確的類來解析,不能直接使用Object。示例:
Gson gson = new Gson();
Map<String, Object> map = new HashMap<String,Object>();
map = gson.fromJson(str, map.getClass());
使用json-lib包的話需要匯入更多的包,需要額外匯入commons-lang.jar、ezmorph-1.0.4.jar、commons-logging-1.1.1.jar、commons-collections.jar、commons-beanutils.jar這5個包。解析示例如下:
JSONObject jb = JSONObject.fromObject(str);
Map<String, Object> map = (Map<String,Object>)jb;
如果你的字串不是json格式,那你就需要自己使用split分割字串,例如:
2.*.jsp頁面點選按鈕,彈出輸入框,並將輸入引數傳入後臺Controller層執行,該的如何實現?
3.jsp頁面中,button按鈕實現刪除功能,要求:①彈出確認框;②執行後臺Controller層的操作,並傳入引數;③要求通用,在foreach語句中也可以執行,並且引數根據點選的位置進行變化。④不設隱藏域,隱藏域影響安全性。
4.使用spring MVC框架開發時,頁面跳轉最容易出現路徑問題,掌握下面幾個方法即可解決。
<%=request.getContextPath()%>是為了解決相對路徑的問題,可返回站點的根路徑。request.getContextPath()應該是得到專案的名字,如果專案為根目錄,則得到一個"",即空的字條串。如果專案為abc,<%=request.getContextPath()% > 將得到abc,伺服器端的路徑則會自動加上,<a href="XXXX.jsp"> 是指當前路徑下的這個xxx.jsp頁面,有時候也可以在head裡設定html:base來解決路徑的問題,不過用的最多的還是request.getContextPath。在js檔案中得到request.getContextPath()的值,不想在JSP中寫太多的JavaScript程式碼:一種方法是用hidden: <input type=hidden name=contextPath value=<%=request.getContextPath()>再就是在本頁面的js裡面也是可以使用Scriptlet來賦值的: var a = '<%=request.getContextPath()>'
參考servlet中的介面:
request.getScheme();返回的協議名稱,預設是http
request.getServerName()返回的是你瀏覽器中顯示的主機名
getServerPort()獲取伺服器埠號
實際應用中,一般用來解決jsp測試和生產環境路徑不同的問題:
<%
String appContext= request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+ request.getServerPort()+ appContext;
%>
2.java中各註解的含義?
Oracle資料的操作
1. oracle資料庫建立的連線,再客戶端什麼資料夾下可以配置?
在客戶端D:\ProgramFiles\PLSQL Developer\instantclient_11_2\tnsnames.ora下可以配置,也可以配置連線外部的資料庫。
orcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =127.0.0.1 )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl )
)
)
2.
// 附 : 常用的正則表示式:
// 匹配特定數字:
// ^[1-9]d*$ //匹配正整數
// ^-[1-9]d*$ //匹配負整數
// ^-?[1-9]d*$ //匹配整數
// ^[1-9]d*|0$ //匹配非負整數(正整數 +0)
// ^-[1-9]d*|0$ //匹配非正整數(負整數 + 0)
// ^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮點數
// ^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配負浮點數
// ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮點數
// ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非負浮點數(正浮點數 + 0)
// ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮點數(負浮點數 + 0)
// 評註:處理大量資料時有用,具體應用時注意修正
//
// 匹配特定字串:
// ^[A-Za-z]+$ //匹配由26個英文字母組成的字串
// ^[A-Z]+$ //匹配由26個英文字母的大寫組成的字串
// ^[a-z]+$ //匹配由26個英文字母的小寫組成的字串
// ^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字串
// ^w+$ //匹配由數字、26個英文字母或者下劃線組成的字串
//
// 在使用RegularExpressionValidator驗證控制元件時的驗證功能及其驗證表示式介紹如下:
//
// 只能輸入數字:“^[0-9]*$”
// 只能輸入n位的數字:“^d{n}$”
// 只能輸入至少n位數字:“^d{n,}$”
// 只能輸入m-n位的數字:“^d{m,n}$”
// 只能輸入零和非零開頭的數字:“^(0|[1-9][0-9]*)$”
// 只能輸入有兩位小數的正實數:“^[0-9]+(.[0-9]{2})?$”
// 只能輸入有1-3位小數的正實數:“^[0-9]+(.[0-9]{1,3})?$”
// 只能輸入非零的正整數:“^+?[1-9][0-9]*$”
// 只能輸入非零的負整數:“^-[1-9][0-9]*$”
// 只能輸入長度為3的字元:“^.{3}$”
// 只能輸入由26個英文字母組成的字串:“^[A-Za-z]+$”
// 只能輸入由26個大寫英文字母組成的字串:“^[A-Z]+$”
// 只能輸入由26個小寫英文字母組成的字串:“^[a-z]+$”
// 只能輸入由數字和26個英文字母組成的字串:“^[A-Za-z0-9]+$”
// 只能輸入由數字、26個英文字母或者下劃線組成的字串:“^w+$”
// 驗證使用者密碼:“^[a-zA-Z]\\w{5,17}$”正確格式為:以字母開頭,長度在6-18之間,
//
// 只能包含字元、數字和下劃線。
// 驗證是否含有^%&’,;=?$”等字元:“[^%&’,;=?$x22]+”
// 只能輸入漢字:“^[u4e00-u9fa5],{0,}$”
// 驗證Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
// 驗證InternetURL:“^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$”
// 驗證電話號碼:“^((d{3,4})|d{3,4}-)?d{7,8}$”
//
// 正確格式為:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,
//
// “XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
// 驗證身份證號(15位或18位數字):“^d{15}|d{}18$”
// 驗證一年的12個月:“^(0?[1-9]|1[0-2])$”正確格式為:“01”-“09”和“1”“12”
// 驗證一個月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”正確格式為:“01”“09”和“1”“31”。
//
// 匹配中文字元的正則表示式: [u4e00-u9fa5]
// 匹配雙位元組字元(包括漢字在內):[^x00-xff]
// 匹配空行的正則表示式:n[s| ]*r
// 匹配HTML標記的正則表示式:/<(.*)>.*|< (.*) />/
// 匹配首尾空格的正則表示式:(^s*)|(s*$)
// 匹配Email地址的正則表示式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
// 匹配網址URL的正則表示式:^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$