書城專案第三、四階段
阿新 • • 發佈:2021-11-29
書城專案第三階段
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 ©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> <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 表示式修改表單回顯
以登入為示例: