设为首页 收藏本站
查看: 384|回复: 0

[经验分享] 浅析Tomcat(二)

[复制链接]

尚未签到

发表于 2017-1-18 11:11:33 | 显示全部楼层 |阅读模式
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包放在附件中servicepackage 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-330185-1-1.html 上篇帖子: 浅析Tomcat(一) 下篇帖子: Tomcat 乱码设置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表