4.现在创建response对象。这里的response类很简单,只需要输出功能
package com.arz.server;
import java.io.IOException;
import java.io.OutputStream;
public class Response {
private OutputStream outStream;
protected Response(OutputStream outStream) {
this.outStream = outStream;
}
public void print(String info){
try{
outStream.write(info.getBytes());
}catch(IOException e){
e.printStackTrace();
}
}
public void println(String info){
try{
outStream.write((info+"\r\n").getBytes());
}catch(IOException e){
e.printStackTrace();
}
}
}
5.创建servlet类,这个servlet是个抽象类,因为在实际开发中这个类里面的service方法是我们来实现的所以也简单
package com.arz.servlet;
import com.arz.server.Request;
import com.arz.server.Response;
public abstract class Servlet {
public abstract void service(Request request,Response response);
}
6.创建ServletContext这个类也是和java中的ServletContext对应。其实就是一个servlet的容器,里面是键-值对的形式保存在map中。这可以对应到整个web.xml。因为web.xml里面放着很多一对一对的servlet元素
package com.arz.servlet;
import java.util.HashMap;
import java.util.Map;
public class ServletContext {
private Map<String,Servlet>context = new HashMap<String, Servlet>();
public Map<String, Servlet> getContext() {
return context;
}
public void setContext(Map<String, Servlet> context) {
this.context = context;
}
public Servlet getServlet(String servletName){
if(context != null){
return context.get(servletName);
}
return null;
}
}
7.下面是ServletMapping这个是存放web.xml中的<servlet-mapping>元素的对应关系
package com.arz.servlet;
public class ServletMapping {
private String servletName;
private String urlPattern;
public String getServletName() {
return servletName;
}
public void setServletName(String servletName) {
this.servletName = servletName;
}
public String getUrlPattern() {
return urlPattern;
}
public void setUrlPattern(String urlPattern) {
this.urlPattern = urlPattern;
}
public ServletMapping(String str,String url){
this.servletName = str;
this.urlPattern = url;
}
}
8.下面的类是解析web.xml并且将servlet-name,servlet-calssdui对应起来保存在ServletContext里面。将servlet-name,url-pattern对应起来保存在ServletMapping这样当知道是什么url时就可以找到对应的class来进行。这里解析xml使用的是jdom方式,你也可以使用其他方法解析。我会将jdom包放在附件中service
package com.arz.servlet;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
public class WebApp {
private static String WEB_ROOT = "/home";
private ServletContext servletContext;
private Map<String, ServletMapping> servletMappings = new HashMap<String, ServletMapping>();
private WebApp(){
parseWebXml();
}
private static WebApp webApp;
public static WebApp getWebApp(){
if(webApp == null){
webApp = new WebApp();
}
return webApp;
}
private void parseWebXml(){
//使用jdom解析XML
SAXBuilder builder = new SAXBuilder();
try{
Document doc = builder.build(new File(WEB_ROOT+"/WEB_INFO/web.xml"));
XPath xpath = XPath.newInstance("//servlet");
servletContext = new ServletContext();
List list = xpath.selectNodes(doc.getRootElement());
//将xml中的servlet-name对应到class类
for(Iterator i = list.iterator(); i.hasNext();){
Element e = (Element)i.next();
String servletname = e.getChildText("servlet-name");
String servletClass = e.getChildText("servlet_class");
Servlet servlet = (Servlet)Class.forName(servletClass).newInstance();
servletContext.getContext().put(servletname, servlet);
}
//将xml中的servlet-name对应到url-pattern(地址栏的请求路径)
xpath = XPath.newInstance("//servlet-mapping");
List mappings = xpath.selectNodes(doc.getRootElement());
for(Iterator i = mappings.iterator(); i.hasNext(); ){
Element e =(Element)i.next();
String servletName = e.getChildText("servlet-name");
String urlPattern = e.getChildText("url-pattern");
ServletMapping mapping = new ServletMapping(servletName,urlPattern);
servletMappings.put(urlPattern,mapping);
}
}catch(Exception e){
e.printStackTrace();
}
}
public ServletContext getServletContext() {
return servletContext;
}
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
public Map<String, ServletMapping> getServletMappings() {
return servletMappings;
}
public void setServletMappings(Map<String, ServletMapping> servletMappings) {
this.servletMappings = servletMappings;
}
}
9.现在写一个测试的Servlet。然后将这个Servlet配置在web.xml中等待请求
package com.arz.servlet;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.arz.server.Request;
import com.arz.server.Response;
public class TestServlet extends Servlet {
private static SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void service(Request request, Response response) {
// TODO Auto-generated method stub
String html = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=gbk\"/>"+
"</head>"+
"<body>"+
"<h2>通信测试.....</h2>"+
"<h2>服务器当前时间是:"+SDF.format(new Date())+"</h2>"+
"</body></html>";
response.print(html);
}
}
这样就大功告成,现在在浏览器中输入http://127.0.0.1:8080/项目名/配置的servlet名(url-pattern)这样就可以看到你输入的html了。
10.简单对上面的过程描述一下
A.“Tomcat”启动,监听着本机端口8080
B.浏览器发送请求:http://127.0.0.1:8080/项目名/配置的servlet名(url-pattern)。没有携带参数被Tomcat捕捉
C.通过socket对象Tomcat封装好HttpServletRequest、HttpServletResponse为执行Servlet的service方法提供参数。并且构造好HttpContext和HttpServlet等对象也就是那六个对象
D.通过解析web.xml调用对应的Servlet类。
E.剩下的事就是我们程序员做的,实例这个类重写service方法或者是doGet()/doPost()
在这里我们应当注意我们使用的Servlet的各种类都tomcat创建的。java只是提供了接口。真正实现的是Tomcat
分享到:
相关推荐
【深入浅析TomCat Session管理分析】 Session在Java Web开发中扮演着至关重要的角色,它允许服务器跟踪用户的交互,存储用户的状态信息。Tomcat作为广泛使用的开源Servlet容器,其内部的Session管理机制对于理解Web...
Tomcat 防止跨站请求伪造(CSRF)机制浅析 在 Web 应用开发中,跨站请求伪造(CSRF)是一种常见的安全威胁。跨站请求伪造攻击是指攻击者诱骗受信任用户访问恶意网站,从而使得恶意网站能以用户身份对受信任网站执行...
【深入浅析Centos 7系统的Tomcat服务器】 Tomcat,这款由Sun的软件架构师詹姆斯·邓肯·戴维森发起的开源项目,如今已成为Apache软件基金会的一部分,是Java Web应用程序的重要载体。Tomcat服务器以其轻量级、高效...
"JDK和Tomcat的安装与配置方法" JDK安装与配置方法是Java开发环境的基础,正确地安装和配置JDK是保证Java程序正常运行的前提。下面将详细介绍JDK的安装和配置方法。 首先,需要下载JDK的安装包,下载地址为...
浅析 Idea 生成 war 包放入 Tomcat 的路径访问问题 Idea 是一个功能强大且流行的集成开发环境(IDE),它可以帮助开发者快速创建、编译和部署 Java 应用程序。然而,在将 war 包部署到 Tomcat 服务器时,开发者...
"浅析Java Web开发环境的搭建.pdf" 本文详细介绍了Java Web开发环境的搭建,包括开发工具包JDK、服务软件Tomcat以及在Tomcat上发布Java Web应用程序的步骤。 Java Web开发环境的搭建是指在Java环境下进行Web应用...
Java Web应用通常被打包为WAR(Web ARchive)或EAR(Enterprise ARchive)文件,然后部署到应用服务器上,如Tomcat、Jetty、GlassFish或WebLogic。应用服务器负责管理和运行这些应用,处理HTTP请求,管理Servlet、...
本篇文档将对JFinal的技术架构进行浅析,帮助读者理解其核心设计理念和工作原理。 1. **总体架构** JFinal 的总体架构可以分为三个层面:空间架构、逻辑架构和代码架构。 - **空间架构**:从物理部署的角度看,...
【基于OBPM构建企业办公管理系统原理浅析】 随着信息技术的发展,企业越来越重视信息化在办公管理中的应用,以提升效率和管理水平。OBPM(Open Business Process Management,开源业务流程管理)作为一种开源、轻量...
在深入研究 Mondrian 时,通常有两种展示结果的方式:一是使用 JPivot(Mondrian 的默认表现层工具)在 Web 页面上展示,二是通过调用 Mondrian API 在控制台显示。后者便于研究结果格式和调试程序。因此,选择后者...
Tomcat应用服务器允许我们配置字符集编码,如在server.xml中设置`URIEncoding`和`useBodyEncodingForURI`属性。在Spring Boot中,可以使用以下配置: ```yaml server: tomcat: uri-encoding: UTF-8 spring: ...
在本压缩包中的"基于Java的Web开发技术浅析 (1).pdf"可能就包含了关于WAR文件的详细解析,以及如何在Web容器中部署和运行WAR文件的方法。 总的来说,Java Web开发技术是一个庞大的领域,涵盖了从服务器端编程、...
【SpringBoot微服务架构下的MVVM模型浅析】 在当前的IT行业中,微服务架构已经成为构建大型复杂应用程序的主流方式,而SpringBoot作为Java领域的热门框架,为微服务的实现提供了强大支持。本文将深入探讨SpringBoot...
至于服务器端的部署,Tomcat是一个广泛使用的开源Java Web应用服务器,它支持Servlet和JSP。对于生产环境,Apache Tomcat或JBoss、WebLogic等更强大的应用服务器可能更适合。 在Web开发中,前端技术也非常重要。...
在Java中,常见的数据库连接池实现有Apache的DBCP、C3P0、HikariCP、Tomcat JDBC Connection Pool等。这些连接池库提供了一套完善的管理和监控机制,包括连接的生命周期管理、事务支持、自动回收过期连接等功能,...
3. 程序部署到 Tomcat 后,src 目录下的配置文件会和 class 文件一样,自动 copy 到应用的 WEB-INF/classes 目录下;classpath: 与 classpath*: 的区别在于,前者只会从第一个 classpath 中加载,而后者会从所有的 ...
在技术实施方面,系统开发多采用Java语言,后台数据库使用MySQL8.0,后台服务器采用Tomcat9.0。这样的技术架构能够保证系统的稳定性和高效性,满足互联网行业对数据分析的高要求。 总而言之,计算机数据挖掘技术在...