本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
所谓基于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-INF目录放置了所有不允许用户直接访问的资源。典型的文件有web.xml,它是Java Web应用的核心配置文件。
web.xml的主要任务是将用户的请求映射到不允许用户直接访问的资源上。
在web.xml中定义的请求
在WEB应用中,一个servlet代表一个URL请求。servlet的表现形式可以是JSP文件资源,也可以是Servlet类。servlet在web.xml中由<servlet/>和<servlet-mapping/>组成。在<servlet-mapping></servlet-mapping>中指定用户端的请求方式,在<servlet></servlet>中指定服务器响应的Servlet类或JSP文件。例如:
通过上述例子,可以了解以下几个要点:
1. 通过<servlet-name/>关联<servlet></servlet>和<servlet-mapping></servlet-mapping>。
2. <url-pattern/>指定了用户端的请求方式。必须以“/”开头,请求基于WEB应用上下文。
3. <url-pattern/>指定的请求方式与JSP资源的定位或Servlet类的位置无关。
4. <jsp-file/>指定了JSP资源在WEB应用中的目录位置。必须以“/”开头,目录位置基于WEB应用上下文的根目录。
5. <servlet-class/>指定了Servlet类的位置,位置信息包括包名及类名。
WEB应用的资源定位方式
我们将“/”开头的路径称为绝对路径,将非“/”开头的路径称为相对路径。Java资源的常用定位方式有三种:文件系统定位方式、类路径定位方式与WEB应用上下文定位方式。文件系统定位与类路径定位可以参考《Java资源的定位方式》一文,WEB应用上下文定位是以上下文根目录为绝对路径,以资源文件所在目录为相对路径进行资源定位。
例如,一个应用上下文的根目录为“/hello”的WEB应用中web.xml的描述
上面的描述可以为我们提供以下信息
/WEB-INF/jsp/index.jsp描述了index.jsp文件的在WEB应用中的目录位置(它是相对于WEB应用的根目录的):
/hello(WEB应用上下文的根目录)
/WEB-INF
/jsp
index.jsp
程序化的Servlet类
用户自定义的Servlet类必须继承自javax.servlet.http.HttpServlet,这样才可以处理HTTP请求。在web.xml的<servlet></servlet>中必须指明自定义Servlet类的完整包名及类名,如:
Servlet类可以打包成JAR包,存放在/WEB-INF/lib目录下;也可以不打包,存放在/WEB-INF/classes目录下。
可以直接访问的资源
/[WebContent]是WEB应用的根目录,在这个目录下存放的资源(子目录或文件),用户端可以直接访问,如以下目录结构:
/hello(WEB应用上下文的根目录)
welcome.html
/images
logo.png
/WEB-INF
web.xml
/lib
/classes
基于上述目录结构的WEB应用,用户端可以直接访问welcome.html,如:
http://localhost:8080/hello/welcome.html
也可以直接访问logo.png,如:
http://localhost:8080/hello/images/logo.png
在Java WEB应用中,针对一个请求,系统首先会定位web.xml中指定的请求与资源的映射关系,其次才会定位直接可以访问的资源。
如以下目录结构:
/hello(WEB应用上下文的根目录)
welcome.html
/images
logo.png
/WEB-INF
web.xml
/lib
/classes
/test
/servlet
IndexServlet.class
在web.xml存在以下定义
此时如果用户端请求/hello/welcome.html,系统定位到的是test.servlet.IndexServlet而不是welcome.html资源文件。
使用基础理论实现MVC架构
MVC是用户界面层次(UI层)的架构模式,它主要由三个部分组成:M—Model(模型),V—View(界面),C—Controller(控制器)。在基于Java的WEB应用中MVC架构的基本流程如下:
- 客户端发出一个request到Web服务器,request中包括表单数据;
- Controller响应request,从中取得表单数据并校验其有效性,校验通过后将表单数据传送给Model;
- Model取得表单数据后进行业务处理,并将处理结果传送给Controller;
- Controller根据处理结果将显示用的数据保存到缓冲区中;
- Controller根据处理结果转向到指定的View;
- View从缓冲区中取得显示用的数据渲染画面;
- View将画面写到response中。
其中View的角色通常由JSP网页资源完成,Servlet类则实现了Controller的功能。
Model是业务模块,主要由JavaBeans实现业务处理功能,在这里不做详细描述。
提取表单数据的方法
一般表单的提交分POST与GET方式两种,文件上传使用multi-part方式提交表单。在服务器端,一般表单可以利用request.getParameter()与request.getParameterValues()两种方法提取数据,multi-part表单可以用以下方式提取数据:
不同范围的缓冲区
根据不同的生命周期,Web应用的缓冲区分request、session和application三种。在JSP文件中,这三种对象可以直接访问,在Servlet类中,这三种对象的访问方式如下:
request、session和application均有getAttribute()和setAttribute()方法,用于数据的读取与保存。
请求的转向
Forward和Redirect是servlet的两种基本转向方式。
Forward通过以下方式调用:
Redirect通过以下方式调用:
Forward方式在转向的过程中完整保留了request,session,application中的数据。Redirect方式有保留的保存了session,application中的数据,但request中的数据不予保留,转向以后全部丢失。
从业务逻辑上讲,转向操作分站内转向和站外转向。
站内转向是指转向到站内的其他JSP网页或者其他的Servlet上,Forward和Redirect两种方式都可以进行站内转向。站外转向是指转向到其他的网址上,站外转向只能用Redirect方式完成,Forward方式不具备转外转向的功能。
JSP网页的渲染
在JSP网页上有多种方法提取缓冲区的方法,最基本的方法是脚本化语言方式,如:
JSP2.0之后,EL表达式成为JSP标准的一部分,可以在JSP2.0中直接使用EL表达式。
EL表达式只能读取request,session及application中的信息,不能直接中脚本化语言中取得数据,如:
除JSP标准之外,还可以使用大量的第三方标签库如JSTL标准标签库,Struts标签库及Spring标签库等等来简化和完善数据缓冲区的数据读取与保存操作。