with item(USERID,USERNAME,PASSWORD,BANKNAME,BANKCODE,ORDERNUMBER,ISVALID,SUPERVISECODE,USERTYPE,GROUPID,ISREPORT,PARENTCODE,ISUNITE,BANKTYPE)
as (
select * from m_reportuser where bankcode='F031H101310101001' and usertype='0'
union all
select mr.* from m_reportuser as mr,item as mrp
where mr.parentcode=mrp.bankcode
)
select USERID,USERNAME,PASSWORD,BANKNAME,BANKCODE,ORDERNUMBER,ISVALID,SUPERVISECODE,USERTYPE,GROUPID,ISREPORT,PARENTCODE,ISUNITE,BANKTYPE from item
sql.append(" select * from ( select rownumber() over(ORDER BY LOGTIME DESC) as rownumber_,");
sql.append(" l.LOGID, l.USERID, l.USERNAME, l.IPADDRESS, l.SUPERVISECODE,l.SUPERVISENAME, l.DEPARTID, l.DEPARTNAME, l.CONTENT, l.LOGTIME from m_log l ,item i ");
sql.append(" where l.userid=i.username ");
sql.append(" ORDER BY LOGTIME DESC ) as temp_ ");
sql.append(" where rownumber_ between "+((pageObject.getPageCurrent()-1)*pageObject.getPageSize()+1)+
" and "+pageObject.getPageCurrent()*pageObject.getPageSize());
=====================================================
if(i=22) 爲啥一直是true ? 只要不爲0,就是true。 例:if(a=3) 相等於 if(3)
==========================================
2014.07.03
spring概述:
spring就是管理bean的。bean對於spring的意義就像object對於oop的意義同樣。
核心:bean,core,context。
bean:演員。
context:舞臺背景。
core:道具。
bean包裹object。object要有數據。
context給數據提供生存環境。context發現對象間的關係,創建而且維護好這些關係。
因此context就是一個bean關係的集合,這個關係集合又叫IoC容器。一旦創建起這個容器spring就能夠開始工做了。
core發現、創建和維護每一個bean之間的關係所須要的一系列的工具。core能夠理解爲util。
==========================================
spring詳述:
------------------------------------
bean組件:
位置:在org.springframework.beans包下。
做用:bean的定義、建立(須要關心)、解析。其餘兩個在spring內部完成了。
模式:工廠模式。頂級類BeanFactory。
BeanFactory:ListableBeanFactory ,HierarchicalBeanFactory,AutowireCapableBeanFactory.
最終實現類是DefaultListableBeanFaction,它實現了全部接口。
多層次的接口:每一個接口都有它使用的場合,主要是爲了區分在spring內部在操做過程當中對象的
傳遞和轉化過程當中,對對象的數據訪問所作的限制。
ListableBeanFactory接口表示這些Bean是可列表的,
而HierarchicalBeanFactory表示的是這些Bean是有繼承關係的,也就是每一個Bean有可能有父Bean。
AutowireCapableBeanFactory接口定義Bean的自動裝配規則。
這三個接口共同定義了Bean的集合、Bean之間的關係、以及Bean行爲。
Context組件
位置:在org.srpingframework.context。
做用:給spring提供一個運行時的環境,用以保存各個對象的狀態。
頂級父類:ApplicationContext.(AC繼承了BeanFactory,
也就說明了spring容器運行的主體對象是bean;還繼承了ResourceLoader接口,
使得能夠訪問到任何外部資源)
AplicationContext必需要完成如下幾件事:
1.標識一個應用環境;
2.利用BeanFactory建立Bean對象;
3.保存對象關係表;
4.可以捕獲各類事件。
Context做爲Spring的Ioc容器,基本上整合了Spring的大部分功能,或者說是大部分功能的基礎。
Core組件:
重要的組成部分:定義了資源的訪問方式。
==========================================
使用線程能夠改善程序的五個方面:
1充分利用CPU資源;
2.簡化編程模型;
3.簡化異步事件的處理;
4.使GUI更有效率;
5.節約成本。
==========================================
繼承Thread資源不共享,實現Runnable接口,資源共享。
==========================================
實現Runnable接口比繼承Thread類所具備的優點:
1):適合多個相同的程序代碼的線程去處理同一個資源
2):能夠避免java中的單繼承的限制
3):增長程序的健壯性,代碼能夠被多個線程共享,代碼和數據獨立。
==========================================
// 開始線程
public void start( );
public void run( );
// 掛起和喚醒線程
public void resume( ); // 不建議使用 使用這兩個方法可能會形成一些不可預料的事情發生。所以,這兩個方法被標識爲deprecated(抗議)標記,
public void suspend( ); // 不建議使用 這代表在之後的jdk版本中這兩個方法可能被刪除,因此儘可能不要使用這兩個方法來操做線程。
public static void sleep(long millis);
public static void sleep(long millis, int nanos);
// 終止線程
public void stop( ); // 不建議使用
public void interrupt( );
// 獲得線程狀態
public boolean isAlive( );
public boolean isInterrupted( );
public static boolean interrupted( );
// join方法
public void join( ) throws InterruptedException;
==========================================
使用 synchronized需注意:
1.synchronized關鍵字不能繼承,若是父類中的某個方法使用了synchronized關鍵字,而在子類覆蓋了此方法,
必須顯示地在子類的這個方法中加上synchronized關鍵字才能夠。或者在子類中調用父類中相應的方法。
2.在定義接口方法時不能使用synchronized。
3.構造方法不能使用synchronized關鍵字,可是可使用synchronized塊來進行同步。
4.synchronized能夠自由放置,可是不能夠放在返回類型的後面。
5.synchronized關鍵字只能同步方法,不能同步類變量。
6.雖然從表面上看synchronized鎖定的是一個方法,但實際上synchronized鎖定的是一個類。
若是靜態方法用synchronized關鍵字定義,此靜態方法沒有執行完畢將不會繼續執行其餘靜態
方法;非靜態方法相似,可是靜態與非靜態不會互相影響。
==========================================
前臺框架 ext(自己太大)easyui(應用範圍較小)bootstrap
==========================================
struts2 hibernate spring
===============================
C 1971
objective-C 1983
c++ 1983 july
python 1991
oak 1991 june
ruby 1993
perl 4.000 1991 march 21
perl 5.000 1994 october 18
visual basic 1991 may 20
delphi 1995 march 5
javascript 1995 december
java 1995 may 23
php 1995
c# 2000 june 26
===============================
web.xml頭文件爲2.3時,可直接使用<taglib>標籤,但版本較高時,<tablib>標籤外需使用<jsp-config>嵌套,緣由未知。
<jsp-config>與<web.xml>版本的問題。
===============================
web開發的兩種模式:
jsp model 1:用戶經過瀏覽器之間訪問web應用的jsp頁面,jsp提供UI顯示,JavaBeans處理數據庫訪問和業務邏輯。
優點:直接,簡單;對於小型應用,能夠很方便、快速的進行開發。
jsp model 2:二者的最大區別是引入了MVC模式的概念。即M(MODEL業務邏輯),V(view系統UI),
C(controller控制)分離,用戶的全部請求提交給controller,由controller進行統一分配,而且採用推
的方式將不一樣的UI顯示給用戶。
優點:
1.能夠統一控制用戶的行爲,例如在controller中添加統一日誌記錄等功能是很是方便的。
2.職責分離,有利於部分的維護。用戶不直接訪問分散的UI,這樣能夠經過配置文件或者流程定義的方式,
在不一樣的環節,時間將不一樣的頁面推向給用戶。
================================
struts框架是mvc分離的一個傑出做品。
===============================
struts控制器的職責:
1.接受客戶請求
2.映射請求到指定的業務操做
3.獲取業務操做的結果並以有效的方式提供給客戶
4.根據業務操做的結果和當前的狀態把不一樣的UI推向給客戶。
===============================
加載ActionServlet時,init()將被調用,開始初始化過程,初始化過程當中將發生:
1.初始化框架的內部消息綁定,這些消息用來輸出提示,警告和錯誤信息到日誌文件中。
org.apache.struts.action.ActionResources用來獲取內部消息;
2.加載web.xml中定義的不一樣參數,用以控制ActionServlet的不一樣行爲,這些參數包括
config,detail,debug and convertNull;
3.加載並初始化web.xml中定義的servlet 名稱和servlet映射信息。經過初始化,框架的各類DTD被註冊,DTD用
來在下一步校驗配置文件的有效性;
四、 爲默認應用加載並初始化Struts配置文件,配置文件即初始化參數config 指定的文件。默認配置文件被解析,
產生一個ApplicationConfig 對象存於ServletContext 中。能夠經過關鍵字
org.apache.struts.action.APPLICATION 從ServletContext中獲取ApplicationConfig;
5 Struts配置文件中指定的每個消息資源都被加載,初始化,並存在ServletContext的合適區域(基於每一個
message-resources元素的key屬性),若是key 屬性沒有設置,則爲org.apache.struts.action.MESSAGE;
6 Struts配置文件中聲明的每個數據源被加載而且初始化,若是沒有配置數據源,這一步跳過;
7 加載並初始化Struts配置文件中指定的插件。每個插件的init()方法被調用;
8 當默認應用加載完成,init()方法判斷是否有應用模塊須要加載,若是有,重複步驟4—7萬成應用模塊的加載。
===============================
當ActionServlet接收到客戶請求後,會進行一連串的初始化操做,而後會將客戶請求轉交給合適的處理器進行
處理,這個合適的處理器就是org.apache.struts.action.RequestProcessor或其子類的一個實例(根據Struts
配置文件中的配置)。提供了默認實現,若是須要自定義這些行爲,Struts推薦重載這個類而不是ActionServlet.
===============================
Action被設計爲線程安全的,在每一個應用中每一個Action類只會被實例化一次,供全部線程共享。
RequestProcessor利用一個HashMap用來保存Action實例。
===============================
若是說ActionServlet是Struts框架的入口,RequestProcessor是消化過濾系統,則org.apache.
struts.action.Action類能夠說是整個框架的心臟。它是客戶請求和業務操做的鏈接橋,也能夠將
其看做是業務操做的客戶代理。一旦肯定並獲得了一個action實例,RequestProcessor會調用
action的execute()方法處理客戶請求。
Action類被設計爲線程安全的,在每一個應用中每一個Action類只會被實例化一次,供全部線程共享。
RequestProcessor利用一個HashMap來保存Action實例。
Action的execute()方法返回一個ActionForward對象。ActionForward對象是JSP頁面、JAVA Servlet
等web資源的抽象表現。
經過在Struts配置文件中進行action映射,而後經過關鍵字去查找一個ActionForward。
===============================
思考題:
1.全部線程共享一個action類實例意味着什麼,咱們在編程中須要注意些什麼
A:全部的線程都會此類有讀寫權限,信息的同步與共享,訪問的衝突。
2.Action屬於MVC中的Controller仍是Model?爲何。
A:我腳着是Controller,由於它確定不是Model。Controller的主要做用是接收請求、處理並返回。
符合Action的描述。
===============================
servlet生命週期:
1.servlet實例被建立。
2.調用init(ServletConfig config)方法,(在HttpServlet中實際上在init(ServletConifg config)
中調用了init()因此咱們能夠覆蓋init()方法來進行初始化)。
3.接受客戶請求,調用service方法。(在HttpServlet中,會調用doGet和doPost)
4.調用destroy()方法。
5.實例被銷燬。
===============================
多個篩選器的運行順序取決於下列規則:
1. 將 filter-mapping 元素包含與請求匹配的 url-pattern的篩選器按其在 web.xml 部署描述符中出現的順序添加到鏈中。
2. 將 filter-mapping 元素包含與請求匹配的 servlet-name 的篩選器添加在鏈中與 URL 模式匹配的篩選器以後。
3. 鏈上先進先出的,鏈中最後的項目每每是最初請求的資源。
也就是說:
1.以url-pattern方式配置的filter運行時確定先於以servlet-name方式配置的filter
2.以url-partern方式配置的filter中,若是有多個與當前請求匹配,則按web.xml中filter-mapping出現的順序來運行
3.對於以servlet-name方式配置的filter,若是有多個與當前請求匹配,也是按web.xml中filter-mapping出現的順序來運行
===============================
Listener>Filter>Servlet
===============================
1.初始化Struts的內部資源文件。該文件路徑由ActionServlet的internalName字段指定,默認值是org.apache.struts.action.ActionResources,即Struts的JAR包裏的org/apache/struts.action.ActionResources.properties及其國際化版本文件。該文件給出了一些應用運行時,由Struts產生的信息,包括一些異常報錯信息,從這裏能夠看出,咱們徹底可讓Struts自身拋出的異常信息中文化。
2.1 若是web.xml裏ActionServlet的配置中給出了config初始化參數,將該參數的值賦給ActionServlet的config字段;
2.2 若是web.xml裏ActionServlet的配置中給出了convertNull初始化參數,若是該參數值是true、yes、on、y、1中的一個,將ActionServlet的convertNull字段設爲true;
2.3 若是ActionServlet的convertNull字段值爲true,則覆蓋Apache Commons BeanUtils中幾個基本數據類型包裝類的轉換器的默認實現,使當轉換數據類型失敗時,返回null,默認的實現是拋出異常。
3.將web.xml裏ActionServlet配置中的url-pattern的值賦給ActionServlet類的servletMapping字段。實現方式是用Apache Commons Digester解析web.xml,用Digester內置的CallMethodRule和CallParamRule使web.xml被解析時,自動調用ActionServlet類的addServletMapping(String servletName, String urlPattern)方法。
===============================
struts核心:action、result、interception
===============================
Struts.xml 配置包含result/view類型、action映射、攔截器等struts2的主要配置文件。
Struts.properties配置struts2的框架屬性。
Strtus-default.xml在文件在struts-action-x.x.jar中,該文件是應該被包含在struts.xml中的缺省配置。
Velocity.properties重寫了velocity的配置文件
Struts-default.vm相對於velocity的缺省配置
=================================
struts.xml配置文件:主要負責管理應用中的action映射,以及該action包含的result定義
主要內容:action、interceptor、packages、namespace
<include>引用分開的配置文件
=================================
還要注意一個問題,就是dispatcher的forward和response.sendRirect。他們都用來跳轉jsp和servlet。但他們是不一樣的。
不一樣點在於
1:sendRirect是重定向,這時候 ,上一個request帶過來的參數會所有丟失。如要在請求里加新的參數,請在url後面跟上參數。例如response.sendRirect("/ABC/jsp/login.jsp?name="+name);
forward是跳轉,參數還保留在request裏。
2:sendRirect的根路徑是相對於服務器而言,假設你的服務器根路徑是http://localhost:8080/
那麼response.sendRirect("/ABC/jsp/login.jsp?");
就至關於跳到http://localhost:8080/ABC/jsp/login.jsp
forward的根路徑是相對於項目的根路徑而言
resquest.getRequestDispatcher("/ABC/jsp/login.jsp");
至關於跳到http://localhost:8080/ABC/ABC/jsp/login.jsp
注意,路徑出錯了,因此應該這樣寫
resquest.getRequestDispatcher("/jsp/login.jsp");
至關於跳到http://localhost:8080/ABC/jsp/login.jsp
順帶一提:<a href="/ABC/jsp/login.jsp">登陸</a>
<form action="/ABC/servlet/login">
這些連接跟sendRirect是同樣的,根路徑是服務器的根路徑。
=================================
XWork提供了不少核心功能:前端攔截器(intercepor)、運行時表單屬性驗證、類型轉換、
強大的表達式語言OGNL(Object Graph Natation Language)和倒置控制(inversion of
Control,IoC)容器等。
======================================
想要正常使用struts2,如下5個包是必須的:
struts2-core-2.0.11.1.jar
xwork-2.0.4.jar
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl.2.6.11.jar
======================================
struts1一般以.do結尾,struts2一般以.action結尾
<!-- <s:form>中Struts2使用table定位 -->
*******************************************************************
smartfoxServer
Mina
Memcached+mySql
Struts 就分發 , 配置文件 , 過濾器
Hibernate 就配置文件數據源 , 緩存 , hql語句
Spring就上兩個框架整合 , 而後更好用一些
====================
在Struts2中最賤的驗證數據的方法是使用validate。咱們從ActionSupport類的源代碼中能夠看到,
ActionSupport類實現了Validateable接口。這個接口只有一個validate方法。若是Action類實現了
這個接口,Struts2在調用execute方法以前首先會調用這個方法,咱們能夠在validate方法中驗證,
若是發生錯誤,能夠根據錯誤的level選擇字段級錯誤,仍是動做級錯誤。而且可使用addFieldError
或addAtionError加入相應的錯誤信息,若是存在Action或Field錯誤,strtus2會返回「input」(zhege
並不用開發人員寫,由struts2自動返回)。若是返回了input,Struts2就不會再調用execute方法了。
若是不存在錯誤信息,struts2在最後會調用execute方法。
這兩個add方法(addActionEroor、addFieldError)和actionErrors類中的add方法相似。只是add方法
的錯誤信息須要一個ActionMessage對象,比較麻煩。除了加入錯誤信息外,還可使用addActionMessage
方法加入成功提交後的信息。當提交成功,能夠顯示這些信息。
=========================
alt+shift+s + r get/set快捷鍵
=========================
在Action類中得到HttpServletResponse對象的四種方法:
1.使用Struts2 Aware攔截器
2.使用RequestAware攔截器
3.使用ActionContext類
4.使用ServletActionContext類(最簡單)
=========================
HttpServletRequest→ActionMapper→Filters→ActionProxy→ConfigrationManager
↓
ActionProxy←ConfigrationManager←Struts.xml
↓
interceptor一、二、3→Action
↓
interceptor一、二、3←Template(jsp、DOJO、FreeMaker、Velocity、etc)←Result
↓
HttpServletResponse
攔截器 過濾器
1.基於java反射機制 | 基於函數回調
2.不依賴於servlet容器 | 依賴於servlet容器
3.只能對Action請求起做用 | 能夠對幾乎全部請求起做用
4.能夠訪問Action上下文、值棧裏的對象 | 不能訪問
5.在Action的生命週期中,能夠屢次調用 | 只能在容器初始化時被調用一次
============================
爲何使用struts2代替struts1
1.struts2的execute方法中的參數不會依賴於servletAPI,實現了servlet解耦,是一種無侵入式的設計;
2.struts2提供了攔截器,利用攔截器能夠進行AOP編程,實現權限攔截等功能;
3.struts2提供了類型轉換器,能夠很容易的對請求參數轉換秤須要的類型;
4.提供了同種表現層技術支持,如JSP、freemarker、velocity等
5.能夠對指定的方法進行校驗,能夠輕鬆的實現表單校驗功能
5.提供了全局範圍、包範圍和action範圍的國際化資源文件管理實現。
=============================================
配置文件的優先級:
由高到低:web.xml→struts.properties→struts.xml→struts-plguin.xml(只讀性)→struts.default.xml(只讀性)
===============================
action的名稱探索順序:徹底對應、逐步追溯到上級目錄查找、"/"下查找、默認namespace下查找
===============================
Struts2新特性
1:用來從動做邏輯中分層出橫切關注點的攔截器,爲了減小或者消除XML配置基於註解(annotation)
的配置方式,一個貫穿整個框架的強大的表達式語言OGNL(object-graph Navigation Language,
對象圖導航語言),智齒可變動和可重用UI組件的基於微型MVC模式(mini-MVC-based)的標籤API.
===========================================================
struts2 MVC經過3個核心框架組件實現:動做、結果和 FilterDispatcher
===============
新的struts2組件:ActionContext、攔截器、ValueStack和OGNL
=================
chain:用來處理Action鏈
dispatcher:用來轉向頁面,一般處理jsp
redirect:重定向到一個URL
redirectAction:重定向到一個Action
freemaker:處理FreeMarker模版
httpheader:控制特殊HTTP行爲的結果類型
stream:向瀏覽器發送inputStream對象,一般用來處理文件下載,還可用於返回AJAX數據
velocity:處理velocity模版
xslt:處理XML/XLST模版
plainText:顯示原始文件內容,例如文件源代碼
=======================
OGNL來引用、操做存儲在框架不一樣區域的數據。
interception用途:安全檢查(確保訪問者是登陸用戶)、跟蹤日誌(記錄每一個action)、
效率瓶頸檢查(記錄每一個action開始和結束的時間以檢查程序中的瓶頸)
========================
數據同時存儲在動做和ValueStack中。
=========================
struts2核心概念:action、interceptor、和類型轉換
==========================
動做的做用:
1.最重要:是爲給定請求封裝須要作的實際工做
2.在從請求到視圖的框架自動數據傳輸中做爲數據的攜帶者
3.動做必須幫助框架決定哪一個結果應該呈現請求響應中返回的視圖。
==========================
框架支持使用依賴注入(dependency injection),使用依賴注入可讓如動做這樣的代碼更整潔、
耦合度更低。
===========================
struts2裏面自帶param攔截器負責將數據從請求參數轉移到動做的JavaBean屬性。
================
可知容器對於web.xml的加載過程是context-param >> listener >> fileter >> servlet
=================
Action接口也提供了一些有用的String常量,這些常量能夠用做返回值來選擇合適的結果,常量爲:
ERROR、INPUT、LOGIN、NONE、SUCCESS
=================
若是action沒有指定動做類的話,Struts2智能默認值會提供繼承的默認動做實現,這個默認的動做有
一個空的execute()方法,除了自動返回Action接口的SUCCESS常量做爲控制字符串,什麼也不作。
================
ActionSupport:它是一個提供了Action接口和其餘幾個有用接口的默認實現的便利類,提供了諸如
數據驗證、錯誤消息本地化等功能。使用這個類是個好主意。
================
攔截器聲明的順序很重要。
1. 若是在攔截器中,咱們不使用invocation.invoke()來完成堆棧中下一個元素的調用,而是直接返回一個字符串做爲執行結果,那麼整個執行將被停止。
2. 咱們能夠以invocation.invoke()爲界,將攔截器中的代碼分紅2個部分,在invocation.invoke()以前的代碼,將會在Action以前被依次執行,而在invocation.invoke()以後的代碼,將會在Action以後被逆序執行。
======================
AOP面向切面編程:是OOP的延續。
主要的功能是:日誌記錄,性能統計,安全控制,事務處理,異常處理等等。
=============================
控制流的分離使得workflow攔截器在進入動做的execute()方法以前能夠停止整個請求處理而且
重定向回輸入頁面。這正是攔截器提供的分離類型。
=================
java 5以前List不支持類型指定。
==================
3.5.2:
預處理(preprocessing):從多重請求到請求參數(params攔截器會自動轉移到動做上)之間的轉換。
後加工(postprocessing):發生在動做執行以後攔截器再次出發時,用來消除上傳文件的臨時版本。
==================
3.6
Action必需要作的三件事:
1.封裝了框架與模型的交互
2.做爲請求處理過程當中的數據轉移對象
3.負責返回一個控制字符串,框架用它來選擇合適的result向用戶呈現視圖。
==========================
javascript