深入刨析tomcat 之---第1篇,解决第1,2章bug 页面不显示内容Hello. Roses are red.
writedby 张艳涛,
第一个问题是不显示index.html网页
19年才开始学java的第二个月,就开始第一遍看这本书,我估计当初,做第一章的一个案例,自己写代码,和验证就得一天吧,当初就发现了这个问题,chrome浏览器不显示localhost:8080/index.html页面,还特意在培训班的课堂上问了下,老师说是web服务器没有写http头,这个老师一眼就看出来了,还行;但通过ie浏览器就没这个问题,真是服气了~~~
先贴下解决这个问题的代码
package com.zyt.tomcat.ex01;
import java.io.*;
public class Response {
private static final int BUFFER_SIZE=1024;
Request request;
OutputStream output;
public Response(OutputStream output) {
this.output = output;
}
public void setRequest(Request request) {
this.request = request;
}
public void sendStaticResource() throws IOException{
byte[] bytes = new byte[BUFFER_SIZE];
FileInputStream fis=null;
File file = new File(HttpServer.WEB_ROOT, request.getUri());
PrintWriter out=null;
try {
if (file.exists()) {
out = new PrintWriter(output);
fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ch = fis.read(bytes, 0, BUFFER_SIZE);
while (ch != -1) {
baos.write(bytes,0,ch);
ch = fis.read(bytes, 0, BUFFER_SIZE);
}
byte[] array = baos.toByteArray();
out.println("HTTP/1.1 200 OK");
out.println("Server: Molly");
out.println("Content-Type: text/html; charset=UTF-8");
out.println("Content-Length: "+array.length);
out.println("");
out.flush();
output.write(array,0,array.length);
}else {
// file not found
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());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
fis.close();
}
}
}
}
你别看这小段内容,其中有一个问题就是,你要写Content-Length的值,如果你先写http头,在读头文件,那你就没法知道文件的大小的值了,这里采取了一个第三变量array来保存文件的内容,这样子就可以先写http头内容,完成之后,接着写文件内容;
这全网独一份,不过我也是在java并发编程的艺术这边书上参考了4.4章,

再顺便提另外一个问题,这个index.html的代码如下
<html>
<head>
<title>Welcome to BrainySoftware</title>
</head>
<body>
<img src="./images/logo.gif">
<br>
Welcome to BrainySoftware.
</body>
</html>
这个图片加载的标签img src="",这个是加载静资源,要说的是静态资源是通过浏览器先接受index.html文件的内容,解析之后再进行了一次http请求得到了jpg图片
并不是一次返回全部内容,看证据,

浏览器端
服务器端
第二个问题是: 浏览器输入 http://localhost:8080/servlet/PrimitiveServlet ,不显示内容
问题描述,这个问题是,第二章的第一案例,加载servlet类,实现动态加载,这个问题,大概在2020年的4月份自己想解决,想了好几天都没想到方法.
这个问题也是一样,他的PrimitiveServlet代码主要是如下,他也没有写http头
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter; public class PrimitiveServlet implements Servlet { public void init(ServletConfig config) throws ServletException {
System.out.println("init");
} public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("from service");
PrintWriter out = response.getWriter();
out.println("Hello. Roses are red.");
out.print("Violets are blue.");
} public void destroy() {
System.out.println("destroy");
} public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
} }
去年4月份想的方法是,在
servlet = ((Servlet) myClass.newInstance());
servlet.service(((ServletRequest) request), ((ServletResponse) response));
service方法之前,给out写一个http 头文件,但是没有解决 out.println("Content-Length: " 是多少); 文件长度的值的问题;
自己就一直想一直想,没想出来,今天下午,同意遇到这个问题了,现在可能对java 的知识理解深入了还是怎么开窍了,
发现自己之前提的问题就是一个错误问题,我们在执行servlet.service()方法的时候,service的功能是什么???之前我理解的是servlet
是给浏览器返回网页,这是错误的,在servlet中,你可以只是sout("hello")回头打印一句话,你不给浏览器回复,那么浏览器只是没得到回复,(网页空白)
那么我的servlet功能实现了吗?实现了控制台已经打印了hello,那么如果你要给浏览器回复一个网页,那么你要在service()方法里面写http头文件和httpbody
不应该servletProcessor1.java这个里,在反射调用servket,service 之前写http头文件
更改后的文件为
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter; public class PrimitiveServlet implements Servlet { public void init(ServletConfig config) throws ServletException {
System.out.println("init");
} public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("from service");
PrintWriter out = response.getWriter();
out.println("HTTP/1.1 200 OK");
out.println("Server: Molly");
out.println("Content-Type: text/html; charset=UTF-8"); out.println("");
out.flush();
out.println("Hello. Roses are red.");
out.print("Violets are blue.");
} public void destroy() {
System.out.println("destroy");
} public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
} }
增加文件如标记所示,这个又遇到一个问题,你得javac编译他,但不能用idea 因为这个类没有包名
所以你要使用javac 带依赖编译,如何编译呢?将源码包中的lib文件方法webroot文件夹下面,运行如下指令
D:\wksp_study\designbook\webroot>javac -encoding UTF-8 -classpath .;D:\wksp_study\designbook\webroot\lib/servlet.jar PrimitiveServlet.java
如果你直接java 类名,会报错,提示
PrimitiveServlet.java:5: 错误: 找不到符号
public class PrimitiveServlet implements Servlet {
^
符号: 类 Servlet
PrimitiveServlet.java:7: 错误: 找不到符号
public void init(ServletConfig config) throws ServletException {
^
符号: 类 ServletConfig
位置: 类 PrimitiveServlet
PrimitiveServlet.java:7: 错误: 找不到符号
public void init(ServletConfig config) throws ServletException {
^
符号: 类 ServletException
位置: 类 PrimitiveServlet
PrimitiveServlet.java:11: 错误: 找不到符号
public void service(ServletRequest request, ServletResponse response)
^
符号: 类 ServletRequest
位置: 类 PrimitiveServlet
PrimitiveServlet.java:11: 错误: 找不到符号
public void service(ServletRequest request, ServletResponse response)
=====================================================
通过如上一番操作,你就能看到如下界面了

结束语:
1,之前打印一章的案例,得慢慢蹭蹭,现在熟练运用了idea的.var .if .nn .try .while 一点代码简直起飞呀,写代码行云流水,真是一种享受;
2,知识是需要循序渐进的,相关知识的积累对当前表面的知识是有很大影响的,比如我问你个问题,jvm的gc是处理垃圾对象,那么垃圾对象是怎么产生的呢? 答案是: A.func1 调用 B.func2 在调用C.func3 那么程序的栈帧中同时有三个方法栈,每个方法中都有自己的局部变量,每个局部变量对应一个jvm对象,如果你在func3中一直while 那么,这个时候jvm没有垃圾,事实是你func3调用玩了,你返回了,摧毁了func3的栈,局部变量给摧毁了,那么 局部变量 obj= new Obejct(); obj 没了, new Object()还在,那么这个new Object()就是jvm的垃圾,同样,你从func1中返回,那么fucn1,2,3中的局部变量都是垃圾了
3.这是我第三次敲这个案例才醒悟了,没那么简单呢,即使是涛哥这么牛逼的人~~~
深入刨析tomcat 之---第1篇,解决第1,2章bug 页面不显示内容Hello. Roses are red.的更多相关文章
- 深入刨析tomcat 之---第2篇,解决第3章bug 页面不显示内容http://localhost:8080/servlet/ModernServlet?userName=zhangyantao&password=1234
writedby 张艳涛7月2日, 在学习第4张的过程中,发现了前一篇文章写的是关于1,2张的bug不用设置response响应头,需要在servlet的service()方法里面写是错误想 serv ...
- 深入刨析tomcat 之---第8篇 how tomcat works 第11章 11.9应用程序,自定义Filter,及注册
writed by 张艳涛, 标签:全网独一份, 自定义一个Filter 起因:在学习深入刨析tomcat的学习中,第11章,说了调用过滤链的原理,但没有给出实例来,自己经过分析,给出来了一个Filt ...
- 深入刨析tomcat 之---第12篇 how tomcat works( 第17章 ) 解析catalina.bat 梳理启动流程
我们如何启动tomcat呢? 答案是双击startup.bat文件,这个文件在bin目录下 @echo off 不显示批处理命令 rem Licensed to the Apache Softw ...
- 深入刨析tomcat 之---第23篇 聊一下web容器的filter配置和defaultservet
writedby 张艳涛,在一个webapp应用程序内如何配置filter? <?xml version="1.0" encoding="ISO-8859-1&qu ...
- 深入刨析tomcat 之---第21篇 tomcat 对jsp页面支持的实现原理
writedby 张艳涛 web技术,以前的动态网页技术多是jsp页面,比如点击一个菜单目录,直接访问了一个LRJSDetailInput.jsp页面,这个页面 有<html><bo ...
- 深入刨析tomcat 之---第15篇 对应20章, myAdmin案例代码
writedby 张艳涛 有没有和我一样做到第20章的?今天基本结束了本书的阅读.最后一个案例没有demo,那我写了一回,如果有需要的可以在本地试试 路径 D:\wksp_study\designbo ...
- 深入刨析tomcat 之---第14篇 对应19章,使用manager管理 web应用
writedby 张艳涛 第19章讲的是管理程序,当一个tomcat启动的时候,能通过远程浏览器能访问tomcat,启动web应用,关闭web应用,查看web应用 怎么实现的呢? 在webapp 文件 ...
- 深入刨析tomcat 之---第13篇 tomcat的三种部署方法
writedby 张艳涛 一般我们都知道将web 应用打成war包,放到tomcat的webapp目录下,就是部署了,这是部署方法1 第2种部署方法我们也知道,就是讲web应用的文件夹拷贝到webap ...
- 深入刨析tomcat 之---第11篇 how tomcat works( 第15章 ) 如何解析web.xml 文件
writedby 张艳涛 记得当年是学习jsp的时候,写过web.xml中的标签.在之后的springmvc中也是有关于配置mvc 过滤器 和dispatchServlet的标签,之前是看不懂呢!看到 ...
随机推荐
- nacos 实战(史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- 面试热点|理解TCP/IP传输层拥塞控制算法
0x00.前言 通过本文你将了解到以下内容: 拥塞控制概念以及其背景 流量控制和拥塞控制的区别与联系 拥塞控制主要过程详解 伙伴们认真学习一下,让offer来得更猛烈些吧! 0x01.TCP/IP协议 ...
- Python使用websocket调用语音识别,语音转文字
@ 目录 0. 太长不看系列,直接使用 1. Python调用标贝科技语音识别websocket接口,实现语音转文字 1.1 环境准备: 1.2 获取权限 1.2.1 登录 1.2.2 创建新应用 1 ...
- 自动删除n天前的日志(此处用于业务删除xml文件)
Linux应用总结:自动删除n天前的日志 linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快 ...
- Java语言实现二维码的生成
众所周知,现在生活中二维码已经是无处不见.走在街道上,随处可见广告标语旁有二维码,手机上QQ,微信加个好友都能通过二维码的方式,我不知道是什么时候兴起的二维码浪潮,但是我知道,这在我小时候可是见不到的 ...
- canvas绘制动画的技巧
我们拿下图中的沿着线段轨迹移动的原点来举例,怎么来实现这个动画! 1)定义路径集合Path,里面规定关键坐标点如startPoint和endPoint,设置从startPoint移动到endPoint ...
- 精尽Spring Boot源码分析 - 支持外部 Tomcat 容器的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- Layui 关闭自己刷新父页面
var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); window.parent.locati ...
- csu-acm 1503: 点到圆弧的距离
1503: 点到圆弧的距离 分析: 先判断点和圆心的连线是否在圆弧范围内,如果在,最短距离即到圆心的距离减去半径的绝对值:反之,为到端点的最短距离. 具体看注释 #include <bits/s ...
- 使用curl断点续传下载文件
办公网络网速不是很好,使用Chrome下载一些软件时不时会中断,恶心的是Chrome居然不支持断点续传下载(为什么chrome的下载不支持断点续传呢?),迅雷自然是不能装的,那怎么办?还好我有大名鼎鼎 ...