1. 程式人生 > >Javaweb開發遇到的問題及解決方案(2017.5.18)

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

("UTF-8");

                    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後臺方式實現頁面跳轉。


8Jsp頁面顯示時間,並同步實時更新如何實現?

 

9Jsp圖片輪播的實現,並且可以進行滑鼠點選控制。下面程式碼採用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-./?%&=]*)?$