所谓基于Java的WEB应用,是通过Java技术实现HTTP协议的一种应用。Java技术中实现HTTP协议的核心技术是servlet技术,随着架构技术的不断完善,servlet基础理论逐渐被淡忘,本文所讨论的就是被大家淡忘的那些基础知识。

Java WEB应用基础理论
统一资源定位符(URL,英语Uniform Resource Locator的缩写)也被称为网页地址,是因特网上标准的资源地址。
一个典型的URL请求如

http://localhost:8080/hello/index.html

分以下几个部分,
HTTP协议头: http://
服务器地址: localhost (地址可以是IP或域名)
端口号: 8080(HTTP协议的默认端口号是80)
应用上下文: /hello(如果应用上下文的根目录是ROOT,则应用上下文为空)
资源或请求: /index.html
Java的servlet技术解决的就是资源或请求的映射问题。

WEB应用的目录结构
如果要创建一个基于Java的WEB应用,基本的目录结构如下:

/[WebContent] WEB应用上下文根目录
 /WEB-INF 配置文件所在目录
 web.xml WEB应用核心配置文件
 /lib 存放所有jar包的类库目录
 /classes 存放没有打包的所有class文件的类路径

根据需要,WEB应用上下文可以定义成任意名字或ROOT。
如果WEB应用上下文的根目录是ROOT,意味着用户端在访问WEB应用时不需要提供WEB应用上下文。如:

http://localhost:8080/index.html

如果WEB应用上下文的根目录不是ROOT,用户端访问时就必须明示WEB应用上下文。如上下文名为hello的访问方式:

http://localhost:8080/hello/index.html 

WEB应用的资源定位方式
我们将“/”开头的路径称为绝对路径,将非“/”开头的路径称为相对路径。Java资源的常用定位方式有三种:文件系统定位方式、类路径定位方式与WEB应用上下文定位方式。文件系统定位与类路径定位可以参考《Java资源的定位方式》一文,WEB应用上下文定位是以上下文根目录为绝对路径,以资源文件所在目录为相对路径进行资源定位。

上面的描述可以为我们提供以下信息
/WEB-INF/jsp/index.jsp描述了index.jsp文件的在WEB应用中的目录位置(它是相对于WEB应用的根目录的):

/hello(WEB应用上下文的根目录)
 /WEB-INF
 /jsp
 index.jsp

ActionContext(Action上下文)

我们知道Xwork与Web 无 关性,我们的Action不用去依赖于任何Web容器,不用和那些JavaServlet复杂的请求(Request)、响应(Response)关联在 一起。对请求(Request)的参数(Param),可以使用拦截器框架自动调用一些get()和set()方法设置到对应的Action的字段中。但 是,仅仅取得请求参数的值就能完全满足我们的功能要求吗?不,在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在 Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest)、响应(HttpServletResponse)操作。

我们需要在Action中取得request请求参数“username”的值:

ActionContext context = ActionContext.getContext();

Map params = context.getParameters();

String username = (String) params.get(“username”);

ActionContext(com.opensymphony.xwork.ActionContext) 是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象, 比如:在使用WebWork时,我们的上下文放有请求的参数(Parameter)、会话(Session)、Servlet上下文 (ServletContext)、本地化(Locale)信息等。

在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程中使用。

一 般情况,我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get();来获取的。我们再来看看这里的actionContext对象的创建:static ThreadLocal actionContext = new ActionContextThreadLocal();,ActionContextThreadLocal是实现ThreadLocal的一个内部 类。ThreadLocal可以命名为“线程局部变量”,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本, 而不会和其它线程的副本冲突。这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。

下面我们看看怎么通过ActionContext取得我们的HttpSession:

Map session = ActionContext.getContext().getSession();

原 来我们取得的session却是Map类型的对象,这是为什么?原来,我们的WebWork框架将与Web相关的很多对象重新进行了包装,比如这里就将 HttpSession对象重新包装成了一个Map对象,供我们的Action使用,而不用直接和底层的HttpSession打交道。也正是框架的包 装,让我们的Actoion可以完全的和Web层解藕。

如果我们的Action需要直接与JavaServlet的HttpSession、HttpServletRequest等一些对象进行操作,我们又该如何处理?请看下面的ServletActionContext。

ServletActionContext

ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与JavaServlet相关对 象访问的功能,它可以取得的对象有:

1、javax.servlet.http.HttpServletRequest:HTTPservlet请求对象

2、javax.servlet.http.HttpServletResponse;:HTTPservlet相应对象

3、javax.servlet.ServletContext:Servlet 上下文信息

4、javax.servlet.ServletConfig:Servlet配置对象

5、javax.servlet.jsp.PageContext:Http页面上下文