Wetts's blog

Stay Hungry, Stay Foolish.

0%

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
@RequestMapping("/value")
public class ValuePropertyController extends ApplicationController{

@Value("#{configProperties['jdbc.jdbcUrl']}")
private String jdbcUrl;

@RequestMapping
public String value(){
System.out.println(jdbcUrl);
return "";
}
}
阅读全文 »

表单提交方法有三种,主要说下第三种

  1. 用form自带属性action提交
  2. 用jquery提交:$(“#formid”).submit()
  3. 用ajax提交
阅读全文 »

当Oracle实例在正常启动时,系统首先要访问的是初始化参数文件spfile,然后Oracle为系统全局区(SGA)分配内存。这是,Oracle实例处于安装状态,并且控制文件处于打开状态;接下来Oracle会自动读出“控制文件”中的所有数据文件和日志文件的信息,并打开当前数据库中所有的数据文件和所有的日志文件以供用户访问。

  • 数据查询语言(DQL):用于检索数据库的数据,主要是select语句,它在操作数据库的过程中使用最为频繁。
  • 数据操纵语言(DML):用于改变数据库中的数据,主要包括insert、update、delete。
  • 事务控制语言(TCL):用于维护数据的一致性,包括commit、rollback、savepoint。
  • 数据定义语言(DDL):用于建立、修改和删除数据库对象。如果,可以使用create table语句创建表。
  • 数据控制语言(DCL):用于执行权限授予和权限回收操作,主要包括grant和revoke两条命令。

Oracle服务器主要由实例、数据库、程序全局区(PGA)和前台进程组成。

实例

实例可以划分为:系统全局区(SGA)和后台进程(PMON、SMON等)两部分,其中,SGA使用操作系统的内存资源,而后台进程需要使用CPU和内存资源。

系统全局区(SGA):

是所有用户进程共享的一块内存区域,也就是说,SGA中的数据资源可以被多个用户进程共同使用。SGA主要由高速数据缓冲区、共享池、重做日志缓存区、Java池和大型池等内存结构组成。SGA随着数据库实例的启动而加载到内存中,当数据库实例关闭时,SGA区域也就消失了。

  • 高速数据缓冲区(Database buffer cache):存放着Oracle系统最近访问过的数据块(数据块在高速缓冲区中也可称为缓存块)。

    若无法在高速数据缓冲区中找到所需要的数据,则Oracle首先从数据文件中读取指定的数据块到缓冲区,然后再从缓冲区中奖请求的数据返回给用户。由于高速数据缓冲区被所有用户共享,只要数据文件中的某些数据块被当前用户或其他用户请求过,那么这些数据块就会被装载到高速数据缓冲区中。经常或最近被访问的数据块会被放置到高速数据缓冲区前端,不常被访问的数据块会被放置到高速数据缓冲区的后端,当高速数据缓冲区填满时,会自动挤掉一些不常被访问的数据块。

    • 高速数据缓冲区分为以下三个部分:
      - 脏数据区:脏数据区中存放着已被修改过的数据,这些数据等待被写入数据文件中。
      - 空闲区:空闲区中的数据块不包含任何数据,这些数据块可以被写入数据,Oracle可以从数据文件中读取数据块,并将其放到该区中。
      - 保留区:保留区包含那些正在被用户访问的数据块和明确保留以作为将来使用的数据块(即缓存块),这些数据块将被保留在缓冲区中。
      
  • 重做日志缓冲区(Red log buffer cache):存放对数据库进行修改操作时所产生的日志信息,这些日志信息在写入到重做日志文件之前,首先存放到重做日志缓冲区中,然后,在检查点发生或重做日志缓冲区中的信息量达到一定峰值时,最后由日志写入进程(LGWR)将此缓冲区的内容写入到重做日志文件。

    重做日志缓冲区的大小由LOG_BUFFER参数指定,该参数也可以在树立启动后动态修改。相对于高速数据缓冲区而言,重做日志缓冲区的大小对数据库性能的影响较小,通常较大的重做日志缓冲区能减少重做日志文件的对I/O的读取次数,对数据库的整体性能有一定的提高。

  • 共享池(Shared Pool):共享池是SGA保留的内存区域,用于缓存SQL语句、PL/SQL语句、数据字典、资源锁、字符集以及其他控制结构等。共享池包含库高数缓冲区(Library cache)和字典高速缓冲区(Dictionary cache)。

    库高速缓冲区是共享池的一部分,主要包括共享SQL区和私有SQL区两个组成部分。每条被缓存的SQL或PL/SQL语句都被分成两个部分,分别被存放在共享SQL区和私有SQL区中。共享SQL区存放SQL或PL/SQL语句的语法分析结果和执行计划,如果以后要再次执行类似的语句,则可以利用共享SQL区已缓存的语法分析结果和执行计划。私有SQL区存放SQL语句中的绑定变量、环境和会话等信息,这些信息属于执行该语句的用户的私有信息,其他用户则无法共享这些信息。

      字典高速缓冲区用于存放Oracle系统内部管理所需要的数据字典信息,例如用户名、数据对象和权限等。
    
  • 大型池(Large pool):大型池在SGA区中不是必需的内存结构,只在某些特殊情况下,实例需要使用大型池来减轻共享池的访问压力,常用的情况有以下几种:

    • 当使用恢复管理器进行备份和恢复操作时,大型池将作为I/O缓冲区使用。
    • 使用I/O Slave仿真异步I/O功能时,大型池将被当作I/O缓冲区使用。
    • 执行具有大量排序操作的SQL语句。
    • 当使用并行查询时,大型池作为并行查询进程彼此交换信息的地方。
  • Java池:用来提供内存空间给Java虚拟机使用,目的是支持在数据库中运行Java程序包,其大小由JAVA_POOL_SIZE参数决定。

  • 流池:Oracle流池用于在数据库与数据库之间进行信息共享。如果没有用到Oracle流,就不需要设置该池。流池的大小由参数STREAMS_POOL_SIZE决定。

程序全局区(PGA):

也称作用户进程全局区,它的内存区在进程私有区而不是共享区中。虽然PGA是一个全局区,可以把代码、全局变量和数据结构都可以存放在其中,但区域内的资源并不像SGA一样被所有的用户进程所共享,而是每个Oracle服务器进程都只拥有属于自己的那部分PGA资源。

各个服务进程的PGA区的总和即为实例的PGA区的大小。通常PGA区由私有SQL区和会话区组成:

  • 私有SQL区:用于存储变量以及SQL语句运行时的内存结构信息,当每个用户连接到实例时,都会在实例中创建一个会话。这些会话可能会在SGA区中创建一个共享SQL,但在PGA区中可能会创建多个私有SQL区。把一个私有SQL区与对应的共享SQL区合并在一起,就可以获得一条SQL语句的完整缓存数据。私有SQL区可以再分为静态区和动态区两个部分。静态区的信息在会话过程中保持不变,只有当会话结束时,静态区才会被释放掉;而动态区的信息在整个会话过程中是不断变化的,一旦SQL语句执行完毕,即使会话还没有结束,动态区也被释放掉。
  • 会话区:用于存放用户的会话信息(如登陆用户名)。如果数据库处于共享服务器连接模式下,则会话区将位于SGA区域,而不是PGA中,这点需要用户特别注意。

前台进程:

前台进程包括用户进程和服务进程,它不属于实例的一部分,但是用户在不知不觉中经常会用到它,使用前台进程能够实现用户和实例沟通。

用户进程:指那些能够产生或执行SQL语句的应用程序。在用户进程中有两个非常重要的概念:连接和会话。

服务器进程:用于处理用户会话过程中想数据库实例发出SQL语句,它可以分为专用服务器模式和共享服务器模式。在专用服务器模式下,每个用户进程都有一个专用的服务器进程,这个服务器进程代表用户进程执行SQL语句,必要时还可以回传执行结果给用户进程。在共享服务器模式下,每个用户进程不直接与服务器连接,而是连接到分派程序,每个分派程序可以同时连接多个用户进程。

后台进程:

是一组运行于Oracle服务器端的后台程序,是Oracle实例的重要组成部分。其中SMON、PMON、DBWR、LGWR和CKPT这5个后台进程必需正常启动,否则导致数据库实例崩溃。

  • 数据写入进程(DBWR):主要任务是负责将内存中的脏数据块回写到数据文件中通常在以下几种情况发生时,DBWR进程会将脏数据块写入数据文件:

    • 当用户进程执行插入或修改等操作时,需要将“新数据”写入高速数据缓冲区,如果在高速数据缓冲区中没有找到足够大的空闲数据块来存放这些“新数据”。
    • 当检查点进程启动后,它会强制要求DBWR将某些脏数据块写入数据文件中。
    • 当脏数据块在高速数据缓冲区中存放超过3秒钟,DBWR进程会自行启动并将某些脏数据块写入到数据文件中。

    在某些比较繁忙的应用系统中可以修改服务器参数文件SPFILE的DB_WRITER_PROCESSES参数,以允许使用多个DBWR进程。但是DBWR进程的数量不应当超过系统处理器的数量,否则多余的DBWR不但无法发乎作用,反而会耗费系统资源。

  • 检查点进程(CKPT):检查点进程可以看作一个时间,当检查点时间发生时,CKPT会要求DBWR将某些脏数据块回写到数据文件。当用户进程发出数据请求时,Oracle系统从数据文件中读取需要的数据并存放到高速数据缓冲区中,用户对数据的操作是在缓冲区中进程的。当用户操作数据时,就会产生大量的日志信息并存储在重做日志缓冲区,当Oracle系统满足一定条件时,日志写入进程(LGWR)会将日志信息写入到重做日志文件组中,当发生日志切换时,就会启动检查点进程。

    • 可以通过修改初始化参数文件SPFILE中的CHECKPOINT_PROCESS参数为TRUE来启动检查点进程。
  • 日志写入进程(LGWR):用于将重做日志缓冲区中的数据写入重做日志文件。

    • 当发生提交命令、或者重做日志缓冲区的信息满1/3、或者日志信息存放超过3秒钟时,LGWR进程就会将日志信息从重做日志缓冲区中读出写入到日志文件组中序号较小的文件中,一个日志组写满后接着写另外一组。当LGWR进程将所有的日志文件都写过一遍之后,它将再次转向第一个日志文件组重新覆盖。
  • 归档进程(ARCH):归档进程是一个可选择的进程,只有当Oracle数据库处于归档模式时,该进程才可能起到作用。若Oracle数据库处于归档模式,当各个日志文件组都被写满而即将被覆盖之前,先由归档进程(ARCH)把即将被覆盖的日志文件中的日志信息读出,然后再把这些“读出的日志信息”写入到归档日志文件中。

    • 当系统比较繁忙而导致LGWR进程处于等待ARCH进程时,可通过修改LOG_ARCHIVE_MAX_PROCESSES参数启动多个归档进程,从而提高归档写磁盘的速度。
  • 系统监控进程(SMON):系统监控进程是在数据库系统启动时执行恢复工作的强制性进程。比如,在并行服务器模式下,SMON可以恢复另一个处于失败的数据库,使系统切换到另一台正常的服务器上。

  • 进程监控进程(PMON):用于监控其他进程的状态,当有进程启动失败时,PMON会清除失败的用户进程,释放用户进程所用的资源。

  • 锁定进程(LCKN):这是一个可选进程,并行服务器模式下可以出现多个锁定进程以利于数据库通信。

  • 恢复进程(RECO):这是在分布式数据库模式下使用的一个可选进程,用于数据不一致时进行恢复工作。

  • 调度进程(DNNN):这是一个可选进程,在共享服务器模式下使用,可以启动多个调度进程。

  • 快照进程(SNPN):快照进程用于处理数据库快照的自动刷新,并通过DBMS_JOB包运行预定的数据库存储过程。

一个或多个数据块组成一个数据区,一个或多个数据区再组成段。

一个段可以属于多个数据文件。一个区不能跨越数据文件。

数据块(Data Blocks):

Oracle逻辑存储结构中最小的逻辑单位,也是执行数据库输入输出操作的最小存储单位。通常数据块是操作系统块的整数倍。Oracle支持在同一个数据库中使用多种大小的块,与标准块大小不同的块就是非标准块。

数据块由以下几个部分组成:

  • 块头:存放数据块的基本信息,如块的物理地址、块所属的段的类型。
  • 表目录:存放表的相关信息。
  • 行目录:如果块中有行数据存在,则这些行的信息将被记录在行目录中。这些信息包括行的地址等。
  • 空余空间:是一个块中未使用的区域,这片区域用于新行的插入和已经存在的行的更新。
  • 行数据:用于存放表数据和索引数据的地方。

v$parameter where name='db_block_size'可以查询标准的数据库大小。

数据区(Extent):

有一组连续的Oracle数据块所构成的Oracle存储结构。

段(Segment):

它不是存储空间的分配单位,而是一个独立的逻辑存储结构。

通常有以下4种类型的段:

  • 数据段:保存的是表中的数据记录。
  • 索引段:包含用于提高系统性能的索引。
  • 回滚段:保存了回滚条目,Oracle将修改前的旧值保存在回滚条目中。
  • 临时段:当执行创建索引、查询等操作时,Oracle可能会使用一些临时存储空间,用于暂时性地保持解析过的查询语句以及在排序过程中产生的临时数据。

表空间(TableSpace):

使用表空间将相关的逻辑结构组合在一起,是最大的逻辑划分区域,通常用来存放数据表、索引、回滚段等数据对象。表空间与数据文件相对应,一个表空间有一个或者多个数据文件组成,一个数据文件只属于一个表空间。

  • SYSTEM表空间:系统表空间,用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户等。
  • SYSAUX表空间:是Oracle11g新增加的表空间,是随着数据库的创建而创建的,充当SYSTEM的辅助表空间,主要存储除数据字段以外的其他数据对象。
  • UODO表空间:撤销表空间,用于存储撤销信息的表空间。当用户对数据表进行修改操作时,Oracle系统自动使用撤销表空间来临时存放修改前的旧数据。当所做的修改操作完成并执行提交命令后,Oracle根据系统设置的保留时间长度来决定何时释放掉撤销表空间的部分空间。
  • USERS表空间:用户表空间,是Oracle建议用户使用的表空间,可以在这个表空间上创建各种数据对象,比如创建表、索引、用户等数据对象。Oracle系统的样例用户SCOTT对象就存放在USERS表空间中。

Oracle数据块的物理存储结构由多种物理文件组成,主要有数据文件、控制文件、重做日志文件、归档日志文件、参数文件、口令文件和警告日志文件等。

数据文件:

用于保存用户应用程序数据和Oracle系统内部数据的文件,这些文件在操作系统中就是普通的操作系统文件。只能由Oracle系统负责为数据对象选择具体的数据文件,并在其中分配物理存储空间,用户是无法指定使用哪一个数据文件来进程存储的。

在读取数据时,Oracle系统首先从数据文件中读取数据,并将数据存储在内存的高速数据缓冲区中,如果用户要读取数据库中的某些数据,而请求的数据又不在内存的高速数据缓冲区中,则需要从相应的数据文件中能够读取数据斌光存储在缓冲区中。当修改和插入数据时,Oracle不会立即将数据写入数据文件,而是把这些数据保存在数据缓冲区中,然后由Oracle的后台进程DBWR决定如何将其写入相应的数据文件。这样的存取方式减少了磁盘的I/O操作,提高了系统的响应性能。

  • 系统数据文件:用于存放“特殊”的用户数据和Oracle系统本身的数据,如用户建立的表名、列名及字段类型等,这些属于用户数据范畴,这些数据存放在系统表空间所包含的数据文件中;而Oracle系统内部的数据字典、系统表(如dba_data_files、dba_temp_files等)中所存储的数据属于Oracle系统的内部数据,这些数据也存放在系统表空间所包含的数据文件中。
  • 撤销数据文件:隶属于撤销表空间。如果修改Oracle数据库中的数据,那么就必须使用撤销段,撤销段用来临时存放修改前的旧数据,而撤销段通常存放在一个单独的撤销表空间中,这个撤销表空间所包含的数据文件就是撤销数据文件。
  • 用户数据文件:用于存放用户应用系统的数据,这些数据包括与应用系统有关的所有相关信息。
    dba_data_files或者v$datafile可以查数据文件。
  • 临时数据文件:从Oracle9i以后,Oracle将临时表空间对应的临时数据文件与一般数据文件分开,可以从dba_temp_files或v$tempfile数据字段中查询。

控制文件:

是一个二进制文件,它记录了数据库的物理结构,其中主要包含数据库名、数据文件与日志文件的名字和位置、数据库建立日期等信息。控制文件一般在Oracle系统安装时或创建数据库时自动创建,控制文件所存放的路径有服务器参数文件spfileorcl.ora和control_files参数值来指定。

由于控制文件存放有数据文件、日志文件等的相关信息,因此,Oracle实例在启动时必需访问控制文件。

当Oracle实例在正常启动时,系统首先要访问的是初始化参数文件spfile,然后Oracle为系统全局区(SGA)分配内存。这是,Oracle实例处于安装状态,并且控制文件处于打开状态;接下来Oracle会自动读出“控制文件”中的所有数据文件和日志文件的信息,并打开当前数据库中所有的数据文件和所有的日志文件以供用户访问。
每个数据库至少拥有一个控制文件,一个数据库可以同时拥有多个控制文件,但是一个控制文件只能属于一个数据库。控制文件内部除了存放数据库名以及其创建日期、控制文件、日志文件等的相关信息之外,在系统运行过程中,还存放有系统更改号、检查点信息及归档的当前状态灯信息。
处于安全考虑,在安装Oracle数据库或创建数据库时,Oracle数据库系统会自动创建2个或3个控制文件,每个控制文件记录相同的信息。
v$controlfile可以查询控制文件信息。

日志文件:

主要功能是记录对数据所做的修改,对数据库所做的修改记录都记录在日志文件中。

重做日志文件:

用来记录数据库所有发生过的更改信息(修改、添加、删除等信息)及由Oracle内部行为(创建数据表、索引等)而引起的数据库变化信息。在数据库恢复时,可以从该日志文件中读取原始记录。在数据库运行期间,当用户执行COMMIT命令时,数据库首先将每笔操作的原始记录写入到日志文件中,写入日志文件成功后,才把新的记录传递给应用程序。

通过对表或则整个表空间设定NOLOGGING属性时,使基于表或表空间中所有的DML操作(如创建表、删除试图、修改索引等操作)都不会产生日志信息。

为了保障数据库系统的安全,每个Oracle实例都启用一个日志线程来记录数据库的变化。日志线程有若干“日志组”构成,而每个日志组又由一个或者多个日志文件构成。

Oracle系统在运行过程中产生的日志信息,首先被临时存放在系统全局区的“重做日志缓冲区”中,当发出COMMIT命令(或日志缓冲区信息满1/3)时,LGWR进程(日志写入进程)将日志信息从“重做日志缓冲区”中读取出来,并将“读取的日志信息”写入到日志文件组中序列号较小的文件里,一个日志组写满后接着写另外一个日志组。当LGWR进程将所有能用的日志文件都使用过一遍后,它将再辞转向第一个日志组重新覆写。

v$logfile查询日志文件。

归档日志文件:

在所有的日志文件被写入一遍之后,LGWR进程将再次转向第一个日志组进行重新覆写,这样务必会导致一部分较早的日志信息被覆盖掉,但Oracle通过归档日志文件解决了这个问题。

Oracle数据库可以运行在两种模式下,即归档模式和非归档模式。非归档模式是指在系统运行期间,所产生的日志信息不断地记录到日志文件组中,当所有重做日志被写满后,又重新从第一个日志组开始覆写。归档模式是在各个日志文件都被写满而即将被覆盖之前,先由归档进程(ARCH)将即将被覆盖的日志文件中的日志信息读出,并将“读出的日志信息”写入到归档日志文件中,而这个过程又被称为归档操作。

在归档操作进程的过程中。日志写入进程(LGWR)需要等待归档进程(ARCH)的结束才能开始覆写日志文件,这样就延迟了系统的响应时间,而且归档日志本身又会占用大量的磁盘空间,这些都会影响系统的整体性能。所以在默认情况下,Oracle系统不采用归档模式运行。

如果将Oracle数据库系统设置成在归档模式下运行,则可以通过服务器参数文件spfile的log_archive_dest参数来规定归档日志文件的所在路径。

服务器参数文件:

SPFILE(Server parameter File)是二进制文件,用来记录Oracle数据库的基本参数信息(如数据库名、控制文件所在路径、日志缓冲大小等)。数据库实例在启动之前,Oracle系统首先会读取SPFILE参数文件中设置的这些参数,并根据这些初始化参数来配置和启动实例。比如,设置标准数据块的大小(即参数db_block_size的值)、设置日志缓冲区的大小(即参数log_buffer的值)等,所以SPFILE参数文件非常重要。服务器参数文件在安装Oracle数据库系统时由系统自动创建,文件的名称为SPFILEsid.ora,sid问所创建的数据库实例名。

密码文件:

是Oracle系统用于验证sysdba权限的二进制文件。

警告文件:

是一个存储在Oracle系统目录下的文本文件(名称通常为alert_orcl.log),它用来记录Oracle系统的运行信息和错误信息。

跟踪文件:

跟踪文件包括后台进程跟踪文件和用户跟踪文件。后台进程跟踪文件用于记录后台进程的警告或错误信息,每个后台进程都有对应的后台进程跟踪文件。用户跟踪文件主要用于跟踪SQL语句。

session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的含义也很不相同。这里只探讨HTTP Session。
 
为了说明问题,这里基于Java Servlet理解Session的概念与原理,这里所说Servlet已经涵盖了JSP技术,因为JSP最终也会被编译为Servlet,两者有着相同的本质。
 
在Java中,HTTP的Session对象用javax.servlet.http.HttpSession来表示。  

概念:

Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象,这个概念到此结束了,也许会很模糊,但只有看完本文,才能真正有个深刻理解。  

Session创建的时间是:

一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。
由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
 
引申:

  1. 访问*.html的静态资源因为不会被编译为Servlet,也就不涉及session的问题。
  2. 当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:
1
Cookie:JSESSIONID=客户端第一次拿到的session ID

这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。这也是session使用的基本原理—-搞不懂这个,就永远不明白session的原理。
下面是两次请求同一个jsp,请求头信息:

1

2

通过图可以清晰发现,第二次请求的时候,已经添加session ID的信息。
 

Session删除的时间是:

  1. Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
  2. 程序调用HttpSession.invalidate()
  3. 服务器关闭或服务停止

 

session存放在哪里:

服务器端的内存中。不过session可以通过特殊的方式做持久化管理。  

session的id是从哪里来的,sessionID是如何使用的:

当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会偷偷地将sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。一个会话只能有一个session对象,对session来说是只认id不认人。  

session会因为浏览器的关闭而删除吗?

不会,session只会通过上面提到的方式去关闭。  

同一客户端机器多次请求同一个资源,session一样吗?

一般来说,每次请求都会新创建一个session。

3

其实,这个也不一定的,总结下:对于多标签的浏览器(比如360浏览器)来说,在一个浏览器窗口中,多个标签同时访问一个页面,session是一个。对于多个浏览器窗口之间,同时或者相隔很短时间访问一个页面,session是多个的,和浏览器的进程有关。对于一个同一个浏览器窗口,直接录入url访问同一应用的不同资源,session是一样的。  

session是一个容器,可以存放会话过程中的任何对象。

 

session因为请求(request对象)而产生,同一个会话中多个request共享了一session对象,可以直接从请求中获取到session对象。

 

其实,session的创建和使用总在服务端,而浏览器从来都没得到过session对象。但浏览器可以请求Servlet(jsp也是Servlet)来获取session的信息。客户端浏览器真正紧紧拿到的是session ID,而这个对于浏览器操作的人来说,是不可见的,并且用户也无需关心自己处于哪个会话过程中。

转自:http://blog.csdn.net/kobejayandy/article/details/12690041

简介:

@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

阅读全文 »