- 浏览: 839799 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
renzhengzhi:
请教一下楼主,公有云和私有云的开发,具体要做哪些工作呢?我拿到 ...
4,云的4 种模式 -
SangBillLee:
我用了solr5.5,用SolrQuery查询,没法高亮,不知 ...
solr5.x快速入门 -
lw900925:
这翻译读起来真是别扭。
solr in action翻译-第一章1.1 -
springjpa_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring MVC性能提升 -
h416373073:
正遇到了此问题不知如何解决, 多谢分享
solr错误
总的来说,一个全功能的servlet容器会为servlet的每个HTTP请求做下面一些工作:
当第一次调用servlet的时候,加载该servlet类并调用servlet的init方法(仅仅一次)。
对每次请求,构造一个javax.servlet.ServletRequest实例和一个javax.servlet.ServletResponse实例。
调用servlet的service方法,同时传递ServletRequest和ServletResponse对象。
当servlet类被关闭的时候,调用servlet的destroy方法并卸载servlet类。
下面这个简单的servlet容器不能做上面的工作,相反,做了下面的几件事
1,等待HTTP请求。
2,构造一个ServletRequest对象和一个ServletResponse对象。
3,假如该请求需要一个静态资源的话,调用StaticResourceProcessor实例的process方法,同时传递ServletRequest和ServletResponse对象。
4,假如该请求需要一个servlet的话,加载servlet类并调用servlet的service方法,同时传递ServletRequest和ServletResponse对象。
------------------------------------------------------------------------------------------------
Servlet由Servlet容器来管理,当客户请求到来时,容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象将被容器作为service()方法的参数传递给Servlet,Serlvet利用ServletRequest对象获取客户端发来的请求数据,利用ServletRequest对象发送响应数据。
所以,我们的容器应构造一个ServletRequest和ServletResponse,即实现这俩个接口即可。
核心代码如下:
package org.tomcat; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class HttpServer1 { private static final String SHUTDOWN_COMMAND= "/SHUTDOWN"; private boolean shutdown =false; public static void main(String[] args){ HttpServer1 server = new HttpServer1(); server.await(); } private void await() { ServerSocket serverSocket = null; int port =8080; try{ serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1")); }catch(IOException e){ e.printStackTrace(); System.exit(-1); } while(!shutdown){ Socket socket = null; InputStream input = null; OutputStream output = null; try{ socket = serverSocket.accept(); input = socket.getInputStream(); output = socket.getOutputStream(); Request request = new Request(input); request.parse(); Response response = new Response(output); response.setRequest(request); if (request.getUri().startsWith("/servlet/")) { ServletProcessor1 processor = new ServletProcessor1(); processor.proess(request, response); }else{ StaticResourceProcessor processor = new StaticResourceProcessor(); processor.process(request, response); } socket.close(); shutdown = request.getUri().equals(SHUTDOWN_COMMAND); }catch(Exception e){ e.printStackTrace(); System.exit(-1); } } } }
package org.tomcat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Enumeration; import java.util.Locale; import java.util.Map; import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; public class Request implements ServletRequest{ private InputStream input; private String uri; public Request(InputStream input){ this.input = input; } public void parse(){ StringBuffer request= new StringBuffer(2048); int i; byte[] buffer =new byte[2048]; try{ i = input.read(buffer); }catch(IOException e){ e.printStackTrace(); i=-1; } for(int j=0;j<i;j++){ request.append((char)buffer[j]); } System.out.println(request.toString()); uri = parseUri(request.toString()); } private String parseUri(String requestString) { int index1, index2; index1 = requestString.indexOf(' '); if (index1 != -1) { index2 = requestString.indexOf(' ', index1 + 1); if (index2 > index1) return requestString.substring(index1 + 1, index2); } return null; } public Object getAttribute(String arg0) { return null; } public Enumeration getAttributeNames() { return null; } public String getCharacterEncoding() { return null; } public int getContentLength() { return 0; } public String getContentType() { return null; } public ServletInputStream getInputStream() throws IOException { return null; } public String getLocalAddr() { return null; } public Locale getLocale() { return null; } public Enumeration getLocales() { return null; } public String getLocalName() { return null; } public int getLocalPort() { return 0; } public String getParameter(String arg0) { return null; } public Map getParameterMap() { return null; } public Enumeration getParameterNames() { return null; } public String[] getParameterValues(String arg0) { return null; } public String getProtocol() { return null; } public BufferedReader getReader() throws IOException { return null; } public String getRealPath(String arg0) { return null; } public String getRemoteAddr() { return null; } public String getRemoteHost() { return null; } public int getRemotePort() { return 0; } public RequestDispatcher getRequestDispatcher(String arg0) { return null; } public String getScheme() { return null; } public String getServerName() { return null; } public int getServerPort() { return 0; } public boolean isSecure() { return false; } public void removeAttribute(String arg0) { } public void setAttribute(String arg0, Object arg1) { } public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException { } public String getUri() { return uri; } }
package org.tomcat; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Locale; import javax.servlet.ServletOutputStream; import javax.servlet.ServletResponse; public class Response implements ServletResponse { private static final int BUFFER_SIZE=1024; Request request; OutputStream output; PrintWriter writer; public Response(OutputStream output){ this.output = output; } public void sendStaticResource()throws IOException{ byte[] bytes= new byte[BUFFER_SIZE]; FileInputStream fis = null; try{ File file = new File(Constants.WEB_ROOT,request.getUri()); fis = new FileInputStream(file); int ch = fis.read(bytes,0,BUFFER_SIZE); while(ch!=-1){ output.write(bytes,0,BUFFER_SIZE); ch = fis.read(bytes,0,BUFFER_SIZE); } }catch(FileNotFoundException e){ String errorMessage = "HTTP/1.1 404 File Not Found\r\n" + "Content-Type: text/html\r\n" + "Content-Length: 23\r\n" + "\r\n" + "<h1>File Not Found</h1>"; output.write(errorMessage.getBytes()); }finally{ if(fis!=null) fis.close(); } } public void flushBuffer() throws IOException { } public int getBufferSize() { return 0; } public String getCharacterEncoding() { return null; } public String getContentType() { return null; } public Locale getLocale() { return null; } public ServletOutputStream getOutputStream() throws IOException { return null; } public PrintWriter getWriter() throws IOException { writer = new PrintWriter(output,true); return writer; } public boolean isCommitted() { return false; } public void reset() { } public void resetBuffer() { } public void setBufferSize(int arg0) { } public void setCharacterEncoding(String arg0) { } public void setContentLength(int arg0) { } public void setContentType(String arg0) { } public void setLocale(Locale arg0) { } public void setRequest(Request request) { this.request = request; } }
发表评论
-
21,tomcat关闭钩子
2012-11-22 20:35 6632在很多环境下,在关闭应用程序的时候需要做一些清理工作。问题在于 ... -
20,tomcat的XML解析---digester
2012-11-22 20:07 1555tomcat使用server.xml配置属性信息Tomcat使 ... -
19tomcat的服务器和服务
2012-11-20 20:10 1074Server服务器 Server接口表示整个Catalina ... -
18,tomcat的主机(host)和引擎
2012-11-16 09:13 2348如果需要在一个Tomcat部署中部署多个上下文,需要使用一个主 ... -
附,listener、 filter、servlet 加载顺序及其详解
2012-11-15 09:10 982一、 1、启动一个WEB项 ... -
17,tomcat中StandardContext
2012-11-15 08:59 5039一个上下文容器(Context)代表一个web应用,每一个上下 ... -
16,tomcat中StandardWrapper实现
2012-11-14 18:28 3883Wrapper接口在Catalina中的标准实现Standar ... -
15,tomcat安全
2012-11-14 09:02 1197有些web应用程序的内容是有限制的,只允许有权限的用户在提供正 ... -
14,tomcat session管理
2012-11-14 09:01 1101Catalina通过一个叫管理器的组建来完成Session的管 ... -
13.tomcat加载器
2012-11-13 13:21 1374库(repository)和源(res ... -
12,tomcat日志处理
2012-11-13 13:15 1248日志系统是一个记录信息的组件。在Catalina中,日志系统是 ... -
附:JAVA事件处理--观察者模式
2012-11-12 10:33 999简单地说,观察者模式 ... -
11.tomcat生命周期
2012-11-12 10:26 985Catalina由多个组件组成,当Catalina启动的 ... -
10.容器
2012-11-12 10:12 1349容器是一个处理用户servlet请求并返回对象给we ... -
9.Tomcat的默认连接器
2012-11-12 08:52 1177Tomcat连接器是一个可以插入servlet容器的独立模块, ... -
8.连接器
2012-11-12 08:46 936一个可以创建更好的请 ... -
7,Facade外观模式
2012-11-08 11:28 946外观模式:为子系统中的一组接口提供了一个一致的界面,此模式定义 ... -
5.javax.servlet.Servlet接口
2012-11-08 09:18 948javax.servlet.Servlet接口Servlet编 ... -
4,一个简单的tomcat
2012-11-07 18:10 935流程图如下 -
3.ServerSocket 与 Socket的区别
2012-11-07 16:56 11711.1 ServerSocket类创建 ...
相关推荐
本主题将深入探讨“一个简单的Servlet容器”的实现,参考自《深入剖析Tomcat》这本书的第二章。 Servlet容器的主要职责是接收HTTP请求,然后调用相应的Servlet来处理这些请求,并将Servlet的响应返回给客户端。在...
6. **Web容器**:为了运行JSP和Servlet,我们需要一个支持Java EE的Web容器,如Tomcat,它可以解析JSP页面并执行Servlet。 7. **项目结构**:ShopCart这个文件夹可能包含了JSP文件、Servlet类、配置文件(如web.xml...
1. 创建一个简单的Servlet,处理GET请求并返回欢迎消息。 2. 学习如何通过Servlet传递参数,并在Servlet中处理这些参数。 3. 理解Servlet的生命周期,模拟Servlet的初始化和销毁过程。 4. 配置Servlet,尝试不同的...
本项目"基于Java的一个支持servlet的web服务器"旨在实现一个简易的Web服务器,能够处理HTTP请求并返回响应,同时支持Servlet容器功能。 1. **Servlet基础** Servlet是Java EE(现在称为Jakarta EE)的一部分,它是...
标题中的“将OSGi嵌入Servlet容器”是一个关于在Java Web开发中整合OSGi(Open Service Gateway Initiative)框架和Servlet容器的技术主题。OSGi是一种模块化系统,它允许Java应用程序以模块化的方式进行构建,提供...
Java Servlet容器(如Tomcat、Jetty)负责加载、实例化和管理Servlet。 2. Servlet生命周期: Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。当首次接收到对Servlet的请求时,容器会加载并初始化Servlet...
在服务阶段,每当接收到一个新的请求时,Servlet容器会创建一个`ServletRequest`和`ServletResponse`对象,并调用Servlet的`service()`方法。`service()`方法会根据请求类型(GET、POST等)转发到相应的`doGet()`或`...
1. 当客户端发送一个HTTP请求到服务器时,服务器会通过Servlet容器(如Tomcat、Jetty)来查找对应的Servlet实例。 2. 如果Servlet尚未被实例化,容器会加载Servlet类并创建一个Servlet实例。 3. 容器调用Servlet的`...
- **服务**:每当有新的请求到来,Servlet容器会调用`service()`方法来处理请求。 - **销毁**:当Servlet不再需要时,服务器会调用`destroy()`方法释放资源,然后销毁Servlet实例。 2. **Servlet的注册与映射** ...
6. **Servlet容器** Servlet运行在Servlet容器中,如Apache Tomcat、Jetty等。容器负责加载、初始化、管理和调度Servlet,提供了一种隔离应用环境的方式。 7. **实际应用** - 用户认证:Servlet可以检查用户登录...
每当有请求到达时,Servlet容器会创建一个Servlet实例来处理请求,完成服务后该实例可能被销毁。对于多线程环境,Servlet容器通常会维护一个Servlet实例池,以提高性能。 7. **Servlet与JSP协同工作** 在实际开发...
1. 单例Servlet:默认情况下,Servlet容器(如Tomcat)会根据需求为每个请求创建一个新的Servlet实例。但为了优化性能,我们可以配置Servlet为单例模式,即整个应用中只有一个Servlet实例。这样,所有请求都将共享同...
在这个实例中,我们需要一个简单的Servlet容器,它能够根据请求的URL找到对应的Servlet并执行相应操作。 4. **Servlet生命周期**:Servlet有三个主要的方法:init、service和destroy。init方法在Servlet被加载时...
3. **Servlet容器**:Servlet容器是Web服务器的核心部分,负责加载、实例化、初始化、服务和销毁Servlet。在这个实现中,容器可能包含一个Servlet的注册表,用来存储Servlet的映射信息。 4. **Servlet生命周期**:...
5. **Servlet容器**:为了运行Servlet,我们需要一个Servlet容器,如Tomcat、Jetty等。这些容器负责管理Servlet的生命周期,解析HTTP请求并调用相应的Servlet方法。 6. **编程实践**:在Servlet类中,我们需要继承`...
8. **运行环境**:这个简单的HTTP应用需要一个Servlet容器来运行,如Tomcat、Jetty等。这些容器提供了运行Servlet所需的环境,并管理Servlet的生命周期。 9. **编码实践**:在实际开发中,我们通常会遵循一些最佳...
使用Jetty实现嵌入式的Servlet容器需要编写代码,下面是一个简单的示例代码: ```java public static void main(String[] args) throws Exception { Server server = new Server(8080); //声明上下文对象 ...
在这个"Servlet 书店的简易实现"项目中,开发者利用Servlet和EasyUI框架构建了一个简单的在线书店系统。下面将详细阐述这个项目中涉及的核心知识点。 1. **Servlet基础**: - Servlet是Java编程语言中处理HTTP请求...
Spring作为一个强大的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,提供了丰富的功能,如依赖注入、事务管理、安全控制等。而Servlet作为Java EE规范的一部分,主要用于处理HTTP请求。将...