SpringMVC註解開發(基礎)---SpringMVC學習筆記(七)
需求
商品修改功能開發。
操作流程:
1、進入商品查詢列表頁面
2、點選修改,進入商品修改頁面,頁面中顯示了要修改的商品(從資料庫查詢)
要修改的商品從資料庫查詢,根據商品id(主鍵)查詢商品資訊
3、在商品修改頁面,修改商品資訊,修改後,點選提交
第一步:開發Mapper(也就是Dao層)
mapper:
根據id查詢商品資訊
根據id更新Items表的資料
不用開發了,使用逆向工程生成的程式碼。
第二步:開發Service
介面功能:
根據id查詢商品資訊
修改商品資訊
service介面:
public interface ItemsService {
//商品查詢列表
public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception;
//根據id查詢商品資訊
public ItemsCustom findItemsById(Integer id) throws Exception;
//修改商品資訊
public void updateItems(Integer id,ItemsCustom itemsCustom) throws Exception;
}
service介面的實現類:
public class ItemsServiceImpl implements ItemsService {
@Autowired
private ItemsMapperCustom itemsMapperCustom;
@Autowired
private ItemsMapper itemsMapper;
@Override
public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo)
throws Exception {
//通過ItemsMapperCustom查詢資料庫
return itemsMapperCustom.findItemsList(itemsQueryVo);
}
@Override
public ItemsCustom findItemsById(Integer id)
throws Exception {
Items items = itemsMapper.selectByPrimaryKey(id);
//中間對商品資訊進行一系列的處理,最終返回商品資訊的擴充套件類的物件
ItemsCustom itemsCustom = new ItemsCustom();
//將items的屬性值拷貝到itemsCustom
BeanUtils.copyProperties(items, itemsCustom);
return itemsCustom ;
}
@Override
public void updateItems(Integer id, ItemsCustom itemsCustom) throws Exception {
//新增業務的校驗,通常在service介面對關鍵引數進行校驗
//因為int這裡無法判斷是否為空,所以這裡使用Integer
//校驗id是否為空,如果為空丟擲異常(這裡先不寫,後面講異常處理的時候再新增)
//更新商品資訊,使用updateByPrimaryKeyWithBLOBs()方法可以根據id更新items表中的所有欄位(包括大文字型別的欄位)
itemsCustom.setId(id);
itemsMapper.updateByPrimaryKeyWithBLOBs(itemsCustom);
}
}
第三步:開發controller(也就是SpringMVC層)
方法:
商品資訊修改頁面顯示
商品資訊修改提交
在ItemsController中新增如下程式碼:
// 商品資訊頁面的展示
@RequestMapping("/editItems")
public ModelAndView editItems() throws Exception {
// 呼叫service根據商品id查詢商品資訊
ItemsCustom itemsCustom = itemsService.findItemsById(1);
// 返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
// 將商品資訊放入到model中
modelAndView.addObject("itemsCustom", itemsCustom);
// 商品修改頁面
modelAndView.setViewName("items/editItems");
return modelAndView;
}
// 商品資訊修改提交
@RequestMapping("/editItemsSubmit")
public ModelAndView editItemsSubmit() throws Exception {
// 呼叫service更新商品資訊
ItemsCustom itemsCustom = itemsService.findItemsById(1);
// 返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
// 將商品資訊放入到model中
modelAndView.addObject("itemsCustom", itemsCustom);
// 商品修改頁面
modelAndView.setViewName("success");
return modelAndView;
}
頁面程式碼:
itemsList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查詢商品列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">
查詢條件:
<table width="100%" border=1>
<tr>
<td><input type="submit" value="查詢" /></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名稱</td>
<td>商品價格</td>
<td>生產日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}"
pattern="yyyy-MM-dd HH:mm:ss" /></td>
<td>${item.detail }</td>
<td><a
href="${pageContext.request.contextPath }/editItems.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
editItems.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>修改商品資訊</title>
</head>
<body>
<%-- <!-- 顯示錯誤資訊 -->
<c:if test="${allErrors!=null }">
<c:forEach items="${allErrors }" var="error">
${ error.defaultMessage}<br />
</c:forEach>
</c:if> --%>
<form id="itemForm"
action="${pageContext.request.contextPath }/editItemsSubmit.action"
method="post" enctype="multipart/form-data">
<input type="hidden" name="id" value="${itemsCustom.id }" /> 修改商品資訊:
<table width="100%" border=1>
<tr>
<td>商品名稱</td>
<td><input type="text" name="name" value="${itemsCustom.name }" /></td>
</tr>
<tr>
<td>商品價格</td>
<td><input type="text" name="price"
value="${itemsCustom.price }" /></td>
</tr>
<%-- <tr>
<td>商品生產日期</td>
<td><input type="text" name="createtime" value="<fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
</tr>
<tr>
<td>商品圖片</td>
<td>
<c:if test="${items.pic !=null}">
<img src="/pic/${items.pic}" width=100 height=100/>
<br/>
</c:if>
<input type="file" name="items_pic"/>
</td>
</tr> --%>
<tr>
<td>商品簡介</td>
<td><textarea rows="3" cols="30" name="detail">${itemsCustom.detail }</textarea>
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交" />
</td>
</tr>
</table>
</form>
</body>
</html>
深入分析Controller層的內容
[email protected]註解的作用:
1.URL路徑對映
@RequestMapping(value=”/item”)或@RequestMapping(“/item)
value的值是陣列,可以將多個url對映到同一個方法
2.窄化請求對映
在class上新增@RequestMapping(url)指定通用請求字首, 限制此類下的所有方法請求url必須以請求字首開頭,通過此方法對url進行分類管理。
如下:
@RequestMapping放在類名上邊,設定請求字首
@Controller
@RequestMapping(“/item”)
方法名上邊設定請求對映url:
@RequestMapping放在方法名上邊,如下:
@RequestMapping(“/queryItem “)
訪問地址為:/item/queryItem
3.限定http請求的方式
- 限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通過Post訪問則報錯:
HTTP Status 405 - Request method ‘POST’ not supported
例如:
@RequestMapping(value="/editItem",method=RequestMethod.GET)
- 限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通過Get訪問則報錯:
HTTP Status 405 - Request method ‘GET’ not supported
- GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
2.controller類中方法的返回值:
1.返回ModelAndView
需要方法結束時,定義ModelAndView,將model和view分別進行設定。
2.返回String
如果controller方法返回string,
表示返回邏輯檢視名。
真正檢視(jsp路徑)=字首+邏輯檢視名+字尾
redirect重定向
需求:商品修改提交後,重定向到商品查詢列表。
redirect重定向特點:瀏覽器位址列中的url會變化。修改提交的request資料無法傳到重定向的地址。因為重定向後重新進行request(request無法共享)
forward頁面轉發
通過forward進行頁面轉發,瀏覽器位址列url不變,request可以共享。
3.返回void
在controller方法形參上可以定義request和response,使用request或response指定響應結果:
使用request轉向頁面,如下:
request.getRequestDispatcher(“頁面路徑”).forward(request, response);也可以通過response頁面重定向:
response.sendRedirect(“url”)也可以通過response指定響應結果,例如響應json資料如下:
response.setCharacterEncoding(“utf-8”);
response.setContentType(“application/json;charset=utf-8”);
response.getWriter().write(“json串”);
3.引數繫結
引數繫結的過程:
從客戶端請求key/value資料,經過引數繫結,將key/value資料繫結到controller方法的形參上。
springmvc中,接收頁面提交的資料是通過方法形參來接收。而不是在controller類定義成員變數接收(這是struts2的接收方式)!
1.預設支援的引數型別
直接在controller方法形參上定義下邊型別的物件,就可以使用這些物件。在引數繫結過程中,如果遇到下邊型別直接進行繫結。
1.HttpServletRequest
通過request物件獲取請求資訊
2.HttpServletResponse
通過response處理響應資訊
3.HttpSession
通過session物件得到session中存放的物件
4.Model/ModelMap
ModelMap是Model介面的實現類,通過Model或ModelMap向頁面傳遞資料。
作用:將model資料填充到request域。
如下:
頁面通過${itemsCustom.XXXX}獲取itemsCustom物件的屬性值。
使用Model和ModelMap的效果一樣,如果直接使用Model,springmvc會例項化ModelMap。
2.簡單型別
注意:url中的引數的名字必須與controller方法中的形參的引數名相同。如果不同就不會對映成功。
需求:解決url中的引數名如果和controller方法中的形參的引數名不同時,也可以對映成功的問題
通過@RequestParam對簡單型別的引數進行繫結。
如果不使用@RequestParam,要求request傳入引數名稱和controller方法的形參名稱一致,方可繫結成功。
如果使用@RequestParam,不用限制request傳入引數名稱和controller方法的形參名稱一致。
通過required屬性指定引數是否必須要傳入,如果設定為true,沒有傳入引數,報下邊錯誤:
錯誤資訊:
TTP Status 400 - Required Integer parameter 'XXXX' is not present
@RequestParam小結:
value:引數名字,即入參的請求引數名字,如value=“item_id”表示請求的引數區中的名字為item_id的引數的值將傳入;
required:是否必須,預設是true,表示請求中一定要有相應的引數,否則將報;
defaultValue:預設值,表示如果請求中沒有同名引數時的預設值
定義如下:
public String editItem(@RequestParam(value="item_id",required=true) String id) {
}
形參名稱為id,但是這裡使用value=” item_id”限定請求的引數名為item_id,所以頁面傳遞引數的名必須為item_id。
注意:如果請求引數中沒有item_id將跑出異常:
HTTP Status 500 - Required Integer parameter 'item_id' is not present
這裡通過required=true限定item_id引數為必需傳遞,如果不傳遞則報400錯誤,可以使用defaultvalue設定預設值,即使required=true也可以不傳item_id引數值
3.pojo型別
1.簡單pojo型別
如果頁面中input的name和controller的pojo形參中的屬性名稱一致,springMVC會自動將頁面中資料繫結到controller中的pojo對應的屬性中。
如下:
editItems.jsp頁面的屬性name定義:
controller的pojo形參的定義:
Contrller方法定義如下:
需要說明的是:簡單型別的引數繫結和pojo引數繫結互不影響。
2.包裝pojo型別
如果頁面中引數的名稱和包裝pojo類中的屬性名一致,那麼springMVC會自動將頁面中資料繫結到controller中的pojo對應的屬性中。
包裝物件定義如下:
頁面定義:
注意:頁面中name的值(也就是itemsCustom)和包裝pojo(也就是ItemsQueryVo)中的屬性(也就是itemsCustom屬性)一致,那麼SpringMVC就自動將頁面中傳遞過來的引數值對映到下面的Controller方法的形參中。
Controller方法定義如下:
4.集合型別繫結
1.陣列的繫結
需求:商品批量刪除,使用者在頁面選擇多個商品,批量刪除。
這裡主要為了說明SpringMVC的集合型別繫結所以就只寫表現層的實現了。
頁面的定義:
controller類中方法的定義:
2.list的繫結
需求:通常在需要批量提交資料時,將提交的資料繫結到list中,比如:成績錄入(錄入多門課成績,批量提交),
本例子需求:批量商品修改,在頁面輸入多個商品資訊,將多個商品資訊提交到controller方法中。
表現層實現:
頁面的定義:
editItemsQuery.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>批量修改商品資訊</title>
</head>
<script type="text/javascript">
function editItemsAndSubmit() {
//提交form
document.itemsForm.action = "${pageContext.request.contextPath }/items/editItemsAllSubmit.action";
document.itemsForm.submit();
}
function queryItems() {
//提交form
document.itemsForm.action = "${pageContext.request.contextPath }/items/queryItems.action";
document.itemsForm.submit();
}
</script>
<body>
<form name="itemsForm"
action="${pageContext.request.contextPath }/items/queryItems.action"
method="post">
查詢條件:
<table width="100%" border=1>
<tr>
<td>商品名稱:<input type="text" name="itemsCustom.name"></td>
<td><input type="button" value="查詢" onclick="queryItems()" /></td>
<td><input type="button" value="批量商品修改提交"
onclick="editItemsAndSubmit()" /></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
<td>商品名稱</td>
<td>商品價格</td>
<td>生產日期</td>
<td>商品描述</td>
</tr>
<c:forEach items="${itemsList }" var="item" varStatus="status">
<tr>
<td><input name="itemsList[${status.index }].name"
value="${item.name }"></td>
<td><input name="itemsList[${status.index }].price"
value="${item.price }"></td>
<td><input name="itemsList[${status.index }].createtime"
value="<fmt:formatDate value="${item.createtime }" pattern="yyyy-MM-dd HH:mm:ss"/>"></td>
<td><input name="itemsList[${status.index }].detail"
value="${item.detail }"></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
特別說明:
controller方法的定義:
1、進入批量商品修改頁面(頁面樣式參考商品列表實現)
2、批量修改商品提交
使用List接收頁面提交的批量資料,通過包裝pojo接收,在包裝pojo中定義list<pojo>
屬性
上面形參物件中需要新增的屬性:
3.map的繫結
也通過在包裝pojo中定義map型別屬性。
在包裝類中定義Map物件,並新增get/set方法,action使用包裝物件接收。
包裝類中定義Map物件如下:
Public class QueryVo {
private Map<String, Object> itemInfo = new HashMap<String, Object>();
//get/set方法..
}
頁面定義如下:
<tr>
<td>學生資訊:</td>
<td>
姓名:<inputtype="text"name="itemInfo['name']"/>
年齡:<inputtype="text"name="itemInfo['price']"/>
.. .. ..
</td>
</tr>
Contrller方法定義如下:
public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
System.out.println(queryVo.getStudentinfo());
}
5.自定義型別繫結
舉例:自定義日期型別繫結
對於controller形參中pojo物件,如果屬性中有日期型別,需要自定義引數繫結。
將請求日期資料串傳成 日期型別,要轉換的日期型別和pojo中日期屬性的型別保持一致。
所以自定義引數繫結將日期串轉成java.util.Date型別。
然後需要向處理器介面卡中注入自定義的引數繫結元件。
自定義日期型別繫結元件:
配置方式1:
配置方式2:
<!--註解介面卡 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder"></property>
</bean>
<!-- 自定義webBinder -->
<bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
</bean>
<!-- conversionService -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 轉換器 -->
<property name="converters">
<list>
<bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
</list>
</property>
</bean>
SpringMVC與Struts2的不同
- springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過濾器。
- springmvc是基於方法開發(一個url對應一個方法),請求引數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞引數是通過類的屬性,只能設計為多例。
- Struts採用值棧儲存請求和響應的資料,通過OGNL存取資料, springmvc通過引數解析器是將request請求內容解析,並給方法形參賦值,將資料和檢視封裝成ModelAndView物件,最後又將ModelAndView中的模型資料通過request域傳輸到頁面。Jsp檢視解析器預設使用jstl。
Post中文亂碼問題
在@RequestMapping中設定http請求方式為post時的出現的中文亂碼問題解決方式:
在web.xml中加入:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以上可以解決post請求亂碼問題。
對於get請求中文引數出現亂碼解決方法有兩個:
修改tomcat配置檔案新增編碼與工程編碼一致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
另外一種方法對引數進行重新編碼:
String userName new
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat預設編碼,需要將tomcat編碼後的內容按utf-8編碼
相關推薦
springmvc+shiro驗證嵌入方法介紹,學習筆記(一)
1.新增shiro框架包 <!--shiro許可權管理--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core&
《Qt5 開發與實例(第三版)》學習筆記(七)
clu idg center ble mil detached pre tab etc 1 // 3.2 停靠窗口 QDockWidget類 2 setFeatures() 3 setAllowedAreas() 4 setWidget() 5 addDockW
《Qt5 開發與實例(第三版)》學習筆記(九)
nal inf lin exc ken right item vbo ott 1 // 3.4 基本布局(QLayout) 2 //dialog.h 3 #ifndef DIALOG_H 4 #define DIALOG_H 5 6 #incl
《Qt5 開發與實例(第三版)》學習筆記(八)
nbsp font public insert enter body win parent hbox 1 // 3.3 堆棧窗體 QStackedWidget類 2 //stackdlg.h 3 #ifndef STACKDLG_H 4 #define STACK
《Qt5 開發與實例(第三版)》學習筆記(十)
fix row tac person als new .cpp exec constrain 1 // 3.5 『綜合實例』 修改用戶資料 2 //main.cpp 3 #include "content.h" 4 #include <QApplic
《Qt5 開發與實例(第三版)》學習筆記(五)
液晶 lag bool child gles 操作 啟動 ring home 1 //2.5 控件 2 //2.51 按鈕組(Buttons) 3 /* 4 Radio Button //單選按鈕 5 Check Box//復選框 6 Dialog
《Qt5 開發與實例(第三版)》學習筆記(四)
常用 斷言 max swap 正則表達 4.2 debug 實例 筆記 1 //2.4 算法及正則表達式 2 //2.4.1 Qt5常用算法 3 double c=qAbs(a);//返回絕對值 4 double max=qMax(b,c);//返回最大值 5
《Qt5 開發與實例(第三版)》學習筆記(十二)
action spa 添加 png esb geb itl msgbox setw 1 // 4.2 Qt5 自定義對話框 2 #include <QMessageBox> 3 4 void Dialog::showCustomMsgBox() 5
python基礎教程(第三版)學習筆記(六)
第六章 抽象(函式) 6.1 懶惰是一種美德 6.2 抽象和結構 6.3 自定義函式 判斷某個物件是否可呼叫,可使用內建函式callable。格式是callable(物件)。 函式是結構化程式設計的核心。使用def(表示定義函式)語句。 ''' def fun(str_s): #
python基礎教程(第三版)學習筆記(四)
第四章 字典 字典一種可通過名稱來訪問其各個值的資料結構。這種資料結構稱為對映。字典是Python中唯一的內建對映型別,其中的值不按順序排列,而是儲存在鍵下。鍵可能是數、字串或元組。 4.1 字典的用途 i表示棋盤的狀態,其中每個鍵都是由座標組成的元組; ii儲存檔案修改時間,其中的鍵為檔名; ii
python基礎教程(第三版)學習筆記(三)
第三章 使用字串 3.1 字串基本操作 所有標準序列操作(索引、切片、乘法、成員資格檢查、長度、最小值和最大值)都適用於字串,但別忘了字串是不可變的,因此所有的元素賦值和切片賦值都是非法的。 3.2設定字串的格式 3.2.1% 使用字串格式設定運算子——百分號。這個運算子的行為類似於C語言中的經典函
python基礎教程(第三版)學習筆記(二)
第二章 列表和元組 2.1序列概述 Python內建的序列包括列表、元組、字串、Unicode字串、buffer物件和xrange物件等,本章僅介紹列表和元組。 列表和元組的主要不同在於,列表的元素是可以修改的,而元組不可以單獨更改其中的單個元素,但可以更改元組的整體內容。 在序列中,每個元素都有編
python基礎教程(第三版)學習筆記(十二)
第十二章 圖形使用者介面 12.1 建立 GUI 示例應用程式 編寫一個簡 單的程式,讓使用者能夠編輯文字檔案 這個微型文字編輯器的需求如下。 1、 讓使用者能夠開啟指定的文字檔案。 2、 讓使用者能夠編輯文字檔案。 3、 讓使用者能夠儲存文字檔案。 4、讓使用者
python基礎教程(第三版)學習筆記(十一)
第十一章 檔案 11.1 開啟檔案 要開啟檔案,可使用函式open,它位於自動匯入的模組io中。函式open將檔名作為唯一必不可少的引數,並返回一個檔案物件。 from contextlib import contextmanager import sys,pprint f=open('xx.
python基礎教程(第三版)學習筆記(十)
第十章 開箱即用 本章簡要介紹模組的工作原理以及如何探索模組以獲悉其提供的功能,然後概述標準庫,重點是幾個很有用的模組。 10.1 模組 使用import將函式從外部模組匯入到程式中。 ''' import math as ma Pi=3.1415926 v=ma.sin(Pi/6) pri
python基礎教程(第三版)學習筆記(九)
第九章 魔法方法、特性和迭代器 9.1 如果你使用的不是python3 在Python 2.2中,Python物件的工作方式有了很大的變化。這種變化帶來了多個方面的影響。這些影響對Python程式設計新手來說大都不重要,但有一點需要注意:即便你使用的是較新的Python 2版本,有些功能(如特性
python基礎教程(第三版)學習筆記(八)
第八章異常 異常事件可能是錯誤(如試圖除以零),也可能是通常不會發生的事情。為處理這些異常事件,可在每個可能發生這些事件的地方都使用異常處理機制。 8.1 異常是什麼 Python使用異常物件來表示異常狀態,並在遇到錯誤時引發異常。異常物件未被處理(或捕獲)時,程式將終止並顯示一條錯誤訊息(trac
python基礎教程(第三版)學習筆記(七)
第七章 再談抽象 自定義`類和物件 7.1 物件魔法 多型:可對不同型別的物件執行相同的操作,而這些操作就像“被施了魔法”一樣能夠正常執行。 封裝:對外部隱藏有關物件工作原理的細節。 繼承:可基於通用類創建出專用類。 7.1.1 多型 大致意味著即便你不知道變數指向的是哪種物件,也能夠對其執行操作,
python基礎教程(第三版)學習筆記(十八)
第十八章 程式打包 本章重點介紹Setuptools,因為這是每個Python程式設計師都要用到的工具。實際上,Setuptools 並非只能用於建立基於指令碼的Python安裝程式,還可用於編譯擴充套件。另外,通過將其與擴充套件py2exe 和py2app結合起來使用,還可建立獨立的Windo
python基礎教程(第三版)學習筆記(十七)
第十七章 擴充套件Python 這門語言功能強大,但有時候速度有點慢。 Python的目標是易於使用以及幫助提高開發速度,這種靈活 性是以犧牲效率為代價的。 但如果你真的很 在乎速度,C、C++、Java和Julia等語言通常要快好幾個數量級。 17.1 魚和熊掌兼得 本章討論確實需要進