書城專案:第3階段
書城專案第三階段
當我們的專案啟動之後,訪問登入或註冊頁面,輸入需要的資訊,點選登入或註冊按鈕:
註冊頁面
我們發現,即使輸入的使用者資訊錯誤,只是跳轉回了當前的登入或註冊頁面,沒有任何的提示資訊。我們希望當輸入的使用者資訊不正確時,給與使用者提示,並且需要回顯使用者名稱等資訊。
一、頁面jsp 動態化
1、在所有html 頁面頂行新增page 指令
2、修改所有的檔案字尾名為:.jsp
3、需要將所有頁面中跳轉的頁面地址修改為(.jsp)的。使用IDEA 搜尋替換.html 為.jsp(快捷鍵:Ctrl+Shift+R)
==================================================================================================================
專案啟動後,訪問不同的頁面,我們發現:有好多的頁面中部分內容都是相同的。如:
為了方便專案後期的管理和維護,需要將這些相同內容抽取到不同的jsp檔案中,使用靜態包含引用即可。
二、抽取頁面中相同的內容
在pages資料夾下新建一個common目錄(用來存放具有形同內容的jsp頁面):
head.jsp檔案(head中的css、jQuery、base標籤):
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath= request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <!--寫base標籤,永遠固定相對路徑跳轉的結果--> <base href="<%=basePath%>"> <link type="text/css" rel="stylesheet" href="static/css/style.css" > <script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
footer.jsp頁面(每個頁面的頁尾):
<div id="bottom"> <span> 尚矽谷書城.Copyright ©2015 </span> </div>
login_success_menu.jsp頁面(登入成功後的選單):
<div> <span>歡迎<span class="um_span">韓總</span>光臨尚矽谷書城</span> <a href="../order/order.jsp">我的訂單</a> <a href="../../index.jsp">登出</a> <a href="../../index.jsp">返回</a> </div>
manager.jsp頁面(manager管理模組的選單):
<div> <span>歡迎<span class="um_span">韓總</span>光臨尚矽谷書城</span> <a href="../order/order.jsp">我的訂單</a> <a href="../../index.jsp">登出</a> <a href="../../index.jsp">返回</a> </div>
有了以上的操作,我們需要用到這些程式碼的地方,只需要使用靜態包含的方式引入即可。後期專案如果有改動的地方,只需要修改common下的這些檔案即可,不需要每一個頁面都去做改動。
====================================================================================================================
三、登入,註冊錯誤提示,及表單回顯
登入頁面,我們希望得到如下的效果:
1.Servlet 程式端需要添加回顯資訊到Request 域中
2.jsp 頁面,需要輸出回顯資訊
註冊頁面,我們希望得到如下的效果:
1.Servlet 程式端需要添加回顯資訊到Request 域中
2.jsp 頁面,需要輸出回顯資訊
=============================================================================================================
四、BaseServlet 的抽取
在實際專案開發中,一個模組,一般只使用一個Servlet程式,我們希望將登入和註冊的Servlet程式進行合併(後面若有其它的業務,全部合併成一個Servlet即可)。
程式碼優化一:將LoginServlet和RegistServlet合併成UserServlet。
1.在登入和註冊的jsp頁面中分別新增隱藏域:
2.在UserServlet程式中通過請求引數action值得不同實現不同的功能分發(記得在web.xml配置UserServlet的訪問路徑):
public class UserServlet extends HttpServlet { private UserService userService = new UserServiceImpl(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String action = req.getParameter("action"); if ("login".equals(action)){ login(req, resp); }else if ("regist".equals(action)){ regist(req, resp); } } protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1、獲取請求的引數 String username = req.getParameter("username"); String password = req.getParameter("password"); // 呼叫 userService.login()登入處理業務 User loginUser = userService.login(new User(null, username, password, null)); // 如果等於null,說明登入 失敗! if (loginUser == null) { req.setAttribute("msg", "使用者名稱或密碼錯誤"); req.setAttribute("username", username); // 跳回登入頁面 req.getRequestDispatcher("/pages/user/login.jsp").forward(req, resp); } else { // 登入 成功 //跳到成功頁面login_success.html req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req, resp); } } protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1、獲取請求的引數 String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); String code = req.getParameter("code"); // 2、檢查 驗證碼是否正確 === 寫死,要求驗證碼為:abcde if ("abcde".equalsIgnoreCase(code)) { // 3、檢查 使用者名稱是否可用 if (userService.existsUsername(username)) { //講回顯得錯誤資訊儲存 req.setAttribute("msg", "使用者名稱已存在"); req.setAttribute("username", username); req.setAttribute("email", email); System.out.println("使用者名稱[" + username + "]已存在!"); // 跳回註冊頁面 req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp); } else { // 可用 // 呼叫Sservice儲存到資料庫 userService.registUser(new User(null, username, password, email)); // // 跳到註冊成功頁面 regist_success.jsp req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req, resp); } } else { //講回顯得錯誤資訊儲存 req.setAttribute("msg", "驗證碼錯誤"); req.setAttribute("username", username); req.setAttribute("email", email); System.out.println("驗證碼[" + code + "]錯誤"); req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp); } } }
===============================================================================================================
程式碼優化二:使用反射優化大量else if程式碼。
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String action = req.getParameter("action"); System.out.println(this.getClass()); try { Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, req, resp); } catch (Exception e) { e.printStackTrace(); } }
=================================================================================================================
程式碼優化三:抽取BaseServlet類。
在實際開發中,不止是有UserServlet模組,而是有很多的Servlet模組,而且他們的功能都是相似的。
我們將所有的Servlet程式抽取出一個BaseServlet程式,讓其他的程式整合這個BaseServlet程式,BaseServlet只需要整合HttpServlet即可。
BaseServlet程式程式碼:
UserServlet只需整合BaseServlet即可(它也是一個Servlet程式,間接的集成了HttpServlet)。
===================================================================================================================
五、資料的封裝和抽取BeanUtils的使用
1.BeanUtils工具類的作用
①BeanUtils 工具類,它可以一次性的把所有請求的引數注入到 JavaBean 中。
② BeanUtils 工具類,經常用於把 Map 中的值注入到 JavaBean 中,或者是物件屬性值的拷貝操作。
2.BeanUtils工具類的使用
BeanUtils 它不是 Jdk 的類。而是第三方的工具類。所以需要導包。
3.WebUtils工具類的使用
①建立工具類WebUtils.java。程式碼如下:
public class WebUtils {
/**
* 將Map中的值注入到bean中
* @param value
* @param bean
* @param <T>
* @return
*/
public static <T> T copyParamToBean(Map value, T bean){
try {
System.out.println("注入之前:" + bean);
/**
* 將所有的請求引數注入到bean物件中
*/
BeanUtils.populate(bean, value);
System.out.println("注入之後:" + bean);
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
②使用WebUtils工具類對請求引數進行封裝
===================================================================================================
六、使用EL表示式修改表單回顯
1.使用EL表示式替換登入頁面中的所有表示式指令碼
2.使用EL表示式替換所有註冊頁面的表示式指令碼