趙艷敏高級講師
從事設計行業(yè)多年,有著豐富的設計和動畫制作經(jīng)驗。曾參與中國電信天翼
手機網(wǎng)及天翼手機DIY等多個項目的設計,動畫,及As開發(fā)。項目經(jīng)驗豐富。曾在卡酷動畫衛(wèi)視下屬公司擔任高級動畫師一職,參與多部動畫片的制作
。對動畫也有較高的造詣。
精通Flash、After Effects、Photoshop、Illustrator、ActionScript
2.0/3.0、Edius、CoolEdit、Axure RP、DIV CSS等相關技術。
講課有自己的風格,思維活躍,條理清晰講課注重細節(jié),由簡入繁。本著以
學生學會為目的,更注重理論與實踐相結合。
Java工程師就業(yè)前景
Java工程師就業(yè)前景
2015年,在美國、加拿大、澳大利亞、新加坡等發(fā)達國家和中等發(fā)達國家,
JAVA軟件工程師年薪均在4—15萬美金,而在國內,JAVA軟件工程師也有極好的工作機會和很高的薪水。
在未來5年內,合格軟件人才的需求將遠大于供給。JAVA軟件工程師是目前
國際高端計算機領域就業(yè)薪資非常高的一類軟件工程師。
一般情況下的JAVA軟件工程師是分四個等級,從軟件技術員到助理軟件工程
師,再到軟件工程師,**后成為高級軟件工程師。
根據(jù)IDC的統(tǒng)計數(shù)字,在所有軟件開發(fā)類人才的需求中,對JAVA工程師的需
求達到全部需求量的60%—70%。同時,JAVA軟件工程師的工資待遇相對較高。
通常來說,具有3—5年開發(fā)經(jīng)驗的工程師,擁有年薪15萬元是很正常的一個
薪酬水平。80%的學生畢業(yè)后年薪都超過了8萬元。
根據(jù)專業(yè)數(shù)據(jù)分析,由于我國經(jīng)濟發(fā)展不均衡因素,JAVA軟件工程師工資待
遇在城市之間的差異也較大,一級城市(如北京、上海等),初級軟件工程師的待遇大概在4000-6000之間,中級軟件工程師的待遇在6000—8000之間,
而高級軟件工程師的待遇基本破萬。
全新升級企業(yè)需求的Java課程
歷經(jīng)16年累計10余萬Java學員。打造專業(yè)的課程體系,值得你的信賴
Java基礎
深入解析Java基礎,直擊面試常見問題。——184課時
數(shù)據(jù)庫
及Web前端技術
包含主流Oracle和MySQL數(shù)據(jù)庫,先進的Web前端技術,熱門的JS語言 ——160課時
Java Web
開發(fā)及服務端框架
定制開發(fā)企業(yè)級框架,教授Spring技術核心,企業(yè)開發(fā)部署環(huán)境,規(guī)范代碼
開發(fā)流程及文檔——176課時
綜合項目實戰(zhàn)
飛揚小鳥、飛機大戰(zhàn)、俄羅斯方塊、T-DMS數(shù)據(jù)采集項目、T-netctoss項目
、云筆記系統(tǒng)——136小時2W代碼量
搭建自己網(wǎng)站
16小時課程實戰(zhàn)演練
——企業(yè)扶持
JSP Servlet培訓班作業(yè)管理系統(tǒng)[13] -使用基于Action的后端(用戶登錄為例)
>
上一篇講完了不止于CRUD的設計,本篇就在新設計的基礎上實現(xiàn)用戶登錄,在實現(xiàn)之前,貓哥先放一張數(shù)據(jù)庫結構的截圖(之前的設計竟然忘了學生選課表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:根據(jù)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作為整個項目唯一的Servlet
public 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");
//根據(jù)request用戶輸入信息創(chuàng)建不同的ActionContext(Action上下文)
ActionContext context=ActionController.assemblyActionContext(request);
//根據(jù)不同的ActionContext創(chuàng)建不懂的action動作
Action action=ActionController.dispatchAction(context);
try {
context=action.execute();//執(zhí)行動作并返回結果
} catch (MyException ex) {//如果有異常,跳轉異常提示頁面
request.setAttribute("tipInfo", ex.getInfo());
request.getRequestDispatcher("/tip.jsp").forward(request,response);
}
//設置返回頁面
request.setAttribute("actionUrl",context.getActionUrl());
//取上下文中的返回值
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);
}
}
}
//跳轉到index.jsp主頁面,注意 actionUrl指向頁面顯示在index.jsp右邊內容區(qū)域
request.getRequestDispatcher("/index.jsp").forward(request,response);
}
}
step3,ActionServlet中有兩個重要方法,這兩個方法實際上就定義了動作路由,前一個方法定義了如何從用戶輸入獲取Action需要的上下文環(huán)境,后一個方法則從上下文環(huán)境自動生成對應的動作。當正式編程時,每當定義一個新的動作類處理一類動作時,都要從ActionController類的這兩個方法中進行注冊對應的上下文生成邏輯和匹配動作邏輯。
//根據(jù)request用戶輸入信息創(chuàng)建不同的ActionContext(Action上下文)
ActionContext context=ActionController.assemblyActionContext(request);
//根據(jù)不同的ActionContext創(chuàng)建不懂的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即裝配動作的上下文,上下文的意思就是環(huán)境
一定注意本方法不管如何執(zhí)行,只關心需要執(zhí)行時候需要哪些參數(shù)*/
public static ActionContext assemblyActionContext(HttpServletRequest request){
ActionContext context=new ActionContext();
//裝配兩個必備參數(shù)
context.setOperationType(request.getParameter("method"));
context.setEntityType(request.getParameter("entityType"));
//剩下的就是根據(jù)需要裝配了
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開始執(zhí)行。
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)){
//設置返回參數(shù)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用于保存不同實體列表頁面顯示實體個數(shù)信息(每頁多少個)
public static HashMap<String,String> PageSize=new HashMap<String,String>();
//使用static代碼塊對roleMenu進行初始化
static{
//注意,二位數(shù)組中的每一組表示一個菜單的信息,又**map建立了角色名和菜單直接的對應關系
RoleMenu.put("校長", new String[][]{
{"人員管理","view","User"},//由具體的地址,變?yōu)槌橄蟮膮?shù)
{"課程管理","view","Course"}
});
RoleMenu.put("教師", new String[][]{});
RoleMenu.put("學生", new String[][]{});
//初始化頁面列表個數(shù)
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 PRefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!-- 使用c:標簽需要添加本行代碼 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index.jsp</title>
<link href="css/index.css" type="text/css" rel="stylesheet"/>
</head>
<body>
<div id="main">
<div id="top">
<div id="top_title">
貓哥培訓班作業(yè)管理系統(tǒng)
</div><!-- 標題部分 -->
<div id="top_info">
歡迎您,尊敬的:${sessionUser.userName}
</div><!-- 登錄用戶信息部分 -->
</div><!-- top部分是標題欄 -->
<div id="left">
<ul>
<c:forEach items="${sessionRoleMenu}" var="menu">
<li>
<a href="/HomeworkSystem/ActionServlet?method=${menu[1]}&entityType=${menu[2]}">${menu[0]}</a>
</li>
</c:forEach>
</ul>
</div><!-- left部分是菜單欄 -->
<div id="right">
<c:if test="${empty actionUrl}">
歡迎來到貓哥培訓班管理系統(tǒng)
</c:if>
<c:if test="${not empty actionUrl}">
<jsp:include page="${actionUrl}" flush="true"></jsp:include>
</c:if>
</div><!-- right部分是具體內容顯示區(qū) -->
</div>
</body>
</html>
/*css/index.css*/
/*星號表示選擇全部,設置外邊距0,內邊距0,字體大小12px,宋體*/
*{
margin:0px;
padding:0px;
font-size:12px;
font-family:"宋體";
}
/*整個body區(qū)域背景色為#F5F5F5,這個很簡單,自己**個取色器,找個漂亮的網(wǎng)頁,取個顏色就行*/
body {
background-color: #FCFCFC;
}
/*在top、left、right外面套用一層main是為了控制寬度,并且整體居中*/
#main{
width:1000px;
margin:0px auto;
}
/*寬度占滿它爹的寬度,高度64px是瞎試的,不好看再調整,貓哥喜歡用16px、32px、64px、128px這些,你懂的。
背景色貓哥繼續(xù)取色器
line-height表示文字占用的高度,它也是64那就是文字占用高度跟top區(qū)域高度是一樣的嘛,所以文字就居中了*/
#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區(qū)域就得靠左飄飄了
內部的東西跟邊距有點距離好看點,暫時定為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;
}
相關推薦:
蘇州JAVA培訓 蘇州JAVA培訓班 蘇州JAVA培訓機構