[置顶] 自己动手写Web容器之TomJetty之六:动态页面引入
传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229
在上一节,我们已经完成了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之六:动态页面引入的更多相关文章
- [置顶] 【J2SE 】1136 容器之旅
开篇引言 本篇文章我将要详细的介绍一下什么是容器?以及什么是1136?来系统全面的了解容器,以及容器的应用,下面就进入我们的容器之旅吧! 1.什么是容器? 用来存储和组织其他对象的对象.我们也可以这样 ...
- 自己动手写web框架----1
本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Se ...
- [置顶] 浅谈大型web系统架构
转载原文:http://blog.csdn.net/dinglang_2009/article/details/6863697 分类: 大规模Web 2.0架构 2011-10-11 18:27 12 ...
- [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现
Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...
- [置顶]
Xamarin android 调用Web Api(ListView使用远程数据)
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...
- 自己动手写web框架----2
在上一节,我们自己写的web框架,只能运行显示一个HelloWorld.现在我们对其进行一次加工,让他至少能运行一个登陆程序. 首先看login.jsp <%@ page contentType ...
- [置顶] 使用Android OpenGL ES 2.0绘图之六:响应触摸事件
传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...
- [Web 前端] 006 css 三种页面引入的方法
1. 外链式 用法 step 1: 在 html 文档的 head 头部分写入下方这句话 <link rel="stylesheet" href="./xxx.cs ...
- 自己动手写一个简单的(IIS)小型服务器
因为第一次在博客园发表随笔,不太会用,这个笔记是我之前在印象笔记中写好的,然后直接copy过来,有兴趣自己做一个IIS服务器的小伙伴们可以参照下面的流程做一次,也可以叫我要源代码,不过要做完,我觉得花 ...
随机推荐
- Git学习笔记总结和注意事项
一.Git简单介绍 Git是眼下世界上最先进的分布式版本号控制系统.其特点简单来说就是:高端大气上档次! 二.Windows上Git安装 最早Git是在Linux上开发的.非常长一段时间内.Git也仅 ...
- Android Bluetooth开发
原文地址:http://developer.android.com/guide/topics/wireless/bluetooth.html 翻译:jykenan 更新:2012.06.19 Andr ...
- shell中判断用法
测试结构: 测试命令可用于测试表达式条件的真假,true,则返回0,false,则返回非0:这一点c/c++有区别: 格式: test expression #expression是一个 ...
- iOS 用GDataXMLNode创建和解析XML
原文地址:http://blog.csdn.net/gf771115/article/details/7718403 NSError *error; // NSString *path = [[ ...
- 高级UIKit-10(UDPSocket)
[day1201_UDPSocket]:utpsocket的使用 使用UDP网络传输,是一种无连接的传输协议,不安全,一般使用在监控视频中或QQ聊天中,该网络传输就向广播传播模式,一对多. 在ios中 ...
- first-,second- and third-class value
In computer science, a programming language is said to have first-class functions if it treats funct ...
- How to calculate the undo_retention time
UNDO_RETENTION The undo_retention is a initialization parameter of the undo tablespace. The initiali ...
- 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 ...
- 四个流行的Java连接池之Proxool篇
Proxool是一个JavaSQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装.可以非常简单的移植到现存的代码中.完全可配置.快速,成熟,健壮.可以透明地为你现存的JDBC驱 ...
- Java引用详解
区分几个概念 ,类 .对象 .对象的引用 A a1 = new A(); A a2 = a1; a1-------------------->对象内存<---------------- ...