書城專案第三階段
當我們的專案啟動之后,訪問登錄或注冊頁面,輸入需要的資訊,點擊登錄或注冊按鈕:

注冊頁面
我們發現,即使輸入的用戶資訊錯誤,只是跳轉回了當前的登錄或注冊頁面,沒有任何的提示資訊,我們希望當輸入的用戶資訊不正確時,給與用戶提示,并且需要回顯用戶名等資訊,
一、頁面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運算式替換所有注冊頁面的運算式腳本



轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/203891.html
標籤:Java
