Two-Layer Web Architecture
在双层Web架构中,服务端应用程序是作为web server的一部分运行的。哪怎么实现的呢,一种流行的Java实现方法就是把Java代码加载到web server内部,我们知道做什么事情都要有个规矩,写程序也是一样的,程序员可以根据业务需求用Java实现不同的应用业务逻辑,包括和数据库的交互,那web server和java应用代码之间怎么交互呢,这个’规矩’就是Java servlet specification。比如HttpServlet就实现了这个接口,我们来看一个例子,假设开始的时候客户端浏览器看到的是这样一个HTML,这是一个Form,要求用户选择是储蓄账户(Account)还是贷款账户(Load),然后输入帐户号码,点击Submit以后,传回服务器,由服务器进行查询以后返回该账户的存款数(Account Balance)或者是贷款数(Loan Amount)。
<form action="BankQuery" method=get >
Select account/load and enter number<br>
<select name="type ">
<option value="account" >Account</option>
<option value="loan" selected>Loan</option>
</select>
<input type=text size=5 name="number ">
<input type=submit value="submit">
</form>
感兴趣的话可以把这段代码拷贝到文本文件里面,文件后缀改成html,然后用IE或者Firefox打开看看效果。当你点击 Submit以后,HTTP就会使用get方法将信息传回服务器,现在的web server都是并行处理的,也就是每收到一个请求,就会分配一个工作线程,来响应请求,在HttpServet的接口实现中,doGet方法就会被调用,我们来看server端的代码:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class BankQueryServlet extends HttpServlet {
public void doGet (HttpServeletRequest request,HttpServetResponse response)
throws ServletException,IOException
{
String type=request.getParameter("type");//得到是account还是loan查询
String number=request.getParameter("number");//得到账户号码
…使用JDBC和数据库服务器通信,取回用户请求的数据
//我们假设查询结果存在变量balance里面
//开始创建返回客户请求的HTML页面
result.setContentType("text/html");
PrintWriter out=response.getWriter();
out.println("<HEAD><TITLE>Query Result</TITLE></HEAD>");
out.println("<BODY>");
out.println("Balance on"+ type + number + "=" + balance );
out.println("</BODY>");
out.close();
}
可以看到任何通过get方法从客户浏览器传回来的数据,都封装在HttpServletRequest里面(这里还包括cookie数据),而传回客户浏览器的内容被封装在HttpServletResponse里面了。
我们这里使用了Servlet的实现来说明问题的,其实其他实现只是换汤不换药,或许语法不同,本质上的工作逻辑是一样的。通俗点来讲,就像你去永和豆浆吃饭,你(客户浏览器)去到永和豆浆一家门店(web server),你看一下菜单,勾上你要的饭菜(客户浏览器上的操作),然后交给服务台(将请求发给server),然后就会有一个服务生来为你服务(服务端分配一个工作线程),根据你的要求去后台拿菜,然后端到你的桌子上(将结果返回客户浏览器)。
其实对于服务器来说,基本就3步:
- 解析客户请求
- 后端操作
- 组建包含结果的HTML返回客户
下一回介绍 HTTP服务中session的概念。