//三層模型 : Web Service Dao : 分工明確 細(xì)化功能
//MVC模型? :? 模型模塊? 視圖模塊? 控制模塊:三層模型是對C模塊的細(xì)分
首先在idea 下web文件新建head.jsp? register.jsp? login.jsp? 在WEB-INF文件下新建main.jsp頁面
在head.jsp中引入jQuery和jstl包
然后在regist.jsp和login.jsp中引入head.jsp
在頁面中編寫input標(biāo)簽,用于接收參數(shù)傳輸給后臺(tái)進(jìn)行接收及處理
1闸翅、可以寫按鈕事件再芋,在js事件中通過jQuery獲取輸入框中內(nèi)容
2、可以寫入form表單中傳遞數(shù)據(jù)
$("#userName").val().trim();
之后通過ajax傳值到后端進(jìn)行數(shù)據(jù)處理
function submit(){
if(!userCheck){
alert("對不起,用戶名不可用")
return;
}
var userName =$("#userName").val().trim();
var password =$("#password").val().trim();
if(password.trim()==""||password.length<6){
alert("對不起,密碼不符合規(guī)則")
return;
}
var repassword =$("#repassword").val().trim();
if(password!=repassword){
alert("對不起,兩次密碼不一致")
return;
}
var d = {userName:userName,password:password,repassword:repassword};
$.ajax({
url:"/user/register",
type:"post",
data:d,
dataType:"json",
success:function (data) {
if(data.code==-1){
$("#message").text(data.message);
}else{
$("#message").text(data.message+",立即為您跳轉(zhuǎn)頁面");
setTimeout(function () {
location.href="/resource/pages/login.jsp";
},2000)
}
}
})
在web層接收前臺(tái)傳遞過來的參數(shù)坚冀,可以用String userName =req.getParameter("userName");屬性名的方式獲取
也可導(dǎo)入工具包c(diǎn)ommons-beanutils-1.8.3.jar济赎,用工具接收直接封裝入javaBean中,(接收的屬性名必須和javaBean中的成員變量名相同)UserBean user = WebUtils.populate(UserBean.class,req);
接著調(diào)用service層中UserService中的各種方法得到從數(shù)據(jù)庫獲取的值记某,進(jìn)行判斷登陸司训、注冊等操作
service層中一般直接調(diào)用Dao層的方法獲取原始數(shù)據(jù),可以在本層進(jìn)行一些簡單的業(yè)務(wù)處理液南,如數(shù)據(jù)庫long型時(shí)間轉(zhuǎn)換日期型豁遭,密碼加密存入數(shù)據(jù)庫等,加密語句如下贺拣,
MessageDigest digest = MessageDigest.getInstance("md5");
//加密之前是字符串,加密之后是字節(jié)數(shù)組, 如果我們把字節(jié)數(shù)組存到數(shù)據(jù)庫, 那么查詢時(shí)的效率極低
byte[] bs = digest.digest(userBean.getPassword().getBytes());
//可以將任意字節(jié)數(shù)組轉(zhuǎn)成明文的字符串
//01100001? 01100010 01100011
//011000 010110 001001 100011
//24? 22 9 35
Base64.Encoder encoder = Base64.getEncoder();
String str = encoder.encodeToString(bs);
userBean.setPassword(str);
而在DAO層則直接是根據(jù)方法名含義直接獲取數(shù)據(jù)庫中的數(shù)據(jù)
bean中則直接寫javaBean類蓖谢,成員變量名與數(shù)據(jù)庫中的字段名相同,且類型相同
在web層調(diào)用獲取的數(shù)據(jù)譬涡,經(jīng)過處理可以放入Session域中闪幽,前端jsp頁面通過jQuery獲取后臺(tái)的到信息進(jìn)行展示,如商品展示涡匀《㈦纾可以分頁展示,
需要分頁的信息陨瘩,對應(yīng)的java? Bean中要繼承? ? Basebean腕够。
里面存放總頁數(shù)當(dāng)前頁等,在調(diào)用提取寫好封裝的paging類中的方法舌劳,根據(jù)javabean的開始頁數(shù)和分頁大小帚湘,還有二次調(diào)用傳過來的當(dāng)前頁,判斷當(dāng)前頁并拼接當(dāng)前請求所帶來的所有參數(shù)甚淡,再拼寫分頁當(dāng)前頁大诸,使用字符串拼接成頁面,返回一個(gè)字符串,在頁面中引入這個(gè)字符串资柔,則會(huì)自動(dòng)轉(zhuǎn)換成對應(yīng)標(biāo)簽和信息焙贷,
在頁面顯示的商品詳情則只會(huì)顯示,調(diào)用時(shí)傳遞過去的開始頁贿堰,及頁面大小數(shù)量的所有商品辙芍。
相應(yīng)的在shopback后臺(tái)系統(tǒng)中判斷用戶登錄之后才能對商品表的信息進(jìn)行增刪改查等操作,否則則會(huì)攔截羹与。
如果用戶沒有登錄沸手,跳到登錄頁面,可以通過攔截器實(shí)現(xiàn)注簿,在攔截器中判斷
用戶登錄成功契吉,則在該用戶的session中放置登錄標(biāo)志,否則無
在攔截器中诡渴,只有登錄才能顯示商品詳情及操作捐晶,或者可以查看一些靜態(tài)頁面,否則就跳到登錄頁面
//因?yàn)橐褂胹ession,所以將ServletRequest強(qiáng)轉(zhuǎn)成HttpServletRequest
HttpServletRequest request = (HttpServletRequest) servletRequest;
//有一些靜態(tài)資源和serlvet請求是不需要攔截的, 放行
//獲取請求路徑 /項(xiàng)目名/請求地址
String str = request.getRequestURI();
if(str.startsWith("/shopback/resource/")||str.startsWith("/shopback/user/login")){
filterChain.doFilter(request,servletResponse);
return;
}
//獲取登陸標(biāo)志
Object userBack = request.getSession().getAttribute("user");
//判斷使用已經(jīng)登陸
if(userBack==null){
request.getRequestDispatcher("/resource/pages/login.jsp").forward(request,servletResponse);
}else{
filterChain.doFilter(request,servletResponse);
}