1. 程式人生 > 其它 >書城專案第三、四階段

書城專案第三、四階段

書城專案第三階段

1、頁面 jsp 動態化

1、在 html 頁面頂行新增 page 指令。

2、修改檔案字尾名為:.jsp

3、使用 IDEA 搜尋替換.html 為.jsp(快捷鍵:Ctrl+Shift+R)

2、抽取頁面中相同的內容

使用靜態包含抽取以下內容

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div id="bottom">
			<span>
				尚矽谷書城.Copyright &copy;2015
			</span>
</div>
<%@ 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>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<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>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div>
    <a href="book_manager.jsp">圖書管理</a>
    <a href="order_manager.jsp">訂單管理</a>
    <a href="../../index.jsp">返回商城</a>
</div>

3、登入,註冊錯誤提示,及表單回顯

以登入回顯為示例:

Servlet 程式端需要添加回顯資訊到 Request 域中

jsp 頁面,需要輸出回顯資訊

4、BaseServlet 的抽取

在實際的專案開發中,一個模組,一般只使用一個 Servlet 程式。

4.1、程式碼優化:合併 LoginServlet RegistServlet 程式為 UserServlet 程式

UserServlet 程式:

public class UserServlet extends HttpServlet {
    private UserService userService = new UserServiceImpl();
    /**
     * 處理登入的功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    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){
            //把錯誤資訊,和回顯的表單項資訊,儲存到Request域中
            req.setAttribute("msg","使用者名稱或密碼錯誤");
            req.setAttribute("username",username);
            // 跳回登入頁面
            req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
        }else{
            // 登入 成功
            // 跳到成功頁面 login_success.jsp
            req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);
        }
    }

    /**
     * 處理註冊的功能
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    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)) {
                //把錯誤資訊,和回顯的表單項資訊,儲存到Request域中
                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.html
                req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req, resp);
            }
        } else {
            //把錯誤資訊,和回顯的表單項資訊,儲存到Request域中
            req.setAttribute("msg","驗證碼錯誤!");
            req.setAttribute("username",username);
            req.setAttribute("email",email);

            System.out.println("驗證碼[" + code + "]錯誤");
            req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
        }
    }
    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);
        }
    }
}

還要給 login.jsp 新增隱藏域和修改請求地址

給 regist.jsp 頁面新增隱藏域 action,和修改請求地址

4.2、優化程式碼二:使用反射優化大量 else if 程式碼:

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        try {
            // 獲取 action 業務鑑別字串,獲取相應的業務 方法反射物件
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            // 呼叫目標業務 方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.3、程式碼優化三:抽取 BaseServlet 程式。

BaseServlet 程式程式碼:

public abstract class BaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        try {
            // 獲取 action 業務鑑別字串,獲取相應的業務 方法反射物件
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            // 呼叫目標業務 方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

修改 UserServlet 程式繼承 BaseServlet 程式。

5、資料的封裝和抽取 BeanUtils 的使用

BeanUtils 工具類,它可以一次性的把所有請求的引數注入到 JavaBean 中。

BeanUtils 工具類,經常用於把 Map 中的值注入到 JavaBean 中,或者是物件屬性值的拷貝操作。

BeanUtils 它不是 Jdk 的類。而是第三方的工具類。所以需要導包。

1、匯入需要的 jar 包:

  • commons-beanutils-1.8.0.jar

  • commons-logging-1.1.1.jar

2、編寫 WebUtils 工具類使用:

public class WebUtils {
    /**
     * 把 Map 中的值注入到對應的 JavaBean 屬性中
     * @param value
     * @param bean
     * @param <T>
     * @return
     */
    public static <T> T copyParamToBean(Map value, T bean) {
        try {
            System.out.println("注入之前:" + bean);
            //把所有請求的引數都注入到 user 物件中
            BeanUtils.populate(bean, value);
            System.out.println("注入之後:" + bean);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
}

書城第四階段。使用 EL 表示式修改表單回顯

以登入為示例: