传送门 ☞ 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 {@Overridepublic 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();}@Overridepublic 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发生异常,加载500File 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()) {// 请求静态页面不存在,加载404file = 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. [置顶] “非主流”Web容器之TomJetty之让服务动起来

    传送门 ☞ 1.Web服务内功经脉 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面启程 上一节我们对于实现TomJetty服务器做了一些与Web有关的知识铺垫和回顾.那么从本节正式开始实现T ...

  2. 【生生不息原创】自己动手写Web自动化测试框架3 - 操纵Web控件

    原创:http://www.colblog.net/node/136 上面的两次课程我们介绍了mshtml和SHDocVw的一些用途,以及如何打开并且附加到IE上,实现IE的宏观上的控制. 这次我们将 ...

  3. [置顶] 自己动手实现OpenGL-OpenGL原来如此简单(三)

    上一篇自己动手写opengl 由于时间原因停止了更新,现在继续. 1. 首先我们定义以下变量 public static class DisplayInfo{ Canvas canvas; int h ...

  4. 分布式专题-高性能的Web容器之Nginx02-Nginx的应用实战

    目录导航 前言 反向代理 负载均衡 upstream 其他配置信息 proxy_next_upstream proxy_connect_timeout proxy_send_timeout proxy ...

  5. 自己动手写web服务器一(浏览器的访问信息)

    要协议一个web服务器,需要了解http协议,下面我们来看一下当浏览器请求网张的时候向web服务器发送的数据,我使用的是ubuntu 中telent展现一个下过程.我需要一个简单的网站来演示一下,我装 ...

  6. 自己动手写数据库系统:容灾恢复原理和容灾恢复日志的设计

    数据库系统有一个及其重要的功能,那就是要保持数据一致性.在用户往数据库写入数据后,如果数据库返回写入成功,那么数据就必须永久性的保存在磁盘上.此外作为一个系统,它必须具备自恢复功能,也就是如果系统出现 ...

  7. [置顶] 自己动手实现OpenGL-OpenGL原来如此简单(二)

    上篇对glViewPort的实现可见一斑.但是并没有提及其中的思路所在.本篇主要是简短地介绍一下WGL的实现思路. 由于OpenGL是一个状态机,既然是状态机,那么肯定有一系列的状态需要保存.Open ...

  8. [置顶] 自己动手实现OpenGL之glViewPort(一)

    直接上代码. public static void glViewport( int x, int y, int width, int height ) { int surfaceHeight = mI ...

  9. html nav 置顶居中,如何让我的nav栏始终在页面中居中使用CSS3?

    而且我怎样才能让颜色伸展过去呢? (我知道我需要更改列表项目的背景颜色,但似乎没有其他工作). 这里是我的CSS代码: #nav {font-family: journalregular; width ...

最新文章

  1. 网络编程学习笔记(udp_connect函数)
  2. alv导出本地文件DUMP
  3. Android常用的几种资源
  4. html逻辑判断符,JavaScript中的逻辑判断符、||与!介绍
  5. 反应堆Reactor
  6. 数据结构与算法--复杂链表的复制
  7. 《剑指Offer》52:两个链表的第一个公共节点
  8. svn冲突怎么解决_管理者怎么处理员工冲突?解决下属冲突的6个方法
  9. html5canvas简单画图
  10. leetcode - 486. 预测赢家
  11. OpenCV中的图像插值示例
  12. Java 相关计数问题及其实现
  13. 【TWVRP】基于matlab遗传算法求解多车场带时间窗的车辆路径规划问题【含Matlab源码 1035期】
  14. 基于JAVA疫情防控期间网上教学管理计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  15. USB、Mini-USB、Micro-USB接口的引脚定义
  16. python 多行注释 字符串_python多行注释和跨行字符串
  17. 龙果支付 mysql_龙果开源支付系统搭建与部署
  18. CANopen协议 学习笔记
  19. htmllt;pregt;标签,聊一聊HTML pre标签
  20. BNUZ-ACM 2018国庆新生欢乐赛部分题解+思路(已解出答案部分)

热门文章

  1. 7-81 单词长度 (15 分)
  2. 输出三角形字符阵列 (15 分)
  3. 注会考试不可以用计算机,CPA机考,不让带计算器该如何做?
  4. java去掉重复字符_Java实现去掉字符串重复字母的方法示例
  5. ab压力测试php脚本,ab压力测试工具-批量压测脚本
  6. JavaScript笔记整理
  7. http://101.132.165.115/
  8. WebScarab使用说明
  9. 分页查询的SQL语句
  10. JavaScript正则表达式的坑很深