JavaWeb企業實戰項目(一):環境搭建-用戶註冊-郵件發送

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實現階段(一)

  1. 在某個要被用到的Servlet中寫好所有方法
  2. doGet中獲得method,用於判斷
  3. 分別判斷method是否爲其中一個方法
  4. 若是,則調用下面的方法
    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實現階段(二)

  1. 在某個要被用到的Servlet中寫好所有方法
  2. 創建一個BasicServlet,作爲通用Servlet
  3. 重寫BasicServlet中的Server方法
    (這裏重寫Server方法的原因是,每一個Servlet在被調用的時候都會調用父類的init、server這些方法。一般情況下我們不會重寫這些初始化的方法,所以我們利用這一點。直接重寫了server方法,阻斷了普通Servlet的加載,達到通用Servlet的目的)
  4. 我們要用到的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的好處:

  1. close掉project, 那麼開啓myeclipse的時候, 就不會自動加載該project的相關zd文件跟jar包等等, 會提高運行速度。
  2. close project 可以在開發其他項目時,釋放出內存,使計算機版運行速度更快。
  3. 可以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包
導入jar包
3、導入Utils工具類
導入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、打開工具->服務器設置
設置1
3、創建新賬號
設置2
4、獲取到FoxMail軟件並執行安裝
5、進行配置即可
設置3
設置4

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", "用戶註冊失敗,請重新註冊!");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章