传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229

传送门 ☞ 1.Web服务内功经脉

传送门 ☞ 2.让服务动起来

传送门 ☞ 3.掀起请求盖头来

传送门 ☞ 4.静态页面起步

传送门 ☞ 5.包装请求参数

在上一节,我们已经完成了TomJetty服务器处理静态页面请求的功能。但是只能处理静态页面请求的服务器并不能满足我们的要求,所以本节我们将为TomJetty服务器完成动态页面请求的处理工作。

所谓动态页面请求,无非就是客户端发送一个请求的url地址或者将一些请求参数提交给某一个url地址,服务器端首先接收到这个url地址并检索其在服务端程序中对应的某个处理类(Servlet),然后在该处理类中执行业务逻辑后产生结果,最终转发给相应的页面在客户端浏览器中显示结果。

一、动态页面请求处理

对于Java而言,Web容器中用来处理动态页面请求的服务类实质上就是Servlet。接下来我们就实现一个LoginServlet来处理客户端提交的用户登录信息。

1.新建一个LoginServlet类,用于处理客户端提交的用户登录请求。

package cn.lynn.servlet;

import cn.lynn.tomjetty.HttpServletImpl;
import cn.lynn.tomjetty.Request;
import cn.lynn.tomjetty.Response; public class LoginServlet extends HttpServletImpl { @Override
public void doGet(Request req, Response res) {
String username = req.getParameterValue("username"); // 接收客户端请求参数
String password = req.getParameterValue("password");
if (username.equals("lynnliget") && password.equals("123456")) { // 执行简单逻辑判断
res.out.print("Hello, " + username + "<br>"); // 输出结果信息
}
res.out.close();
} @Override
public void doPost(Request req, Response res) {
String username = req.getParameterValue("username");
String password = req.getParameterValue("password");
if (username.equals("lynnlipost") && password.equals("123456")) {
res.out.print("Hello, " + username + "<br>");
}
res.out.close();
} }

2.在webapps目录下新建web.config文件,用于配置动态页面请求路径与请求处理类的对应关系。

/login=cn.lynn.servlet.LoginServlet

3.新建WebUtil类,用来从web.config文件中读取请求处理类的名称并生成该类的实例。该类的设计和用法与TomJettyUtil类基本一致。

package cn.lynn.tomjetty;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties; public class WebUtil { private static Properties props = new Properties(); static {
try {
props.load(new FileInputStream(".//webapps//web.config"));
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
} public static String getValue(String key) {
return props.getProperty(key);
}
}

4.新建一个Response类,用于封装服务器对请求的响应。目前我只存放打印流PrintWriter。

package cn.lynn.tomjetty;

import java.io.PrintWriter;

public class Response {
public PrintWriter out; public PrintWriter getOut() {
return out;
} public void setOut(PrintWriter out) {
this.out = out;
} }

5.在TomJetty类的run()方法中,我们新增如下代码片段,用来处理动态页面请求。

IServlet servlet = (IServlet) Class.forName(WebUtil.getValue(header.getUrl())).newInstance();
res.setOut(new PrintWriter(out));
servlet.service(req, res);

二、处理动态请求效果展示

1.GET方式提交

2.POST方式提交

这里我们默认请求都携带参数信息。至于其他输入请求的格式可能导致页面出现的不友好信息的情景,请读者自行处理^_^。

三、添加错误提示页面,以增加服务友好度。

1.添加404.htm至webapps目录下,用于提示用户请求页面不存在。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>404</title>
<link href="css/css0.css" rel="stylesheet" type="text/css">
</head> <body>
<table width="50%" border="0" align="center" cellpadding="10" cellspacing="0">
<tr>
<td bgcolor="#A4A4A4"><table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#FFFFFF"><table width="100%" border="0" cellpadding="15" cellspacing="1">
<tr>
<td bgcolor="#E1E1E1"><div align="center"><strong>404</strong> Request Page Not Found!</div></td>
</tr>
</table></td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>

2.添加500.htm至webapps目录下,以提示服务器编译问题。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>500</title>
<style type="text/css">
<!--
.style1 {
color: #FF0000;
font-weight: bold;
}
-->
</style>
</head> <body>
<table width="50%" border="0" align="center" cellpadding="10" cellspacing="0">
<tr>
<td bgcolor="#A4A4A4"><table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#FFFFFF"><table width="100%" border="0" cellpadding="15" cellspacing="1">
<tr>
<td bgcolor="#E1E1E1"><div align="center"><strong>500</strong> <span class="style1">System Error.Please Wait...</span> </div></td>
</tr>
</table></td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>

四、TomJetty处理请求流程:

1.接收客户端发送的请求;

2.解析出请求的url;

3.在web.config文件中检索是否存在该url对应的Servlet类。

4.如果存在该Servlet,就是动态请求,交给该Servlet去处理它。

5.如果不存在,就视为静态请求,加载tomjetty.config文件中的配置信息去处理它。

6.在上述处理过程中,如果遇到服务器端处理类生成或代码问题,就加载500.htm页面;如果是请求页面找不到,则加载404.htm页面。

那么根据上述服务器处理请求的完整流程,TomJetty类的run()方法中处理请求的代码片段就应该是下面这样:

// 封装响应
Response res = new Response(); // 有请求处理类就加载,无则找文件
if(WebUtil.getValue(header.getUrl()) != null) {
try {
IServlet servlet = (IServlet) Class.forName(WebUtil.getValue(header.getUrl())).newInstance();
res.setOut(new PrintWriter(out));
servlet.service(req, res);
} catch(Exception e) {// 编译Servlet发生异常,加载500
File file = new File(TomJettyUtil.getValue("tomjetty.webapps"), "500.htm");
fin = new FileInputStream(file);
byte[] buf = new byte[(int) file.length()];
fin.read(buf);
out.write(buf);
}
} else {
File file = new File(TomJettyUtil.getValue("tomjetty.webapps"),header.getUrl()); // 从配置文件检索服务端静态页面存放目录,定位到服务器端的静态页面
if(!file.exists()) {// 请求静态页面不存在,加载404
file = new File(TomJettyUtil.getValue("tomjetty.webapps"), "404.htm");
}
fin = new FileInputStream(file);
byte[] buf = new byte[(int) file.length()];
fin.read(buf); // 读取静态页面内容
out.write(buf); // 将静态页面内容写回给客户端浏览器显示
}

[置顶] 自己动手写Web容器之TomJetty之六:动态页面引入的更多相关文章

  1. [置顶] 【J2SE 】1136 容器之旅

    开篇引言 本篇文章我将要详细的介绍一下什么是容器?以及什么是1136?来系统全面的了解容器,以及容器的应用,下面就进入我们的容器之旅吧! 1.什么是容器? 用来存储和组织其他对象的对象.我们也可以这样 ...

  2. 自己动手写web框架----1

    本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Se ...

  3. [置顶] 浅谈大型web系统架构

    转载原文:http://blog.csdn.net/dinglang_2009/article/details/6863697 分类: 大规模Web 2.0架构 2011-10-11 18:27 12 ...

  4. [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现

    Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...

  5. [置顶] Xamarin android 调用Web Api(ListView使用远程数据)

    xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...

  6. 自己动手写web框架----2

    在上一节,我们自己写的web框架,只能运行显示一个HelloWorld.现在我们对其进行一次加工,让他至少能运行一个登陆程序. 首先看login.jsp <%@ page contentType ...

  7. [置顶] 使用Android OpenGL ES 2.0绘图之六:响应触摸事件

    传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...

  8. [Web 前端] 006 css 三种页面引入的方法

    1. 外链式 用法 step 1: 在 html 文档的 head 头部分写入下方这句话 <link rel="stylesheet" href="./xxx.cs ...

  9. 自己动手写一个简单的(IIS)小型服务器

    因为第一次在博客园发表随笔,不太会用,这个笔记是我之前在印象笔记中写好的,然后直接copy过来,有兴趣自己做一个IIS服务器的小伙伴们可以参照下面的流程做一次,也可以叫我要源代码,不过要做完,我觉得花 ...

随机推荐

  1. Git学习笔记总结和注意事项

    一.Git简单介绍 Git是眼下世界上最先进的分布式版本号控制系统.其特点简单来说就是:高端大气上档次! 二.Windows上Git安装 最早Git是在Linux上开发的.非常长一段时间内.Git也仅 ...

  2. Android Bluetooth开发

    原文地址:http://developer.android.com/guide/topics/wireless/bluetooth.html 翻译:jykenan 更新:2012.06.19 Andr ...

  3. shell中判断用法

    测试结构: 测试命令可用于测试表达式条件的真假,true,则返回0,false,则返回非0:这一点c/c++有区别:       格式: test  expression #expression是一个 ...

  4. iOS 用GDataXMLNode创建和解析XML

    原文地址:http://blog.csdn.net/gf771115/article/details/7718403 NSError *error; //    NSString *path = [[ ...

  5. 高级UIKit-10(UDPSocket)

    [day1201_UDPSocket]:utpsocket的使用 使用UDP网络传输,是一种无连接的传输协议,不安全,一般使用在监控视频中或QQ聊天中,该网络传输就向广播传播模式,一对多. 在ios中 ...

  6. first-,second- and third-class value

    In computer science, a programming language is said to have first-class functions if it treats funct ...

  7. How to calculate the undo_retention time

    UNDO_RETENTION The undo_retention is a initialization parameter of the undo tablespace. The initiali ...

  8. One simple health check for oracle with sql

    There are some sqls which is used for check the oracle database's health condition. ------numbers of ...

  9. 四个流行的Java连接池之Proxool篇

    Proxool是一个JavaSQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装.可以非常简单的移植到现存的代码中.完全可配置.快速,成熟,健壮.可以透明地为你现存的JDBC驱 ...

  10. Java引用详解

    区分几个概念 ,类 .对象 .对象的引用 A  a1  = new A(); A a2 = a1; a1-------------------->对象内存<---------------- ...