HTTP协议是一个无状态协议,基于客户端/服务器模型。HTTP客户端需要与服务器建立一个连接,并将一则请求消息通过连接发送到HTTP服务器,以请求响应的资源,然后在服务器返回带有请求资源的响应消息,一旦回答了请求,服务器则关闭连接,在计算机与服务器上没有存储连接消息。
HTTP协议使用端口发送和接收消息,端口是协议发送和接收数据的信道或机制。80端口为HTTP协议默认端口。
JSP/Servlet/JavaBean
JavaEE包括的技术
JavaEE是一个开发分布式企业级应用的规范和标准,JavaEE应用程序是有组件构成的,JavaEE组件是具有功能的单元。
JavaEE与框架的关系
框架技术是在JavaEE的基础上形成的,而应用程序是在框架的基础上形成。
JavaEE体系结构
应用程序的三层结构可分为:
1、 表示层:由用户界面和用于生成界面的代码组成 2、 中间层:包含系统的业务和功能代码
3、 数据层:负责完成存取数据库的数据和对数据进行封装
三层体系结构的优点:
1、 一个组件的更改不影响其他组件 2、 可以方便的扩展表示层 3、 代码重复减少 4、 良好的分工与协作
第 1 页 共 37 页
JavaEE技术内容 表示层技术
1、 HTML 2、 JavaScript
3、 Ajax:Ajax并不是一种技术,而是几种技术的整合,主要功能是异步想服务器段发送请
求,处理数据或者根据返回的数据重新显示页面。
中间层技术
1、 JSP:显示动态内容的服务器网页。
2、 Servlet:接受客户端请求,并做出响应的Java程序 3、 JSTL:辅助JSP显示动态内容的标准标签库 4、 JavaBean:JavaEE的模型组件
5、 中间层的框架技术:Struts框架主要扩展了Servlet
数据层技术
1、 JDBC技术
2、 数据层框架技术:Hibernate提供了以对象的形式操作关系型数据库数据的功能。
系统集成技术
1、 JAX-WS技术:(Java API for XML Web Service)是JavaEE平台的重要组成部分,简化
了使用Java技术开发Web服务的工作。 2、 JNDI技术:(Java Naming and Directory Interface ,Java 命名与目录接口)是一组在Java
应用中访问命名和目录服务的API。
表单GET请求和POST请求的区别:
1、 GET请求提交数据在地址栏内显示,不安全,而POST不显示 2、 GET提交数据量有,255个字符,而POST不
3、 GET请求的页面可以设置为书签或使用邮件发送,而POST不可以
第 2 页 共 37 页
Servlet Servlet基础
Servlet是一个Java程序,是在服务器端运行以处理客户端请求并做出响应的程序。创建Servlet类必须继承HttpServlet类。实现doGet()或者doPost()方法。
创建Servlet时,必须要继承自HttpServlet,HttpServlet作为一个抽象类用来创建用户自己的Servlet,HttpServlet的子类至少要重写doGet()和doPost()方法中的一个。
Servlet生命周期
1、 加载和实例化
Servlet容器负责加载和实例化Servlet,当客户端发送一个请求时,Servlet容器会查找内存是否存在Servlet实例,如果不存在,就创建一个Servlet实例。如果存在Servlet实例,就直接存内存中取出该实例来响应请求。 2、 初始化
Servlet容器加载好后,必须进行初始化,初始化Servlet时,可以设置数据库连接参数,建立JDBC连接,或者是建立对其他资源的引用,初始化时init()方法被调用,此方法在javax.servlet.Servlet接口中定义。 3、 服务
Servlet被初始化以后,就处于能响应请求的就绪状态,当客户端有一个请求时,Servlet容器将Servlet Request和Servlet Response对象都转发给Servlet ,这两个对象以参数的形式传给service()方法。在service()内,对客户端的请求方法进行判断,然后决定到底调用doGet()方法还是doPost()方法。 4、 销毁
Servlet的实例是由Servlet容器创建的,所以实例的销毁也是由容器来完成,即Servlet的destroy()方法。destroy()方法指明那些资源可以被系统回收,而不是由destroy()方法直接进行回收。
Servlet的部署与配置
web.xml配置文件
Filter
Filter(过滤器):用户的请求在到达Servlet前,先由过滤器做一番预处理,如验证用户身份、准备日志等。
必须实现javax.servlet.Filter接口。
import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class Filter implements javax.servlet.Filter { { } } public void init(FilterConfig arg0) throws ServletException { } request.setCharacterEncoding(\"utf-8\"); filterChain.doFilter(request, response); public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException web.xml配置文件
由于HTTP协议是无状态协议,如果仅用HTTP协议是不能够进行用户状态的跟踪的。因此Java Servlet API 中引入session机制来跟踪客户的状态,session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。在一个session中,客户可能会多次请求访问同一个网页,可有可能访问各种不同的服务器资源。
第 4 页 共 37 页
创建会话的方法
1、 HttpSession session = request.getSession(boolean value); 2、 HttpSession session = request.getSession();
在第一种方法中,布尔值为true时,如果存在于当前请求关联的回话,就返回该会话,负责创建一个新的会话,并把该会话返回。布尔值为false时,如果存在于与当前请求关联的回话,就返回该会话,否则返回null,不在创建会话。 第二种方法等同与第一种方法中参数为true的情况。
session对象的方法
方法 void setAttribute(String name,Object value) Object getAttribute(String name) 说明 保存数据 读取数据 session对象存储数据是以“键-值”对的形式存储 关闭session时,关闭浏览器可自动关闭,也可调用invalidate()方法关闭,另外两次访问时间大于session定义的非活动时间间隔会关闭
MVC设计模式
MVC是一种流行的软件设计模式,它把系统分为3个模块: 1、 模型(Model):对应的组件是JavaBean。
模型可以分为业务模型和数据模型,它们代表应用程序的业务逻辑和状态。 2、 视图(View):对应的组件是JSP或HTML文件。
视图提供可交互的客户界面,想客户显示模型数据。 3、 控制器(Controller):对应的组件是Servlet。
控制器响应客户的请求,根据客户的请求来操作模型,并把模型的相应结果由视图展现给客户。
数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接;释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接遗漏。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量由最小数据库连接数来设定,无论数据库连接是否被使用,连接池都将一直保持至少拥有这么多的连接数量,最大的数据库连接数超过最大连接数时,这些请求将被加入等待队列中。
数据源和JNDI资源
JNDI技术:Java Naming and Directory Interface
第 5 页 共 37 页
DataSource对象是由Web容器(Tomcat)提供,不能在程序中采用创建一个实例的方式来生成DataSource对象,javax.naming.Context提供了查找JNDI Resource的借口,例: Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup(\"java:comp/env/jdbc/message\"); Connection conn=ds.getConnection(); 此时Connection的close()方法的作用是:将连接放回到数据连接池中,是连接回复空闲状态。
JNDI的配置
在Tomcat的目录:\\conf\\context.xml文件中 属性 name auth 说明 指定Resource的JNDI名字 指定管理Resource的Manager,它有两个可选值:Container和Application。Container表示有容器来创建Resource,Application表示由Web应用来创建和管理Resource 指定Resource所属的Java类名 指定数据连接池中处于活动状态的数据库连接的最大数目,取值为0,表示不收 指定数据库连接池中处于空闲状态的数据连接的最大数目,取值为0,表示不收 指定数据库连接池中数据库连接处于空闲状态的最长时间,单位为毫秒,超过这一时间将会抛出异常,取值为-1,表示可以无等待 指定连接数据库的用户名 指定连接数据库的口令 指定连接数据库的JDBC驱动程序 指定连接数据库的URL type maxActive maxIdle maxWait username password driverClassName url 第 6 页 共 37 页 web.xml文件的配置 在应用程序的WEB-INF/web.xml文件中 属性 description res-ref-name res-type res-auth 说明 对所引用资源的说明 指定所引用资源的JNDI名字,与 Java中提供Properties类,读取.properties(属性)文件,一般在项目的默认路径(src)下创建文件db.properties文件,后缀名必须为.properties。例: driver=com.microsoft.sqlserver.jdbc.SQLServerDriver url=jdbc:sqlserver://localhost:1433;databasename=message userName=sa password= Properties类继承了HashTable,Properties类把“=”号之前的内容添加到HashTable对象的key值,同时把“=”号之后的内容存到value中 .properties文件只能保存String类型的信息 程序中读取属性文件 Properties p=new Properties(); p.load(PropertiesTest.class.getResourceAsStream(\"/db.properties\")); String driver=p.get(\"driver\").toString(); 第 7 页 共 37 页 String url=p.getProperty(\"url\").toString(); String userName=p.getProperty(\"userName\").toString(); String password=p.getProperty(\"password\").toString(); System.out.println(\"驱动:\"+driver); System.out.println(\"连接字符串:\"+url); System.out.println(\"用户名:\"+userName); System.out.println(\"密码:\"+password); JavaBean JavaBean是Java中开发的可以跨平台的重用组件,它是组件体系结构,JavaBean实际上是一个Java类,这个类可以重用。从功能上分可以分为以下两类。 1、 封装数据 2、 封装业务 JavaBean一般要满足一下要求: 1、 是一个公共类,提供无参的公有构造方法 2、 属性私有 3、 具有公共的访问属性的getter和setter方法 JavaBean用法 范围 page request session application 说明 JavaBean只能在当前页中使用,加载新页时销毁 在用户对其发出请求时存在 一直存在于会话当中 存在与整个应用程序中 框架技术 框架(Framework)是个提供了可重用的公共结构的半成品,它为我们构建新的应用提供了极大的便利,一番米娜给我们提供了可以拿来就用的工具。更大意义上,给我们提供了课重用的设计。 第 8 页 共 37 页 主流技术框架 Struts框架 Struts框架是最早的Java开源框架之一,也是现在Java Web框架的事实标准,现有的绝大多数Java Web应用程序都有基于Struts框架构建的。Struts是MVC设计模式一个优秀的实现。Struts定义了通用的Controller(控制器),通过配置文件(一般是struts-config.xml)隔离了Model(模型)和View(视图),以Action的概念对用户请求做了封装,使代码更清晰易读,Struts还义工了自动将请求的数据填充到对象中以及页面标签等简化编码的工具。Struts使开发大型Java Web项目成为可能。 Hibernate框架 Hibernate框架是一个优秀的持久化框架,负责简化将对象数据保存到数据库中或从数据库中读取数据并封装到对象的工具,通过简单配置和编码即可替代JDBC繁琐的程序代码。Hibernate处理数据操作的方式代表了当前的趋势。 Spring框架 Spring的出现改变了Java世界,它的目标是使现有的JavaEE技术更易用和促进良好的编程习惯。它是一个轻量级的框架,渗透了JavaEE技术的方方面面,它主要作为依赖注入容器和AOP实现了存在。还提供了申明式失误、对DAO层的支持等简化开发的功能。Spring还可以很方便地与Struts、Hibernate等技术集成。 DWR框架 DWR是一个Ajax框架,使Ajax开发更加轻松,Ajax是一种通过JavaScript代码异步请求服务器资源的技术。 Struts1 基于Struts1的开发由3类组件构成:控制器组件、模型组件和试图组件。 控制器组件包括ActionServlet,是Struts1的核心控制器,还包括自定义的Action类,一个Action类代表客户的一个操作,自定义的Action类继承自Struts1提供的org.apache.struts.action.Action。 模型组件并不由Struts提供,一般由普通的接口和JavaBean充当,需要我们自己编写实现。 视图组件一般由JSP实现,还包括自定义的ActionForm类和Struts1标签。自定义的ActionForm类用于封装request中的数据,Struts可以讲request中的数据自动填充到ActionForm类中,以避免繁琐的request.getParamter()和类型转换代码。自定义的ActionForm 第 9 页 共 37 页 类继承自Struts1提供的org.apache.struts.action.ActionForm。 ActionSelect在系统启动的时候加载struts-config.xml配置文件。struts-config.xml配置文件中包含于Action、ActionForm、页面转发等相关的配置信息。 在Web.xml中配置ActionSelect: Struts1处理请求的过程 当Web服务器启动的时候ActionServlet被初始化,加载struts-config.xml文件。 1、 当客户端浏览器发起请求道ActionServlet时,ActionServlet首先对请求进行一系列处理; 根据请求的路径和配置信息找到对应的Action Bean和Form Bean,如果提交表单发送http://localhost:8080/test/add.do请求到服务器的时候,ActionServlet就会根据Struts配置信息查找path属性为“/add”的Action Bean,于是找到AddAction;并得知Action的name属性为“addForm”,于是找到AddForm的实例,如果不存在则创建。 2、 在去定将要调用的Action Bean和对应的Form Bean后,就将请求中包含的值填充到Form Bean中(Action可以不关联任何ActionForm)。在调用Action的execute方法前,ActionServlet还需要准备好ActionMapping参数,ActionMapping中包含了该Action的配置信息。 3、 然后Struts将请求分发至相应的Action Bean处理,ActionMapping参数、ActionForm参 数、request和response都作为参数传递给处理请求的Action Bean的execute方法。 4、 Action调用业务逻辑方法,得到返回值,并返回ActionForward对象。 5、 控制权重新回到ActionServlet,ActionServlet根据Action返回的ActionForward对象转 发到相应的JSP页面。 6、 处理结果返回给浏览器。 注意 1、 ActionServlet将控制权转到页面的时候采用的是转发方式 (request.getRequestDispatcher(url).forward(request,response);)所以转发的页面的request和Action方法参数中的request是同一个请求,数据可以通过request对象的attribute属性传递。 2、 ActionForm根据对应Action的scope属性配置不同而生命周期有所不同。一般情况下, scope属性设为request,则每次请求开始时ActionServlet创建新的ActionForm对象,保存在request对象的attribute属性中,所以可以再Actin代码中设置ActinForm的值,在页面中取出。 3、 当需要采取重定向的方式转到新的页面的时候,可以在Actin代码中使用 “request.sendRedirect(url)”语句,并返回null。 DispatchAction 通常,一个Action中只能完成一个业务操作,通过扩展org.apache.struts.actions.DispatchAction实现的Action类可以完成一组相关的几种业务操作。扩展自DispatchAction的Action类中不必定义execute方法,而是创建一些实现业务操作的方法,如doAdd()等,但这些业务方法的掺入参数和返回值要和普通Action的execute方法相同。 第 11 页 共 37 页 使用DispatchAction 使用DispatchAction是,定义的Action类继承自DispatchAction,然后在配置Action时,指定一个parameter属性。 struts.xml配置 Struts1标签库 引入Struts1标签库 <%@ taglib prefix=\"bean\" uri=\"http://jakarta.apache.org/struts/tags-bean\"%> <%@ taglib prefix=\"html\" uri=\"http://jakarta.apache.org/struts/tags-html\"%> <%@ taglib prefix=\"logic\" uri=\"http://jakarta.apache.org/struts/tags-logic\"%> Hibernate Hibernate概述 Hibernate是一个优秀的Java持久层解决方案,是当今主流的对象-关系映射工具,Hibernate的价值在于,对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 第 12 页 共 37 页 Hibernate配置文件 主配置文件 1、 2、 主键) 3、 4、 5、 对象标识符生成方式 标识符生成器 increment identity 描述 有Hibernate自动以递增的方式生成标识符,每次增量为1。 适用于代理对象标识符 由底层数据库生成标识符,数据库必须支持自动增长字段类型。不便于统统数据库之间的移植。 适用于代理对象标识符 Hibernate根据底层数据系列来生成标识符。前提条件是底层数据库支持序列(如Oracle)。 适用于代理对象标识符 Hibernate根据high/how算法来生成标识符。 适用于代理对象标识符 根据底层数据库对自动生成标识符的支持能力来选择identity,sequence或hilo。主键类型必须是long、int或short。 适用于代理对象标识符 Hibernate采用128位UUID算法来生成标识符。UUID算法能够在网络环境中生成唯一的一个32位16进制的字符串。 适用于代理对象标识符 由Java应用程序负责生成标识符,需在保存数据前完成。 适用于代理对象标识符 通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个对象标识符 使用另外一个相关联的对象的标识符。常和 1、 如果对象标识符的数据类型为整型(long、int、short)或对应的包装类型,为提高应用 程序在不同的数据库上的移植能力,建议使用native。 2、 如果对象标识符的数据类型为字符串型,为了提高应用程序在不同数据库上的移植能 力,建议使用uuid。 3、 如果应用是先有数据库物理模型而后简历实体模型,且使用了自然主键,那么就选择 assigned。 第 14 页 共 37 页 Hibernate执行持久化操作的步骤 步骤 1 操作 读取并解析配置文件 代码 Configuration 与JDBC区别 cfg=new 相当于使用Configuration().configure(); DataSource获取连接前读取DataSource的配置文件 2 读取并解析映射信息,创建SessionFactory 打开Session 开始一个事务 持久化操作 提交事务 关闭session SessionFactory sf=cfg.buildSessionFactory(); Session session=sf.openSession(); Transaction ts=session.beginTransaction(); session.save(u); ts.commit(); session.close(); 相当于创DataSource对象 建3 4 5 6 7 相当于JDBC获得连接 开始事务 持久化操作 提交事务 关闭连接 Hibernate的核心类和接口 Configuration类 Configuration类是Hibernate的入口,负责配置并启动Hibernate。Hibernate框架通过Configuration实例加载配置文件信息,然后读取指定对象关系映射文件的内容并创建SessionFactory实例。 SessionFactory接口 SessionFactory接口负责初始化Hibernate,一个SessionFactory实例对应一个数据存储源(一般就是指一个数据库)。应用程序从SessionFactory中获得Session实例。 SessionFactory的特点: 1、 现成安全,同一个SessionFactory实例可以被应用的多个线程共享。 2、 它是重量级的,因为它需要一个很大的缓存,用来存放预定义的SQL语句以及映 射元数据等。 如果一个应用程序只访问一个数据,则只需要创建一个全局的SessionFactory实例。 Session接口 Session是Hibernate用应用最频繁的接口。Session也被称为持久化管理器。它负责管理所有的持久化相关的操作。 第 15 页 共 37 页 Session的特点: 1、 单线程,非共享的对象。现成不安全,在设计软甲架构时,应该避免多个线程共享 同一个Session实例。 2、 Session实例是轻量级的,它的创建和销毁不需要消耗太多的资源。可以为每个请 求分配一个Session实例,在每次请求过程中及时创建和销毁Session实例。 3、 Session有一个缓存,它存放当前工作单元加载的对象。Session的缓存被称为 Hibernate的第一级缓存。 Transaction接口 Transaction接口是Hibernate框架的事务接口。它对底层的事务接口做了封装,包括:JDBC API和JTA。这样,使得Hibernate应用可通过一致的Transaction接口来声明事务边界,这有助于应用程序在不同的环境和容器中移植。 Query和Criteria接口 它们是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程。Query包装了一个HQL(Hibernate Query Language)查询语句;而Criteria接口完全封装了基于字符串形式的查询语句,比Query更加面向对象,Criteria接口擅长于执行动态查询。 Hibernate映射的数据类型 基本数据类型的映射 Hibernate映射类型 Java类型 integer或int long short byte float double big_decimal character string boolean yes_no true_false int或java.lang.Integer long或java.lang.Long short或java.lang.Short byte或java.lang.Byte float或java.lang.Float double或java.lang.Double java.math.BigDecimal char或java.lang.Character java.lang.String boolean或java.lang.Boolean boolean或java.lang.Boolean boolean或java.lang.Boolean 标准SQL类型 INTEGER BIGINT SMALLINT TINYINT FLOAT DOUBLE NUMERIC CHAR(1) VARCHAR BIT CHAR(1) CHAR(1) 第 16 页 共 37 页 日期和时间数据类型的映射 Hibernate映射类型 Java类型 date time timestamp calendar calendar_date java.util.Date或java.sql.Date java.util.Date或java.sql.Time java.util.Date或java.sql.Timestamp java.util.Calendar java.util.Calendar 标准SQL类型 DATE TIME TIMESTAMP TIMESTAMP DATE 二进制和大对象映射类型 映射类型 binary text serializable clob blob Java类型 byte[] java.lang.String 实现java.io.Serializable接口的类 java.sql.Clob java.sql.Blob 标准SQL类型 CLOB MySQL TEXT Oracle BLOB CLOB BOLB COLB BLOB VARBINARY或BLOB BLOB VARBINARY或BLOB BOLOB CLOB BLOB TEXT BLOB JDK映射类型 Hibernate映射类型 Java类型 class locale timezone currency java.lang.Class java.util.Locale java.util.TimeZone java.util.Currency 标准SQL类型 VARCHAR VARCHAR VARCHAR VARCHAR Hibernate的关联映射—双向一对多 实体类 Message类》》》》》 一 private Integer messageId; private String title; private String content; private String writer; private String writeDate; private Set reverts = new HashSet(0); Revert类》》》》》 多 private Integer revertId; private String content; private String writer; private String writeDate; private Message message; 第 17 页 共 37 页 数据库表 message表 [messageID] [int] NOT NULL, [title] [varchar](50) NOT NULL, [content] [varchar](400) NULL, [writer] [varchar](20) NOT NULL, [writeDate] [varchar](25) NULL, revert表 [revertID] [int] NOT NULL, [content] [varchar](400) NULL, [writer] [varchar](20) NOT NULL, [writeDate] [varchar](25) NULL, [messageID] [int] NOT NULL, ORM映射文件 Message.hbm.xml 1、 从POJO对象看 双向一对多 “一”的一方有“多”的一方的set集合 “多”的一方有“一”的一方的实体类 2、 从配置文件看 双向一对多 “一“的一方有 3、 inverse属性,表示反转,默认值为false;设置为true时,表示由对方管理关联关系,自 己放弃管理,设置在 4、 cascade属性,级联删除;一般在 有的操作都进行级联;none,对所有的操作都不进行级联;save-update,执行更新操作时级联;delete,执行删除操作时级联。 第 18 页 共 37 页 Hibernate查询 参数查询 from Room room where room.Roomtype.typeName like '%标%' HQL支持where子句,支持like关键字,也支持“%”、“_”通配符, from Room room where room.roomtype.typeName like ? query.setString(0, \"标\"); Query类提供了setString()、setLong()、setDouble()、setDate()等用户设置不同类型参数值的方法。设置参数时:必须保证每个占位符都设置了参数值;下标从0开始。 String hql=\"from Room room where room.roomtype.typeName like :typeName\"; query.setString(\"typeName\",\"%标%\"); 命名参数采用“:参数名”的格式定义,HQL语句中支持“>、<、=、>=、<=、<>”和“is null”、“and”、“or”、“not”、“in”、“between”。 分页查询 Query query=session.createQuery(hql); int pageSize=5;//每页显示数据条数 int pageNo=1;//页数 query.setFirstResult(pageSize*(pageNo-1)); query.setMaxResults(pageSize); 统计函数 HQL支持count()、min()、max()、avg()函数。 Criteria查询 Criteria描述 Criteria查询,又称对象查询,采用面向对象的方式封装查询条件,并提供了Restrictions等类做辅助。 使用Criteria首先创建Criteria对象,与创建Query对象的语法很相似,但需要传入的参数是对应实体类的类型对象。然后使用Restrictions对象的静态方法构造查询条件,并添加进Criteria对象中。 例: Criteria c=session.createCriteria(Room.class); c.add(Restrictions.like(\"number\", \"1\",MatchMode.ANYWHERE)); 第 19 页 共 37 页 c.add(Restrictions.ge(\"roomId\", 30)); System.out.println(c.list().size()); Criteria查询的组成 1、 Criteria接口:代表一个查询,它是一个查询条件的容器,通过它的add()方法向其实力 中添加查询条件。 2、 Criterion接口:代表一中面向对象的查询条件,它是实例是作为Criteria接口的add()方 法的参数二添加到Criteria实例中的。 3、 Restrictions类:用来创建查询条件Criterion实例的工具类。她提供了一系列的静态方法 用来设定查询条件并作为Criterion实例返回。 HQL与Criteria的查询条件限定符的对比 HQL >= > <= < = <> is null is not null between值1 and 值2 not between 值1 and 值2 in(值1 , 值2…) not in(值1 , 值2…) and or not like Criteria Restrictions.ge() Restrictions.gt() Restrictions.le() Restrictions.lt() Restrictions.eq() Restrictions.ne() Restrictions.isNull() Restrictions.isNotNull() Restrictions.between() Restrictions.not(Restrictions.between()) Restrictions.in() Restrictions.not(Restrictions.in()) Restrictions.and() Restrictions.or() Restrictions.not() Restrictions.like() Restrictions.ilike()不区分大小写的匹配 Hibernate延迟加载 Hibernate默认采用延迟加载的情况 1、 当调用Session的load()方法加载一个实体时,会采用延迟加载。 2、 当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。 3、 当Session加载某个实体时,会对这个实体所单端关联(one-to-one,many-to-one)的另一 个实体对象采用延迟加载。 第 20 页 共 37 页 关闭延迟加载 1、 在加载单个实体,如果不需要延迟加载,就可以使用Session的get()方法。 2、 当Session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即 加载。这是可以在映射文件中针对这个集合的配置元素( 3、 当Session加载某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载, 就可以在映射文件中针对这个单端关联的配置元素(one-to-one、 Hibernate缓存管理 Hibernate中提供两级缓存,第一级别的缓存是Session级别的缓存,它是数据事务范围的缓存。第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存,这个级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 一级缓存管理 Session级别的缓存由Hibernate自动管理,一般情况下无需进行干预。当程序调用Session的CRUD方法以及调用查询接口的list()、iterate()或filter()等方法时,如果Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到Session缓存中。当Hibernate清理缓存时(默认是提交事务的时候)Hibernate会根据缓存中对象的状态变化来同步数据库中的数据状态。在关闭Session时,会清空Session缓存中的所有对象。 Session提供两个手动管理这一级缓存的方法。 1、 evict(Object obj):从缓存中清除指定的持久化对象。 2、 clear():清空缓存中所有持久化对象。 二级缓存管理 第二级别的缓存是SessionFactory级别的缓存,使用过程如下: 1、 执行条件查询的时候,总是发出一条“select * fro table_name where …”(选择所有字段) 这样的SQL语句查询数据库,一次获得所有的数据对象。 2、 把获得的所有数据对象根据ID放入到二级缓存中。 3、 当Hibernate根据ID访问数据库对象的时候,首先从Session级缓存中查;查不到,如 果配置了二级缓存,那么从二级缓存中查;还没查到,在查询数据库,吧结果按照ID放入到二级缓存。 4、 删除、更新和增加数据的时候,同事会更新到二级缓存中。 Hibernate的二级缓存策略是针对于ID查询的缓存策略,对于条件查询则毫无作用 适合存放到二级缓存中的数据有如下四种: 1、 很少被修改的数据。 2、 不是很重要的数据,允许出现偶尔并发的数据。 第 21 页 共 37 页 3、 不会被并发访问的数据。 4、 参考数据,指的是供应用参考的常量数据,它的实力数目有限,它的实例会被许多其他 类的实例引用,它的实例极少或者从来不会被修改。 常用的缓存插件 Hibernate的二级缓存是一个插件,下面是集中常用的缓存插件。 1、 EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate 的查询缓存提供了支持。 2、 OSCache:课作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供丰富 的缓存数据过期策略,对Hibernate的查询提供了支持。 3、 SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。 4、 JBossCache:可作为群集范围内的缓存,支持事务性并发访问策略,对Hibernate的查询 提供了支持。 Spring Spring概述 Spring是一个开源框架,为企业应用程序开发的复杂性提供一种轻量级解决方案。主要提供:基于控制反转(Inversion of Control, IOC)的轻量级容器、面向切面编程(Aspect-programming,AOP)支持、优秀的Web MVC框架、多种持久层技术的整合、多种Web MVC框架的整合等。 Spring特点 1、 低侵入式设计,对程序代码污染极低。 2、 于应用服务器设计。可以是用户的程序运行在不同开发商的JavaEE应用服务器中。 3、 Spring的依赖注入(Dependency Injection)使应用程序组件之间的依赖达到松散耦合。 4、 Spring的面向切面编程降低了应用程序的业务逻辑和服务之间整合的复杂性。 依赖注入 依赖注入(Dependency Injection,DI)也叫控制反转(Inversion of Control,IoC) 控制反转的概念:当某个Java对象需要(依赖)另一个Java对象时,不是自身直接创建依赖对象,而是由实现IoC的容器来创建,并将它注入需要这个依赖对象的Java对象中。 第 22 页 共 37 页 注入方式 Spring管理的基本单元式Bean,在Spring的应用中,所有的组件都是一个个的Bean,它可以是任何的Java对象,Spring负责创建这些Bean的实例,并管理器生命周期。Spring框架是通过其内置的容器来完成Bean的管理的,Bean在Spring的容器中生存着,使用时只需要通过它提供的一些方法从其中获取即可。 Spring的容器有两个接口:BeanFactory和ApplicationContext,这两个接口的实例被称为Spring上下文,他们都是来产生Bean的工厂,及负责创建和管理Bean。 实际应用中,一般使用ApplicationContext,它是BeanFactory的子接口,具有比BeanFactory更完善的功能。其实现类常用的是org.springframework.context.support包中的三个类: 1、 ClassPathXmlApplicationContext:主要用来从类路径(CLASSPATH)中的xml文件载入 上下文定义信息。 2、 FileSystemXmlApplicationContext:从指定的文件系统路径中的xml文件载入上下文定义 信息。 3、 XmlWebApplicationContext:从Web系统中的xml文件中载入上下文定义信息。 在创建Spring上下文实例时,可以使用“*”通配符加载多个相同部分名称的配置文件。 ApplicationContext context=new ClassPathXmlApplicationContext(\"application*.xml\"); 第 23 页 共 37 页 装配Bean Spring容器要管理的Bean是通过xml文件来配置的。Spring容器的管理内容都是来自xml配置文件的指定。通过在xml配置文件中指定要装配的Bean和它的一些特征属性,可以让Spring容器按要求去管理对应的Bean。 手动装配Bean 2、 class:指定该Bean的全限定名,即该Bean的完整的类名 3、 name:为该Bean指定一到多个别名。可以包含特殊字符 4、 autowire:指定该Bean的属性的装配方式 5、 scope:指定该Bean的存在范围 6、 init-method:指定该Bean的初始化方法 7、 destroy-method:指定该Bean的销毁方法 8、 abstract:指定该Bean是否为抽象类。如果是抽象类,则Spring不为它创建实例 9、 parent:指定该Bean的父类标识或别名 自动装配Bean Spring能自动装配Bean的属性,仅设置要自动装配的bean中的autowire属性即可。有以下几种值可选: 1、 no:不使用自动装配。Bean的属性值必须通过显式装配定义,这是默认值 2、 byName:根据属性名进行装配 3、 byType:根据属性类型自动装配 4、 Constructor:跟byType类似,采用构造器注入方式 5、 autodetect:根据Bean的内部结构,首先尝试Constructor来自动装配,然后再使用byType 方式。 第 24 页 共 37 页 指定Bean的存在范围 在装配Bean时,可以通过bean元素的scope属性来指定Bean的生存范围,有以下之可选: 1、 singleton:一个Spring IoC容器中的一个Bean定义一个实例,单例模式,这是默认值 2、 prototype:每次对Bean请求时都会创建一个新的Bean实例 3、 request:在HTTP请求范围内 4、 session:在HTTP Session范围内 5、 global_session:全局HTTP Session,只有在protlet上下文中有效 AOP AOP是Aspect-Oriented Programming的简称,即面向方面编程; 特定功能的方面代码在AOP概念中又称为“通知(Advice)”,通知分为前置通知、后置通知、环绕通知和异常通知。 前置通知是在方法执行前自动执行的通知;后置通知是在方法执行后自动执行的通知;环绕通知能力最强,可以在方法执行前执行通知代码,可以决定是否还调用目标方法;异常通知是方法抛出异常时自动执行的方面代码。 例: 配置文件 public class LogAdvice implements MethodBeforeAdvice { @Override public void before(Method method, Object[] arg1, Object arg2) throws Throwable { System.out.println(\"记录日志开始\"); System.out.println(\"调用方法:\" + method.getName()); } 第 25 页 共 37 页 } 使用AOP IRoomDao biz = context.getBean(\"roomService\", IRoomDao.class); System.out.println(biz.findAll().size()); 事务 Spring 1.X的方式 1、 PROPAGATION_MANDATORY,表示当前方法必须运行在一个事务上下文中,否则就 抛出异常。 2、 PROPAGATION_NAVER,表示当前方法不应该运行在一个事务中,否则就抛出异常。 3、 PROPAGATION_REQUIRES_NEW,表示当前方法必须运行在自己的事务里。 4、 PROPAGATION_SUPPORTS,表示当前方法不需要事务处理环境,但如果有一个事务正 在运行的话,这个方法也可以运行在这个事务里。 第 26 页 共 37 页 继承实现 增加命名空间的声明: Struts2核心包 struts2-core-X.jar xwork-X.jar ognl-X.jar freemarker-X.jar commons-logging-X.jar commons-fileupload.jar 框架的核心库文件,用来支持Struts2核心功能 框架的核心库文件,用来支持Struts2核心功能 框架的核心库文件,用来支持框架使用的表达式语言OGNL 框架的核心库文件,用来支持freemarker视图 框架辅助工具类,使框架可以支持各种第三方日志组件 框架辅助工具类,使框架可以支持各种文件上传 Web.xml文件 Struts2 (2.1版) 1、 Struts2框架中,Action不需要继承自任何类和接口 2、 只需要具有一个execute()方法,作为对请求信息进行处理并返回结构的接口 3、 包含的属性参数提供setter/getter方法,以便框架对属性进行参数进行操作 ActionContext ActionContext类位于com.opensymphony.xwork2.ActionContext中,提供了一系列相 关方法用于访问保存在ServletContext、HttpSession、HttpServletRequest中的信息,并将其封装在Map中。 方法 public static ActionContext getContext() public Map getParameters() public Map getApplication() public Map getSession() 说明 获得ActionContext对象 从请求对象中获取请求参数 获取ServletContext中保存的Attribute 获取HttpSession中保存的Attribute Action处理多个请求 方法一: public String login() { } public String error(){ } return ERROR; return SUCCESS; 第 29 页 共 37 页 http://localhost:8080/s2fileuploat/login!error.action 方法二: 从实现代码来说,就是一个普通的Java组件,只需要实现一个com.opensymphony.xwork2.interceptor.Interceptor的接口。在Struts2框架中,Action是封装了业务处理行为的对象,是众多Action中抽取出来的公共行为的实现。 ActionInvocation实例负责整个Action对象的执行,出了包含Action对象、的引用外,还包含Action组件运行相关的其他重要信息的引用,如请求对象、Action组件关联的Result对象等。它就好比一个Action组件运行的一个容器。 当框架接收到请求时,它首先根据请求的URL创建一个Action实例,并将其复制给一个新创建的ActionInvocation实例,然后框架根据配置文件或声明的架构信息将相应的的引用传递给ActionInvocation实例。 创建 public class LoginInter implements Interceptor { } public void destroy() { } public void init() { } public String intercept(ActionInvocation arg0) throws Exception { } System.out.println(\"intercept...\"); return arg0.invoke(); System.out.println(\"init...\"); System.out.println(\"destroy...\"); ActionInvocation的常用方法 方法 getInvocationContext().getApplication() 说明 获取Web应用的全局信息 第 30 页 共 37 页 getInvocationContext().getSession() getInvocationContext().getParameters() getInvocationContext().getValueStack() getAction() getResult() 获取Session 获取请求参数信息 获取ValueStack对象 获取Action组件实例 获取结果视图 配置 AliasInterceptor ActionAutowiringInterceptor ChainingInterceptor 名字 alias autowiring chain 说明 在不同请求之间将请求参数在不同名字间转换,请求内容不变 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用 将错误从ActionContext中添加到Action的属性字段中 使用配置的name,value来设置cookies 清除HttpSession 自动的创建HttpSession 提供不同的调试用的页面来展现内部数据状况 在后台实行Action,同时将用户带到一个中间的等待页面 将异常定位到一个页面 StrutsConversionErrorInterceptor CookieInterceptor ClearSessionInterceptor CreateSessionInterceptor DebuggingInterceptor ExternalReferencesInterceptor ExecuteAndWaitInterceptor ExceptionMappingInterceptor conversionError cookie clearSession createSession debugging externalRef execAndWait exception 第 31 页 共 37 页 FileUploadInterceptor I18nInterceptor LoggingInterceptor ModelDrivenInterceptor fileUpload i18n logger modelDriven 提供文件上传功能 记录用户选择的locale 输出Action的名字 如果一个类实现了ModelDriven,将getModel得到的结果放在ValueStack中 如果一个Action实现了ScopedModelDriven,则这个会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部 将请求中的参数设置到Action中 如果Action实现了Preparable,则该调用Action类的prepare方法 充struts.xml文件中将内容设置到队形的Action中 将Action状态存入session和application的简单方法 提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问 输出Action执行的时间 通过Token来避免表单重复提交 和TokenInterceptor一样,不过重复提交时将请求的数据存储在Session中 使用action-validation.xml文件中定义的规则进行内容校验 调用Action的validation方法,一旦有异常,重定向到input结果视图 添加了checkbox自动处理代码,将没有选中的checkbox的内容色划定为false 通过参数激活profile 确定用户是否具有JAAS指定的Role,否则不予执行 ScopedModelDrivenInterceptor scopedModelDriven ParametersInterceptor ActionMappingParametersInteceptor PrepareInterceptor params actionMappingParams prepare StaticParametersInterceptor ScopeInterceptor staticParams scope ServletConfigInterceptor servletConfig SessionContextAutowiringInterceptor sessionAutowiring TimerInterceptor TokenInterceptor timer token TokenSessionStoreInterceptor tokenSession AnnotationValidationInterceptor validation DefaultWorkflowInterceptor MessageStoreInterceptor CheckboxInterceptor ProfilingActivationInterceptor RolesInterceptor JSONValidationInterceptor workflow store checkbox profiling roles jsonValidation 第 32 页 共 37 页 AnnotationWorkflowInterceptor MultiselectInterceptor annotationWorkflow multiselect 标记库 Struts2标记库的特性: 1、 与表现层技术无关,与Struts1的标记库不同的是,Struts2的标签不依赖于任何表现层 技术,也就是说,Struts2提供的大部分标签,可以在各种表现层技术中使用,包括最常用的JSP页面,以及Velocity和FreeMarker等。 2、 采用OGNL作为表达式语言,放别对于Web请求处理结果数据的操作。 3、 通过主题和模板提供更强大的显示支持。 4、 提供对AJAX的强大支持。 结果视图 结果类型 结果类型 dispatcher Chain freemarker httpheader redirect redirectAction stream velocity xslt plainText 说明 用来转向JSP页面,这是默认的结果类型 构造成一条动作链 处理FreeMarker模板 控制特殊HTTP行为的结果类型 重定向到一个URL 重定向到一个Action 想浏览器发送InputStream对象 处理Velocity模板 处理XML/XLST模板 显示原始文件内容 输入校验 Struts2通过校验validation和workflow来实现对输入信息的校验工作。这两个都位于默认的栈内。其中validation根据校验规则声明调用内置实现校验工作,并负责维护创建一个字段相关的错误信息列表,而workflow负责检查此错误信息列表,如果存在错误信息,则返回Action组件相关的input结果视图,并在返回的视图中显示相关的错误信息。因此对于声明了校验的Action组件,必须定义一个名为input的结果视图,否则当校验失败时,将得到一个“Action组件没有定义input result”的错误信息。 第 33 页 共 37 页 校验规则文件实现 只需要在Action所在的包中加入“Action名字-validation.xml”文件即可 在JSP页面中必须加入: 程序代码实现 Action继承自com.opensymphony.xwork2.ActionSupport类,重写validate()方法,使用this.addFieldError(\"loginId\用户名不能为空\");在程序代码中指定校验出错信息 Struts2框架内置校验器 名称 required requiredstring int stringlength date long short double expression fieldexpressio email url visitor conversion regex conditionalvisitor 作用 要求指定字段必须不为空 要求字段值必须非空,且床度大于0 要求字段的整数值必须在指定范围内 要求被校验字段的长度必须在指定范围之内 要求字段的日期必须在指定范围内 要求字段的Long值必须在指定范围内 要求字段的Short值必须在指定范围内 要求字段的Double值必须在指定范围内 要求满足指定的表达式要求 要求字段的值满徐表达式要求 要求字段的值如果非空,则必须是有效E-mail地址 要求字段的值如果非空,则必须是有效URL地址 按照指定的校验规则文件来校验Action的复合属性 检查指定的字段在类型转换中是否出现错误 检查指定的字段是否匹配一个正则表达式 要求指定字段值满足的表达式要求,则调用Vistor校验器 自定义校验器 自定义校验器步骤: 1、 定义校验器实现类,实现类需要实现validate接口,另外,框架提供了几个相关的类, 因此最简单字段校验器直接继承FieldValidatorSupport,非字段校验器直接继承ValidatorSupport。 2、 注册校验器类,在项目的根目录下创建一个名为validators.xml的配置文件,然后添加自 第 34 页 共 37 页 定义校验器的注册信息,参照com.opensymphony.xwork2.validator下名为default.xml的配置文件。 AJAX 概述 Ajax是Asynchronous JavaScript and XML的英文缩写,Ajax采用客户端脚本与Web服务器交换数据,由于它是一种异步通信模式,客户端不需要等待服务器的响应,因此不必采用导致中断交互的完整页面刷新,就可以动态地更新Web页面。 AJAX应用通信框架 Ajax通信与HTTP不同,它是依靠JavaScript对象XMLHttpRequest是想的一种一部通信模式。脚本主要包括获取XMLHttpRequest对象以便与后台服务器程序进行通信,以及设置处理服务器返回XML文档的方法。 获取XMLHttpRequest对象 function newXMLHttpRequest() { } var xmlRequest = false; if (window.XMLHttpRequest) { } return xmlRequest; xmlRequest = new XMLHttpRequest(); try { } xmlRequest = new ActiveXObject(\"Msxml2.XMLHTTP\"); try { } xmlRequest = new ActiveXObject(\"Microsoft.XMLHTTP\"); xmlRequest = false; } catch (e2) { } catch (e1) { } else if (window.ActiveXObject) { 处理相应返回的XML文档 function getReadyStateHandler(req, responseXmlHandler) { 第 35 页 共 37 页 } return function() { } if (req.readyState == 4) { } if (req.readyState == 200) { } responseXmlHandler(req.responseXML); alert(\"HTTP error\" + req.status + \":\" + req.statusText); } else { DOJO 概述 Dojo是最古老的框架之一,于2004年9月开始开发,这个项目的目标是充分利用XHR和DHTML工具包,并把重心放在可用性问题上,Dojo只有几个文件,不用处理XHR的建立,值需调用bind方法,并传入想调用的URL和回调方法即可,还可以使用bind方法来提交整个表单。 Dojo支持向后和向前按钮的特性使其独树一帜,尽管这个特性不一定在每个浏览器上都能用,但注册一个回调方法,在用户单击了向后按钮或向前按钮时触发这个方法。Dojo还提供了changeURL标记,力图解决使用Ajax所固有的书签问题。 DOJO标记 自动请求: JSON/JSON-RPC 概述 JSON(JavaScript Object Notation)一种简单的数据格式,比XML更轻巧。JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。 JSON提供了一种更适合Ajax应用的标准数据交换格式。JSON是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。 DWR 概述 利用DWR(Direct Web Remoting),能从JavaScript直接调用Java方法,就好像它们是浏览器本地的方法一样。但是后台为Java。 第 37 页 共 37 页 因篇幅问题不能全部显示,请点此查看更多更全内容、
Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务