一、基于Java技术的Web应用体系结构
整个网站系统采用Browser/Web/DataBase的三层体系结构。Web服务器接受请求,通过应用程序服务器执行一个Java服务器端小程序Servlet并返回其输出,从而实现与客户机进行信息资源的交互。数据库服务器用来存储管理信息系统中所用到的各种数据,数据由数据库管理程序直接录入。系统的客户端只需要一个浏览器即可。相关人员通过浏览器来查询、增加、修改、删除数据,对信息进行管理。
二、用JSP开发Web网站的几种主要方式
JSP作为J2EE的一部分,既可以用于开发小型的Web站点、也可以用于开发大型的、企业级的应用程序,下面给出使用JSP进行开发的不同方式。
1、直接使用JSP(以页面为中心Page-Centric方式)
对于最小型的Web站点,可以直接使用JSP来构建动态网页,这种站点最为简单,所需要的仅仅是简单的留言板、动态日期等基本的功能。对于
这种开发模式,一般可以将所有的动态处理部分都放置在JSP的Scriptlet脚本代码中,就像一般使用PHP或ASP开发动态网页一样。
(1)优缺点
这种结构的优点就是编程简单,成本很低。允许页面的设计者根据资源的状态动态的生成页面的内容。但是当系统规模增大的时候,这样的结构不适合多个客户同时访问资源,这样同时会有大量的请求需要服务端来处理。每个请求都会建立一个连接,消耗一定的资源。这样,需要让这些连接共享一些资源。其中最明显的例子就是用JDBC连接数据库中用到的连接池(Connection
pools)。
另外该结构也会导致JSP中出现大量的JAVA代码。这虽然对java程序设计人员不会有什么问题,可是大量的代码分散在JSP中,不利于维护和修改,网页美工不懂jsp的。
(2)应用场合:
小型网站,并且页面的设计者与JSP的编程者为同一人。
(3)示例图
2、JSP + JavaBeans或者JSP+Servlet的两层的开发结构(JSP
Model 1)
中型站点面对的是数据库查询、用户管理和小量的商业业务逻辑。对于这种站点,不能将所有的东西全部交给JSP页面来处理。在单纯的JSP中加入JavaBeans技术将有助于这种中型网站的开发。
利用JavaBeans,将很容易完成如数据库连接、用户登录与注销、商业业务逻辑封装的任务。如:将常用的数据库连接写为一个Java
Beans,既方便了使用,又可以使JSP文件简单而清晰,通过封装,还可以防止一般的开发人员直接获得数据库的控制权。
在企业级的Web应用中,通常包含Web浏览器(表示)、中间层(业务)和后台数据库服务器三个层次。
Web浏览器:Web浏览器是三层结构中的第一个层次,利用Web浏览器作为客户端,使客户面对一个统一的应用界面。可以采用JSP页面来显示由中间层所返回的数据。
Servlet或者JavaBean中间层:中间层是指运行在服务器中的,联系Web浏览器与后台数据库服务器的软件。对基于Java技术的Web应用,一般可以采用Servlet或者JavaBean来实现中间层。中间层在浏览器和数据库服务器之间完成“粘合”作用。
后台数据库服务器:后台数据库服务器是用户存放数据信息的地方,中间层可以通过JDBC来访问后台数据库。对于采用何种类型的数据库系统,取决于具体的应用。
(1)JSP+JavaBean形式:在设计时JSP只负责显示页面,也就是说JSP调用JavaBean传过来的数据然后显示,而JavaBean负责收集JSP需要的数据。
(2)JSP+Servlet形式:在设计时JSP只负责显示页面,也就是说JSP调用Servlet传过来的数据然后显示,而Servlet负责收集JSP需要的数据并将处理后的结果返回给某一个JSP页面。
3、JSP + JavaBeans
+ Servlet的MVC的三层开发结构(JSP Model 2)
无论用ASP还是PHP开发动态网站,长期以来都有一个比较重要的问题,就是网站的逻辑关系和网站的显示页面不容易分开。常常可以看见一些夹杂着i
f . . . . . . t h e n . . . . . .、case select或是i f{ . . . . .
. }和大量显示用的HTML代码的ASP、PHP页面,即使是有着良好的程序写作习惯的程序员,其作品也几乎无法阅读。
另一方面,动态Web的开发人员也在抱怨,将网站美工设计的静态页面和动态程序和并的过程是一个异常痛苦的过程。
如何解决这个问题呢?利用Servlet担负起决定整个网站逻辑流程的任务。在逻辑关系异常复杂的网站中,借助于Servlet(Control,也就是调度JSP页面和JavaBean)和JSP(View,也就是实现人机交互的前台界面)良好的交互关系和JavaBeans(Model,实现操作和处理数据)的协助,完全可以将网站的整个逻辑结构放在Servlet中,而将动态页面的输出放在JSP页面中来完成。
在这种开发方式中,一个网站可以有一个或几个核心的Servlet来处理网站的逻辑,通过调用JSP页面来完成客户端(通常是Web浏览器)的请求。在J2EE模型中,Servlet的这项功能可以被EJB取代。
在JSP中使用JavaBean和用Enterprise JavaBean是有区别的。
它们之间的基本相同之处:
- 它们都是用一组特性创建,以执行其特定任务的对象或组件;
- 它们还有从当前所驻留服务器上的容器获得其它特性的能力;
- 都是与平台无关的
它们之间的不相同之处:
- EJB 是部署在服务器上的可执行组件或商业对象,有一个协议允许对其进行远程访问或在特定服务器上安装或部署它们。有一系列机制允许它们将服务安全性、事务行为、并发性(由多个客户机同时访问的能力)和持久性(其状态可以保存多久)的主要方面授权给EJB
服务器上其所在的容器。
- EJB 是设计成运行在服务器上,并由客户机调用的非可视远程对象。可通过多个非可视
JavaBean 构建 EJB。
二、MVC架构
1、MVC概述
用户界面,特别是图形用户界面,承担着向用户显示问题模型和与用户进行操作和I/O交互的作用。用户希望保持交互操作界面的相对稳定,但更希望根据需要改变和调整显示的内容和形式。例如,要求支持不同的界面标准或得到不同的显示效果,适应不同的操作需求。这就要求界面结构能够在不改变软件的功能和模型情况下,支持用户对界面构成的调整。
要做到这一点,从界面构成的角度看,困难在于:在满足对界面要求的同时,如何使软件的计算模型独立于界面的构成。模型-视图-控制(MVC:Model-View-Controller)就是这样的一种交互界面的结构组织模型。
2、MVC的含义
模型-视图-控制器(MVC)是80年代由Trygve
Reenskaug提出并首先应用于Smalltalk-80中的一种软件设计模式,现在已经被广泛的使用。MVC的三层开发结构能有效地分离逻辑开发,使开发人员能专注于各自的开发中。同时也能使整个开发结构流程更清晰,但是需要比较高的开发配合度。
模型(Model):模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑。
视图(View):视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。
控制器(controller):控制器工作就是根据用户的输入,控制用户界面数据显示和更新model对象状态
3、MVC工作的机制
4、MVC的进一步发展----Struts
有些人觉得model2仍不够好,于是Craig R. McClanahan 2000年5月 提交了一个WEB
framework给Java Community.这就是后来的Struts。
2001年7月,Struts1.0,正式发布。该项目也成为了Apache Jakarta的子项目之一
。Struts 本质上就是在Model2的基础上实现的一个MVC架构。它只有一个中心控制器,他采用XML定制转向的URL。采用Action来处理逻辑。
6、MVC的应用实例:
一个MVC模式的数据传递的过程,从JSP页面输入一个字符,然后提交给Servlet,由Servlet调用JavaBean处理后,然后再把页面定向到另一个JSP页面,然后用session和request两种方式实现显示。
由JSP所实现的录入页为Login.htm,显示页分别为RequestTest.jsp和SessionTest.jsp;
Servlet为TestServlet.class,JavaBean为TestBean.class。
(1)Login.htm 代码如下
<body bgcolor="#FFFFFF">
<FORM METHOD="post" ACTION="/TestServlet">
<INPUT TYPE="text" NAME="testStr">
<INPUT TYPE="submit">
</FORM>
</body>
(2)TestServlet.java
Sevlet的代码
package mvcExamples;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class TestServlet extends HttpServlet
{
static final private String CONTENT_TYPE = "text/html; charset=GBK";
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
public void destroy()
{
}
protected void doGet(HttpServletRequest request,HttpServletResponse
response) throws ServletException,
IOException
{
response.setContentType(CONTENT_TYPE);
}
protected void doPost(HttpServletRequest request,HttpServletResponse
response)throws ServletException, IOException
{
response.setContentType(CONTENT_TYPE);
TestBean testbean = new TestBean (); //对JavaBean进行实例化
HttpSession session = request.getSession(); //获得session对象
String testStr = request.getParameter("testStr");
//获得从录入页为Login.htm所传递来的参数
testbean.setTestStr (testStr); //向JavaBean传递参数
String targetURL = "/RequestTest.jsp"; //定义目标页面URL
session.setAttribute("sessionbean",testbean); //向session中存储JavaBean以便在另一页中获得它
request.setAttribute("requestbean",testbean); //向request中存储JavaBean以便在另一页中获得它
this.dispatch(targetURL, request, response); //转移到目标页面
}
public void dispatch(String targetURI,HttpServletRequest request,HttpServletResponse
response) throws java.io.IOException,
ServletException
{
RequestDispatcher dispatch = getServletContext().getRequestDispatcher(targetURI);
dispatch.forward(request, response);
}
} (3)TestBean.java
JavaBean的代码
package mvcExamples;
public class TestBean
{
private String testStr = null;
public TestBean ()
{
}
void setTestStr(String testStr)
{
this.testStr = testStr;
}
public String getTestStr ()
{
return testStr;
}
}
(4)RequestTest.jsp显示数据的页面
<%@ page language="java"
pageEncoding="GB2312" %>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html><head><title>利用request显示Login.htm中的登录数据的页面
<!—
注意下面的JavaBean的id应该与前面的Servlet中存储时的名称相同
-->
<jsp:useBean id="requestbean" scope="request"
class=" mvcExamples.TestBean"/>
<%=requestbean.getTestStr()%>
<HR>
<a href="/testSessionTest.jsp">SessionTest.jsp
<HR>
<CENTER><a href="/testLogin.html">Index
(5)SessionTest.jsp显示数据的页面
<%@ page language="java" pageEncoding="GB2312"
%>
<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">
<html><head><title>利用session显示Login.htm中的登录数据的页面
<!—
注意下面的JavaBean的id应该与前面的Servlet中存储时的名称相同
-->
<jsp:useBean id="sessionbean" scope="session"
class=" mvcExamples.TestBean"/>
<%= sessionbean.getTestStr()%>
<HR><CENTER><a href="RequestTest.jsp">RequestTest.jsp
<HR><CENTER><a href="Login.html">Index
7、MVC的优点及不足之处
(1)MVC的优点:MVC的优点表现在以下几个方面:
- 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。
- 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。
- 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。
- 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
(2)MVC的不足之处:MVC的不足表现在以下几个方面:
- 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
- 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
- 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能
三、网站发布
1、概述
与传统的桌面应用程序不同,在Tomcat中的应用程序是一个WAR(Web Archive)文件。WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织并且还会有一个WEB-INF目录(在WEB-INF目录下有一个web.xml文件和一个classes目录)。
在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。
2、将整个Web站点也就是Web
应用程序打包为*.war文件
在WebPub文件夹下输入
jar cvf WebPub.war –C .\ *
3、将所生成的WebPub.war文件放在webapps文件夹下
4、再次启动Tomcat服务器,将自动地进行解包
四、设置网站的缺省首页
1、在webapps\ROOT下增加两个文件index.htm、index.html和
index.jsp(内容相同)
<html>
<head>
<meta http-equiv="refresh" content="0;url='http://127.0.0.1:8080/WebPub/index.jsp'">
<meta name="keywords" content="培训,网校,计算机培训">
<meta name="description" content="培训,网校,计算机培训">
<title>首页</title>
</head>
<body style="font-family: 宋体; font-size: 9pt">
正在加载主页面,请等待....<br>
</body></html>
注意:对index.jsp好要增加一条 page 指令,否则中文问题出现
<%@ page contentType="text/html;charset=gb2312"%>
2、在index.htm、index.html和
index.jsp中增加
<meta http-equiv="refresh" content="0;url='http://127.0.0.1:8080/WebPub/index.jsp'">
3、修改webapps\ROOT\WEB-INF下的web.xml文件为下面的内容
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<display-name>Welcome to Tomcat
<description>
Welcome to Tomcat
</description>
<welcome-file-list>
<welcome-file>index.html
<welcome-file>index.htm
<welcome-file>index.jsp
</welcome-file-list>
</web-app>
五、在 Tomcat 上配置虚拟主机
1、Tomcat 服务器的server.xml文件
(1)Tomcat 组件
Tomcat 服务器是由一系列可配置的组件构成,其中核心组件是
Catalina Servlet 容器,它是所有其他 Tomcat 组件的顶层容器。Tomcat
的
组件可以在 /conf/server.xml
文件中进行配置,每个 Tomcat 组件在 server.xml 文件中对应一种配置元素。
(2)Tomcat 组件之间的关系
以下代码以 XML 的形式展示了各种
Tomcat 组件之间的关系:
<Server>
<Service>
<Connector />
<Engine>
<Host>
<Context>
</Context>
<Host>
</Engine>
</Service>
</Server>
(3)各个Tomcat
组件的说明
在以上 XML 代码中,每个元素都代表一种
Tomcat 组件。这些元素可分4 类:
顶层类元素:主要包括 <Server> 元素和 <Service> 元素,他们位于整个配置文件的顶层。
连接器类元素:代表了介于客户与服务之间的通信接口,负责将客户的请求发送给服务器,并将服务器的响应结果传递给客户。
容器类元素:代表处理客户请求并生成响应结果的组件,有 3 种容器类元素,它们是
Engine、Host 和 Context。Engine 组件为特定的Service 组件处理所有的客户请求,Host
组件为特定的虚拟主机处理所有客户请求,Context 组件为特定的 Web 应用处理所有客户请求。
嵌套类元素:嵌套类元素代表了可以加入到容器中的组件,如 <Logger>
元素、<Valve> 元素和 <Realm> 元素。
(4)<Server> 元素
<Server> 元素代表整个
Catalina Servlet 容器,它是 Tomcat 实例的顶层元素,由 org.apache.catalina.Server
接口来定义。
<Server> 元素中可以包含一个或多个 <Service> 元素,但
<Server> 元素不能做为任何其他元素的子元素。
(5)<Service>
元素
<Service> 元素由
org.apache.catalina.Service 接口来定义,它包含一个 <Engine>
元素,以及一个或多个 <Connector> 元素,这些<Connector>
元素共享同一个 元素。
(6)<Connector>
元素
<Connector>
元素由 org.apache.catalina.Connector 接口来定义。<Connector>
元素代表和客户程序实际交互的组件,它负责接受客户请求,以及向客户返回响应结果。
(7)<Engine>
元素
<Engine> 元素由
org.apache.catalina.Engine 接口来定义。每个 元素只能包含一个
<Engine> 元素。<Engine> 元素处理在同一个 <Service>
元素中所有 <Connector> 元素接受到的客户请求。
<Engine> 元素可包括如下子元素:
<Loggor>
<Realm>
<Valve>
<Host>
(8)<Host>
元素
<Host> 元素由
org.apache.catalina.Host 接口来定义。一个 <Engine> 元素中可以包含多个
<Host> 元素。每个 <Host> 元素定义了一个虚拟主机,他可以包含一个或多个
Web 应用。
<Host> 元素可包括如下子元素:
<Loggor>
<Realm>
<Valve>
<Context>
(9)<Context>
元素
<Context> 元素由
org.apache.catalina.Context 接口来定义。<Context> 元素是使用最频繁的元素。每个
<Context> 元素代表运行在虚拟主机上的单个 Web 应用。一个 <Host>
元素中可以包含多个 <Context> 元素。
<Context> 元素可包括如下子元素:
<Loggor>
<Realm>
<Valve>
<Resource>
<ResourceParams> 2、为主机配置域名
(1)编辑C:\WINNT\system32\drivers\etc下的hosts文件,在其中增加对本机IP地址的映射的域名
(2)本例为
127.0.0.1 www.sina.com
(3)保存该文件
3、修改Tomcat下的C:\jakarta-tomcat-5.0.19\conf\server.xml文件以增加一个主机Host的设置
Host标记是用来配置虚拟主机的,就是可以多个域名指向一个tomcat,
是Host标记的子元素吧,表示一个虚拟目录,它主要有两个属性,path就相当于虚拟目录名字,而
docbase则是具体的文件位置。
<Host name="www.sina.com"
debug="0" appBase="webapps" unpackWARs="true"
autoDeploy="true" xmlValidation="false"
xmlNamespaceAware="false">
<Context path="" docBase="ROOT"
debug="0" />
</Host>
注意:
(1)可以将Tomcat自己带的localhost主机的Host的整个设置全部拷贝,然后将“localhost”改名为www.sina.com即可以。
(2)必须保证在<Host></Host>之间至少有一个<Context path=""
docBase="ROOT" debug="0" />的根Web应用程序的设置项目存在。
(3)可以根据应用的需要,在<Host></Host>之间设置其它的基于该主机名称下的其它Web应用程序的<Context>设置。
|