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用
来在下一步校验配置文件的有效性;
4、 为默认应用加载并初始化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
↓
interceptor1、2、3→Action
↓
interceptor1、2、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向用户呈现视图。
==========================