想必大家都知道Tomcat其实就是servlet容器。负责servlet前期的准备工作。在这里简单用代码模拟一下Tomcat的工作。
首先牵涉到网络,那么网络编程是少不了的。
1.这个类就是一个servlet服务的工具,程序从这里开始
package com.arz.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServletServer {
private ServerSocket serverSocket;
private int port;
private boolean shutDown;
public ServletServer (int port){
this.port = port;
}
public void startServer(){
try{
serverSocket = new ServerSocket(port);
}catch(IOException e){
System.out.println("监听"+port+"失败!");
System.exit(0);
}
while(!shutDown){
try{
//监听着8080端口
Socket socket = serverSocket.accept();
//实例一个Runnable接口类,在这里面运行全部的核心工作
DispatchSocket dispatchSocket = new DispatchSocket(socket);
//启动Runnable中的run()方法
new Thread(dispatchSocket).start();
}catch(IOException e){
System.out.println("客户端出了问题");
e.printStackTrace();
}
}
}
public static void main(String[] args){
ServletServer server = new ServletServer(8080);
server.startServer();
}
public boolean isShutDown(){
return shutDown;
}
public void setShutDown(boolean shutDown){
this.shutDown = shutDown;
}
}
2.创建DispatchSocket这个类是为了满足Tomcat的多线程而产生的。有了这个类“Tomcat”就可以同时被多个访问了
package com.arz.server;
import java.io.IOException;
import java.net.Socket;
import com.arz.servlet.Servlet;
import com.arz.servlet.ServletMapping;
import com.arz.servlet.TestServlet;
import com.arz.servlet.WebApp;
public class DispatchSocket implements Runnable {
private Socket socket;
public DispatchSocket(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try{
System.out.println("客户端是:"+socket.getRemoteSocketAddress());
//实例request,可以跟踪查看Request类,将socket类的输入流交给request。可以看做是HttpServletRequest
Request request = new Request(socket.getInputStream(),8080);
//实例response,可以跟踪查看Response类,将socket类的输出流交给response。结果将会输出到网页。可以看做是HttpServletResponse
Response response = new Response(socket.getOutputStream());
//*****************这里是直接运行Servlet类的service方法*****************
//将这个类看做是HttpServlet
Servlet servlet = new TestServlet();
//调用我们写的service()方法
servlet.service(request, response);
//*****************这里是我们解析web.xml得到的servlet对象,和上面是并行的*****************
//解析web.xml的类,并且将对象的对应关系包装好
WebApp webApp = WebApp.getWebApp();
String urlPattern = request.getUrlPattern();
ServletMapping mapping = webApp.getServletMappings().get(urlPattern);
if(mapping != null){
String servletName = mapping.getServletName();
Servlet servlet1 = webApp.getServletContext().getServlet(servletName);
if(servlet1 != null){
servlet1.service(request, response);
}else{
response.println("没有获得Servlet");
}
}else{
response.print("你请求的url错误,该url不正确。没有找到相应的页面!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
closeSocket(socket);
}
}
public void closeSocket(Socket socket){
if(socket != null){
try{
socket.getOutputStream().flush();
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
3.大家应该知道java在servlet编程中只是提供了类的接口,具体的实现是交给服务商完成的。作为比较优秀的服务器Tomcat自然也要实现java定义的servlet类例如HttpServletRequest,下面是HttpServletRequest的模拟代码。当然真正的HttpServletRequest要复杂的多的多
package com.arz.server;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Request {
private int port;
private String host;
private String urlPattern;
private Map<String,String> map = new HashMap<String,String>();
private String method;
private String headInfo;
private InputStream inStream;
protected Request(InputStream inStream,int port) {
this.inStream = inStream;
this.port = port;
parseRequestHead();
}
private void parseRequestHead(){
byte[] buf = new byte[1024];
try{
inStream.read(buf);
headInfo = new String(buf);
System.out.println(headInfo);
method = headInfo.substring(0,headInfo.indexOf("/")).trim();
System.out.println("请求方式:"+method);
host = headInfo.substring(headInfo.indexOf("Host:")+5,headInfo.indexOf(":"+port)).trim();
System.out.println("请求地址:"+host);
//??
if(method.equalsIgnoreCase("get")){
parseGetString();
}else if (method.equalsIgnoreCase("post")){
parsePostString();
}
}catch(IOException e){
e.printStackTrace();
}
}
private void parsePostString(){
urlPattern = headInfo.substring(5, headInfo.indexOf("HTTP/")).trim();
String dataString = headInfo.substring(headInfo.lastIndexOf("\r\n")).trim();
//??
StringTokenizer st = new StringTokenizer(dataString,"&");
while(st.hasMoreTokens()){
String[] ss = st.nextToken().split("=");
map.put(ss[0], ss[1]);
}
}
private void parseGetString(){
String url = headInfo.substring(4, headInfo.indexOf("HTTP/"));
if(url.indexOf("?")==-1){
urlPattern = url.trim();
}else{
urlPattern = url.substring(0, url.indexOf("?")).trim();
String dataString = url.substring(url.indexOf("?")+1).trim();
StringTokenizer st = new StringTokenizer(dataString,"&");
while(st.hasMoreTokens()){
String[] ss = st.nextToken().split("=");
map.put(ss[0], ss[1]);
}
}
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUrlPattern() {
return urlPattern;
}
public void setUrlPattern(String urlPattern) {
this.urlPattern = urlPattern;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getHeadInfo() {
return headInfo;
}
public void setHeadInfo(String headInfo) {
this.headInfo = headInfo;
}
public String getParameter(String name){
if(map != null && map.size() > 0){
return (String)map.get(name);
}
return null;
}
}
分享到:
相关推荐
【深入浅析TomCat Session管理分析】 Session在Java Web开发中扮演着至关重要的角色,它允许服务器跟踪用户的交互,存储用户的状态信息。Tomcat作为广泛使用的开源Servlet容器,其内部的Session管理机制对于理解Web...
Tomcat 防止跨站请求伪造(CSRF)机制浅析 在 Web 应用开发中,跨站请求伪造(CSRF)是一种常见的安全威胁。跨站请求伪造攻击是指攻击者诱骗受信任用户访问恶意网站,从而使得恶意网站能以用户身份对受信任网站执行...
【深入浅析Centos 7系统的Tomcat服务器】 Tomcat,这款由Sun的软件架构师詹姆斯·邓肯·戴维森发起的开源项目,如今已成为Apache软件基金会的一部分,是Java Web应用程序的重要载体。Tomcat服务器以其轻量级、高效...
浅析 Idea 生成 war 包放入 Tomcat 的路径访问问题 Idea 是一个功能强大且流行的集成开发环境(IDE),它可以帮助开发者快速创建、编译和部署 Java 应用程序。然而,在将 war 包部署到 Tomcat 服务器时,开发者...
"JDK和Tomcat的安装与配置方法" JDK安装与配置方法是Java开发环境的基础,正确地安装和配置JDK是保证Java程序正常运行的前提。下面将详细介绍JDK的安装和配置方法。 首先,需要下载JDK的安装包,下载地址为...
Tomcat是最常用的Web服务器之一,它可以运行在Windows、Linux、Unix等多种操作系统上。 在Java Web开发环境中,数据库是必不可少的组件,它用于存储和管理数据。常见的数据库有MySQL、Oracle、DB2等。 IDE工具是...
Java Web应用通常被打包为WAR(Web ARchive)或EAR(Enterprise ARchive)文件,然后部署到应用服务器上,如Tomcat、Jetty、GlassFish或WebLogic。应用服务器负责管理和运行这些应用,处理HTTP请求,管理Servlet、...
- **空间架构**:从物理部署的角度看,JFinal 是一个标准的Servlet容器应用,可以运行在任何支持Servlet的Web服务器上,如Tomcat、Jetty等。它不需要额外的中间件或服务层,使得部署简单且快速。 - **逻辑架构**...
在本压缩包中的"基于Java的Web开发技术浅析 (1).pdf"可能就包含了关于WAR文件的详细解析,以及如何在Web容器中部署和运行WAR文件的方法。 总的来说,Java Web开发技术是一个庞大的领域,涵盖了从服务器端编程、...
在实际分析前,需要搭建合适的环境,如 Windows 2003、Tomcat、MySQL、Java 1.6 和特定版本的 Mondrian 源码。通过配置 Eclipse 工程,导入源码并运行 Ant 脚本准备编译和测试环境。 在深入研究 Mondrian 时,通常...
至于服务器端的部署,Tomcat是一个广泛使用的开源Java Web应用服务器,它支持Servlet和JSP。对于生产环境,Apache Tomcat或JBoss、WebLogic等更强大的应用服务器可能更适合。 在Web开发中,前端技术也非常重要。...
在Java中,常见的数据库连接池实现有Apache的DBCP、C3P0、HikariCP、Tomcat JDBC Connection Pool等。这些连接池库提供了一套完善的管理和监控机制,包括连接的生命周期管理、事务支持、自动回收过期连接等功能,...
SpringBoot是Spring框架的一个简化版本,它提供了快速构建独立运行的Spring应用程序的能力,简化了配置,并内置了许多常用功能,如嵌入式Tomcat服务器、自动配置、健康检查等。这使得开发者可以专注于业务逻辑,而...
Java 中文乱码问题是一个常见的编程困扰,尤其对于处理中文字符的Java程序而言。这个问题通常源于字符编码的不一致,即不同环节采用的字符编码标准不统一。本文将深入探讨这一问题,并提供相应的解决方案。 首先,...
【基于OBPM构建企业办公管理系统原理浅析】 随着信息技术的发展,企业越来越重视信息化在办公管理中的应用,以提升效率和管理水平。OBPM(Open Business Process Management,开源业务流程管理)作为一种开源、轻量...
3. 程序部署到 Tomcat 后,src 目录下的配置文件会和 class 文件一样,自动 copy 到应用的 WEB-INF/classes 目录下;classpath: 与 classpath*: 的区别在于,前者只会从第一个 classpath 中加载,而后者会从所有的 ...
安装过程包括下载Jenkins WAR文件,将其部署在Tomcat或Jetty等Web服务器上,然后通过浏览器访问Jenkins初始化设置,配置系统环境和安装必要的插件。 ### 3. 构建工作流 在Java项目中,Jenkins可以通过监听Git或SVN...