---
# System prepended metadata

title: CoaServlet.java

---

# CoaServlet.java

```java
package com.coach.controller;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;

import org.json.JSONArray;
import org.json.JSONObject;

import com.coach.model.CoaService;
import com.coach.model.CoaVO;
import com.expertise.model.ExpService;
import com.expertise.model.ExpVO;
import com.expertise_own.model.ExpOwnService;
import com.expertise_own.model.ExpOwnVO;
import com.utils.MailUtil;
import com.utils.StringUtil;

import sun.misc.BASE64Encoder;

@MultipartConfig
public class CoaServlet extends HttpServlet {


	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		res.setContentType("application/json");
		res.setCharacterEncoding("UTF-8");
		PrintWriter out = res.getWriter();
		try {
			CoaService coaSvc = new CoaService();
			ExpService expService = new ExpService();
			ExpOwnService expOwnService = new ExpOwnService();
			List<CoaVO> list = coaSvc.getAll();

			JSONArray jsonArray = new JSONArray();
			for (CoaVO coaVO : list) {
				JSONObject jSONObject = new JSONObject();
				jSONObject.put("coano", coaVO.getCoano());
				jSONObject.put("coaname", coaVO.getCoaname());
				jSONObject.put("coapsw", coaVO.getCoapsw());
				jSONObject.put("coamail", coaVO.getCoamail());
				jSONObject.put("coatel", coaVO.getCoatel());
				jSONObject.put("coaacc", coaVO.getCoaacc());
				jSONObject.put("coapoint", coaVO.getCoapoint());
				jSONObject.put("coasta", coaVO.getCoasta());
				jSONObject.put("coapic", coaVO.getCoapic());
				jSONObject.put("coasex", coaVO.getCoasex());
				jSONObject.put("coaintro", coaVO.getCoaintro());
				jSONObject.put("coasctotal", coaVO.getCoasctotal());
				jSONObject.put("coascqty", coaVO.getCoascqty());
				List<String> expdescs = new ArrayList<String>();
				List<ExpOwnVO> expOwnVOs = expOwnService.getExpOwnsByCoano(coaVO.getCoano());
				for (ExpOwnVO expOwnVO : expOwnVOs) {
					ExpVO expVO = expService.getOneExp(expOwnVO.getExpno());
					expdescs.add(expVO.getExpdesc());
				}
				jSONObject.put("expdescs", expdescs);
				jsonArray.put(jSONObject);
			}
			out.print(jsonArray.toString());
			out.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			out.close();
		}
	}

	public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		String action = req.getParameter("action");
		
		// 新增一筆教練資料
		if ("insert".equals(action)) { // 來自addCoach.jsp的請求
			Map<String, String> errorMsgs = new HashMap<String, String>();
			try {
				/*********************** 1.接收請求參數 - 輸入格式的錯誤處理 *************************/
				String coaname = req.getParameter("coaname").trim();
				System.out.println("coaname: " + coaname);
				String coanameReg = "^[(\u4e00-\u9fa5)(a-zA-Z0-9_)]{2,10}$";
				if (coaname == null || coaname.trim().length() == 0) {
					errorMsgs.put("coaname", "教練姓名: 請勿空白");
				} else if (!coaname.trim().matches(coanameReg)) {
					errorMsgs.put("coaname", "教練姓名: 只能是中、英文字母、數字和_ , 且長度必需在2到10之間");
				}

				String coapsw = StringUtil.genRamdomStr(6);
				System.out.println("coapsw: " + coapsw);
//				String coapswRege = "^[A-Za-z0-9]{6,10}$";
//				if (coapsw == null || coapsw.trim().length() == 0) {
//					errorMsgs.put("coapsw", "密碼: 只能是大寫或小寫英文字母和數字 , 且長度必需在6到10之間");
//				}

				String coamail = req.getParameter("coamail").trim();
				System.out.println("coamail: " + coamail);
				String coamailRege = "\\p{Alpha}\\w{2,15}[@][a-z0-9]{3,}[.]\\p{Lower}{2,}";
				if (coamail == null || coamail.trim().length() == 0) {
					errorMsgs.put("coamail", "信箱:必需包含@，且@前必需含字母(2~15個)，@後可以是字母或(和)數字(至少3個)，.後至少兩個小寫字母");
				}

				String coatel = req.getParameter("coatel").trim();
				System.out.println("coatel: " + coatel);
				String coatelRege = "/^09[0-9]{8}$/";
				if (coatel == null || coatel.trim().length() == 0) {
					errorMsgs.put("coatel", "電話:必需是09開頭且後方接著0-9，共八個數字");
				}

				String coaacc = req.getParameter("coaacc").trim();
				System.out.println("coaacc: " + coaacc);
				String coaaccRege = "/^[0-9]{12,14}$/";
				if (coaacc == null || coaacc.trim().length() == 0) {
					errorMsgs.put("coaacc", "帳戶:0-9的數字，12~14個數字");
				}

				InputStream picIn = null;
				byte[] coapic = new byte[0];
				try {
					Part picPart = req.getPart("coapic");
					picIn = picPart.getInputStream();
					coapic = new byte[picIn.available()];
					picIn.read(coapic);
				} catch (NullPointerException e) {
					errorMsgs.put("coapic", "請上傳一張照片！");
				} finally {
					picIn.close();
				}

				String coasex = req.getParameter("coasex");
				System.out.println("coasex: " + coasex);

				String coaintro = req.getParameter("coaintro").trim();
				System.out.println("coaintro: " + coaintro);
				if (coaintro == null || coaintro.trim().length() == 0) {
					errorMsgs.put("coaintro", "請輸入內容！");
				}

				// TODO Send the use back to the form, if there were errors
				if (!errorMsgs.isEmpty()) {// 如果有任何錯誤訊息
					CoaVO coaVO = new CoaVO();

					coaVO.setCoaname(coaname);
					coaVO.setCoapsw(coapsw);
					coaVO.setCoamail(coamail);
					coaVO.setCoatel(coatel);
					coaVO.setCoaacc(coaacc);
					coaVO.setCoapic(coapic);
					coaVO.setCoasex(coasex);
					coaVO.setCoaintro(coaintro);

					req.setAttribute("coaVO", coaVO); // 含有輸入格式錯誤的coaVO物件,也存入req，左邊的coaVO來自addCoach.jsp的第6行，第6行跟第8行有關，而第8行跟第100行有關
					req.setAttribute("errorMsgs", errorMsgs);
					RequestDispatcher failureView = req.getRequestDispatcher("/front-end/coach/addCoach.jsp");
					failureView.forward(req, res);
					return;
				}

				/*************************** 2.開始新增資料 ***************************************/
				CoaService coaSvc = new CoaService();
				String coano = coaSvc.addCoa(coaname, coapsw, coamail, coatel, coaacc, coapic, coasex, coaintro);

				ExpOwnService expOwnService = new ExpOwnService();
				Integer expNumber = 1;
				while (req.getParameter("expno" + expNumber.toString()) != null) {
					// insert expown
					String expno = req.getParameter("expno" + expNumber.toString());
					Part expownPart = req.getPart("expown" + expNumber.toString());
					InputStream expownIn = expownPart.getInputStream();
					byte[] expown = new byte[expownIn.available()];
					expownIn.read(expown);
					expownIn.close();
					expOwnService.addExpOwn(coano, expno, expown);
					expNumber++;
				}

				MailUtil mailUtil = new MailUtil();
				mailUtil.sendMail(coamail, "Sign Up success!", "your password is " + coapsw);

				/*************************** 3.新增完成,準備轉交(Send the Success view) ***********/
				String url = "/front-end/index.jsp";
				RequestDispatcher successView = req.getRequestDispatcher(url);
				successView.forward(req, res);

				/*************************** 其他可能的錯誤處理 **********************************/
			} catch (Exception e) {
				e.printStackTrace();
				errorMsgs.put("other errors", e.getMessage());
				req.setAttribute("errorMsgs", errorMsgs);
				RequestDispatcher failureView = req.getRequestDispatcher("/front-end/coach/addCoach.jsp");
				failureView.forward(req, res);
			}
		}
		// 修改頁面展示一筆教練資料 for back-end
		else if ("BackendGetOneForUpdate".equals(action) || "BackendGetOneForView".equals(action)) { // 來自listAllCoach.jsp的請求
			List<String> errorMsgs = new LinkedList<String>();
			req.setAttribute("errorMsgs", errorMsgs);
			try {
				/*************************** 1.接收請求參數 ****************************************/
				String coano = (String) req.getParameter("coano");

				/*************************** 2.開始查詢資料 ****************************************/
				// get coach data
				BASE64Encoder encoder = new BASE64Encoder();
				CoaService coaSvc = new CoaService();
				CoaVO coaVO = coaSvc.getOneCoa(coano);
				coaVO.setCoapicStr(encoder.encode(coaVO.getCoapic()));

				// get expertise data
				ExpOwnService expOwnService = new ExpOwnService();
				List<ExpOwnVO> expOwnVOs = expOwnService.getExpOwnsByCoano(coano);
				ExpService expService = new ExpService();
				for (ExpOwnVO expOwnVO : expOwnVOs) {
					ExpVO expVO = expService.getOneExp(expOwnVO.getExpno());
					expOwnVO.setExpdesc(expVO.getExpdesc());

					// encode bytes to base64 for display purpose
					expOwnVO.setExpownStr(encoder.encode(expOwnVO.getExpown()));
				}
				/*************************** 3.查詢完成,準備轉交(Send the Success view) ************/
				req.setAttribute("coaVO", coaVO); // 資料庫取出的coaVO物件,存入req
				req.setAttribute("expOwnVOs", expOwnVOs);
				
				//為課表加
				HttpSession session = req.getSession();
				session.setAttribute("coano", coaVO.getCoano());
				
				String url = "BackendGetOneForView".equals(action) ? "/front-end/coach/listOneCoach_ForStudent.jsp"
						: "/back-end/coach/listOneCoach.jsp";
				RequestDispatcher successView = req.getRequestDispatcher(url);
				successView.forward(req, res);

				/*************************** 其他可能的錯誤處理 **********************************/
			} catch (Exception e) {
				e.printStackTrace();
				errorMsgs.add("無法取得要修改的資料:" + e.getMessage());
				String url = "BackendGetOneForView".equals(action) ? "/front-end/coach/listAllCoach_ForStudent.jsp"
						: "/back-end/coach/listAllCoach.jsp";
				RequestDispatcher failureView = req.getRequestDispatcher(url);
				failureView.forward(req, res);
			}
		}
		// for ajax
		else if ("BackendUpdate".equals(action)) {
			res.setContentType("application/json");
			res.setCharacterEncoding("UTF-8");
			PrintWriter out = res.getWriter();
			String coano = (String) req.getParameter("coano");
			String coasta = (String) req.getParameter("coasta");
			try {
				CoaService coaSvc = new CoaService();
				CoaVO coaVO = coaSvc.getOneCoa(coano);
				coaSvc.updateCoa(coano, coaVO.getCoaname(), coaVO.getCoapsw(), coaVO.getCoamail(), coaVO.getCoatel(),
						coaVO.getCoaacc(), coaVO.getCoapoint(), coasta, coaVO.getCoapic(), coaVO.getCoasex(),
						coaVO.getCoaintro(), coaVO.getCoasctotal(), coaVO.getCoascqty());
				JSONObject jsonObject = new JSONObject();
				jsonObject.put("error_code", "0");
				out.print(jsonObject.toString());
				out.flush();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				out.close();
			}
		}
		// for submit form
		else if ("update".equals(action)) {
			Map<String, String> errorMsgs = new HashMap<String, String>();
			try {
				/*********************** 1.接收請求參數 - 輸入格式的錯誤處理 *************************/
				String coaname = req.getParameter("coaname").trim();
				System.out.println("coaname: " + coaname);
				String coanameReg = "^[(\u4e00-\u9fa5)(a-zA-Z0-9_)]{2,10}$";
				if (coaname == null || coaname.trim().length() == 0) {
					errorMsgs.put("coaname", "教練姓名: 請勿空白");
				} else if (!coaname.trim().matches(coanameReg)) {
					errorMsgs.put("coaname", "教練姓名: 只能是中、英文字母、數字和_ , 且長度必需在2到10之間");
				}

//				String coapsw = StringUtil.genRamdomStr(6);
//				System.out.println("coapsw: " + coapsw);
//				String coapswRege = "^[A-Za-z0-9]{6,10}$";
//				if (coapsw == null || coapsw.trim().length() == 0 || !coapsw.matches(coapswRege)) {
//					errorMsgs.put("coapsw", "密碼: 只能是大寫或小寫英文字母和數字 , 且長度必需在6到10之間");
//				}

				String coamail = req.getParameter("coamail").trim();
				System.out.println("coamail: " + coamail);
				String coamailRege = "\\p{Alpha}\\w{2,15}[@][a-z0-9]{3,}[.]\\p{Lower}{2,}";
				if (coamail == null || coamail.trim().length() == 0 || !coamail.matches(coamailRege)) {
					errorMsgs.put("coamail", "信箱:必需包含@，且@前必需含字母(2~15個)，@後可以是字母或(和)數字(至少3個)，.後至少兩個小寫字母");
				}

				String coatel = req.getParameter("coatel").trim();
				System.out.println("coatel: " + coatel);
				String coatelRege = "/^09[0-9]{8}$/";
				if (coatel == null || coatel.trim().length() == 0 || !coatel.matches(coatelRege)) {
					errorMsgs.put("coatel", "電話:必需是09開頭且後方接著0-9，共10個數字");
				}

				String coaacc = req.getParameter("coaacc").trim();
				System.out.println("coaacc: " + coaacc);
				String coaaccRege = "/^[0-9]{12,14}$/";
				if (coaacc == null || coaacc.trim().length() == 0 || !coaacc.matches(coaaccRege)) {
					errorMsgs.put("coaacc", "帳戶:0-9的數字，12~14個數字");
				}

				InputStream picIn = null;
				byte[] coapic = new byte[0];
				try {
					Part picPart = req.getPart("coapic");
					picIn = picPart.getInputStream();
					coapic = new byte[picIn.available()];
					picIn.read(coapic);
				} catch (NullPointerException e) {
					errorMsgs.put("coapic", "請上傳一張照片！");
				} finally {
					picIn.close();
				}

				String coasex = req.getParameter("coasex");
				System.out.println("coasex: " + coasex);

				String coaintro = req.getParameter("coaintro").trim();
				System.out.println("coaintro: " + coaintro);
				if (coaintro == null || coaintro.trim().length() == 0) {
					errorMsgs.put("coaintro", "請輸入內容！");
				}

//				// TODO Send the use back to the form, if there were errors
//				if (!errorMsgs.isEmpty()) {// 如果有任何錯誤訊息
//					CoaVO coaVO = new CoaVO();
//
//					coaVO.setCoaname(coaname);
//					coaVO.setCoamail(coamail);
//					coaVO.setCoatel(coatel);
//					coaVO.setCoaacc(coaacc);
//					coaVO.setCoapic(coapic);
//					coaVO.setCoasex(coasex);
//					coaVO.setCoaintro(coaintro);
//
//					req.setAttribute("coaVO", coaVO); // 含有輸入格式錯誤的coaVO物件,也存入req，左邊的coaVO來自addCoach.jsp的第6行，第6行跟第8行有關，而第8行跟第100行有關
//					req.setAttribute("errorMsgs", errorMsgs);
//					RequestDispatcher failureView = req.getRequestDispatcher("/front-end/coach/addCoach.jsp");
//					failureView.forward(req, res);
//					return;
//				}

				/*************************** 2.開始更新資料 ***************************************/
				CoaService coaSvc = new CoaService();
				String coano = req.getParameter("coano").trim();
				CoaVO coaVO = coaSvc.getOneCoa(coano);
				coaSvc.updateCoa(coano, coaname, coaVO.getCoapsw(), coamail, coatel, coaacc, coaVO.getCoapoint(),
						coaVO.getCoasta(), coapic, coasex, coaintro, coaVO.getCoasctotal(), coaVO.getCoascqty());

//				ExpOwnService expOwnService = new ExpOwnService();
//				Integer expNumber = 1;
//				while (req.getParameter("expno" + expNumber.toString()) != null) {
//					// insert expown
//					String expno = req.getParameter("expno" + expNumber.toString());
//					Part expownPart = req.getPart("expown" + expNumber.toString());
//					InputStream expownIn = expownPart.getInputStream();
//					byte[] expown = new byte[expownIn.available()];
//					expownIn.read(expown);
//					expownIn.close();
//					expOwnService.addExpOwn(coano, expno, expown);
//					expNumber++;
//				}

//				MailUtil mailUtil = new MailUtil();
//				mailUtil.sendMail(coamail, "Sign Up success!", "your password is " + coapsw);

				/*************************** 3.新增完成,準備轉交(Send the Success view) ***********/
				String url = "/front-end/coach/updateCoach.jsp";
				RequestDispatcher successView = req.getRequestDispatcher(url);
				successView.forward(req, res);

				/*************************** 其他可能的錯誤處理 **********************************/
			} catch (Exception e) {
				e.printStackTrace();
				errorMsgs.put("other errors", e.getMessage());
				req.setAttribute("errorMsgs", errorMsgs);
				RequestDispatcher failureView = req.getRequestDispatcher("/front-end/coach/updateCoach.jsp");
				failureView.forward(req, res);
			}
		}
		
		if("getOne".equals(action)) {
			
			String coano = req.getParameter("coano");
			CoaService coaSvc = new CoaService();
			CoaVO coaVO = coaSvc.getOneCoa(coano);
			List<String> errorMsgs = new LinkedList<String>();
			req.setAttribute("errorMsgs", errorMsgs);
			try {
				
				/*************************** 2.開始查詢資料 ****************************************/
				// get coach data
				BASE64Encoder encoder = new BASE64Encoder();
				
				coaVO.setCoapicStr(encoder.encode(coaVO.getCoapic()));

				// get expertise data
				ExpOwnService expOwnService = new ExpOwnService();
				List<ExpOwnVO> expOwnVOs = expOwnService.getExpOwnsByCoano(coano);
				ExpService expService = new ExpService();
				for (ExpOwnVO expOwnVO : expOwnVOs) {
					ExpVO expVO = expService.getOneExp(expOwnVO.getExpno());
					expOwnVO.setExpdesc(expVO.getExpdesc());

					// encode bytes to base64 for display purpose
					expOwnVO.setExpownStr(encoder.encode(expOwnVO.getExpown()));
				}
				/*************************** 3.查詢完成,準備轉交(Send the Success view) ************/
				req.setAttribute("coaVO", coaVO); // 資料庫取出的coaVO物件,存入req
				req.setAttribute("expOwnVOs", expOwnVOs);
				
				//為課表加
				HttpSession session = req.getSession();
				session.setAttribute("coano", coaVO.getCoano());
				
				String url = "/front-end/coach/listOneCoach_ForStudent.jsp";
				RequestDispatcher successView = req.getRequestDispatcher(url);
				successView.forward(req, res);

				/*************************** 其他可能的錯誤處理 **********************************/
			} catch (Exception e) {
				e.printStackTrace();
				errorMsgs.add("無法取得要修改的資料:" + e.getMessage());
				String url = "BackendGetOneForView".equals(action) ? "/front-end/coach/listAllCoach_ForStudent.jsp"
						: "/back-end/coach/listAllCoach.jsp";
				RequestDispatcher failureView = req.getRequestDispatcher(url);
				failureView.forward(req, res);
		}
	}
}}
```