1. 程式人生 > 實用技巧 >書城專案:第3階段

書城專案:第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 &copy;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>&nbsp;&nbsp;
    <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>&nbsp;&nbsp;
    <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表示式替換所有註冊頁面的表示式指令碼