1、回顧Redis消息訂閱和發佈
subscribe channel:訂閱頻道,例:subscribe mychat,訂閱mychat這個頻道
psubscribe channel*:批量訂閱,例:psubscribe s*,訂閱以"s"開頭的頻道
publish channel content:在指定的頻道中發佈消息,如publish mychant ‘hello my friends’
使用消息訂閱的前提是:開啓三個client
再次複習Redis持久化的方式:
RDB持久化是內部原理是生成內存狀態機的快照,所以佔用空間會很小
AOF持久化是以日誌的形式保存用戶的每一個操作,主要是寫操作
無持久化(略)、同時RDB和AOF(略)
2、開發常識
軟件開發流程
1 軟件需求的分析,軟件要做什麼功能
2 軟件頁面原型設計,把實現功能畫出功能圖
3 把原型轉換成靜態頁面,把功能圖轉換成html頁面
4 數據庫設計和技術選型
5 系統的編碼
6 系統的測試
7 系統的部署和維護
異常處理
1 每一個異常都直接處理
2 全拋,統一處理異常
開發準備
1、創建數據倉庫,建立表結構
2、數據增刪改查都要用到Servlet,如何減少Servlet數量?
答:首先外面看一下從客戶端向服務端發起請求的方式:
1_通過表單向服務端發起請求
2_通過超鏈接向服務端發起請求
3_Ajax向服務端發起請求
減少Servlet原理:傳遞隱含信息Method
服務端獲取到method之後,判斷是什麼方法,就調用什麼功能,這樣一個Servlet就能做很多事
3、通用Servlet實現
減少Servlet的最直接方法就是實現一個通用Servlet,就和連接池一般,(前提還是獲取一個隱藏參數method)
首先Jsp內容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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">
<script type="text/javascript" src="JQuery/jquery-1.11.3.min.js"></script>
</head>
<body>
<form action="TestServlet3?method=addStu" method="post">
用戶:<input type="text" name="name"/>
<button>提交</button>
</form>
<a href="TestServlet3?method=delStu&name='hillain'">提交</a>
<button οnclick="fun()">提交</button>
<script>
function fun(){
$.post("TestServlet3",{method:"update",name:"李四"},function(data,status){
alert(status);
alert(data);
});
}
</script>
</body>
</html>
通用Servlet實現階段(一)
- 在某個要被用到的Servlet中寫好所有方法
- doGet中獲得method,用於判斷
- 分別判斷method是否爲其中一個方法
- 若是,則調用下面的方法
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception{ request.setCharacterEncoding("utf-8"); String method = request.getParameter("method"); if("addStu".equals(method)){ this.addStu(); }else if("delStu".equals(method)){ this.delStu(); }else if("update".equals(method)){ this.update(); } } //下面是addStu、delStu、update函數...
通用Servlet實現階段(二)
- 在某個要被用到的Servlet中寫好所有方法
- 創建一個BasicServlet,作爲通用Servlet
- 重寫BasicServlet中的Server方法
(這裏重寫Server方法的原因是,每一個Servlet在被調用的時候都會調用父類的init、server這些方法。一般情況下我們不會重寫這些初始化的方法,所以我們利用這一點。直接重寫了server方法,阻斷了普通Servlet的加載,達到通用Servlet的目的) - 我們要用到的Servlet繼承BasicServlet
//TestServlet public class TestServlet extends BasicServlet { public String addStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("this is addStu"); return null; } public String delStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("this is delStu"); return null; } public String update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("this is update"); return null; } } //BasicServlet public class BasicServlet extends HttpServlet { public String path = null; //執行方法後的轉發路徑 @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置編碼並獲取參數 request.setCharacterEncoding("utf-8"); String method = request.getParameter("method"); //獲取類子類class Class clazz = this.getClass(); try { //通過參數獲得對應Servlet中的方法 Method md = clazz.getMethod(method,HttpServletRequest.class,HttpServletResponse.class); //執行並獲得轉發路徑 if(md!=null)path = (String)md.invoke(this,request,response); //若轉發路徑不爲空則跳轉頁面 if(path!=null)response.sendRedirect(path); } catch (Exception e) { System.out.println("無此方法"); } } }
4、環境搭建
首先,提了Eclipse的close project的好處:
- close掉project, 那麼開啓myeclipse的時候, 就不會自動加載該project的相關zd文件跟jar包等等, 會提高運行速度。
- close project 可以在開發其他項目時,釋放出內存,使計算機版運行速度更快。
- 可以close project,當需要使用關閉的項目時,可以選中項目,右鍵,點擊open project,然後項目就打開可以正權常使用了。
1、創建Package,層級結構與包如下:
store.web
store.web.servlet
store.web.fitler
store.web.base
store.service
store.service.serviceImp
store.dao
store.dao.daoImp
store.domain
store.utils
2、導入jar包
3、導入Utils工具類
UUIDUtils生成隨機字符串 —— 100年纔可能重複一次
EncodingFilter編碼過濾器 —— 統一編碼所有方法並放行
EncodingFilter改放在了web中的filter中
其他工具不詳細說明…
4、導入c3p0配置文件並修改相關配置
5、導入通用Servlet - 不需要配置
6、導入JSP頁面原型
7、創建用戶模塊相關程序
User、UserServlet、UserService、UserServiceImpl、UserDao、UserDaoImpl
5、實現用戶註冊_原理分析
開發約定:爲了項目管理方便,不會從客戶端直接發起請求到JSP頁面。先請求到Servlet再由Servlet轉發到JSP頁面
由開發約定實現頁面路徑跳轉:
1:/jsp/index.jsp修改連接
2:UserServlet -> registUI
return “/jsp/register.jsp”;
註冊功能原理分析:
測試MyBeanUtils接收表單參數:
register頁面中有個註冊表單,隱藏的method爲"userRegist",Servlet中功能代碼如下:
//UserServlet中userRegist()
public String userRegist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String[]> map = request.getParameterMap();
User user = new User();
//直接用工具類實現
MyBeanUtils.populate(user, map);
/*try {
// 1_創建時間類型的轉換器
DateConverter dt = new DateConverter();
// 2_設置轉換的格式
dt.setPattern("yyyy-MM-dd");
// 3_註冊轉換器
ConvertUtils.register(dt, java.util.Date.class);
BeanUtils.populate(user, map);
} catch (Exception e) {
e.printStackTrace();
} */
//遍歷map中的數據
/*Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while(iterator.hasNext()){
String next = iterator.next();
System.out.println("key="+next);
String[] strs = map.get(next);
for (String string : strs) {
System.out.println(" value="+string);
}
}*/
return "";
}
6、實現用戶註冊功能
開發步驟約定(普通MVC功能):
1_準備工作(表單屬性設置,鏈接拼接,Ajax編寫)
準備工作實現完畢之後,可以從客戶端向服務端發起請求
2_Servlet
明確要實現的功能,中文註釋,代碼
3_service_dao
4_jsp頁面
PS:爲了方便斷點調試,eclise===>window==>preferences===>java===>debug
開發步驟實現(普通MVC功能):
1_準備工作 /jsp/register.jsp
設置表單各種屬性 action method
2_UserServlet__>userRegist
接收表單參數
調用業務層註冊功能
註冊成功,向用戶郵箱發送信息,跳轉到提示頁面
註冊失敗,跳轉到提示頁面
3_依次實現service,dao
4_ /jsp/info.jsp獲取提示信息
修改美化info.jsp中的header和bottom
修改info.jsp中的中間信息部分,改成${msg}提示
註冊功能開發,代碼實現:
//UserServlet中userRegist()
public String userRegist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String[]> map = request.getParameterMap();
User user = new User();
user.setState(0);
user.setUid(UUIDUtils.getId());
user.setCode(UUIDUtils.getCode());
MyBeanUtils.populate(user, map);
UserService service = new UserServiceImpl();
try {
service.userRegist(user);
request.setAttribute("msg", "用戶註冊成功,請激活!");
} catch (SQLException e) {
request.setAttribute("msg", "用戶註冊失敗,請重新註冊!");
}
return "/jsp/info.jsp";
}
//UserServiceImpl
public class UserServiceImpl implements UserService{
@Override
public void userRegist(User user) throws SQLException {
UserDao dao = new UserDaoImpl();
dao.userRegist(user);
}
}
//UserDaoImpl
public class UserDaoImpl implements UserDao {
@Override
public void userRegist(User user) throws SQLException {
String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)";
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
Object[] params = {user.getUid(),user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),user.getBirthday(),user.getSex(),user.getState(),user.getCode()};
qr.update(sql, params);
}
}
斷點調試編輯Servlet:
1、開發調試不是用對比,光看效率很低,所以一般使用調試來處理問題
2、添加斷點,Debug on Server
3、運行頁面,完成註冊,到調試界面
7、搭建郵箱服務器_配置客戶端
郵件服務器:
公司服務器上安裝軟件,管理各個郵箱賬戶中的郵件 接收/發送
電子郵箱:
各個賬戶在服務器上開闢一段空間
郵件協議:發送SMTP 接收:pop3/pop/imap
作用:約定了郵件在網絡中傳輸格式
搭建郵件服務器:
1、獲取到eyoumailserversetup.exe,並執行安裝
2、打開工具->服務器設置
3、創建新賬號
4、獲取到FoxMail軟件並執行安裝
5、進行配置即可
8、電子郵箱相關概念及實現
SMTP協議 —— 發郵件協議
全稱爲Simple Mail Transfer Protocol(簡單郵件傳輸協議) , 它定義了郵件客戶端軟件與SMTP服務器之間、以及兩臺SMTP服務器之間的通訊規則。
端口號:25
POP3協議 —— 收郵件協議
全稱爲PostOffice Protocol(郵局協議) , 它定義了郵件客戶端軟件與POP 3服務器的通訊規則。
端口號:110
收發郵件流程圖
發件人通過SMTP服務器發->SMTP服務器收到存儲設備->通過POP3服務器轉發給收件人
FoxMail使用QQ郵箱
進入QQ郵箱;設置;開啓POP3/SMTP服務;記下授權碼;創建FoxMail用戶;使用授權碼收發郵件
Java實現用戶郵件的發送
UserServlet中userRegist添加:
try{
service.userRegist(user);
MailUtils.sendMail(user.getEmail(), user.getCode());
request.setAttribute("msg", "用戶註冊成功,請激活!");
} catch (Exception e) {
request.setAttribute("msg", "用戶註冊失敗,請重新註冊!");
}