当前页面位置: » 丰搜网 » 文档中心 » 详细内容
struts用户和开发指南(前言之二)
标题: struts用户和开发指南(前言之二)
原文: http://jakarta.apache.org/struts/userguide/preface.html
译者: javaduke
email: javaduke@263.net
qq:658155
msn: javaduke@hotmail.com
0. 前言:核心技术0.6 属性(properties)文件和资源绑定(resourse bundles) 很多
java应用程序(包括
web应用程序在内)经常通过 属性文件进行一些配置。属性文件是
struts框架用于给应用程序提供消息资源资源绑定的基础所在。
关于属性文件更多,请参考:
.the
java tutorial中的using properties to manage program attributes
java资源绑定是根据用户 区域(locale)通过一个或多个属性文件为用户提供国际化支持。
struts从一建立开始就对应用程序的本地化有很好的支持。
关于本地化和资源绑定的更多,请参考:
.the
java tutorial 中的about the resourcebundle class
0.7 java servlet 由于
java是一种面向对象的编程语言,所以
java servlet平台就把http强制造型(或构造)为面向对象的形式。这一策略使得
java开发人员省下更多的时间去处理自己的应用程序的功能上,而不是放在http的机制处理上。
http提供了一套扩展
服务器的基本机制,即公共网关接口(common gateway interface,
cgi)。
服务器可以传递一个请求给
cgi程序,然后
cgi程序返回一个响应。同样,一个
java服务器传递一个请求给一个
servlet容器,容器可以对请求作一些处理,也可以把这个请求直接返还给http
服务器,容器检查它的
servlet列表来决定是否要对这个请求进行处理,如果请求注册了一个servlert,那么容器就把这请求转交给这个
servlet。
当一个请求进入时,容器检查该请求是否注册了
servlet,如果找到一个匹配的
servlet,容器就把这个请求传给这个
servlet,如果没有,请求就被返还给http
服务器。
容器的职责就是管理
servlet的生命周期,创建
servlet,调用
servlet,最后释放
servlet。
一般情况下一个
servlet是[
javax.
servlet.http.http
servlet]的一个子类,一个
servlet必须实现容器需要调用的四个方法:
.public void init(
servletconfig config):当
servlet实例第一次被创建时和执行所有请求之前
servlet容器调用这个方法;
.public void doget(http
servletrequest request,http
servletresponse response)此方法用于处理一个使用http get 协议的请求,并生成一个相应的动态响应;
.public void dopost(http
servletrequest request http
servletresponse response)此方法用于处理一个使用http post协议的请求,并生成一个相应的动态响应;
.public void destroy() 当
servlet实例中止服务时容器调用这个方法,诸如当
web应用程序正在被undeploy或当整个容器被shut down时;
struts框架已为我们的应用程序提供一个现成
servlet[org.apache.
struts.action.action
servlet]。作为一个
struts应用程序开发人员,在使用
struts框架的action
servlet实例的同时,了解
servlet的基础知识和明白它在
web应用程序所扮演的角色也是相当重要。
关于
servlet的更多知识,请参考:
.java.sun.com中的the
java servlet technology;
.java.sun.com中的the
servlet 2.2 and 2.3 specifications;
.the
java web service tutorial的
java servlet technology;
.the
java web service tutorial的
web applications;
0.7.1 servlet和thread 为了提高性能,容器支持多
线程servlet。一个具体的
servlet只能创建一个实例,通过同一个对象为注册了这个
servlet的每个请求服务。这一个策略可以使容器充分利用系统资源,与此同时也就必须考虑
servlet的doget和dopost方法编码的
线程安全问题。
关于
servlet与
线程安全的更多资料,请参考:
.the
java web service tutorial中的controlling concurrent
access to shared resourceshttp://
java.sun.com/
webservices/docs/1.0/tutorial/doc/
servlets5.
html#64386;
0.7.2 servlet上下文(context) servletcontext接口[
javax.
servlet.
servletcontext]提供正在运行的
servlet所处的
web应用程序的上下文(或环境)的
视图。
servlet可以通过get
servletconfig()方法访问,而
jsp页面可以通过隐含变量application变量获得。
servlet上下文提供的几个api在创建
struts web应用程序时是相当有用的。
.访问
web应用程序资源:
servlet可以通过getresource()和getresourceasstream()方法访问
web应用程序内的静态资源文件;
.servlet上下文属性:上下文可以用来存储
java对象,通过字符串值的key来识别对象,这些属性对整个
web应用程序都是全局的,
servlet可以通过getattribute(),getattributenames(),removeatrribute()和setattribute()方法进行访问。对
jsp页面来说,
servlet上下文属性相当于“应用程序作用域bean”;
关于
servlet上下文的更多信息,请参考:
.the
java web services tutorial中的
accessing the
web context http://
java.sun.com/
webservices/docs/1.0/tutorial/doc/
servlets10.
html#64724;
0.7.3 servlet请求 每个
servlet处理的请求用一个
java接口代表,一般是http
servletrequest接口 [
javax.
servlet.http.http
servletrequest]。这个请求接口提供了一套访问包含在底层http请求内的所有信息的面向对象机制,包含:
.cookie:通过getcookie()方法获得包含在请求中的有效cookie集;
.头:可以通过名称访问包含在请求中的http头。你可以枚举包含的所有的http头的名称;
.参数:请求参数,可以通过名称访问包含在url的查询字符串中(doget)或包含在请求内容中(dopost)的请求参数;
.请求特征:输入http请求的一些其他特征,诸如get或post方法使用的协议规格("http" 或"https"),等等;
.请求uri信息:通过getrequesturi()方法可以获得原始的请求url。另外,
servlet容器把请求url解析为一些可以单独访问的组成部分(contextpath、
servletpath和 pathinfo);
.用户信息:如果你使用了用户管理的
安全,那么你就可以查找一个已认证用户名,获得一个代表当前用户的principal对象,还有当前用户是否被授权为一个特定角色;
另外,
servlet请求还支持请求属性(在
jsp中,就是请求作用域bean),类似于前面讲到的
servlet上下文属性。请求属性常用于业务逻辑层和
视图层之间状态信息通信,业务逻辑层产生这些状态信息,
视图层使用这些信息产生相应的响应。
servlet容器会确保一个具体的请求被一个单独
线程的
servlet处理,所以你就不必担心在访问
servlet请求的属性时有关
线程安全的问题。
关于
servlet请求的更多,请参考:
.the
java web tutorial中的getting information from requestshttp://
java.sun.com/
webservices/docs/1.0/tutorial/doc/
servlets7.
html#64433;
0.7.4 servlet响应 一个
servlet的主要目的就是处理一个输入的
servlet请求[
javax.
servlet.http.http
servletrequest],并生成对应的响应。生成响应的过程是通过调用
servlet响应接口[
javax.
servlet.http.http
servletresponse]相应的方法来完成的,可用的方法如下:
.设置http头:你可以设置包含在响应中的http头信息。最重要的http头信息就是content-type,它告诉你的客户端包含在响应体中信息是哪种类型的,一般情况下,设为text/
html类型就是
html页面,或设为text/
xml类型就是
xml文档;
.设置cookies:你可以向当前的响应中增加cookie;
.发送错误响应:你可以使用senderro()发送一个http错误状态信息(代替一般的页面内容);
.重定向到其他资源:你可以使用sendredirect()方法重定向客户端到你指定的其他url资源上去;
使用
servlet响应api的一个重要原则就是调用维护头信息和cookies所有方法都必须在缓存的全部响应内容第一次被更新给客户端之前完成。原因是因为这些信息都是作为http响应最开始部分被传输的,因此试图在头信息已被送出之后再添加头信息,必然是徒劳的。
使用model 2
模式的应用程序的表现层,你可能不直接使用
servlet 响应apis来生成响应。一般是使用
jsp页面来完成,在
servlet容器中
jsp页面将被
jsp编译器转换为
servlet,由这个
jsp servlet生成响应,其中可能包含一些
jsp标签生成的动态信息。
其他的表现系统,诸如
struts工具velocity
框架,可能把生成响应的任务代理给一个专门的
servlet来完成,但是原理是相同的。你创建一个模板,然后动态的响应由模板动态生成。
关于
servlet响应的更多,请参考:
.the
java web tutorial中的constructing responseshttp://
java.sun.com/
webservices/docs/1.0/tutorial/doc/
servlets7.
html#64531;
0.7.5 过滤器(filtering) 如果你使用2.3版或更新规范的
servlet容器(如
tomcat4.x),你可以使用新的过滤器apis[
javax.
servlet.filter]组合一些组件来处理请求和生成响应。过滤器其实是一个过滤器链的集合,每个过滤器都可以处理请求和生成响应,然后把处理权交给下一个过滤器,最后调用
servlet。
struts 1.x系列(1.0,1.1版本等)仅支持2.2版本或更早的
servlet规范的
servlet容器,所以
struts自身并没有使用过滤器。下一代的
struts(2.x系列)是基于
servlet2.3或更新规范的。
struts 2.x版可能会使用到过滤器。
关于过滤器更多,请参考:
.filtering requests and responseshttp://
java.sun.com/
webservices/docs/1.0/tutorial/doc/
servlets8.
html#64572;
0.7.6 会话(session) http最关键的特征就是无状态性。换句话说就是,http内建机制无法识别同一个用户在后续请求和它的前继请求是同一个用户。这就使得建立一个跨请求的用户交互的应用程序变得相当困难!
为了克服这个困难,
servlet apis提供了一个编程概念—会话(session),用一个实现了[
javax.
servlet.http.httpsession]接口的对象表示。
servlet容器将使用cookies或重写url两项技术中之一来确保同一用户的会话的会话id包含在下一个请求中,这样就使保存在会话中的状态信息可以关联到多个请求上。状态信息被保存在会话属性(session attributes)中,在
jsp页面中,就是“会话作用域bean”。
为了避免一个用户在未能完全完成一个交互时造成永久占用资源,会话可以配置会话的超时时间间隔。如果两个请求间的时间间隔超过配置的超时时间间隔,会话将超时,所有的会话属性将被删除。你可以在
web应用程序的配置描述符文件中定义一个默认的会话超时时间间隔,也可以在具体的会话中通过调用setmaxinactiveinterval()方法来动态更改超时时间间隔。
会话和请求不同不同之处在于,在使用会话属性时应当考虑
线程安全的问题,而请求属性不用。(不仅是会话自身getattribute()和setattribute()方法,还有这些bean提供的所有方法)会话使同一用户的多个同步请求变得出奇的容易,因为它们只要访问同一个会话就可以了。
另一个应该考虑的问题是请求间的会话属性要占用一定的
服务器内存资源,这可能会影响系统支持的同步用户数。如果你的应用程序需要支持大量的同步用户数,那么你应该尽可能地最小程度地使用会话属性,从而控制你的整个应用程序对内存需求。
关于会话更多,请参考:
.the
java web tutorail中的maintaining client statehttp://
java.sun.com/
webservices/docs/1.0/tutorial/doc/
servlets11.
html#64744;
. javax.
servlet.http.httpsession;
0.7.7 分发请求(dispatching requests) java servlet规范通过在资源之间分发、转发请求来扩展http的请求/响应周期。
struts框架使用
servlet的这一特性让一个请求在几个特定的专用组件之间游走,每个组件都可能影响响应的内容。一般的过程是这样的,一个请求先被控制器组件抓住,接着被传给模型组件,最后被交给
视图组件,这可能仅仅是一个单独的请求/响应周期的一部分。
0.7.8 web应用程序 不仅一个http
服务器可以宿主多个单独的
web站点,
servlet容器也可以为多个
web应用程序提供服务。
java servlet平台对组织和部署
web应用程序有明确的机制。每个
web应用程序运行在属于自己的命名空间中,可以进行单独开发,单独部署。一个
web应用程序可以打成一个
web应用程序文件,或叫war文件。单独的war文件可以被上传到
服务器上并自动进行部署。
关于
web应用程序更多,请参考:
.the
java web tutorial中的
web applications http://
java.sun.com/
webservices/docs/1.0/tutorial/doc/
webapp.
html#76431;
0.7.9 web应用程序配置描述符文件(web.xml) 应用程序的生命周期中属性和事件都可以通过
web应用程序配置描述符文件
xml文件进行配置。配置文件
web.
xml的
模式(schema)由
java servlet规范给出。
关于
web.
xml和应用程序生命周期中的事件,请参考:
.the
java web tutorial中的
web application life cycle http://
java.sun.com/
webservices/docs/1.0/tutorial/doc/
webapp2.
html#64550;
0.7.10 安全(security) 在
web应用程序配置文件中可以配置容器管理的
安全。声明级的
安全可以保护匹配一定
模式的uri的请求。编程级
安全用于进行微观的
安全控制,如基于时刻、调用的参数或
web组件内部状态的授权控制;或是基于
数据库的约束验证。
关于容器管理的
安全更多,请参考:
.the
java web tutorial中的
web application security (chapter 24) ;
0.8
jsp、
jsp标签库和
jsf
jsp其实本质上也是
servlet,它是使创建和维护动态
web页面更容易的
servlet。
jsp页面中除了其中特定的
java语句外所有都将被写入到http响应中,代替使用
java的print语句写http响应。
使用
jsp,你可以从一个标准的
html页面开始,然后再使用
java语言或
jsp标签增加一些动态特性。
struts框架本身包含有一些
jsp标签库,可以使你在
jsp页面中很轻松地访问到
框架的特征。
关于
jsp和自定义
jsp标签库,请参考:
.java.sun.com的
jsp技术页;
.java.sun.com的
jsp1.1和1.2规范下载页;
.the
java web services tutorial中的
jsp技术;
.the
java web services tutorial中的
jsp自定义标签;
许多时候
jsp标签是协同
javabean一同使用的,应用程序发送一个
javabean给
jsp页面,
jsp标签使用bean为当前用户定制页面。关于更多,请参考the
java web tutorial中的
jsp中的
javabean组件
struts可以很好的和新的
jsp标准标签库 (
jstl)配合使用,同时也和其他的标签库也有很好的兼容,如
jsp tags 和 jakarta taglibs 。
还有一些其他的有用工具包可以使
struts框架使用更加容易,如xslt和velocity templates
在
java地平线上最新的一颗新星就是
java server faces。
javaserver faces技术简化了
javaserver应用程序(包括
web和桌面)的用户界面的创建。虽然
jsf规范还处于开发阶段,但在
java web services developer pack已经包含了可用的最初参考实现版本。同样,
struts框架的
jsf标签库
struts-faces也通过夜以继日的努力完成了最初版。
jsf和
struts框架是完全兼容的。随着
jsf规范的最终定案,
struts/
jsf整合工具也陆续出现,并得到了广泛地传播使用。
关于
jstl和
jsf更多,请参考:
.practical
jstl, part 1 -sue spielman著;
.jsf central-
jsf资源;
.javaserver faces resources- james holmes dot com;