資料講義ja筆記凡day13day_第1頁
資料講義ja筆記凡day13day_第2頁
資料講義ja筆記凡day13day_第3頁
資料講義ja筆記凡day13day_第4頁
資料講義ja筆記凡day13day_第5頁
已閱讀5頁,還剩79頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、2.jstl庫(1)jstl的概述* apache的東西,依賴EL* 使用jstl需要導(dǎo)入jstl1.2.jar* 四大庫:> core:庫,重點> fmt:格式化:日期、數(shù)字> sql:過時> xml:過時(2). 導(dǎo)入庫* jar包 jstl-1.2.jar* 在jsp頁面中:<%taglib prefix="前綴" uri="路徑"%>3.out和set導(dǎo)入JSTL的core庫:<% taglib prefix="c" uri="" %>(1)- prefix=

2、"c":指定(2)- uri="件;庫的前綴,這個前綴可以隨便給值,但大家都會在使用core庫時指定前綴為c;":指定庫的uri,它不一定是真實存在的,但它可以讓JSP找到庫的描述文out和set* <c:out>:輸出> value:可以是字符串常量,也可以是EL表達式> default:當(dāng)要輸出的內(nèi)容為nul時,會輸出default指定的值> escapeXml:默認值為true,表示轉(zhuǎn)義!* <c:set>:設(shè)置(創(chuàng)建域的屬性)> var:變量名> value:變量值,可以是EL表達式>

3、scope:域,默認為page,可選值:page、request、session、application圖如何來防止這種呢?(escapeXml如果是false,那就不轉(zhuǎn)義)把el表達式$code 改為 <c:out value="$code " ></c:out>下面是setset是用來替代java的setAttribute的例如,用<c:set var="code"value="<script>alert('hello');</script>" scope=&q

4、uot;request"></c:set>來代替<%request.setAttribute("code", "<script>alert('hello');</script>");%>4.removeremove* <remove>:刪除域變量> var:變量名> scope:如果不給出scope,表示刪除所有域中的該名稱的變量;如果指定了域,那么只刪除該域的變量。5.urlurl* value:指定一個路徑!它會在路徑前面自動添加項目名。<&

5、gt; <c:url value="/index.jsp"/>,它會輸出/day13_1/index.jsp* 子:<c:param>,用來給url后面添加參數(shù),例如:<c:url value="/index.jsp"><c:param name="username" value="張三"/> <!-可以對參數(shù)進行url編碼!-></c:url>結(jié)果為:/day13_1/index.jsp?username=%ED%2C%3F%ED%2C%3F

6、* var:指定變量名,一旦添加了這個屬性,那么url* scope:它與var一起使用,用來保存url。就再輸出到頁面,而是把生成url保存到域中。6.if和choose(1)if:對應(yīng)java中的if語句* <c:if test="布爾類型">.</c:if>,當(dāng)test為值時,執(zhí)行體內(nèi)容!舉例之前先說一個$empty empty是關(guān)鍵字, 代表空的(表示如果為空的話),上面語句意思為name參數(shù)是否為空對應(yīng)還有not empty 表示如果不為空的話(空代表有沒有參數(shù))舉例:<c:if test="$empt

7、y param.score ">您沒有給出參數(shù)</c:if>param.value怎么賦值?在瀏覽器地址欄手動賦值就行?score=80這時候param.score=80下面介紹choose(2) choose:它對應(yīng)java中的if/else if/ . /else* 例如:<c:choose><c:when test="">.</c:when><c:when test="">.</c:when><c:when test="">.&l

8、t;/c:when>.<c:otherwise> .</c:otherwise></c:choose>等同與if(.) else if( ) else if( ) else if( ) .else 舉例7.forEach它用來循環(huán)遍歷數(shù)組、集合!它還可以用來計數(shù)方式來循環(huán)!(1) 計數(shù)方式:for(int i = 1; i <= 10; i+) .等價于<c:forEach var="i" begin="1" end="10">$i</c:forEach>屬性:*

9、 var:循環(huán)變量* begin:設(shè)置循環(huán)變量從幾開始。* end:設(shè)置循環(huán)變量到幾結(jié)束。* step:設(shè)置步長!等同與java中的i+,或i+=2(step此時為2)。step默認為1。舉例子基礎(chǔ)用法<c:forEach var="i" begin="1" end="10">$i <br/></c:forEach><br/> 進階用法<c:forEach var="j" begin="1" end="10" step=&

10、quot;2">$j <br/></c:forEach><br/>輸出(2)用來輸出數(shù)組、集合!l 循環(huán)遍歷集合,類似for(Object o : 集合);但是,首先先寫java<%來新建數(shù)組String strs = "one","two","three"request.setAttribute("strs", strs);%>然后<c:forEach items="$strs " var="str"&g

11、t;$str <br/></c:forEach>等同于for(String str : strs) .屬性:* items:指定要循環(huán)誰,它可以是一個數(shù)組或一個集合* var:把數(shù)組或集合中的每個元素賦值給var指定的變量。一個值得注意的問題-jstl、EL表達式中的空格陷阱加空格后輸出以下錯誤內(nèi)容輸出正確8.forEach中的循環(huán)狀態(tài)變量循環(huán)狀態(tài)可以使用varStatus來創(chuàng)建循環(huán)狀態(tài)變量!循環(huán)狀態(tài)變量有如下屬性:* count:循環(huán)元素的個數(shù)(int類型)* index:循環(huán)元素的下標(int類型)* first:是否為第一個元素(boolean類型)* last:

12、是否為最后一個元素(boolean類型)* current:當(dāng)前元素(Object類型)簡單例子<c:forEach items="$list " var="ele" varStatus="vs">$vs.index $vs.count $vs.first $vs.last $vs.current <br/></c:forEach>輸出注意:$vs.current的效果與$vs 一致9.fmtfmt庫它是格式化庫<fmt:formatDate value="" patter

13、n="">value:指定一個Date類型的變量pattern:用來指定輸出的模板!例如:yyyy-MM-dd HH:mm:ss<fmt:formatNumber value="$num1" pattern="0.00">保留小數(shù)點后2位,它會四舍五入!如果不足2位,以0補位!<fmt:formatNumber value="$num1" pattern="#.#">保留小數(shù)點后2位,它會四舍五入!如果不足2位,不補位!舉個例子<%request.setAtt

14、ribute("num1", 3.141253);%><fmt:formatNumber value="$requestScope.num1 " pattern="0.00"></fmt:formatNumber>10.自定義自定義入門(1). 步驟*處理類(也是一個對象,那么就需要先有類?。? tld文件,它是一個xml* JSP頁面中使用<%taglib%>來指定tld文件的位置(2).處理類SimpleTag接口:* void doTag():每次執(zhí)行時都會調(diào)用這個方法;* JspTag

15、 getParent():返回父* void setParent(JspTag):設(shè)置父(非生命周期方法)* void setJspBody(JspFragment):設(shè)置體* void seetJspContext(JspContext):設(shè)置jsp上下文對象,它兒子是PageContext其中doTag()會在其他三個方法之后被tomcat調(diào)用。(3). 配置tld文件tld文件一般都放到WEB-INF之下,這樣保證客戶端<tag>不到!<name>myTag1</name> 指定當(dāng)前的名稱<tag-class>cn.itcast.tag.M

16、yTag1</tag-class> 指定當(dāng)前的處理類!<body-content>empty</body-content> 指定</tag>體的類型,我們這里使用的是空?。?). 頁面中指定tld文件位置<% taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>導(dǎo)庫,就是為頁面指定tld文件的位置!過程中一些注意事項新建tld文件(模板太老,其實不必用這個)taglib的內(nèi)容去其它地方“借”過來(例如jstl1,2.jar中c.tld)

17、首先第一步,新建一個處理類/* 自定義* author cxf*/public class MyTag1 implements SimpleTag private PageContext pageContext; private JspFragment body;/* 所有的set()方法都會在doTag()方法之前被tomcat調(diào)用!* 所在doTag()中就可以使用tomcat傳遞過來的對象了。*/ Overridepublic void doTag() throws JspException, IOException pageContext.getOut().print("He

18、llo Tag!");Overridepublic JspTag getParent() return null;Overridepublic void setJspBody(JspFragment body) this.body = body;/接收tocat給我們的""Overridepublic void setJspContext(JspContext context) this.pageContext = (PageContext) context;/接收tocat給我們的""public void setParent(JspTag

19、arg0) =其實上面實現(xiàn)接口的辦法代碼比較繁瑣,所以可以繼承其它類來達到方便的目的/* SimpleTagSupport它實現(xiàn)了SimpleTag接口。* 它已經(jīng)把所有的tomcat傳遞的數(shù)據(jù)都保存起來了!而且還提供了get方法供子類調(diào)用!* author cxf*/public class MyTag2 extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException this.getJspContext().getOut().print("再 Hello 一次 Tag!&q

20、uot;);附圖Tag2 extends SimpleTagSupport寫好處理類之后,第二步就要寫tld文件了其實下面紅字是需要寫的內(nèi)容,其余的都是模板。<?xml version="1.0" encoding="UTF-8"?><taglib xmlns="xmlns:xsi=" xsi:schemaLocation="jsptaglibrary_2_1.xsd" version="2.1">""<tlib-version>1.0&l

21、t;/tlib-version><short-name>itcast</short-name><uri></uri><tag><name>Tag1</name><tag-class>cn.itcast.tag.Tag1</tag-class><body-content>empty</body-content></tag><tag><name>Tag2</name><tag-class>cn.itca

22、st.tag.Tag2</tag-class><body-content>empty</body-content></tag></taglib>一點empty就類似與<br/>沒有屬性的空<tag><name>MyTag1</name><tag-class>cn.itcast.tag.MyTag1</tag-class><body-content>empty</body-content></tag>還有最后一步,就是在index

23、.jsp中使用在index.jsp前面導(dǎo)入自定義的庫<% taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %><body><h1><it:Tag1/></h1><br/><h1><it:Tag2/></h1></body>11.自定義進階之體內(nèi)容類型體內(nèi)容* empty:無體!* JSP:jsp2.0已經(jīng)不再支持這個類型了!表示體內(nèi)容可以是:java,可以是,可以是el表達式*

24、 scriptless:只能是EL表達式,也可以是其他的!* tagdependent:體內(nèi)容被執(zhí)行,而是直接賦值處理類!(不要用)一般用empty 還有scriptless步驟與上一節(jié)一樣,所以省略講處理類public class MyTag3 extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException Writer out = this.getJspContext().getOut();/獲取當(dāng)前jsp頁面的輸出流out.write("*<br/>"

25、;);this.getJspBody().invoke(out);/執(zhí)行體的內(nèi)容,把結(jié)果寫到執(zhí)行的流中,即頁面上out.write("<br/>*");在原來的tld文件中添加tag最后,在jsp使用<body><%request.setAttribute("%><h1>", "");<it:MyTag3>$</h1></body></it:MyTag3>輸出12.自定義之SkipPageException,不再執(zhí)行下面的內(nèi)容首先,寫處理類

26、public class MyTag4 extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException this.getJspContext().getOut().print("你只能看見我"); throw new SkipPageException();=然后,tld文件<tag><name>MyTag4</name><tag-class>cn.itcast.tag.MyTag4</tag-class>&

27、lt;body-content>empty</body-content></tag>=最后,jsp頁面使用在原來的jsp頁面頂端<body>之后加<h2><it:MyTag4/></h2>輸出13.自定義屬性之帶有屬性的步驟:1. 給你的為處理類添加屬性!處理類添加屬性,屬性至少要且一個set方法!這個set方在doTag()方法之前被tomcat執(zhí)行!所在doTag()中就可以使用屬性了。2. 在tld文件中對屬性進行配置<attribute><name>test</name>

28、指定屬性名<required>true</required> 指定屬性是否為必需的<rtexprvalue>true</rtexprvalue> 指定屬性是否可以使用EL</attribute>舉例先新建處理類public class MyTag5 extends SimpleTagSupport private boolean test;/* 這個方法由tomcat來調(diào)用*/public void setTest(boolean test) this.test = test;Overridepublic void doTag() t

29、hrows JspException, IOException if(test)/* 執(zhí)行*/體this.getJspBody().invoke(null);/null為默認當(dāng)前輸出流/this.getJspContext().getOut();然后在tld文件中配置<tag><name>MyTag5</name><tag-class>cn.itcast.tag.MyTag5</tag-class><body-content>scriptless</body-content><attribute>&

30、lt;name>test</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>=說明一下,rtexprvalue并不是一個單詞,而是 Run-time Expression Value的縮寫,指定屬性是否可以使用EL表達式最后,在jsp中使用<it:MyTag5 test="$empty param.<h2><it:MyTag4/></h2>&qu

31、ot;></it:MyTag5>注意問題14.MVCMVC它不是java獨有,所有的B/S結(jié)構(gòu)的項目都在使用它!M - m模型(寫代碼)V - View 視圖(jsp)C - Cotroller器(Servlet)1 MVC設(shè)計模式MVC設(shè)計模式MVC模式(M-View-Controller)是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個基本部分:模型(M)、視圖(View)和器(Controller)。MVC模式最早為Trygve Reenskaug提出,為施樂帕羅奧多研究中心(Xerox PARC)的Smalltalk語言發(fā)明的一種軟件設(shè)計模式。MVC可對程序的后期維

32、護和擴展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序簡化,更加直觀。l器Controller:對請求進行處理,負責(zé)請求轉(zhuǎn)發(fā);l 視圖View:界面設(shè)計進行圖形界面設(shè)計;l 模型M:程序編寫程序應(yīng)用的功能(實現(xiàn)算法等等)、數(shù)據(jù)庫管理;注意,MVC不是Java的東西,幾乎現(xiàn)在所有B/S結(jié)構(gòu)的軟件都采用了MVC設(shè)計模式。但是要注意,MVC在B/S結(jié)構(gòu)軟件并沒有完全實現(xiàn),例如在我們今后的B/S軟件中并有驅(qū)動!2 JavaWeb與MVCJavaWeb的經(jīng)歷了JSP M1、JSP M1二代、JSP M2三個時期。2.1 JSP MJSP M1第一代1是JavaWeb早期的模型,它適合

33、小型Web項目,開發(fā)成本低!M1第一代時期,服務(wù)器端只有JSP頁面,所有的操作都在JSP頁面中,連的維護和擴展極為不利。數(shù)據(jù)庫的API也在JSP頁面中完成。也就是說,所有的東西都耦合在一起,對后期2.2 JSP MJSP M1第二代1第二代有所改進,把業(yè)務(wù)邏輯的內(nèi)容放到了JavaBean中,而JSP頁面負責(zé)顯示以及請求調(diào)度的工作。雖然第二代比第一代好了些,但還讓JSP做了過多的工作,JSP中把視圖工作和請求調(diào)度(器)的工作耦合在一起了。2.3 JSP MJSP M22模式已經(jīng)可以清晰的看到MVC完整的結(jié)構(gòu)了。l JSP:視圖層,用來與用戶打交道。負責(zé)接收用來的數(shù)據(jù),以及顯示數(shù)據(jù)給用戶;l Se

34、rvlet:層,負責(zé)找到合適的模型對象來處理業(yè)務(wù)邏輯,轉(zhuǎn)發(fā)到合適的視圖;l JavaBean:模型層,完成具體的業(yè)務(wù)工作,例如:開啟、轉(zhuǎn)賬等。JSP M2適合多人合作開發(fā)大型的Web項目,各司其職,互不,有利于開發(fā)中的分工,有利于組件的重用。但是,Web項目的開發(fā)難度加大,同時對開發(fā)的技術(shù)要求也提高了。15.JavaWeb的三層框架JavaWeb三層框架Web層 -> 與Web相關(guān)的內(nèi)容(Servlet,JSP,Servlet相關(guān)API:request、response、session、ServletContext)業(yè)務(wù)層 -> 業(yè)務(wù)對象(Service)數(shù)據(jù)層 -> 操作數(shù)

35、據(jù)庫(DAO Data Access Object)(所有對數(shù)據(jù)庫的操作,不能跳出到DAO之外)JavaWeb經(jīng)典三層框架我們常說的三層框架是由JavaWeb提出的,也就是說這是JavaWeb獨有的!所謂三層是表述層(WEB層)、業(yè)務(wù)邏輯層(Business Logic),以及數(shù)據(jù)l WEB層:包含JSP和Servlet等與WEB相關(guān)的內(nèi)容;l 業(yè)務(wù)層:業(yè)務(wù)層中不包含JavaWeb API,它只關(guān)心業(yè)務(wù)邏輯;層(Data Access)。l 數(shù)據(jù)層:封裝了對數(shù)據(jù)庫的細節(jié);注意,在業(yè)務(wù)層中不能出現(xiàn)JavaWeb API,例如request、response等。也就是說,業(yè)務(wù)層代碼是可重用的,甚至

36、可以應(yīng)用到非Web環(huán)境依賴業(yè)務(wù)層!務(wù)層的每個方法可以理解成一個萬能,例如轉(zhuǎn)賬業(yè)務(wù)方法。業(yè)務(wù)層依賴數(shù)據(jù)層,而Web層16.三層的HelloWorld程序首先,新建四個包(1)第一步就是在domain包中新建User類/* 把數(shù)據(jù)庫* author 阿滔*/出的結(jié)果保存到這個對象中public class User private String username; private String password;public User() super();/ TODO Auto-generated constructor stubpublic User(String username, Strin

37、g password) this.username = username; this.password = password;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;Overridepublic St

38、ring toString() return "User username=" + username + ", password=" + password + ""(2)然后,在dao包中新建UserDao類public class UserDao /*把xml中的數(shù)據(jù)*/public User find() 出來之后,封裝到 user對象中。然后返回return new User("zhangsan","123");=(3)接著,在service包中新建UserService類public c

39、lass UserService /service層依賴dao層private UserDao userDao = new UserDao();/* service的*/,需要使用dao來完成public User find() return userDao.find();=(4)然后,在web.servlet包中新建UserServlet類public class UserServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws

40、ServletException, IOException /* 在Servlet中依賴service,然后通過service完到request中、* 轉(zhuǎn)發(fā)到j(luò)sp*/能,把結(jié)果保存UserService userService = new UserService();User user = userService.find();request.setAttribute("user", user);request.getRequestDispatcher("/show.jsp").forward(request, response);=(5)最后就是顯示

41、。在WebRoot中新建index.jsp(初始頁面)和show.jsp(結(jié)果顯示頁面)=index.jsp<% taglib prefix="c" uri="%><body><a href="<c:url value='/UserServlet'></c:url>">點擊這里顯示</a></body>=show.jsp<body>用戶名:$user.username <br/>密 碼:$user.password <

42、;br/></body>-運行如下點擊超day141.項目的框架的分析項目功能:>> 登錄-JSP:* login.jsp -> 登錄表單* regist.jsp ->表單* index.jsp -> 主頁(只有登錄才能看到)Servlet:* LoginServlet* RegistServletService:* UserService -> 與用戶相關(guān)的業(yè)務(wù)類Dao:* UserDao -> 與用戶相關(guān)的數(shù)據(jù)類Domain:* User(對應(yīng)數(shù)據(jù)庫,還要對應(yīng)所有表單)> username> password>

43、verifyCode-數(shù)據(jù)庫設(shè)計* users.xml<users><user username="<user username="</users>password="password="/>"/>-步驟:1. 創(chuàng)建空項目2. 導(dǎo)包:* CommonUtils* commons-beanutils.jar* commons-logging.jar* dom4j3. 建包* cn.itcast.user.domain> User* cn.itcast.user.dao> UserDao*

44、 cn.itcast.user.service> UserService* cn.itcast.user.web.servlet> LoginServlet> RegistServlet4. jsp* login.jsp* regist.jsp* index.jsp5. 在F盤下創(chuàng)建一個users.xml文件!2.項目的框架搭建步驟:1. 創(chuàng)建空項目2. 導(dǎo)包:* CommonUtils* commons-beanutils.jar* commons-logging.jar* dom4j3. 建包* cn.itcast.user.domain> User* cn.itc

45、ast.user.dao> UserDao* cn.itcast.user.service> UserService* cn.itcast.user.web.servlet> LoginServlet> RegistServlet4. jsp* login.jsp* regist.jsp* index.jsp5. 在F盤下創(chuàng)建一個users.xml文件!* 添加根元素<users>* 保證文件為utf-8編碼!導(dǎo)包的時候要注意導(dǎo)全下面是替代Servlet舊模板操作(導(dǎo)入jar包)然后找到位置替換在F盤下創(chuàng)建一個users.xml文件!* 添加根元素<u

46、sers>* 保證文件為utf-8編碼!3.功能流程分析上面漏了創(chuàng)建RegisterServletregist.jsp> 第一步:完成regist.jsp的基本功能! RegistServlet> 封裝表單數(shù)據(jù),封裝到User對象中。> 調(diào)用service的regist()方法* 如果這個方法沒有出問題,輸出“”* 如果這個方法拋出了異常,把錯誤信息保存到request域,轉(zhuǎn)發(fā)到regist.jsp(顯示錯誤信息)UserService#regist()> 沒有返回值,但失敗拋出一個自定義的異常!可以在異常中添加異常信息!(自定義一個異常類)> 校驗用戶名是

47、否已被> 添加用戶用戶),如果已被,拋出異常,異常信息為“用戶名已被!”(通過用戶名UserDao:通過業(yè)務(wù)分析,得到結(jié)果:需要提供兩個方法> 按用戶名用戶對象:User findByUsername(String username)>一個用戶到數(shù)據(jù)庫中:void add(User user)工作:1. 在service層添加一個UserException2. dao;* User findByUsername(String username)* void add(User user)3. service* void regist() throws UserException

48、4. servlet1). 封裝表單數(shù)據(jù)到User對象中2). 使用user調(diào)用service的regist()方法3). 如果得到UserException,那么把異常信息保存到request域中,轉(zhuǎn)發(fā)回regist.jsp,(數(shù)據(jù)的回顯)4). 輸出“”下圖是流程圖圖片放大4.dao之按用戶名用戶對象預(yù)備知識復(fù)path先來完成UserDao的內(nèi)容/* 數(shù)據(jù)類* author cxf*/public class UserDao private String path = "F:/users.xml"/依賴數(shù)據(jù)文件/* 按用戶名* paramusername* return

49、*/public User findByUsername(String username) /* 1. 得到Document* 2. xpath* 3. 校驗!結(jié)果是否為nul,如果為nul,返回nul* 4. 如果不為nul,需要把Element封裝到User對象中。*/* 1. 得到Document*/ 創(chuàng)建器SAXReader reader = new SAXReader();try Document doc = reader.read(path);/* 2. 通過xpath*/得到ElementElement ele = (Element)doc.selectSingleNode(&q

50、uot;/userusername='" + username + "'");/上面xpath中的參數(shù)巧妙利用了字符串拼接避免了username的歧義(讓username串"username")/* 3. 校驗ele是否為nul,如果為nul,返回nul*/if(ele = nul) return nul;為變量而不是簡單的字符/* 4. 把ele的數(shù)據(jù)封裝到User對象中*/User user = new User();String attrUsername = ele.attributeValue("usernam

51、e");/獲取該元素的名為username屬性值String attrPassword = ele.attributeValue("password");/獲取該元素的名為password屬性值user.setUsername(attrUsername);user.setPassword(attrPassword);return user; catch (DocumentException e) throw new RuntimeException(e);/避免客戶處理異常-throw new RuntimeException(e);/避免客戶處理異常妙處-來源網(wǎng)

52、上:vcjFJJbafVN540AhMb8vJHdvFzgQSqA5KVk3Z9VttcvWmru0iITxae.printStackTrace( )是打印異常棧信息,而throw new RuntimeException(e)是把異常包在一個運行時異常中拋出。我們??匆娺@種寫法try.catch(Exception e)e.printStackTrace( );throw new RuntimeException(e);這是處理沒法進一步處理的異常的一般做法。try塊中出現(xiàn)了一個異常,它被catch住了,我們首先要在標準輸出上打印出異常但是如果沒有throw這句,這個錯誤就靜悄悄地被catc

53、h塊了,程序會繼續(xù)運行??蛇@個時候很可能你的程序的狀態(tài)已經(jīng)不對了,繼續(xù)下去也沒有什么意義,所以應(yīng)該繼續(xù)拋出這個異常。你當(dāng)然可以寫throw e;,但是這個e是一般的異常,如果這樣拋出的話,你得在這個函數(shù)頭上用throws來public void abc() throws Exception,比如:然后調(diào)用這個函數(shù)的函數(shù)也還得這么干,所以一般的處理是把e包裝成運行時異常:newRuntimeException(e),這樣就不需要在函數(shù)頭了。但這只是一般的處理方法,在實際程序中不可不顧實際情況和需求。5.dao之添加用戶自行回顧知識 回寫xml/* 添加用戶* param user*/ publi

54、c void add(User user) /* 1. 得到Document* 2. 通過Document得到root元素!<users>* 3. 使用參數(shù)user,轉(zhuǎn)發(fā)成Element對象* 4. 把element添加到root元素中* 5. 保存Document*/ 得到Document SAXReader reader = new SAXReader(); try Document doc = reader.read(path);/ 得到根元素Element root = doc.getRootElement();/ 通過根元素創(chuàng)建新元素Element userEle = r

55、oot.addElement("user");/ 為userEle設(shè)置屬性 userEle.addAttribute("username", user.getUsername(); userEle.addAttribute("password", user.getPassword();/* 保存文檔*/ 創(chuàng)建輸出格式化器OutputFormat format = new OutputFormat("t", true);/縮進使用t,是否換行,使用是! format.setTrimText(true);/清空原有的換

56、行和縮進/個人補充:其實紅字沒必要那么麻煩,直接OutputFormat format = OutputFormat.createPrettyPrint();就可以了/ 創(chuàng)建XmlWriter XMLWriter writer; try writer = new XMLWriter( new OutputStreamWriter( new FileOutputStream(path), "UTF-8"), format); writer.write(doc);/保存document對象writer.close(); catch (Exception e) throw new RuntimeException(e); catch (DocumentException e) throw new RuntimeException(e);6.dao層測試新建一個test.dao包再新建測試類UserDaoTestimport org.junit.Test;import cn.itcast.dao.UserDao;import cn.itcast.domain.User;public class UserDaoTest Testpublic void testFindByUsername() UserDao userDao = new

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論