亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP+Servlet培訓班作業管理系統[13] -使用基于Action的后端(用戶登錄為例)

2019-11-06 07:00:06
字體:
來源:轉載
供稿:網友

上一篇講完了不止于CRUD的設計,本篇就在新設計的基礎上實現用戶登錄,在實現之前,貓哥先放一張數據庫結構的截圖(之前的設計竟然忘了學生選課表student_lesson,好尷尬啊…所以此處重放) 這里寫圖片描述

step1,用戶登錄頁面代碼如下,需要注意的是點擊登錄后提交到/HomeworkSystem/ActionServlet?method=login&entityType=User method=login表示登錄動作 entityType=User表示動作相關對象類別是User

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>login.jsp</title> </head> <body> <form id="mainForm" method="post" action="/HomeworkSystem/ActionServlet?method=login&entityType=User"> 請輸入用戶編號:<input type="text" name="userId" /> <br/> 請輸入密碼:<input type="passWord" name="userPassword"/> <br/> <input type="submit" value="登錄"/> </form> </body></html>

step2:根據web.xml配置,ActionServlet負責處理該請求,代碼如下,注意注釋部分的解釋內容:

package servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import action.support.Action;import action.support.ActionContext;import exception.MyException;import java.util.Iterator;import java.util.Map;//ActionServlet作為整個項目唯一的Servletpublic class ActionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response);//doGet與doPost一樣處理 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //輸入輸出格式設置 response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //根據request用戶輸入信息創建不同的ActionContext(Action上下文) ActionContext context=ActionController.assemblyActionContext(request); //根據不同的ActionContext創建不懂的action動作 Action action=ActionController.dispatchAction(context); try { context=action.execute();//執行動作并返回結果 } catch (MyException ex) {//如果有異常,跳轉異常提示頁面 request.setAttribute("tsession")){ request.getSession().setAttribute(key.toString(), val); }else{ request.setAttribute(key.toString(), val); } } } //跳轉到index.jsp主頁面,注意 actionUrl指向頁面顯示在index.jsp右邊內容區域 request.getRequestDispatcher("/index.jsp").forward(request,response); }}

step3,ActionServlet中有兩個重要方法,這兩個方法實際上就定義了動作路由,前一個方法定義了如何從用戶輸入獲取Action需要的上下文環境,后一個方法則從上下文環境自動生成對應的動作。當正式編程時,每當定義一個新的動作類處理一類動作時,都要從ActionController類的這兩個方法中進行注冊對應的上下文生成邏輯和匹配動作邏輯。

//根據request用戶輸入信息創建不同的ActionContext(Action上下文)ActionContext context=ActionController.assemblyActionContext(request);//根據不同的ActionContext創建不懂的action動作Action action=ActionController.dispatchAction(context);

OK,此時我們要進行的是登錄動作,method=login。所以ActionController中可添加如下代碼,注意注釋中的解釋內容。

package servlet;import inter.IOperation;import java.util.*;import javax.servlet.http.HttpServletRequest;import entity.*;import factory.EntityFactory;import factory.OperationFactory;import action.*;import action.support.Action;import action.support.ActionContext;/** * 實質的控制器 * @author 貓哥 * @date 2017.2.11 * 一定注意該類是整個控制邏輯的核心,每當有新的Action來了,需要從本類進行類似“注冊”的動作,而且必須保證 * createAction與assemblyActionContext正確的呼應(對應)關系 */public class ActionController { /*assembly裝配的意思,裝配ActionContext即裝配動作的上下文,上下文的意思就是環境 一定注意本方法不管如何執行,只關心需要執行時候需要哪些參數*/ public static ActionContext assemblyActionContext(HttpServletRequest request){ ActionContext context=new ActionContext(); //裝配兩個必備參數 context.setOperationType(request.getParameter("method")); context.setEntityType(request.getParameter("entityType")); //剩下的就是根據需要裝配了 if(context.getOperationType().equals("login")){ //登錄時間,需要攜帶用戶輸入的用戶名、密碼 Map<String,Object> map=new HashMap<String,Object>(); map.put("userId", request.getParameter("userId")); map.put("userPassword", request.getParameter("userPassword")); context.setInputParams(map); } return context; } /*dispatch的意思是調度,分派 一定注意本方法只關心將context中請求派給哪個Action處理 為了保證呼應,可先直接將上面if段拷貝,然后修改內容*/ public static Action dispatchAction(ActionContext context){ if(context.getOperationType().equals("login")){ return new LoginAction(context); } return null; }}

由此可見針對login動作,ActionController生成了含userId和userPassword信息的上下文,且定義了該上下文對應的Action為LoginAction(context)。

step4,這樣動作LoginAction開始執行。

package action;import java.util.Date;import java.util.HashMap;import java.util.Map;import operation.UserOperation;import action.support.Action;import action.support.ActionContext;import util.Constant;import entity.User;import exception.MyException;import factory.OperationFactory;public class LoginAction extends Action{ public LoginAction(ActionContext context){ super(context); } @Override public ActionContext execute() throws MyException { UserOperation oper=(UserOperation)OperationFactory.createOperation(context.getEntityType()); String inputUserId=(String)context.getInputParams().get("userId"); String inputUserPassword=(String)context.getInputParams().get("userPassword"); User realUser=(User)oper.selectById(Integer.parseInt(inputUserId)); if(realUser!=null&&realUser.getUserPassword().equals(inputUserPassword)){ //設置返回參數back Map<String,Object> back=new HashMap<String,Object>(); //登錄用戶,一定注意如果需要Servlet接收到返回context時將對應量放入session域,則命名為session.... back.put("sessionUser", realUser); //登錄用戶角色對應菜單 back.put("sessionRoleMenu", Constant.RoleMenu.get(realUser.getUserRole().getRoleName())); context.setOutputParams(back); context.setActionUrl("tip.jsp"); return context; } else{ throw new MyException(new Date(),"LoginAction Error","登錄失??!"); } }}

到此處再結合ActionServlet中處理context.getOutputParams()的邏輯就好理解了,返回值如果需要放入session域,那么action中命名時就加上session。如果放入request域,那就不要使用session字樣的命名。

Map<String,Object> map=context.getOutputParams(); if(map!=null){ Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); if(key.toString().startsWith("session")){ request.getSession().setAttribute(key.toString(), val); }else{ request.setAttribute(key.toString(), val); } } }

step5,好的,角色菜單信息依然放在Constant中:

package util;import java.util.HashMap;public class Constant {//保存常量信息 //roleMenu用于保存角色及對應的菜單信息 public static HashMap<String,String[][]> RoleMenu=new HashMap<String,String[][]>(); //pageSize用于保存不同實體列表頁面顯示實體個數信息(每頁多少個) public static HashMap<String,String> PageSize=new HashMap<String,String>(); //使用static代碼塊對roleMenu進行初始化 static{ //注意,二位數組中的每一組表示一個菜單的信息,又通過map建立了角色名和菜單直接的對應關系 RoleMenu.put("校長", new String[][]{ {"人員管理","view","User"},//由具體的地址,變為抽象的參數 {"課程管理","view","Course"} }); RoleMenu.put("教師", new String[][]{}); RoleMenu.put("學生", new String[][]{}); //初始化頁面列表個數 PageSize.put("Course", "10"); PageSize.put("Job", "10"); PageSize.put("Lesson", "10"); PageSize.put("Role", "10"); PageSize.put("User", "10"); PageSize.put("Work", "10"); } }

step6,最后是登錄成功后的index.jsp頁面代碼及其相關CSS文件index.css:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib 字體大小12px,宋體*/ *{ margin:0px; padding:0px; font-size:12px; font-family:"宋體"; } /*整個body區域背景色為#F5F5F5,這個很簡單,自己下載個取色器,找個漂亮的網頁,取個顏色就行*/ body { background-color: #FCFCFC; } /*在top、left、right外面套用一層main是為了控制寬度,并且整體居中*/ #main{ width:1000px; margin:0px auto; } /*寬度占滿它爹的寬度,高度64px是瞎試的,不好看再調整,貓哥喜歡用16px、32px、64px、128px這些,你懂的。 背景色貓哥繼續取色器 line-height表示文字占用的高度,它也是64那就是文字占用高度跟top區域高度是一樣的嘛,所以文字就居中了*/ #top{ width:100%; height:64px; background-color:#000000; line-height:64px; } /*文字顏色取色器,標題部分啊文字用微軟雅黑,大氣!*/ #top_title{ line-height:64px; font-family:"微軟雅黑"; color:#FFFFFF; float:left; font-size:32px; margin-left:16px; } /*顏色依然是自己取色的*/ #top_info{ color:#71777D; float:right; line-height:64px; font-size:16px; margin-right:16px; } /*寬度占200px差不多了吧 float表示漂浮,left的話就是靠左了,所以這個left區域就得靠左飄飄了 內部的東西跟邊距有點距離好看點,暫時定為10px,上下左右都是哦*/ #left{ width:200px; height:536px;/*貓哥認為600-64=536*/ float:left; background-color:#EEEEEE; padding:10px; } /*調整id=left的div中的ul標簽下的li標簽的樣式為上邊距10px,左邊距15px*/ #left ul li{ margin:10px 0px 0px 15px; } /*注意逗號表示同時設置兩組對象的CSS屬性 a:link表示未訪問的鏈接,a:visited表示已訪問的鏈接,顏色憑愛好了*/ #left a:link, #left a:visited { color: #333333; text-decoration:none;/*不要下劃線*/ } /*a:hover表示鼠標懸停的鏈接,a:active表示被選擇的鏈接*/ #left a:hover, #left a:active { color: #0AA770; text-decoration:none; } /*同理right向右飄*/ #right{ width:760px;/*1000-200-10*4=760,此處一定要注意padding的內容會拓寬div整體寬度,有志于前端的可以專門去研究下*/ min-width:600px; height:536px;/*貓哥認為600-64=536*/ float:right; background-color:#FFFFFF; padding:10px; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性20hd另类| 久色乳综合思思在线视频| 欧美日韩中文字幕综合视频| 国产精品尤物福利片在线观看| 狠狠躁夜夜躁人人爽超碰91| 国产成人精品视频| 欧美日韩成人精品| www国产精品视频| 国产精品久久久久久久久久东京| 亚洲自拍偷拍在线| 欧美猛交ⅹxxx乱大交视频| 欧美韩日一区二区| 在线日韩av观看| 国产精品视频一区二区高潮| 欧美日韩一区二区三区在线免费观看| 亚洲综合第一页| 欧美一级片在线播放| 精品国产一区二区三区久久狼5月| 成人高h视频在线| 欧美一级淫片aaaaaaa视频| 欧美视频在线免费看| 成人xxxxx| 欧美超级免费视 在线| 亚洲精品美女视频| 136fldh精品导航福利| 综合国产在线观看| 丝袜美腿精品国产二区| 精品久久久久国产| 欧美黑人极品猛少妇色xxxxx| 国产精品丝袜白浆摸在线| 午夜精品久久久久久久男人的天堂| 亚洲激情自拍图| 亚洲深夜福利视频| 国产成人午夜视频网址| 欧美老女人在线视频| 欧美精品久久久久久久免费观看| 国产亚洲在线播放| 欧美激情xxxx| 91香蕉电影院| 国产精品狠色婷| 青青草成人在线| 一本色道久久88亚洲综合88| 国产午夜一区二区| 国产精品免费久久久| 26uuu日韩精品一区二区| 亚洲午夜久久久影院| 久热精品视频在线观看一区| 亚洲最大福利网站| 国产一区二区三区直播精品电影| 久久久久久国产精品美女| 精品亚洲一区二区三区四区五区| 日韩三级成人av网| 日韩欧美在线免费| 另类少妇人与禽zozz0性伦| 亚洲人成网站777色婷婷| 亚洲免费电影一区| 国模精品一区二区三区色天香| 国内精品一区二区三区四区| 理论片在线不卡免费观看| 欧美激情中文字幕在线| 富二代精品短视频| 国产日韩中文字幕| 一区二区三区久久精品| 亚洲精品v欧美精品v日韩精品| 久久成人亚洲精品| 亚洲精品福利在线| 日本成人精品在线| 日韩成人在线网站| 亚洲自拍av在线| 国产精品精品视频| 91精品视频播放| 人人澡人人澡人人看欧美| 日韩女优在线播放| 亚洲一区二区三区成人在线视频精品| 欧美日本国产在线| xxxx欧美18另类的高清| 国产精品激情自拍| 欧美高清电影在线看| 国产美女精品免费电影| 亚洲第一网站男人都懂| 2019最新中文字幕| 欧美激情在线有限公司| 91国产精品91| 精品激情国产视频| 国产成人在线一区| 欧美高清视频在线播放| 日韩av在线导航| 国产91久久婷婷一区二区| 欧美激情一区二区三区成人| 欧美亚洲另类激情另类| 国产精品直播网红| 欧美一级视频在线观看| 热re91久久精品国99热蜜臀| 亚洲视频免费一区| 色综合久久88色综合天天看泰| 欧美激情亚洲视频| 国产日韩av高清| 国产z一区二区三区| 日韩一区二区三区xxxx| 亲爱的老师9免费观看全集电视剧| 国产精品成人久久久久| 97碰在线观看| 精品一区二区三区四区| 亚洲tv在线观看| 亚洲人成网站999久久久综合| 久久视频在线免费观看| 一个色综合导航| 岛国精品视频在线播放| 亚洲国产天堂久久综合| 欧美色另类天堂2015| 国产精品久久久久9999| 亚洲免费中文字幕| 亚洲美女视频网| 久久久久久高潮国产精品视| 国产日产欧美精品| 亚洲欧美日韩一区在线| 理论片在线不卡免费观看| 成人黄色片网站| 亚洲自拍偷拍在线| 亚洲最大中文字幕| 欧美天堂在线观看| 亚洲男女性事视频| 亚洲激情在线观看视频免费| 国产美女被下药99| 成人观看高清在线观看免费| 日韩在线观看免费高清| 另类视频在线观看| 亚洲四色影视在线观看| 亚洲欧美国产va在线影院| 国产精品高精视频免费| 国产精品日韩精品| 亚洲无限乱码一二三四麻| 国产91色在线播放| 激情av一区二区| 欧美性猛交xxxxx水多| 欧美日韩一区二区精品| 日韩国产中文字幕| 亚洲午夜精品视频| 久久青草精品视频免费观看| 日韩av一区在线观看| 精品国产视频在线| 欧美激情亚洲激情| 色综合久久中文字幕综合网小说| 久久在线免费观看视频| 中文字幕一精品亚洲无线一区| 亚洲欧美国产一区二区三区| 亚洲女在线观看| 91精品国产高清自在线| 欧美黄色三级网站| 久久久久久久久久久人体| 91欧美精品成人综合在线观看| 亚洲天堂成人在线视频| 亚洲a级在线播放观看| 国产精品久久久亚洲| 成人黄色av免费在线观看| 久久91亚洲精品中文字幕奶水| 91精品国产色综合久久不卡98口| 国产精品久久久久国产a级| 国产精品普通话| 欧美日韩综合视频网址| 亚洲小视频在线观看| 国产精品尤物福利片在线观看| 亚洲欧美一区二区激情| 欧美亚洲视频在线看网址|