JavaEE知识点总结

JavaEE简介

JavaEE 容器和组件
Applet Container 浏览器
applet
App Container Java应用
Web Container 网页服务器
JSP Servlet
EJB Container 业务服务器
EJB

Evolution of Enterprise Application Framework

Single-tier 单层的
Mainframe-based 基于主机(大型机)
直接终端访问大型机

Two-Tier
肥客户端方案,后端存储数据,客户端处理几乎全部的事情
数据库独立性,但安全性和耦合性都较高

Three-Tier (RPC based)
RPC远程过程调用
中间的服务器负责绝大部分任务

Three-Tier (Remote Object based)
业务逻辑和数据都被封装在对象中
客户端持有接口层,然后通过调用远程方法进行操作

使用远程对象模型的有:
CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)
RMI (Remote Method Invocation,远程方法调用)
DCOM (Distributed Component Object Model,分布式组件对象模型)

Three Tier (Web Server)
使用http协议
数据模型通过动态创建技术生成

JavaEE包含的技术
JavaSE - 基础
RMI/IIOP - RMI提供远程方法调用 IIOP可以和其他语言中的CORBA交互
JDBC - Java数据库连接
Java Messaging Service JMS - Java消息服务是一个Java平台中关于面向消息的中间件
JNDI - JNDI(Java Naming and Directory Interface, Java命名和目录接口)
Servlet
JavaServer Pages JSP
JavaMail
JavaBeans Activation Framework - JAF JAF是一个专用的数据处理框架, 它用于封装数据, 并为应用程序提供访问和操作数据的接口
Enterprise JavaBeans - JavaEE服务器端组件模型
Java Transaction API - JTA(Java Transaction API)允许应用程序执行分布式事务处理
Java TransactionService - JTS 是一个 组件事务监视器
Connector Architecture - J2EE 连接器架构(JCA) 注重的是将Java程序连接到非Java程序和软件包中间件的开发
ECPerf - JavaEE可伸缩性和性能测试的规范

JAXR(Java API for XML Registries)提供了与多种类型注册服务进行交互的API
JAXP(Java API for XML Processing,意为XML处理的Java API)
JMX(Java Management Extensions,即Java管理扩展)

Servlet 基础

Servlet是网页服务层,也是服务端的入口
是一组框架API,扩展http服务器
一个Servlet可以被添加到url映射

Servlet的优势
没有CGI的限制
丰富的第三方库和工具
更好的性能和可伸缩性
平台服务器无关性
更安全

JSP 页面
基于文本的网页模板,可以被编译成servlet

JSP 技术
HTML内嵌Java代码,可以通过用户标签进行扩展
基于Servlet技术

JSP的优势
内容和显示逻辑分离
开发更加简便
支持软件和组件重用
能够在源文件被修改时自动重新编译
平台独立

什么时候使用Servlet而不是JSP
扩展性强的页面,需要支持新的显示方式的页面
会生成不仅仅是html标签的页面时
仅仅是用来返回非html数据的

GET requests:
User entered information is appended to the URL in a query string
Can only send limited amount of data
…/servlet/ViewCourse?FirstName=Sang&LastName=Shin
POST requests:
User entered information is sent as data (not appended to URL)
Can send any amount of data

执行过程:
客户端向Web容器发送http请求
Servlet自动载入,装入后就一直留在内存中
Web容器把Http请求转给servlet,每个用户请求拥有独立的线程
Servlet容器将Http请求转换为HttpServletRequest结构,并传入构建好的HttpServletResponse,调用Sevlet的service(…)方法
Servlet处理该请求,返回对应的数据
Servlet容器将数据返回客户端

javax.servlet包和javax.servlet.http包提供编写servlet所需的类和接口。
所有servlets必须实现接口javax.servlet.Servlet,在该接口中定义了Servlet生命周期的各种方法。
可通过继承javax.servlet.GenericServlet创建一个与协议无关的一般的Servlet。
通过继承javax.servlet.http.HttpServlet创建基于HTTP协议的servlet。

javax.servlet.GenericServlet class
init():读取初始化的配置信息。
destroy():用于释放本servlet所占用的所有资源,如线程或数据库连接,并将数据保存到文件或者数据库中。
service():抽象方法
javax.servlet.http.HttpServlet class
service():具体方法
该方法根据HTTP请求,调用doGet(…)或doPost(…),用于接收来自Client的请求、获取请求中的数据,编写响应的标题、获取响应的输出流以及编写响应的数据。
开发人员不用覆盖这个方法
doGet(), doPost(), doXxx()
处理HTTP GET, POST请求。
开发人员覆盖这些方法,完成相应功能。

service和doGet doPost的不同点
向service()方法传的参数的类型为generic requests and responses:
service(ServletRequest request, ServletResponse response)
向doGet()ordoPost()方法传的参数的类型为HTTP requests and responses:
doGet(HttpServletRequest request, HttpServletResponse response)
doPost(HttpServletRequest request, HttpServletResponse response)

以post方式提交:提交内容不会显示,没有长度要求。
以get方式提交:提交的内容会显示出来
地址栏中的长度只有4k~5k,如果传递大数据,则无法使用;
默认的提交方式。

Servlet的生命周期方法
init() 该servlet第一次被使用时被调用
destroy() 析构时被调用,往往是服务器关闭时

处理http响应的步骤:
填写headers
设置response的属性
获取其输入流
写入返回数据

Scope Objects 范围对象

作用时间较长的对象,生命周期往往超过servlet
Web context, session, request, page // 这个page是怎么回事

请求(request):HttpRequest
响应(response):HttpResponse
会话(session):HttpSession
上下文(context):ServletContext

请求相应的相关接口
ServletRequest:代表了Servlet的请求, HttpServletRequest是他的子接口;
ServletResponse:代表了Servlet的响应, HttpServletResponse是他的子接口
ServletInputStrean:Servlet的输入流类
ServletOutputStream:Servlet的输出流类
ServletRequestWrapper: ServletRequest的实现
ServletResponseWrapper:ServletReponse的实现
HttpServletRequest:代表了Http的请求,继承了ServletRequest接口
HttpServletResponse:代表了Http的响应,继承了ServletResponse接口
HttpServletRequestWrapper: HttpServletRequest的实现
HttpServletResponseWrapper: HttpServletResponse的实现

request的主要用途
这个接口中最常用的方法就是获得请求中的参数,这个请求中的参数是客户端表单中的数据。
也可以获取客户端正在使用的通信协议,产生请求并且接受请求的远端主机名和其IP地址等信息;
getParameterNames()
获取客户提交的表单中所有参数名的集合
getParameter(ParamName)
获取参数名为ParamName的参数值,如果请求中没有这个参数,返回null。
getParameterValues(ParamName)
获取参数名为ParamName的参数值的集合,这个值往往是checkbox或者select控件提交的,获得的值是一个String数组,如果请求中没有这个参数,返回null。
getInputStream()
得到一个输入流用来读取二进制数据

response的主要用途
response的主要功能是服务器端用于向客户端发送消息,例如HTTP的头信息和Cookie信息等:
设置HTTP头信息;重定向:客户端跳转(request信息会丢失);设置Cookie等;
setContentType(” text/html;charset=gb2312 “);
设置文档输出类型
ServletOutputStream out=response.getOutputStream();
获取字节形式的输出流
PrintWriter out = response.getWriter();
获取字符输出流
sendRedirect(String location);
URL重定向,把响应发送到另一页面或者Servlet进行处理;
encodeURL(String url);
使用URL和一个SessionId重写这个URL;
setCharacterEncoding(String charset);
设置响应的字符编码类型。

会话跟踪技术

用户授权 隐藏表单域 URL重写 Cookie
会话跟踪的用户授权方法在用户登录之后跟踪用户。用户授权技术不允许未经授权的用户访问网站上的某些资源
将会话跟踪字段的隐藏表单域添加到 HTML 页面,但是不会显示在客户端浏览器中=
URL(统一资源定位) 重写技术:当客户端不接受Cookie的时候,可以使用URL重写机制将一个唯一的会话 ID 添加到 URL 结尾,以标识该会话。URL改写是一种好的解决方案,特别是在用户禁用Cookie的情况下,它是最佳解决方案.
Cookie就是服务器暂存放在浏览者电脑里的资料,好让服务器用来辨认其计算机。

Cookie的工作原理

客户的HTTP 请求到达服务器。
服务器创建Cookie,并作为响应头域的一部分返回用户。
浏览器收到包含Cookie 的响应后,会把Cookie 的内容用“关键字/值” 对的形式写入到一个客户端专为存放Cookie 的文本文件中。
浏览器会把Cookie 及随后产生的请求发给相同的服务器,
服务器可以再次读取Cookie 中存放的Cookie

Cookie一般用于保存用户的访问状态,当用户再次访问同一个网站的时候,浏览器会将这些Cookie信息发送回服务器,使得服务器能够恢复用户上一次的访问状态。用Cookie的根本目的是为了在用户访问期间实现不同页面之间的数据传输,以解决HTTP无状态的问题。

Cookie 用于存储 Web 服务器发送给客户端的信息。服务器通过设置响应标题中的 Set-Cookie 方法来发送 cookie
Name – 指定 Cookie 的名称
VALUE – 指定 Cookie 名称的值
Domain – 指定 Cookie 有效的 URL
Max-age – 指定 Cookie 的生命周期(以秒表示)
secure – HTTP 指定 Cookie 是否可以在 HTTP 上交换

Session

Session:从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称作一个会话。 Session是web技术中提供的一项高级会话跟踪技术。
Session对象主要用于纪录独有的个人信息,保存用户的各种信息在不同的页面之间传递。
Session对象能和客户建立起一一对应关系依赖于客户的浏览器是否支持Cookie。
这种高级接口建立在Cookie或URL重写之上,如果浏览器不支持或者禁用Cookie时就会自动改用URL重写。

Session的生命周期

当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象,并为此对象分配一个String类型的id号;
JSP引擎同时将这个id号发送到客户端,存放在客户端的Cookie中;
Session信息保存在容器里(服务器端);
不同的客户,Session对象不同,id号不同,session ID实际上是打开保险箱( Session信息)的钥匙;
客户关闭浏览器,服务器端该客户的session对象被取消。

Servlet协作

将HTTP请求从一个servlet转发到另一个servlet或jsp的过程叫做请求转发(request dispatching)
ServletRequest接口:提供了访问RequestDispatcher对象的方法。
RequestDispatcher接口:可以从一个客户端接收请求,并能够把请求发送到任何服务器资源(比如servlet、HTML文件或者JSP文件)的对象。
RequestDispatcher接口的主要作用是由servlet到jsp页面或servlet页面的跳转。
接口中有以下两个方法:
include(ServletRequest, ServletResponse);
Forward(ServletRequest, ServletResponse);

RequestDispatcher使用场合

MVC开发模式中: (重要,必须掌握)
考虑问题:现在从Servlet 中要传递的值只使用一次,如果把此值存放在session 范围之中,则此内容只要用户一直与服务器保持连接,则此块内存空间要一直被占用,那么性能会怎么样?性能会很低。
解决方法:RequestDispatcher 接口,是用于进行服务器端跳转的接口。
用法:
RequestDispatcher rd = null ;
rd = req.getRequestDispatcher(“mvcdemo.jsp”) ;
rd.forward(req,resp) ;

rd.forward(request,response)方法:将响应职责传递给另一个Servlet进行处理。
注意:必须在输出还未提交到客户端时才可以调用。
rd.include(request,response)方法:包含其它的Servlet或静态资源。

Servlet Request
包含全部的从客户端发过来的数据
Client sent parameters 客户端参数
Object-valued attributes 对象值
Locales 地区
Client and server 客户端和服务器信息
Input stream 数据流
Protocol information 协议信息
Content type 内容的类型和编码
If request is made over secure channel (HTTPS) 是否启用https

Why do we need HTTP response status code?
Forward client to another page 重定向
Indicate the resource is missing 表示资源丢失
Instruct browser to use cached copy 通知浏览器使用缓存
还有很重要的功能吧?
例如文件的断点续传,使用代理等,当然核心还是用来表示异常状态和正常状态

100-199 Informational
200-299 Successful
300-399 Redirection
400-499 Request Error
500-599 Server Error

JSP

JSP和Servlet的关系
JSP多用于表示层,用于显示数据, Servlet多用在事务逻辑层,用于处理商务逻辑。
JSP是脚本语言,要编译成servlet,Servlet是直接可执行的字节码。
Jsp页面可以跳转到servlet页面, servlet 页面可以跳转到Jsp页面,他们共同协作完成一项任务
MVC模式(后面介绍)

JSP标签

### JSP指令(directives) JSP指令代表向JSP容器传送的信息,它不会产生输出。常用的指令包括: page指令、 include指令 JSP指令语法格式:

JSP内置对象 (重要)

Implicit Declared Objects(内建对象)
JSP中存在若干个内置对象,这些对象可以不经过显示声明便可以直接引用,也不需要专门的代码创建其实例,在程序设计中可以直接使用这些对象。
从本质上讲,JSP的这些内置对象其实都是由特定的Java类所产生的,由在服务器运行时根据情况自动生成。

request javax.servlet.ServletRequest 表示用户请求 可以获取用户的传入参数等
response javax.servlet.ServletResponse 生成用户端输出响应 设置返回类型和状态等
pageContext javax.servlet.jsp.PageContext 页面上下文对象
session javax.servlet.http.HttpSession 会话对象 存放Session数据
application javax.servlet.ServletContext 应用程序对象 用来在服务器生存期管理对象
out javax.servlet.jsp.JspWriter 输出对象 用来向输出流输出内容
config javax.servlet.ServletConfig 配置对象 配置
page java.lang.Object 页面对象 可以在页面范围内保存数据
exception java.lang.Throwable 异常对象 用来抛出异常

JSP的动作元素

动态包含一个jsp页面或静态页面
跳转到其他jsp/servlet页面
加载一个插件
使用一个JavaBean
获取JavaBean的属性
设置JavaBean的属性

两种include的区别

<%@ include file=“uri”%>
静态的包含页面:不管其文件内容如何只是将页面中的内容包含进来。
执行时:先将所有内容包含进来一起处理完之后再将所有的内容发送给客户端。

动态包含页面:能自动区分所包含的是静态页面还是动态页面;
执行时:
如果资源为静态资源则直接将资源包含处理,与<%@include file=“uri”%>相同。
如果请求资源为动态,则先各自处理资源,之后将处理后的结果包含在一起。

在JSP中使用JavaBean的优点

使用JavaBean有如下优点
程序易于开发维护:
实现业务逻辑的封装,使事务处理和显示互不干扰,使得JAVA 开发人员专注于具体业务的开发,而JSP 开发人员,专注于显示效果的开发。
提高代码的可复用性:
对于通用的事务处理逻辑,如数据库操作等可以封装在JavaBean中,通过调用JavaBean的属性和方法可以快速进行程序设计。
通过内建的共享机制使得java对象的共享变得更加简单易用。

JSP中使用JavaBean


jsp:useBean动作将特定范围内Java的对象实例和一个在脚本中给定的ID相关联,一个JavaBean有一个唯一的id,执行jsp时,javaBean被实例化为对象,对象名称即id名称。
语法格式如下:

Web Application Development and Deployment Steps

编写web页面逻辑处理代码
创建静态资源
创建web.xml配置文件
构建项目,打包war
部署项目到web服务器中

EJB

Common tasks of Enterprise Applications
EJB的核心任务
并发控制
持久化数据
事务管理
资源管理

术语:
Home interface
Java interface that contains creation/location methods
包含本地方法和构造方法
EJB Home object
Sometimes called factory object
工厂对象,负责创建其他
Remote interface
Java inteface that contains business methods
包含业务逻辑的Java接口
EJB object
Implemented by the container
EJB容器的实现
EJB Home object and EJB object are sometimes called proxy objects(代理对象)

Types of beans

Session Beans
Stateful session beans
Stateless session beans
Entity Beans
Bean Managed Persistence (BMP)
Container Managed Persistence (CMP)
Message Driven Beans
JMS
JAXM

Session Beans

Use Session beans to model process or control objects specific to a particular client.
用来建模过程或者特殊客户端的控制对象
例如,工作流,过程,任务,管理活动等

Stateless Session Beans
短暂的、瞬时的,不会保存用户状态

Stateful Session Beans
拥有客户的完整生命周期,保存用户状态

Entity Beans

Entity Beans的生命周期和客户端无关,拥有数据持久化功能
在大多数情况,数据会被同步到数据库中
Entity bean instance has unique identifier called primary key
Entity Bean实例都有主键,主键可以是任意类

CMP (Container Managed Persistence) 容器负责持久化
不需要考虑编写数据库同步代码

BMP (Bean Managed Persistence) Bean手动管理持久化
那么数据的同步交由开发者完成

Message Driven Beans

Message Driven Beans不能被客户直接调用
当消息到达的时候被激活
无本地和远程接口

JDBC(Java Dadabase Connectivity)

JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统

数据持久化

把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。
持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。

JDBC直接访问数据库
JDO技术
第三方ORM工具,如Hibernate, ibatis 等

JDBC接口(API)

包括两个层次:
面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。

JDBC编程步骤

  1. Load DB-specific JDBC driver(上载数据库驱动)
  2. Get a Connection object (获得连接数据库的对象)
    Define the Connection URL
    Establish the Connection
    If the driver does not match, null is returned
    If a connection is not made, a SQLException is thrown
  3. Get a Statement object (获得一个Statement对象)
  4. Executing a SQL (执行SQL)
    Execute queries and/or updates
  5. Processing the results (处理结果集)
    Read results
    Read Meta-data (optional step)
  6. Close Statement and Connection objects (关闭资源)

预编译语句PreparedStatement

当需要多次调用同一条SQL语句时,可以使用PreparedStatement接口;
PreparedStatement从Statement继承而来
PreparedStatement接口的常用方法
setXXX( )
ResultSet executeQuery(SQL )
int executeUpdate(SQL )
Statement在每次执行SQL之前都要编译解析这句SQL,而PreparedStatement只需编译一次SQL语句,就可以多次重复执行,所以总体性能上要比前者好得多。

当不直接使用SQL语句,而是调用数据库中的存储过程时,要用到CallableStatement;
存储过程语句的好处:存储过程已经把SQL编译成DBMS中可执行的代码,尽管存储过程执行的过程中需要耗费资源,但如果经常有数据在Java程序和DBMS之间传输时,使用存储过程就可显著减少传输的次数,比起用Statement逐句调用一般的SQL语句执行速度快得多。

DAO

DAO是Data Access Object数据访问接口,故名思义,数据访问就是与数据库打交道,夹在业务逻辑与数据库资源中间。
DAO模式的主要构成有:
PO包
PO对象,用于存储映射数据库表的对象,po实质上就是一个简单的JAVABEAN ;
DAO包
一个connection类:管理数据库的连接对象:
一个接口:规定对特定的数据的存取接口;
一个接口的实现类:实现具体的数据库存取操作
factory包
使用简单工厂模式,返回数据库存取的接口类型,通过其getInstance()方法获得数据库存取的实际实现类,这样在使用数据库存储对象时,只需通过factory对象获得实例即可。实现了解耦。

使用连接池

数据库连接的建立及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程序环境中,这种耗费资源的动作对系统的性能影响尤为明显。

JNDI Java命名和目录接口

命名服务和目录服务
命名服务
把名字和对象联系起来;
实际上是提供一个工具,根据名字寻找资源。例如:计算机位置,当前打印机状态,个人数据
目录服务
目录服务是对命名服务的扩展和增强,为使用属性提供了目录对象的操作
目录的内容通常形成一种类似树的分层结构
类似于数据库,可以看成一个小型的,简化的数据库

JNDI:Java Naming and Directory Interface
JNDI是一个J2EE API,提供了定位用户、机器、网络、对象和服务等的标准接口。
JNDI是一个命名和目录服务之上的桥梁,为不同目录提供一个通用接口。
JNDI接口提供了一个公共框架,通过它可以执行所有的目录操作。

JNDI由两部分构成:
客户端API (client API):
允许执行目录操作,对于所有类型的目录,它都是一样的。
服务提供者接口(Service Provider Interface, SPI):SPI是命名与目录服务供应商可插入的接口。与API正好相反,SPI允许命名和目录服务供应商在系统里安装他们自己专有的协议。

JNDI允许服务器按指定的名字处理对象;
可使用JNDI访问分布式环境中的对象;
只需要学习单一的API就可以访问各种目录服务信息;
将应用程序与协议和实现细节隔离开
可以连接不同类型的目录。

事务

事务必须服从ISO/IEC所制定的ACID原则 。
ACID代表:
Atomic 原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。
Consistent 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
Isolated 独立性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见 。
Durable 持久性:指定了事务提交时,对数据所做的任何改变都要记录到永久存储器中

一系列动作相互依赖,不可分割,必须作为一个整体来对待,称为“原子操作”;
要么都成功,要么都失败(all or none);
通过事务可以保持数据库中数据的完整性。

Struts

Struts2的核心功能是action
action映射是Struts2框架中的基本” 工作单元”。
action映射就是将一个请求URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。

在struts2中,前端页面的数据和action有两种基本对应方式:属性驱动和模型驱动。
属性驱动分为两种情况:
a、一种是基本数据类型的属性对应,称为属性驱动;
b、一种是JavaBean风格的属性对应,称为直接使用域对象。即将属性和对应的setter和getter方法从action中移出,单独做成一个域对象,这个对象用来封装这些数据,然后在action中直接使用这个对象即可。此时action中需要自己去new域对象,且需要写getter/setter方法,且在页面中name属性的值需要添加一个域对象的前缀,指明这个值对应到哪个域对象里面去。
注:struts2不需要显式new一个域对象,若没有对象,会在运行时通过反射实例化一个对象。
例如User.xxx 只有传,才会构造。User类必须要有一个无参数的构造方法,因为自动构造的时候,有可能用到;

模型驱动
基本实现方式是让action类实现ModelDriven接口,在Action类中,编写ModelDriven接口的getModel方法,此方法返回action所使用的数据模型对象。此时action中不需要编写每一个属性的getter/setter方法,仅编写数据模型对象的getter/setter方法即可,页面也不需要添加域对象的前缀。缺点是限制了一个Action对应多个数据模型的能力。(当属性和模型都能同时匹配同一个值时,模型驱动优先!)
在模型驱动模式下,将请求参数和处理结果放在模型中封装,而不是在Action的属性中!

通配符映射

随着Web应用程序的增加,所需的Action也会更多,从而导致大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的Action或者Action方法可以使用通用的样式来配置
通配符即星号(),用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用星号()来匹配任意的字符。

工作原理

一个用户的请求在Struts2框架中的处理大概分为以下几个步骤:
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

Struts2和struts1对比

Struts2是在WebWork2基础发展而来的。和struts1一样, Struts2也属于MVC框架。
但是,尽管Struts2和struts1在名字上的差别不是很大,但Struts2和struts1在代码编写风格上几乎是不一样的。那么既然有了struts1,为何还要推出struts2。主要是因为struts2有以下优点:
1> 在软件设计上Struts2没有像struts1那样跟Servlet API和struts API有着紧密的耦合,Struts2的应用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。
2> Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。
3> Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在Struts1中,如果我们要实现同样的功能,就必须向Struts1的底层实现BeanUtil注册类型转换器才行。
4> Struts2提供支持多种表现层技术,如:JSP、freeMarker、Velocity等
5> Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。
6> 提供了全局范围、包范围和Action范围的国际化资源文件管理实现

过滤器和拦截器

过滤器,java web中,在传入的request,response前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑。
比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉)
例如传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。

拦截器是面向切面编程领域的概念,在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法
比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

拦截器与过滤器的区别
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后

使用validate方法验证数据

在Struts2中最简单的验证数据的方法是使用validate。
ActionSupport类实现了一个Validateable接口。这个接口只有一个validate方法。
如果Action类实现了这个接口,Struts2在调用execute方法之前首先会调用这个方法进行验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldError或addActionError加入相应的错误信息。
如果存在Action或Field错误,Struts2会返回“input”(这个并不用开发人员写,由Struts2自动返回),如果返回了“input”,Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调用execute方法。

validator框架的验证规则配置文件一般和验证的.class文件放在同一目录下,而且配置文件名要使用如下两个规则中的一个来命名:
-validation.xml
--validation.xml
其中就是struts.xml中的name属性值。

struts2中的session和普通的session对比

struts 2在action里面获取 session 一般是 ActionContext.getContext().getSession().put(key, value) 这个是与servlet解耦的方式
ServletActionContext.getRequest().getSession().setAttribute(key, value); 这是不解耦的方式
通过actionContext获得的session和request都只是map对象,struts2最强大的解耦就是让控制器与web环境无关,就是不再依赖于servlet,struts2会把session,request里面的值抽取出来,放进actionContext里面,actionContext就是一个数据环境,都是map类型,再传入action中,从而解耦,当然你也可以用servletContext获得原生的request,session

上传文件

在Struts2中,用于获得和设置java.io.File对象(Struts2将文件上传到临时路径,并使用java.io.File打开这个临时文件)的方法是getUpload和setUpload。
获得和设置文件名的方法是getUploadFileName和setUploadFileName
获得和设置上传文件内容类型的方法是getUploadContentType和setUploadContentType

国际化

国际化的作用就是根据不同国家的用户在访问Web或其他类型的程序时,将各种信息以本地的常用形式显示出来。
例如界面信息在中国,就会显示中文信息,在以英文为主的国家里,就会显示英文信息。还有信息的格式,日期格式和货币等。
应用程序“国际化(internationalization,经常被称做“i18n”,因为18是字母“i”和字母“n”之间的字母个数)和本地化的需求”。

JMS

JMS是一组Java API ,它定义了消息传递客户如何以一种标准的方式与底层的消息服务提供商进行交互。同时,也提供了一个实现了底层消息传递服务接口,它将JMS服务提供给客户。

JMS包括两类API(与JDBC, JNDI类似):
应用编程接口(API),用于编写消息收发。
服务供应商接口(SPI),提供JMS驱动程序
和JDBC一样JMS是用来访问各种各样的MS的,它是J2EE的一部分,并且扮演了非常重要的角色。JMS需要其它的J2EE part的支持

构成JMS的组件

JMS提供者

连接面向消息中间件的,JMS接口的一个实现。

JMS客户

生产或消费基于消息的Java的应用程序或对象。

JMS生产者

创建并发送消息的JMS客户。

JMS消费者

接收消息的JMS客户。

JMS消息

包括可以在JMS客户之间传递的数据的对象

JMS队列

一个容纳那些被发送的等待阅读的消息的区域。

JMS主题

一种支持发送消息给多个订阅者的机制。

消息类型

JMS点对点(message can be persistent or non-persistent)
JMS发布者/订阅者(message can be durable or non-durable)

JMS 的Message的组成

Header,Properties,Body

Spring

Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架
Spring的核心是控制反转(IoC)和面向切面(AOP)
Spring 框架是一个分层架构,由 7 个定义良好的模块组成
1、核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。
2、Spring 上下文:Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。
3、Spring AOP:为基于 Spring 的应用程序中的对象提供了事务管理服务
4、Spring DAO:可用来管理异常处理和不同数据库供应商抛出的错误消息。
5、Spring ORM:Spring 框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。
6、Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。
7、Spring MVC 框架:MVC框架是一个全功能的构建 Web应用程序的 MVC 实现。

DI(Dependency Injection) & IoC (Inversion of Control)

控制反转

IoC,把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

依赖注入

Ioc的实现方式之一,组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系;其他还有设值注入(Setter Injection)和构造子注入(Constructor Injection)


本文属西风逍遥游原创, 转载请注明出处: 西风世界http://blog.csdn.net/xfxyy_sxfancy

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值