zoukankan      html  css  js  c++  java
  • 第五章 Java Web

    5.1 Servlet 与 Jsp
    5.1.1 页面请求与工作流程
    • 用户通过浏览器链接访问
    • 浏览器接受请求,发送到相应的服务器
    • 服务器接受请求寻找资源
    • 服务器返回资源
    • 把资源以HTTP的格式响应给客户端
    • 浏览器解析展现给用户看
    5.1.2 GET和POST的区别
    • GET
      • GET有大小限制,通常1024Byte
      • 链接会看到传输的数据,不安全
    • POST
      • 相反
    5.1.3 什么是Servlet
    •  Servlet 是采用Java语言编写的服务器端程序,它运行于Web服务器中的Servlet容器中,其主要功能是提供请求/响应的Web服务模式,可以生成动态的Web内容,而这正是HTML所不具备的功能。
    • 有点
      • 较好的移植性。
      • 执行效率高。
      • 功能强大。
      • 使用方便。
      • 可扩展性强。
    • 响应步骤
      • 1) 用户通过单击一个链接来向Servlet发起请求。
      • 2) Web服务器接收到该请求后,会把该请求交给相应的容器来处理,当容器发现这是对Servlet发起的请求后,容器此时会创建两个对象: HttpServletResponse 和HttpServletRequest。
      • 3) 容器可以根据请求消息中的URL消息找到对应的Servlet,然后针对该请求创建一个单独的线程,同时把第2)步中创建的两个对象以参数的形式传递到新创建的线程中。
      • 4) 容器调用Servlet的service( )方法来完成对用户请求的响应,service( )方法会调用doPost()或doGet()方法来完成具体的响应任务,同时把生成的动态页面返回给容器。
      • 5) 容器把响应消息组装成HTTP格式返回给客户端。此时,这个线程运行结束,同时删除第2)步创建的两个对象。
                        
     
     
     
    • 与CGI相比 
      • CGI每次新建一个进程
      • Servlet每次创建一个线程
    5.1.5 Servlet的生命周期控制器
    • 加载。容器通过类加载器使用Servlet类对应的文件来加载Servlet。
    • 创建。通过调用Servlet的构造函数来创建一 个Servlet 实例。
    • 初始化。通过调用Servlet的init( )方法来完成初始化工作,这个方法是在Servlet已被创建但向客户端提供服务之前调用的,需要注意的是,init( )方法只会被调用一次。
    • 处理客户请求。Servlet 一旦被创建后,它就可以为客户端提供服务了。每当有新的客户请求到来时,容器都会创建--个新的线程来处理该请求,接着会调用Servlet的service()方法来完成客户端的请求,当然,service()方法会根据请求的method属性值的不同调用决定是调用doGet()方法还是调用doPost()方法来完成具体的响应。
    • 卸载。容器在卸载Servlet之前需要调用destroy( )方法,让Servlet自己释放其占用的系统资源,一旦destroy 方法被调用,容器就不会再向这个Servlet发送任何请求消息了。如果容器需要这个Servlet,那么就必须重新创建并初始化一个实例。需要注意的是,destroy( )方法只会被调用一次。
    5.1.6 JSP
    • JSP就是嵌入Java代码的HTML
    5.1.7 JSP与Servlet
    • 相同点
      • JSP是特殊的Servlet
      • JSP最终要转换成Servlet来运行。
    • 不同点
      • Servlet没有内置对象,JSP有九大内置对象
        • 输入输出对象:out对象、response对象、request对象
        • 通信控制对象:pageContext对象、session对象、application对象
        • Servlet对象:page对象、config对象
        • 错误处理对象:exception对象
    5.1.8 MVC模式
    • Model 模型
    • View 视图
    • Controller 
    • 优点
      • 低耦合性
      • 高重用性和可适用性
      • 较低的生命周期成本
      • 部署快速
      • 可维护性
      • 有利于软件工程化管理
    5.1.9 Servlet中forward 与 redirect 区别
    • forward 是跳转 (推荐)
      • 地址栏不变
      • 服务器内部重定向
    • redirect 是重定向
      • 地址栏变
      • 客户端重定向
    5.1.10 JSP内置对象
    • Servlet没有内置对象,JSP有九大内置对象
    • 输入输出对象:out对象、response对象、request对象
    • 通信控制对象:pageContext对象、session对象、application对象
    • Servlet对象: page对象、config对象
    • 错误处理对象:exception对象
     
    5.1.11 request对象主要有哪些方法
     
    5.1.12 JSP有哪些动作
    • 6个基本动作
    • jsp:include。用来在页面被请求时引用一个文件。
    • jsp:useBean。用来寻找或者实例化一个JavaBean。
    • jsp:setProperty。用来设置已经实例化的Bean对象的属性。
    • jsp:forward。用来把请求转到一个新页面。
    • Jsp:plugin。用于在浏览器中播放或者显示一个对象。
    5.1.13 JSP中include指令与include动作的区别
    • 指令
      • 使用方式
      • 编译时被调用
    • 动作 (更适合JSP)
      • 使用方式
      • 运行时被调用
    • 其他差异
      • 当使用include动作时,在页面中声明的变量不可用于另一文件,除非将变量放置在request、session、 application 作用域中;而在使用include指令时,当前页面和被包含页面可以共享变量。
      • 当使用include指令时,新生成的JSP页面要符合JSP语法要求,应该避免变量名的冲突;而在使用include动作时,不存在变量名冲突问题。
      • include指令会修改被包含文件,但不会立即生效,除非修改主页面或删除主页面的类;而include动作修改了被包含的文件,会立即生效。
    5.1.14 会话跟踪技术有哪些
    • 四种会话跟踪技术
      •  page。代表与一个页面相关的对象和属性。一个页面由一个编译好的JavaServlet类(可以带有任何的include指令,但是没有include动作)表示。这既包括Servlet又包括被编译成Servlet的JSP页面。
      • request。代表与Web客户端发送的一一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件。
      • session。代表与用于某个Web客户端的一一个用户体验相关的对象和属性,一个Web会话可以也经常会跨越多个客户端请求。
      • application。 代表与整个Web应用程序相关的对象和属性,这实质上是跨越多个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
     
    5.1.15 Web开发中如何指定字符串的编码
    • 推荐UTF-8编码
    • 转码方式
    5.1.16 什么是Ajax
    • Ajax (Asynchronous JavaScript and XML,异步JavaScript与XML)
    5.1.17 cookie和session有什么区别
    • cookie它是有Web服务器保存在用户浏览器上的小文件,可以包含用户的信息。
    • session是指用来在客户端与服务器之间保持状态的解决方案以及存储结构。
    • 区别
      • cookie是客户端的浏览器上; session保存在服务器上。
      • cookie安全性不够,客户端别人可以轻易查看。 session在服务器端安全。
      • cookie性能更好。session保存在服务器上访问量增大会减小性能。
      • cookie单个大小不能超过4KB,大部分浏览器最多保存20个cookie, session不存在这样的问题。
    • 用户登陆信息等重要信息存放在session中,其他的保存咋cookie中;
    5.2 J2EE 与 EJB
    5.2.1 什么书J2EE
    • J2EE是Java平台企业版的简称。
      • 构件
        • 客户端构件 
          • Applets
          • Application Clients
        • 服务器构件 
          • Web构件(Servlet和JSP)
          • EJBs两种
      • 服务
        • Service API
        • 运行时服务
      • 通信 由容器提供的支持协作构件之间的通信。
    5.2.2 J2EE中常用的术语有哪些
    • Web服务器
      • 指驻留在Internet上的计算机程序。
      • 主流两大Web服务器
        • IIS(Internet Information Services)
        • Apache Http Server
    • Web容器
      • Web容器也被叫做Web应用服务器,它是一种服务程序,用来给运行在其中的程序(例如Servlet、JSP等)提供一个运行的环境。
      • 常见Web同期
        • Tomcat
        • JBoss
    • EJB容器
      • EJB容器是一个服务器端容器。是J2EE应用的业务层的技术标准只要满足J2EE规范的组件就能在EJB容器中运行。这个组件会被高效的管理。
    • Applet容器
      • Applet容器是一个客户端容器,包含的组件为Applet。Applet是一种嵌入在浏览器中的轻量级的客户端,Web页面无法充分地表现数据或者应用界面是就会启用它。无法使用J2EE的更总Service和API。
    • Application Client容器
      • Application Client 容器是一个客户端容器,包含的组件为Application Client。相对Applet而言,Application Client是一种较重量级的客户端,它能够使用J2EE的大多数Service和API。
    • JNDI
      • JNDI全称为Java Naming and Directory Interface,译为Java命名和目录接口。它提供了一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可使用名称来访问对象。通过使用JNDI,一方面实现了快速查找和定位分布式应用程序的功能,另一-方面使得程序有了更好的可扩展性。由于JNDI是独立于目录协议的,因此应用还可以使用JNDI访问各种特定的目录服务,例如轻量级目录访问协议( Lightweight Directory Access Protocol, LDAP)、网络数据服务( Network Data Service, NDS)和域名系统( Domain Name System ,DNS)等。
    • JMS
      • JMS全称为Java Message Service,译为Java消息服务。它是一个Java平台中面向消息中间件的API,主要实现各个应用程序之间进行异步通信,包括创建、发送、接收、读取消息等。通过使用JMS,能够最大限度地提升消息应用的可移植性。JMS既支持点对的消息通信,也支持发布/订阅式的消息通信。余他过游资的使处出行然↔浙治93新∩国州论关企包来备控
    • JTA
      • JTA全称为Java Transaction API,译为Java事务服务。它提供各种分布式事务服务(在多个网络计算机上进行数据访问和更新),为J2EE实现分布式事务处理提供了重要的支撑。
    • JAF
      • JAF的全称为JavaBeans Activation Framework,译为JavaBeans激活框架。它是一个专用的数据处理框架,提供了一种统一处理不同数据格式的方法。
    • RMI
      • RMI全称为Remote Method Invocation,译为远程方法调用,它主要用于远程调用服务,通过它,可以像调用本地函数一样调用另外一-台计算机上运行的程序,而不需要关心远程计算机所使用的系统或所使用的语言,也就是说,只要满足一定的规范,就可以实现在不同的计算机上进行函数调用。
    5.2.3 EJB有哪些不同的类别
    • EJB是Enterprise JavaBean的简称,相当于分布式组件对象模型( Distributed Component Object Model, DCOM), 它是一种服务器端组件体系结构,用于开发和部署多层的、分布式的以及面向对象的应用系统的跨平台体系结构。
    • EJB可以分为以下3种类型:
      • Session Bean (会话Bean)
        • Session Bean用来实现服务器端的业务逻辑,同时协调Bean之间的交互。Session Bean 仅存在于客户应用与服务器交互的时间段内,Session Bean中的数据是不保存在数据库中的。根据Session Bean是否有状态又可以分为两种类型: Stateless Session Bean ( 无状态的Session Bean)和Stateful Session Bean ( 有状态的Session Bean)。
      • Entity Bean(实体Bean)
        • Entity Bean主要是资料组件,代表数据库中的记录,因此它与数据库中的数据有着相同的生存周期,也就是说,只要数据库中的数据存在,Entity bean就一直存在。;此外,Entity Bean还可以被多个客户应用共享。Entity 有两种对数据持久化的处理方式:①CMP ( ContainerManaged Persistence," 容器管理的持续性)。构件的相关数据库操作由容器自动完成,不需要在bean中编写数据库操作的代码。②BMP ( Bean Managed Persistence, Bean 管理的持续性)。构件的相关数据库操作由开发人员在代码中通过JDBC编程来实现。这两种EntityBean的形态不同,但是目的相同,二者的主要的区别在于维护资料的角色,CMP是由EJB Vontainer来维护,而BMP则是由Bean自行维护资料的一致性。
        • Entity Bean- -共有3种状态: no - state、pooled 和ready。其中,no一state状态表示Bean实例还没有被创建;pooled状态表示Bean实例已经被创建,但还没有和一个EJBObject关联起来; ready状态表示与EJB Object关联起来,若断开关联,则回到pooled状态。
      • Message Driven. Bean ( 消息驱动Bean)
        • Message Driver Bean用来处理异步消息,一-般不是由用户来调用的。它的调用方式为:当有异步消息发送到某个Message Driver Bean后,容器会负责调用Message Driver Bean的OnMessage( )方法来处理这个异步请求。
    5.2.4 EJB与JavaBean有什么异同
    • EJB是基于Java的远程方法调用( Remote Method Invocation, RMI)技术,可以被远程访问(跨进程、跨计算机),但它必须被部署在Webspere、WebLogic 等容器中。EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。
    • Java Bean是可复用的组件,理论上讲,任何一个Java类都可以是一一个Bean。但通常情况下,由于Java Bean是被容器(例如Tomcat)所创建的,因此Java Bean应具有一个无参的构造器,另外,通常JavaBean还要实现Serializable接口用于实现Bean的持久性。JavaBean实际上相当于微软COM模型中的本地进程内COM组件,是不能被跨进程访问的。
     
    5.2.5 EJB有哪些生命周期
    • Stateless Session Bean
      • No State(无状态)
      • Method Ready(准备方法)
    • Stateful Session Bean
      • No State(无状态)
      • Method Ready(准备方法)
      • Passivated(顿化)
    • Entity Bean
      • No State(无状态)
      • Pooled State(池状态)
      • Method Ready(准备方法)

    5.2.6 EJB的角色有哪几种
    • EJB将开发部署EJB应用的任务划分到了6个不同的角色,它们分别为Enterprise Bean Provider (企业级组件开发者)、Application Assembler (应用组合者)、EJB Deployer (EJB部署者)、EJB Server Provider ( EJB服务器提供者)、EJB Container Provider (EJB容器提供者)和System Administrator (系统管理员)。
    5.2.7 EJB的开发流程是怎样的
    • 3个非常重要的3个对象:Remote接口、Home接口和Bean类。
    • 步骤 简略
      • 定义Romote接口。
      • 编写一个接口即成javax.ejb.EJBHome。
      • 编写bean类的实现类(SessionBean)。
      • 在项目的META-INF目录中创建两个文件:ejb-jar.xml和jboss.xml。
      • 把上述EJB项目发布到JBoss容器上后,客户端就可以调用该EJB对象了。
    5.2.8 EJB3.0与EJB2.0有哪些不同之处
    • EJB 3.0与EJB 2.0最大的不同之处就在于EJB 3.0通过元数据、去掉部署文件、省去对Home接口的使用等方法简化了开发的工作。此外,在访问数据库的方法上也有所不同: EJB2.0在访问数据库时使用的是Entity Bean,而EJB 3. 0用的是JPA ( Java Persistance API) 。
    5.2.9 EJB容器有哪些作用
    • 所有RJB否必须运行在EJB容器中,EJB容器是Enterprise JavaBean的拥有者,它负责管理运行在其中的bean。
    5.2.10 EJB规范规定EJB中禁止的操作有哪些
    • 具体而言,EJB 规范规定EJB中禁止的操作有以下8种:
      • 不能操作线程和线程API ( 线程API指非线程对象的方法,例如notify、wait 等)。
      • 不能操作AWT ( Abstract Windowing Toolkit,抽象窗口工具包)。
      • 不能实现服务器功能。
      • 不能对静态属性存取。
      • 不能使用I0操作直接存取文件系统。
      • 不能加载本地库。
      • 不能将this作为变量,不能将this返回。
      • 不能循环调用。
    5.2.11 Web服务器与Web应用服务器有什么区别
    • Web服务器是可以向发出请求的浏览器提供文档的程序。
    • 应用服务器提供访问业务员逻辑的途径以供客户端应用程序使用。
    • Web服务器一般是通用的,而应用古物器一般是专用的,例如Tomcat只是处理Java应用程序。
    5.2.12 什么是Web Service
    • Web Service是一种基于网络的分布式模块化组件,它可以将可调用的功能发布到Web.上以供应用程序访问(应用程序可以使用标准的Web协议和数据格式来访问它)。
    • 基于的协议
      • 1)可扩展可标记语言( eXtensible Markup Language, XML)。
      • 2)Web服务描述语言( Web Service Description Language, WSDL)。
      • 3)通用描述、发现与集成服务( Universal Description ,Discovery and Integration, UDDI)。
      • 4)简单对象存取协议(Simple Object Access Protocol,SOAP)。
    • Web Service优点
      • 完好的封装性。
      • 松耦合。
      • 高度客户操作性。
      • 动态性。
    5.2.13 SOAP与REST有什么区别
    • SOAP是一个严格定义的信息交换协议,用于在Web Service中把远程调用和返回封装成机器可读的格式化数据,SOAP数据使用XML数据格式,定义了一整套复杂的标签,来描述调用的远程过程、参数、返回值和出错信息等内容。
    • REST ( Representational State Transfer,表述性状态转移)形式上为客户端通过申请资源来实现状态的转换,可以被看作一台虚拟的状态机。需要注意的是它只是一种软件架构风格,而不是一个具体的协议或标准,而且,它是面向资源的,甚至连服务也会被抽象成资源。
    • SOAP与REST的对比
    5.2.14 什么是XML
    • 可扩展标记语言
    • 优点
      • 实用性强。
      • 访问速度快。
      • 可扩展性好。
      • 跨平台性好。
    • 缺点
      • 数据量过大。
    • XML文档定义有两种形式: 用于验证文档
      • 文档类型定义(Document Type Define,DTD)
      • Schema
    • 解析两种方式
      • DOM
      • SAX
    5.2.15 数据库连接池的工作机制是怎样的
    • 数据库连接池负责分配、管理并释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个新的数据库连接,同时,它还负责释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接遗漏。
    5.2.16 J2EE开发有哪些调优的方法
    • 优化设计,小心使用继承,继承会导致递归。
    • 尽可能使用数据库连接池
    • 给Web容器配置合理的线程数量来处理客户端的HTTP请求。
    • 根据实际情况设置Java虚拟机中堆空间的大小。
    • 使用框架(例如Hibernate)来提高系统的效率。
    • 把一些经常被访问的Servlet或JSP缓存起来,能够减少响应时间和提高系统的性能。
    • 当在系统中使用EJB时,由于对EJB的调用是采用对象请求代理(Object Request Broker,ORB)的方式来完成的,而ORB使用了线程来处理对EJB的请求,因此,应该合理配置线程池的大小以便它能够在平均负载和高峰期都能都很好地处理EJB的请求。
    • 优化I/O性能。I/O使用不当将会造成资源竞争,降低系统性能。所以,在实际应用时,尽可能少使用System.out打印调试信息,推荐使用缓冲。
    • 优化查询。在模型设计时就应考虑冗余相对不会变化的数据,如果设计大数据量,最好能够考虑分区设计。
    • 对session进行合理管理与设置。根据实际情况对内存中可能存在的session的个数设置一个合适的值。注意:尽量减少session的大小,以降低其对内存的使用。而且,除非是在必须的情况下,否则尽量不要启用对session的持久化。同时,通过对session设置一个合理的超时时间来回收较长时间不使用的session ,也可以有效地提高系统的效率。
    5.3 框架
    表示层(web层)、业务逻辑层(service层)、数据访问层(dao层)
    MVC 模型、视图、控制器 
    5.3.1 什么是Struts框架
    • 整体采用MVC设计
    • 控制器(Controller) 包括
      • ActionServlet
      • RequestProcessor
    • Action采用配置器模式
    • 优点
      • 由于采用了MVC模式,因此它实现了表现与逻辑的分离,使得系统有较好的可扩展性。同时Struts的标记库(Taglib)包含了大量的tag,有助于提高系统的开发效率。
      • 提供了页面导航功能,使系统的脉络更加清晰。通过一一个配置文件建立整个系统各部分之间的联系,使有系统结构变得更加清晰,从而增强了系统的可扩展性与可维护性。
      • 提供了表单的验证功能,进-一步增强了系统的健壮性。
      • 提供了数据库连接池管理。
      • 提供了Exception 处理机制。
      • 支持国际化。
    • 缺点
      •  Taglib中包含了大量的tag, ,对于初学者而言,开发难度比较大。
      • 2Struts 开发中包含了许多XML格式的配置文件。一方面,这些配置文件不易调试;另一方面,大量的XML文件也不便于管理。
      • Struts 只能支持Web应用程序的开发。
      • Struts 的Action不是线程安全的,因此Action类用到的所有资源都必须进行同步。
      • 单元测试不方便。由于Action与Web层的紧耦合,导致其非常依赖于Web容器,给单元测试带来了不便。
      • 部署烦琐。当转到表示层时,需要配置forward,例如,如果有10个表示层的JSP文件,则需要配置10个Struts。此外,当目录、文件变更后,需要重新修改forward,而且每次修改配置之后,还需要重新部署整个项目,对于Tomcate等服务器,还必须重启服务器。
      • 对Servlet的依赖性过强。Struts 处理Action时必需要依赖ServletRequest和ServletResponse,摆脱不了对Servlet容器的依赖。
    5.3.2 Struts框架响应客户请求的工作流程是什么
    • 在Struts框架中,控制器主要是ActionServlet,但是对业务逻辑的操作则主要由Action、ActionMapping、ActionForward 等组件协调完成。其中,Action 扮演了真正的控制逻辑实现者的角色,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。
    • 对于采用Struts 框架的Web应用而言,在Web应用启动时,会加载并初始化ActionServlet, ActionServlet 从struts - config. xml文件中读取配置信息,并把它们存放到ActionMappings对象中。具体而言,当ActionServlet接收到一个客户请求时,执行如下流程:
    • 1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
    • 2)如果ActionForm实例不存在,就创建-一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
    • 3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate( )方法。
    • 4)如果ActionForm的validate( )方法返回null或返回-一个不包含ActionMessge 的ActionErrors对象,就表示表单验证成功。
    • 5) ActionServlet 根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果对应的Action 实例不存在,就先创建一个实例,然后调用Action 的execute()方法。
    • 6) Action 的execute( )方法返回一个ActionForward对象,ActionServlet 再把客户请求转发给ActionForward 对象指向的JSP组件。
    • 7) ActionForward 对象指向的JSP组件生成动态页面,返回给客户。对于以上流程中的步骤4),如果ActionForm的validate( )方法返回一个(包含一个)或多个ActionMessage的ActionErrors 对象,就表示表单验证失败,s此时,ActionServlet 将直接把请求转发给包含客户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute方法了。
     
    5.3.3 Struts框架的数据验证可分为几种类型
    • 表单验证
    • 业务逻辑验证
      • 业务逻辑验证由Action处理,如果用户在表单中输人的姓名为“Hehao”,那么按照本应用的业务规则,不允许输入“Hehao”,因此将生成业务逻辑错误。需要注意的是,在Action里面完成数据验证,实际上就是在execute()方法前面增加数据验证的部分代码。
     
    5.3.4 Form Bean的表单验证流程是什么
    • 在Form Bean 的表单验证主要有以下4个步骤:出米dmothenn/ 用深济n 15
      • 1) 用户提交HTML表单后,Struts框架会自动把表单数据组装到ActionForm Bean中。
      • 2) Struts 框架调用ActionForm Bean的validate( )方法进行表单验证。
      • 3) 如果validate( )方法返回的ActionErrors对象为null,'或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。
      • 4) 如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts 框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件中,视图组件通过< html : errors >标签把request范围内的ActionErrors 对象中包含的错误消息显示出来,提示用户修改错误。
    5.3.5 在Struts配置文件中,<action>元素包括哪些属性和子元素
    5.3.6 ActionForm Bean的作用有哪些
    • Action一般用于控制业务逻辑的处理,例如增加、删除、修改、查询等,ActionForm Bean用于封装用户请求的参数。当接收到页面输人的数据后,会首先保存在ActionForm Bean中,然后在Action里面调用逻辑层的代码来处理这些数据。
    • ActionForm Bean 的作用有如下3点:
      • 1) ActionFormBean本质上也是一种JavaBean,是专门用来传递表单数据的数据传递对象( DATA Transfer Object, DTO)。 除了具有一些JavaBean的常规方法外,ActionForm Bean 还包含一些特殊的方法,例如用于验证HTML表单的数据以及将其属性重新设置为默认值。
      • 2) Struts框架利用ActionFormBean来进行View组件和Controller组件之间表单数据的传递。
      • 3) Struts框架把View组件接收到的用户输人的表单数据保存在ActionFormBean中,然后把它传递给Controller组件,Controller 组件可以对ActionForm Bean中的数据进行修改,JSP 文件使用Struts 标签读取修改后的ActionForm Bean的信息,重新设置HTML表单。
     5.3.7 ActionForm的执行步骤有哪些
    • ActionForm的执行步骤有以下几点:
      • 1)检查Action的映射,确定Action中是否已经配置了对ActionForm的映射。
      • 2)根据name属性查找FormBean的配置信息。
      • 3)检查Action的Form Bean的使用范围,确定在此范围下是否已经有此Form Bean的实例。假如当前范围下已经存在此Form Bean的实例,而且对当前请求来说,是同一种类型的话,那么就重用。否则,就重新构建-一个Form Bean的实例。
      • 4) Form Bean的reset( )方法被调用。示< moita >
      • 5)调用对应的setter( )方法,对状态属性赋值。
      • 6)根据validate的属性选择调用方法。如果validate 的属性被设置为true,那么就调用Form Bean的validate() 方法。如果validate( )方法没有返回任何错误,控制器将ActionForm作为参数传递给Action实例的execute()方法并执行。
    5.3.8 forward与global-forward有什么区别
    •  

    5.3.9 Struts如何实现国际化
    5.3.10 Struts1与Struts2有哪些区别
    5.3.11 什么是IoC
    • 控制反转(Inverse of Control,IoC),有时也被称为依赖注入,是一种降低对象耦合关系的设计思想。
    • 上层接口不再依赖下层接口,由调用者来决定被调用者。对象不会被显式地调用,而是根据需求通过IoC容器(例如Spring)来提供。
    • 优点:
      • 1) 通过IoC容器,开发人员不需要关注对象如何被创建的,同时增加新类也非常方便,只需要修改配置文件即可实现对象的“热插拔”。
      • 2) loC 容器可以通过配置文件来确定需要注入的实例化对象,因此非常便于进行单元测试。
    • 缺点
      • 1) 对象是通过反射机制实例化出来的,因此会对系统的性能有一定的影响。
      • 2) 创建对象的流程变得比较复杂。
     
    5.3.12 什么是AOP
    • 面向切面编程(Aspect-Oriented Programming,AOP)是对面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态地修改模型以满足新的需求。
    • aop配置文件
    5.3.13 什么是Spring框架
    • Spring是一个J2EE的框架,这个框架提供了对轻量级IoC的良好支持,同时也提供了对AOP技术非常好的封装。

    • Spring工作原理图
    • 优点:
      • 1)在使用J2EE开发多层应用程序时,Spring有效地管理了中间层的代码,由于Spring采用了控制反转和面向切面编程的思想,因此这些代码非常容易进行单独测试。
      • 2)使用Spring有助于开发人员培养一个良:好的编程习惯:面向接口编程而不是面向类编程。面向接口编程使得程序有更好的可扩展性。
      • 3)Spring对数据的存取提供了一个一致的框架(不论是使用JDBC还是O/R映射的框架,例如Hibernate或JDO)。
      • 4)Spring通过支持不同的事务处理API(如JTA、JDBC、Hibermate等)的方法对事务的管理提供了- -致的抽象方法。
      • 5)使用Spring框架编写的大部分业务对象不需要依赖Spring。
    5.3.14 什么是Hibernate
    • Hibernate是一个开放源代码的对象关系映射( Object Relation Mapping,ORM,一种用来完成对象模型到关系模型的映射技术)框架,它不仅可以运行在J2EE容器中,也可以在J2EE容器外运行。它对JDBC进行了非常轻量级的对象封装,所以任何可以使用JDBC的地方都可以用Hibernate来替代。Hibernate 实现了Java 对象与关系数据库记录的映射关系,简化了开发人员访问数据库的流程,极大地提高了软件的开发效率。
    • Hibernate的使用过程如下:
      • 1)应用程序通过Configuration类读取配置文件并创建SessionFactory对象。
        • SessionF actory sessionFactory = new Configuration( ). configure( ). buildSessionfactory( );
      • 2)通过SessionFactory生成-一个Session对象。
        • Session session = sessionF actory. openSession( ) ;
      • 3)通过Session对象的beginTrancation( )方法创建-一个事务。
        • Transaction t = session. beginTransaction( );
      • 接着可以通过Session 对象的get()、load( )、save( )、update( )、delete( )和saveOrUpdate()等方法实现数据的加载、保存、更新和删除等操作;也可以通过session生成-一个Query对象,然后利用Query对象执行查询操作;最后通过commit( )方法或rollback( )方法完成事务操作。
      • 4)在完成所有持久化操作与事务操作后需要关闭Session与SessionFactory。
    • 优点
      • 1)提高开发效率。
      • 2)使得开发可以完全采用面向对象的思想,不需要关心数据库的关系模型。
      • 3)使用Hibernate开发的系统有很好的可移植性,可以很容易地实现不同数据库之间的移植而不需要关系不同数据库SQL语句的差异。
      • 4)支持透明持久化,Hibernate 的API没有侵入性,当保存一个对象时,这个对象不需要继承Hibernate中的任何类和实现任何接口。虽然如此,但Hibernate只适用于针对单-一对象简单的增、删、查、改,而对于批量的修改/删除的场合,则不适用,这也是OR框架的弱点,所以,当要使用数据库的特定优化机制时,不适合使用Hibernate。
    • 使用Hibernate时如何让提高性能
      • 1)延迟加载。当Hiberate从数据库获取某一个对象数据、获取某一个对象的集合属性值时或者获取某一个对象所关联的另一个对象时,并不会立即从数据库中把数据加载到对象中,而是通过建立一一个代理对象,把这个对象的属性都设置为默认值,只有当这些数据在被使用时才会从数据库中去加载对应的数据,使用这种方法有助于提高Hiberate的性能。
      • 2)缓存技术。Hibermate 中提供了一级缓存与二级缓存,合理的利用缓存也有助于提高系统的性能,为了避免不合理的利用缓存导致内存的过度消耗降低系统的性能,可以通过合理配置缓存的参数(例如配置缓存可以加载数据的个数)来避免这个问题。
      • 3)优化查询语句。通过优化查询语句来提高系统的性能。
    •  Hibernate中怎样实现类之间的关系? (例如一-对多、多对多关系)
      • 类之间的关系主要体现在表之间的关系,它们都是对对象进行操作,程序中把所有表与类都映射在一起,它们通过配置文件中的many- to -one、one- to- many、many - to- many来进行配置。
    5.3.15 什么是Hibernate的二级缓存
    • 一级缓存使用的场合如下:当使用Session查询数据时,首先会在该Session内部查找该对象是否存在,若存在,则直接返回,否则,就到数据库中去查询,并将查询的结果缓存起来以便后期使用。一级缓存的缺点就是当使用Session来表示一次会话时,它的生命周期较短,而且它是线程不安全的,不能被多个线程共享,因此,在实际使用时,对效率的提升不是非常明显。
    • 鉴于以上原因,二级缓存的概念被引入了张二级缓存用来为Hibernate配置-~种全局的缓存,以便实现多个线程与事务共享。在使用了二级缓存机制后,当查询数据时,会首先在内部缓存中去查找,如果不存在,接着在二级缓存中查找,最后才去数据库中查找。
    • 二级缓存一-般适用于以下几种情况:
      • 1)数据量较小。如果数据量太大,缓存太多,会消耗大量内存,造成内存资源短缺,从而降低系统的性能。
      • 2)对数据的修改较少。如果进行大量的修改,就需要频繁地对缓存中数据与数据库中的数据进行同步,而这也会影响系统的性能。
      • 3)不会被大量的应用共享的数据。如果数据被大量线程或事务共享,多线程访问时的同步机制也会影响系统的性能。
      • 4)不是很重要的数据。如果查询的数据非常重要(例如财务数据),对数据的正确性要求非常高,最好不要使用二级缓存。
    5.3.16 Hibernate中的session的update()和saveOrUpdate()、load()和get()有什么区别
    • Hibernate的对象有3种状态,分别为:瞬时态( Transient)、持久态( Persistent)和脱管态(Detached)。
    • saveOrUpdate( )方法同时包含了save( )和update( )方法的功能。Hibernate会根据对象的状态来确定是调用save( )方法还是调用update( )方法:若对象是持久化对象,则不进行任何操作,直接返回;若传人的对象与session中的另一一个对象有相同的标识符,则抛出一个异常;若对象的标识符属性(用来唯一确定-一个对象)在数据库中不存在或者是二个临时值,则调用save()方法把它保存到数据库中,否则,调用update()方法更新对象的值到数据库中。鉴于此,在使用时,若能确定对象的状态,则最好不要调用saveOrUpdate( )方法,这样有助于提高效率,例如,如果能够确定这个对象所对应的值在数据库中肯定不存在,那么就可以直接调用save()方法。
    • get()方法与load()方法都是用来通过从数据库中加载所需的数据来创建一个持久化的对象,它们主要有以下几个不同点:
      • 1)如果数据库中不存在该对象,load( )方法会抛出一个ObjectNotFoundException异常,而get()方法则会返回null。
      • 2) get()方法首先查询Session内部缓存,若不存在,则接着查询二级缓存,最后查询数据库;而load()方法在创建时会首先查询Session内部缓存,如果不存在,就创建代理对象,实际使用数据时才查询二级缓存和数据库,因此load()方法支持延迟加载(对象中的属性在使用时才会加载,而不是在创建对象时就加载所有属性)。
      • 3) get( )方法永远只返回实体类,而load()方法可以返回实体类的代理类实例。
      • 4)get()方法和find()方法都是直接从数据库中检索,而load()方法的执行则比较复杂:首先查找Session的persistent Context中是否有缓存,若有,则直接返回;若没有,则判断是否是lazy。如果不是,直接访问数据库检索,查到记录返回,查不到抛出异常;若是lazy,则需要建立代理对象,对象的initialized属性为false, target 属性为null。在访问获得的代理对象的属性时检索数据库,若找到记录,则把该记录的对象复制到代理对象的target.上,并将initialized置为true;若找不到,就抛出异常。
    5.3.17 Hibernate有哪些主键生成策略
    1. increment:适用于short,int,long作为主键.不是使用的数据库自动增长机制.
    * Hibernate中提供的一种增长机制.
    * 先进行查询 :select max(id) from user;
    * 再进行插入 :获得最大值+1作为新的记录的主键.
    * 问题:不能在集群环境下或者有并发访问的情况下使用.
    2. identity:适用于short,int,long作为主键。但是这个必须使用在有自动增长数据库中.采用的是数据库底层的自动增长机制.
    * 底层使用的是数据库的自动增长(auto_increment).像Oracle数据库没有自动增长.
    3. sequence:适用于short,int,long作为主键.底层使用的是序列的增长方式.
    * Oracle数据库底层没有自动增长,想自动增长需要使用序列.
    4. uuid:适用于char,varchar类型的作为主键.
    * 使用随机的字符串作为主键.
    5. native:本地策略.根据底层的数据库不同,自动选择适用于该种数据库的生成策略.(short,int,long)
    * 如果底层使用的MySQL数据库:相当于identity.
    * 如果底层使用Oracle数据库:相当于sequence.
    6. assigned:主键的生成不用Hibernate管理了.必须手动设置主键.
    5.3.18如何实现分页机制
    5.3.19 什么是SSH
    • 使用SSH框架开发的系统从职责上可以分为4层:表示层、业务逻辑层、数据持久化层和域模块层。
    • 其中,Struts 实现了MVC模式,它对ModeI、View 和Controller 的各个模块都提供了支持。
    • 由于SSH提供了很多有用的框架,因此能显著提高项目的开发效率。其主要优点如下:
      • 1) Struts实现了MVC模式,这种模式的特点是对应用程序进行了很好的分层,使得开发人员只需要把开发重点放在业务逻辑的开发即可。不仅如此,Struts 还提供了许多非常有用的标签库,这些标签能够显著地提高开发人员的开发效率。
      • 2) Spring可以用来管理对象。使用Spring的IoC容器,把对象之间的依赖关系交给Spring,降低组件之间的耦合性,让开发人员更专注于业务逻辑的开发。Spring 采用了IoC 和AOP的思想,使得它具有很好的模块化,程序与可以根据需求使用其中的一个模块。Spring 还提供了一些非常有用的功能,例如事务管理等。
      • 3) Hibernate 作为一个轻量级的持久性框架,实现了高效的对象关系映射,使得开发可以完全采用面向对象的思想,而不需要关心数据库的关系模型。使用Hibernate开发的系统有很好的可移植性,可以很容易地实现不同数据库之间的移植,而不需要关心不同数据库SQL语句的差异。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    C# 将信息打印/输出到VS的“输出”窗口
    USB、UART、232串口通信和转换芯片
    UART/USB你必须知道的
    摄像头捕获视频流软件AMCAP使用教程(视频采集捕获处理媒体制作微型软件)
    Qt 线程关闭
    Qt 5种标准对话框及使用方法详解 QFileDialog、QcolorDialog、QFontDialog、QinputDialog、QMessageBox
    OpenCV 机器人手眼标定(九点标定法)
    如何打开svs文件
    OpenCV cvEstimateRigidTransform函数详细注解
    OpenCV 几何图像变换-cv::getAffineTransform(仿射变换)
  • 原文地址:https://www.cnblogs.com/Sungc/p/9313705.html
Copyright © 2011-2022 走看看