其實我現在覺得也挺蒙的,主要是對於頁面跳轉的相對路徑和絕對路徑的把握經常糊塗,所以先記下來一點點到時候再找到更好的方法的時候再作補充。
其實現在很多都是用架構進行開發了,但是架構技術與jsp技術還是有很大的關係的,以前倒是經常沒認真細看,所以還是作一下筆記好自己能慢慢體會。因為對這些技術自己以前都米有深入瞭解。。。所以記下來一些簡單點的筆記~~~~
application:(ServeltContext執行個體)
該執行個體代表jsp所屬的web應用本身,可用於jsp頁面或在servlet之間交換資訊,常用方法setAttribute(name,value),getAttribute(name),getInitParameter(name)
request:(HttpServeltContext執行個體)
對象封裝了一次請求,用戶端的請求參數都被封裝到該對象裡。常用方法getParameter(name),getParameterValues(name),setAttribute(name,value),getAttribute(name),setCharacterEncoding(encode)
1.利用application擷取web應用配置參數
/kernal/getparam.jsp
<body> <% //從配置參數中擷取驅動、url、資料庫的使用者名稱和密碼 String driver = application.getInitParameter("driver"); String url = application.getInitParameter("url"); String user = application.getInitParameter("user"); String pass= application.getInitParameter("pass"); //註冊驅動 Class.forName(driver); //獲得資料庫;串連 Connection conn = DriverManager.getConnection(url,user,pass); //建立statement對象 Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select * from user"); %> <table> <% while(rs.next()){ %> <tr> <td><%=rs.getString(1) %></td> <td><%=rs.getString(2) %></td> <td><%=rs.getString(3) %></td> </tr> <%} %> </table> </body>
application的getInitParameter(name)方法擷取web應用配置參數,而這些參數是儲存到web.xml中的context-param元素中的,所以下一步可以看一下web.xml的配置
<context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param>
這裡的param-name指明名字是driver,param-value指明驅動的名字。按這樣的格式可以繼續設定url,user,pass,名字其實都是任意定義的,只要保證getparam.jsp上面的名字和web.xml的名字一一對應起來就可以了
按照getparam.jsp的參數來看,會顯示user表中每一行的前3列。
然後下面是關於留言板的例子,日誌開篇的application和request聯絡起來
/msg/msg_ed.jsp
這個頁面是用於準備添加留言的頁面
先大概寫一下主要架構:
/*num為留言數,一開始進入jsp時,num=0,後面再通過application的getAttribute("num")方法取得當前留言簿中的num數*/<%String temp = new String();temp = (String)application.getAttribute("num");if(temp == null) application.setAttribute("num", "0");%>//然後table中有3個參數//標題:<name="txtti"> 作者:<name="txtau"> 內容:<name="txtau">//其中前兩者是tetx類型,最後是textarea類型<type="submit" value="添加添加"><type="reset" value="重設"><type="button" value="查看所有留言">
詳細的代碼:
<html> <head> <title>My JSP 'msg_ed.jsp' starting page</title> <script type="text/javascript"> function MM_openWindow(theURL,winName,features){ window.open(theURL,winName,features); } </script> </head> <body> <% String temp = new String(); temp = (String)application.getAttribute("num"); if(temp == null) application.setAttribute("num", "0"); %> <h3>留言板</h3> <hr size="1"> <form action="msg_ok.jsp" method="post" name="form1"> <table align ="center" width="60%"> <tr><td width="20%">留言作者:</td> <td width="80%"><input type="text" name="txtau"/></td> </tr> <tr><td width="20%">留言標題:</td> <td width="80%"><input type="text" name="txtti"/></td> </tr> <tr><td width="20%">留言內容:</td> <td width="80%"><textarea name="txtnr" cols="45" rows="5"></textarea></td> </tr> <tr> <td><input type="submit" name="btadd" value="添加到留言簿"/></td> <td><input type="reset" name="btres" value="重新填寫留言"/></td> <td><input type="button" name="btrea" value="查看所有留言" onClick="MM_openWindow('msg_sh.jsp'),'','width=400,height=400'"/></td> </tr> </table> </form> </body></html>
/msg/msg_ok.jsp
添加留言成功的頁面
<body> <h3>留言板</h3> <hr size="1"> <% int n; String temp = new String(); String temp1 = new String(); String temp2 = new String(); String temp3 = new String(); temp1 = request.getParameter("txtau"); temp2 = request.getParameter("txtti"); temp3 = request.getParameter("txtnr"); n = temp1.length()*temp2.length()*temp3.length(); if(n!=0){ temp = (String)application.getAttribute("num"); n = Integer.parseInt(temp); n = n+1; temp = temp.valueOf(n); application.setAttribute("num", temp); application.setAttribute("ti"+temp, temp1); application.setAttribute("au"+temp, temp2); application.setAttribute("nr"+temp, temp3); %><p align="center">留言成功 <%}else{ %> <p align="center">不添加標題、作者或內容,留言失敗! <%} %> <p align="center"><a href="msg_ed.jsp">返回首頁</a> </body>
簡單的分析一下:通過request.getParameter(name)的方法獲得上一次頁面提交的請求的參數標題、作者、內容等用戶端參數)。前面提及到的request對象就是用來封裝一次請求的,我們需要通過這個對象來獲得用戶端請求的參數,這時我們就可以得到txtau,txtti,txtnr的值。事實上,我們的留言數會隨著我們的添加而一直上升的,要如何區分對象呢?靠的就是每次建立一次留言就增加的數n。每一條留言都有其對應的n其實就跟我們平常的id號類似,唯一標識一段留言),這時application對於每一條留言的參數都通過setAttribute(name,value)方法使得ti1和temp1對應起來,ti2和下一個temp1對應起來。
/msg/msg_sh.jsp
<%int n;String temp = new String();String temp1 = new String();String temp2 = new String();String temp3 = new String();temp = (String)application.getAttribute("num");n = Integer.parseInt(temp);if(n == 0){%><p align="center">目前沒有文章<%}else{ %> <table width="60%" border="1" bordercolor="#999999"> <% int i; for(i=1;i<=n;i++){ temp = temp.valueOf(i); temp1 = (String)application.getAttribute("ti"+temp); temp2 = (String)application.getAttribute("au"+temp); temp3 = (String)application.getAttribute("nr"+temp); %> <tr> <td bgcolor="#CCCCFF" height="30"> <b><%=temp%>.標題 :<%=temp1 %> 作者:<%=temp2 %></b> </td> </tr> <tr><td><%=temp3 %></td></tr> <%}%> </table> <%} %>
通過for迴圈輸出所有的留言。
整理一下思路:
msg_ed.jsp的num值通過(application的get或setAttribute方法獲得,看是不是第一個),form表單summit後提交到msg_ok.jsp,msg_ok.jsp通過request封裝上一次的請求,獲得一次留言request.getParameter()方法取得各個參數值,新增一個留言n=n+1,此時num值通過application.set的方法更新值,下一次獲得的時候就是已經更新後的num了。另外,為了區分留言,此時的n和一個留言對應起來setAttribute("ti"+temp);最後在msg_sh.jsp中通過for就可以把所有留言輸出。
另外,因為一開始測試的時候是放到index.jsp頁面,那時通過
<!--<jsp:include page="msg/msg_ed.jsp"></jsp:include> --><!-- <jsp:forward page="msg/msg_ed.jsp"></jsp:forward> -->
這兩種方法來進入,
兩者對應的URL都為:localhost/jspkernal(其中jspkernal為對應的project名)
那麼include和forward有什麼區別呢~~查了查~~include是將一個頁麵包括進去,也就是一個jsp裡面通過多個include可以包含多個jsp的,forward是請求轉寄另一個資源,也就是把資源給覆蓋到我們的index.jsp中了~~正因為如此,兩者的URL都不會變化。
另外,kernal是放到WebRoot下的,也有人習慣放到WEB-INF下,不過我還在糾結著應該怎樣放到WEB-INF下,目前如果放到這個目錄下的話我只能通過絕對路徑找到jsp頁面,很明顯,很麻煩的,每次都輸很長的字串。。。不過應該還有別的方法,我繼續探索吧。。。
另外,就像我之前是放到index.jsp上面測試的,這樣不太好就這個代碼而言),因為程式是從localhost/jspkernal這一路徑出發的,所以當向msg_ed.jsp的form action是到"msg_ok.jsp",此時很明顯就會跳轉到localhost/jspkernal/msg_ok.jsp,但我的msg_ok.jsp的詳細目錄應該是/jspkernal/msg/msg_ok.jsp,所以我還是得好好再測試測試多幾次瞭解瞭解相對路徑以怎麼好的方式才可以很好地在各個頁面中跳轉額。。。。≡(▔﹏▔)≡
本文出自 “再累也要開心D” 部落格,請務必保留此出處http://zhangzhang.blog.51cto.com/6250085/1304279