靜態網頁
動態網頁CGI? asp(html+JavaScript+com組件) PHP?
jsp(html+java片段+jsp語法+js)在servlet基礎上發展的
B/S開發模式(browser/server)瀏覽器→服務器
C/S開發模式(client/server)客戶端→服務器
html:行內元素 獨占一行? ? ? 塊級元素
target=? _blank新建選項卡打開 _self當前選項卡打開
在frameset中,可以給target指定一個frame的name
display改變元素的樣式
CSS層疊樣式表
常用的選擇器:
標簽選擇器父子選擇器class類選擇器(.) ID選擇器(以#開頭) 通配符選擇器(*)
浮動float
JavaScript:解釋性語言? 是基于對象和事件驅動
廣泛用于客戶端的web開發的腳本語言,常給html添加動態功能
沒有class(類)
var Fish = new Fish()當做類使用
數字類型布爾類型字符串類型(使用引號)
false 0 “”null undefined NaN都表示false。
null:變量的值為null/賦值為null
undefined:變量沒有值/聲明了變量,沒有賦值
算術運算:
推斷:refer
當if遇到||運算時 從前向后運算? 遇到真的時候返回真的對象 當沒有真 就返回最后一個為假的對象
var input = window.prompt();
window.alert();
document.write();
強轉parseInt();變整型
JS中,函數/方法定義的時候,形參不需要var
數組:foreach: Java中遍歷的是元素? JS中是下標 用in替代:
數組中的鍵值對只能遍歷出來
函數:自定義函數系統函數
調函數只看函數名
function函數調用時可直接賦參數?
用arguments可以for循環出賦予的參數(arguments里存放了通過參數傳來的參數值)
重載:無重載后面的會覆蓋前面的
定義類(原型對象)和對象:
沒有類的概念,類怎么來?創建對象實例可通過構造函數實現
function Car(){}
var c = new Car();
1、①動態綁定屬性 c.name=””;②動態綁定方法 c.run = function(){}
2、有參構造方法中 動態綁定 用 this.替換上面的c.? 不用this用var 是私有的
即在JS中 被this修飾的都是公開的 否則為私有
靜態綁定Car.prototype.屬性或方法 所有對象都擁有了這些屬性和方法
Array直接new 直接放
JSON一種簡潔的方式創建一個對象 var car = {:,:,}
①var str = '{"name":"huangxiaojian","age":"23"}'
JSON.parse(str)? ? age: "23" name: "huangxiaojian"
②var a = {a:1,b:2}? ?
JSON.stringify(a)? ? "{"a":1,"b":2}"
封裝
繼承:①使用對象冒充的方式實現繼承? 多繼承 多重繼承
this.xx =父名;
this.xx();
? ②原型鏈:上面所示的靜態綁定。
多態無態的
JS內建對象
Object對象.constructor,返回代碼? ? Math? ? Date? String? Array? Boolean? Number
系統函數
URL:統一資源定位
URI:統一資源標識符
都能表示網絡資源但前者可以獲取資源
eval();
JS事件驅動機制
document.getElementById(“id號”);
-c→ C
DOM
刪除p標簽:先獲取父節點 再刪除子節點
onsubmit詢問是否提交表單
window.setInterval(“方法”,毫秒)? 每隔多少毫秒 調用一次方法
open(“網站”, “_self”)不新建的打開網站
span.innerText
History列表
Location對象
Navigator對象
Screen對象
Event對象? 事件
Document對象常用函數
document.createElement(“a”)創建一個標簽
了解:Tomcat WebSphere WebLogic
Tomcat:入門級服務器,支持JSP Servlet
WebSphere: IBM專業級應用服務器,支持JSP Servlet 數據庫連接池管理 EJB容器等
WebLogic:世界第一應用服務器,支持數據庫連接池 EJB容器 集群管理
Servlet與CGI(通用網關接口)的區別
Servlet是通過多線程的方法運行service的,一個實例服務于多個請求,實例一般不銷毀。CGI是每次請求都會創建新的進程,服務完后就銷毀
接收、處理、響應
Servlet:
servlet在Web服務器的運行過程:裝入→→初始化→→調用→→銷毀
主要體現在:init()service()destory()
加載和實例化:Servlet容器負責加載和實例化Servlet
1、初始化:init()? 讀取配置信息、初始化參數等,在Servlet生命周期中只執行一次。
2、調用:service()? ServletRequest請求對象和ServletResponse響應對象, 此外還可調用doGet()、doPost()方法來處理請求。
3、銷毀:destory()? 在Servlet生命周期中只執行一次,結束時。
配置:
1、創建一個java工程
2、搭建javaweb框架
①在項目里面創建一個文件夾webroot
②在webroot中創建WEB-INF的文件夾
③在WEB-INF中創建classes和lib
3、修改項目的編譯路徑(把以前編譯到bin目錄改為WEB-INF下的classes目錄)
右鍵工程文件,build-path,進去選source 選擇classes,classes會消失
4、從服務器的根路徑中找到lib,然后再從lib中找到servlet-api.jar
拷貝到WEB-INF下的lib中,然后在該文件上右鍵 選擇build-path →add to build
5、從服務器根目錄中找到webapps,打開找到root,在找到WEB-INF 把其中的web.xml拷貝到WEB-INF目錄下。
6、在web.xml文件夾中配置外界訪問的servlet,添加如下代碼:
thing//thing鏈接下面的thing
/nice//nice是將來瀏覽器訪問的字符串
thing
ServletText//ServletText是src下的全限定名
7、告訴服務器要到指定的目錄去自動部署項目,找到服務器根目錄中的conf中的server.xml
在Host標簽之間添加如下代碼:
path中放的是上下文路徑 可忽略?
8、訪問:http://ip:port/上下文路徑/資源名稱(就是是哪個面的nice)
//給用戶訪問資源提供接口
<servlet-name>ming
/search 可以直接寫多個
//根據名稱找到具體的服務類
HTTPServlet類:專門處理HTML表單(FROM),不必重寫父類的init()方法和destory()方法。
缺省的service()方法可以調用與HTTP請求方式相應的doXxx()功能。
get方法:數據量小、沒有安全性考慮? post方法:數據量大 有安全放面考慮
當服務器調用Servlet的service() doGet() doPost()方法時,均需要請求和響應對象作為參數。
GET POST請求參數的亂碼:字符流兩次修改編碼 字節流一次
響應頁面的亂碼
一:請求參數的亂碼
GET:根據本來的編碼(ISO-8859-1)獲取其字節數組,再把字節數組按照我們的編碼(UTF-8)來編碼
? POST:同樣擁有GET的方式; 設置request.setCharactorEncoding("你的編碼");
二:響應頁面的亂碼
GET POST:
1):字節流
①:我們自己要用給瀏覽器傳輸什么編碼的數據(如:utf-8)
②:告訴瀏覽器使用什么編碼解析數據(要和上面的utf-8一致)
2):字符流
①:我們自己要用給瀏覽器傳輸什么編碼的數據(如:utf-8)
action:填寫提交的URI
Cookie:一種用于保留用戶操作信息的客戶端技術
步驟:new一個cookie ,添加到響應里去? ? ? ? ? ?
set-cookie和cookie 原理
更新cookie
cookie.setPath(“/”);? cookie.setDomain();
編碼URLEncoder
解碼URLDecoder
Session:一種用于保留用戶操作信息的服務端技術
服務器創建session:服務器把創建好的一個對象的地址映射成id,把默認id通過cookie傳遞給瀏覽器
session不傳輸,在服務器內存中開辟空間存放
步驟:請求獲取session,設置session
只需要創建并設置值即可,不需要添加響應中,會自動添加session對象的地址映射id到本次請求的響應頭中
銷毀session和移除session中的屬性
獲取session看其是否有值來判斷需不需要登錄
Servlet頁面間對象傳遞的方式:request、cookie、session、application
注解
1、@webServlet(“/annotation”)? 相當于
多參數:@webServlet(
urlPatterns={“/annotation1”,“/annotation2”}, initParams=@webinitParams{name = ”users”, value = “gyvsxy”}
)
2、在web.xml中將metadata-complete改為false,意味不忽略注解
ServletContext全局應用程序: 全局只有一個Servlet對象。
web.xml中設置?
ServletContext和ServletConfig對比:前者全局應用對象,后者表示Servlet的初始化參數。
URL重定向 :在服務端讓瀏覽器重新跳到指定的頁面
用法:resp.sendRedirect(url);注意:? /? 當前路徑
重定向不能訪問WEB-INF下的文件.
請求轉發:瀏覽器請求一個Servlet里的轉發給另一個Servlet
用法:req.getRequestDispatcher("url").forward(req, resp);
URL重定向和請求轉發:前者改變地址欄地址,可跨域;后者不變,可以訪問WEB-INF下的文件,不可跨域
Servlet三大作用域對象:共享數據
ServletContext
Httpsession
HTTPServletRequest
作用域越來越小
JSP:
xx.jsp→在web.xml找jsp對應的處理類→JSPservlet源程序→xx_jsp.java→xx_jsp.class→返回
xx_jsp→HttpJspBase→HttpServlet(都是繼承)
JSP注釋是隱式注釋和HTML注釋不同的是:前者不會被發送到客戶端
JSP的java代碼片段和java代碼表達式=和全局代碼片段!
九大內置對象四大作用域
request:客戶端請求,包含GET/POST請求的參數。
response:傳給客戶端的響應
session:與用戶請求相關的對象,用于保存該用戶的信息,跟蹤用戶的操作狀態。
application:Servlet中正在執行的內容,一直存在到服務器關閉。
out:用來傳送響應的輸出
pagecontext:管理網頁的屬性
config:取得服務器的配置信息
page:JSP頁面本身
exception:針對錯誤頁面,沒有被捕捉的異常就會生成此對象
JSP、Servlet的異同:都可以加載成.class文件,JSP的本質就是一個Servlet,不同點:一個用于前端,一個用于后臺
EL
語法:${}
作用:獲取作用域中的共享數據
注:依次從pageContext,request,session,application(由小到大)
EL獲取指定作用域:${requestScope.}
找不到返回空字符串與findAttribute的不同點
${param.key}對應getParameter
EL訪問對象
注:屬性(property)=字段(field)+getset方法
${對象.屬性}
set/getAttribute設置獲取作用域的值 findAttribute依次尋找
getParameter獲取請求參數中的值
JSTL:JSP Standard Tag Library 即JSP標準標簽庫
作用:替代java的邏輯操作代碼
用法:先導入taglib指令?
單條件判斷
<% %>
多條件匹配
<% %>
循環
<%循環體%>${}
foreach
<% %>${}
格式化日期:
<%%>
分頁
自定義(pageCount pageSize)
過濾器過濾請求
接口Filter
name
/* 或者/xxx/*
根據請求類型過濾
較好用函數:
JS:
confirm():如果用戶點擊確定按鈕,則confirm()返回 true。如果點擊取消按鈕,則 confirm() 返回 false。
Struts2
基于MVC設計模式的輕量級JavaEE框架,本質上相當于一個Servlet(控制層)
原生mvc模式使用jsp+javabean+servlet來實現。jsp充當v,javabean充當m,servlet充當c。
作為控制器來建立模型和視圖的數據交互
基于攔截器
運行原理:客戶端發送請求經過核心過濾器,然后詢問ActionMapper需要調用哪個Action,如果需要,核心過濾器會把請求交給ActionProxy代理,代理通過配置管理器加載Struts.xml文件,找需要調用的Action類,ActionProxy會創建Action類的實例,調用對應的方法,在調用之前依次調用所有配置的攔截器,執行完Action返回字符串,實例會根據字符串查Result,再經過所有配置的攔截器返回響應,響應經過核心過濾器返回給客戶端。
DTD獲取本地xml提示? 需聯網? 如果沒網需手動配置本地DTD
Struts2配置常量(如編碼集、擴展名、開發模式、動態方法調用)有三種方式:
①struts.xml中的②struts.properties中③web.xml的
###是properties的注釋信息
核心組件:Action和攔截器
包配置:? name唯一? 默認struts-default,這樣該包中的action就具有了Struts2默認的攔截器等功能。? 抽象包不能寫action
包含配置:
實現Action控制類的三種方式:
①直接寫類名(POJO)②繼承ActionSupport③實現Action接口
配置Action:
不寫method會根據反射執行execute方法
寫方法調用方法
寫action的三種方法:
直接寫
通配符法: 1表示從第一個*開始? *→方法名
動態方法調用:常量配置里默認關閉動態方法調用
的name可用在form表單的action
下的 全局的
標簽的type屬性值默認是dispatcher,實際上就是轉發
訪問Servlet API
①ActionContext.getContext()? 分別可用在request、application、session
②通過特定接口ServletRequestAware ServletResponseAware 等
③通過ServletActionContext訪問
Action處理請求參數
①屬性驅動:只需set? ? ? ? 把表單的name作為屬性 getset方法
②對象驅動? 必須set和get? ? 新建類
集合驅動
③實現模型驅動
ServletActionContext封裝了以前的servlet
數據校驗
重寫validate方法中加
if(){this.addFielderror(鍵值)}
s標簽 s:fielderror fieldname=””
避免重復提交
XML配置方式數據校驗
XML名字:Action類名-validation.xml? 與Action類在同一個包下
資源文件
①針對action類
與action在同一個包下
名稱:ActionClassName.properties這個配置文件只對當前action有用
②針對包下的所有action? ? package.properties
this.getText
③struts.properties 全局
攔截器
自定義攔截器實現interceptor
需要在struts.xml中
在package中
//系統的
如果在中設置方法名 忽略攔截方法
通過配置的形式向攔截其中傳遞參數
param參數會在啟動服務器時把其中的參數name通過對應的setter方法傳遞到攔截器中
設置默認攔截器只能有一個
下面的action都可以被攔截
給action單獨用攔截器
在action中加
action之間的傳遞參數
redirect和chain
注解:單個@XXX(“”)多個@XXXS({@xx(“”),@xx(“”)})
JSON
{“key”:”value”,”key2”:”value2”}[{},{}]
JS中加入 $.ajax({})
不跳轉頁面請求數據
Listener監聽器
實現HttpSessionListener? ServletContextListener? RequestListener等等
設置配置
防止表單重復提交
token字符串? 每請求一次都會生成一個字符串 可放在 session、隱藏域
避免表單用戶輸入亂碼
req.setCharacterEncoding(“”);
JavaEE三層:表現層、業務層、持久層
前端控制器:過濾器棧
值棧
用來管理請求數據
生命周期就是一次請求
由root和 Context組成
OGNL對象圖形導航語言
替換EL的
Struts2用OGNL作為默認的表達式語言
OGNL是基于ValueStack數據結構
獲取root中的數據
①對象.getRoot().push(值)
②對象.set(鍵值)?
③private String val=”123”;? public String getVal(){return val;}? ? ? ? ? ? ?
獲取context中的數據
凡是寫在context中的數據 前面要加#? 便于維護
①對象.getContext().put(鍵值)
②context.put(鍵值)
校驗
validate()對應
如果不通過就執行input如果通過 就執行execute的success
標簽
國際化
上傳下載
上傳:①上傳的表單以POST方式 ②提交需要指定編碼為:multipart/from-data;
標簽
不需要再去填寫contextPath
多選框
取setAttribute的值
Hibernate
是一個面向對象的持久化框架
hibernate.cfg.xml
//連接數據庫
true
采用getCurrentSession()創建的Session會綁定到當前的線程中去、而采用OpenSession()則不會。
采用getCurrentSession()創建的Session在commit或rollback后會自動關閉,采用OpenSession()必須手動關閉。
采用getCurrentSession()需要在Hibernate.cfg.xml配置文件中加入如下配置:
如果是本地事物,及JDBC一個數據庫:
thread
如果是全局事物,及jta事物、多個數據庫資源或事物資源:
jta
類和表的映射配置文件:
xx.hbm.xml
//id是類中的屬性? column是表中的字段
//設置主鍵
Transaction對事物的封裝
save方法的執行流程
1、新建一個configuration對象
2、利用方法configuration.configure()加載hibernate.cfg.xml
3、根據xml中的連接數據庫的信息連接數據庫,并配置相關的property屬性
4、加載解析映射文件,把映射文件的信息保存在configuration對象中
5、根據config創建sessionfactory對象,并創建session對象
6、執行保存事件
saveOrUpdate()方法
persist()持久化? JPA規范里面的? 與save()有點相同
merge()與update()有點相同
load()與get()? load()動態的新建一個類:
Student stu =(Student) session.load(Student.Class, 3);多態
load():延遲加載? load()方法返回的是一個代理(代理只有一個ID),只有等真正使用該對象屬性的時候才會發出sql語句
如果數據庫中沒有對應的記錄,get()方法返回的是null.而load()方法出現異常ObjectNotFoundException
一級緩存
緩存:提高效率
在hibernate.cfg.xml中的
#hibernate.hbm2ddl.auto none/create/create-drop/update/validate
mapping文件獲取屬性是反射:反射不關心訪問權限
OID:對象中對應數據表的主鍵的屬性
自然主鍵(使用對象本身的屬性作為主鍵)代理主鍵(序號)
主鍵生成策略:
assigned:手動設置主鍵
uuid:hibernate幫忙生成的
increment:查最大id然后加1
identity:數據庫需支持自增
native:使用數據庫支持的生成主鍵方式
持久化對象的狀態
有沒有被管理有沒有id數據庫中有沒有值
瞬時態
持久態
脫管態
提交之前,delete之后,數據處于計劃刪除
session管理對象的狀態 事務負責提交數據操作
事務處理方式(當多個事務同時訪問數據庫中的相同數據)
悲觀鎖:在每次操作數據時,悲觀的認為會有其他事務來操作同一數據。加鎖(數據庫層次)
樂觀鎖:認為許多事務同時操作同一數據的情況很少發生。數據版本標識鎖定機制(非庫層次)
對象的關系
依賴關系
關聯關系
聚合關系
組合關系
關聯關系:一對多多對一多對多
多對一:
在多中:設置一的私有屬性
一對多:
set:
在一中:Set<>? = new HashSet<>();
在一的xml中
list:
反轉操作:
在雙向關聯中,一方的中加入inverse=”true”可以反轉維護關系,即此方放棄對另一端關系的維護,而由對方來維護關系
一對多多對一雙向:
刪除時注意set里的inverse為false?
cascade級聯刪除:save-update、delete、all、delete-orphan、all-delete-orphan
一對一:先保存xx
多對多:兩個set
注意中間表的主鍵重復需要把一個主鍵設置為
組件映射
SQL
HQL
Criteria
分頁
HQL不支持 limit關鍵字
query.setFirstResult()
query.setMaxResults()
位置占位符?
名稱占位符:xxx
Collection
query.uniqueResult()返回個數
SELECT NEW LIST(XX,XX,XX) FROM
SELECT NEW MAP(XX,XX,XX) FROM
session.getNameQuery()
主要是為了一些經常使用,在類的映射文件中添加一個標簽“query”,屬性name來指這個NameQuery的名字,在XML的innerText中寫HQL語句
Spring
面向接口編程解耦
IoC/DI控制反轉? 依賴注入
IoC控制反轉:說的是創建對象實例的控制權從代碼控制剝離到IoC容器控制,實際就是你在xml文件控制,側重于原理。
DI依賴注入:說的是創建對象實例時,為這個對象注入屬性值或其它對象實例,側重于實現。
IoC是目的,di是手段。IoC是指讓生成類的方式由傳統方式(new)反過來,既程序員不調用new,需要類的時候由框架注入(DI),是同一件不同層面的解讀。
Bean:放在Spring容器中的對象
bean中的屬性:
id: bean的全局唯一標識
lazy-init=”true/false”告訴容器,不要在容器啟動的時候實例化bean
bean的作用域? scope=””?
singleton單例模式對于無會話狀態的bean(Dao、Service)來說是最理想的選擇?
prototype原型類型,每次都會創建個新的對象 適合需要保持會話狀態的bean(struts2的action)
bean的生命周期
singleton作用域下的bean的聲明周期受spring容器的管理,
prototype作用域下的bean,容器只負責創建,管理交給客戶端代碼
bean里面的constructor-arg:可傳入構造參數 index type ref value
bean里面的property 用于調用bean實例中的setter方法
name和value? name有對應的屬性,不是隨便寫
name和ref? ref=”xx”:是把id為xx的bean傳過來
在面向對象的程序中,想要使用某個對象,就需要先實例化這個對象
bean的實例化方法:
1、構造器實例化? 通過實現類的默認無參構造器對bean進行實例化? 傳統bean的配置方式
2、靜態工廠方法生產bean? class屬性為對應的工廠實現類? factory-method
3、實例工廠方法? 建立工廠bean,再通過factory-bean建調用工廠bean的bean,再通過factory-method指定實例化bean的方法
AOP
所有事務從Dao剝離,放在service層
靜態代理
動態代理:
①通過實現接口的方式? 代理類是對dao實現類的增強
Handler implements invocationHandler? ? ? proxy.newProxyInstance
public Object invoke(Object proxy, Method method, Object[] args)
method.invoke(obj, args);
proxy:代理方法調用的代理實例
method:
②通過繼承的方式Enhancer
cglib? javassist:代碼生成的庫
AOP的xml和注解Annotation
xml
Annotation: point連貫方法
AOP:在某些事情即將發生的時候做某些事
XML
解析方式:DOM解析:把整個XML文件加載進內存進行解析
SAX解析:通過流的形式一行行解析
xmlns:xmlnamespace
dtd和schema的后綴xsd
SpringMVC
分離了控制器,模型對象,分派器,處理程序對象角色
DispatcherServlet:前端控制器,用于接收請求。
HandlerMapping接口:用于處理請求的映射。
DefaultAnnotationHandlerMapping:HandlerMapping接口的實現,用于把一個URL映射到具體的Controller類上。
HandlerAdapter接口:用于處理請求的映射。
AnnotationMethodHandlerAdapter:HandlerAdapter接口的試下,用于把一個URL映射到對應Controller類的某個方法上。
ViewResolver接口:用于解析View。
InternalResourceViewResolver:ViewResolver接口的實現,用于把ModelAndView的邏輯視圖名解析為具體的View。
加載優先級
在xml配置了這個標簽后,spring可以自動去掃描base-pack下面或者子包下面的Java文件,如果掃描到有@Component @Controller@Service等這些注解的類,則把這些類注冊為bean
MyBatis(非標準的ORM框架)基于JDBC
做數據持久化(其他三種:流JDBC Hibernate(Hibernate是標準的對象關系映射ORM))
標準的ORM框架:
實現:
連接數據庫:SqlSessionFactoryBuilder Reader SqlSessionFactory SqlSession
xml:
xxxMapper.xml:domain的類的映射文件
在mybatis中,映射文件中的namespace是用于綁定Dao接口的,即面向接口編程。
parameterType:在映射文件中通過parameterType指定輸入 參數的類型? 可省略
resultType:在映射文件中通過resultType指定輸出結果的類型
#{}接收輸入參數,類型可以是簡單類型,pojo、hashmap
keyProperty keyColumn use
Apache Shiro
易使用的Java安全框架,進行認證、授權、加密和會話管理
web.xml配置shiroFilter(放在最上面)?
applicationContext-shiro.xml,對shiro進行配置
applicationContext.xml中引入該文件
JQuery EasyUI
實現CRUD DataGrid
使用的插件:
datagrid:向用戶展示列表數據。
dialog:創建或編輯一條單一的用戶信息。
form:用于提交表單數據。
messager:顯示一些操作信息。
FormData
XMLHttpRequest Level 2添加了一個新的接口FormData.利用FormData對象,我們可以通過JavaScript用一些鍵值對來模擬一系列表單控件,我們還可以使用XMLHttpRequest的send()方法來異步的提交這個"表單".比起普通的ajax,使用FormData的最大優點就是我們可以異步上傳一個二進制文件.
進度條
基于multipartResolver多部解析器的上傳進度條
①寫一個進度條的實體類
②實現ProgressListener
③繼承CommonsMultipartResolver
④在springmvc的xml中重新配置自己的解析器
⑤編寫Controller
⑥開發jsp、js頁面
JQuery
XMLHttpRequest對象的 onload 回調函數是在異步請求加載完成后所執行的函數,當JavaScript監測到請求的數據全部傳輸完成后就會觸發該函數。而 open() 函數設置異步請求的 method、URL 和同步方式等參數,執行 open() 后再執行 send() 函數才開始向服務器發送請求。