Open saltfish666 opened 6 years ago
$ pwd
/usr/local/apache-tomcat-8.5.29
$ tree -L 1
.
├── LICENSE
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── bin
├── conf
├── lib
├── logs
├── saltfish
├── temp
├── webapps
└── work
bin
文件夹存放一些系统脚本
$ /Library/Tomcat/bin/startup.sh (启动tomcat)
$ /Library/Tomcat/bin/shutdown.sh (关闭tomcat)
Using CATALINA_BASE: /usr/local/apache-tomcat-8.5.29
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.29
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.5.29/temp
Using JRE_HOME: /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
Using CLASSPATH: /usr/local/apache-tomcat-8.5.29/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.29/bin/tomcat-juli.jar
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Server version: Apache Tomcat/8.5.29
Server built: Mar 5 2018 13:11:12 UTC
Server number: 8.5.29.0
OS Name: Mac OS X
OS Version: 10.12.6
Architecture: x86_64
JVM Version: 10+46
JVM Vendor: "Oracle Corporation"
lib
文件夹存放开发用的jar包。
servlet-api.jar
实现了javax.servlet
conf
文件夹server.xml
Tomcat 在启动的第三阶段会解析 server.xml文件
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
字段决定Tomcat 使用哪个端口接受HTTP请求。
-- 测试 -- 将8080 修改为8088 ,重启。 发现Tomcat监听了http://localhost:8088
<Server port="8005" shutdown="SHUTDOWN">
Tomcat 监听8005端口开接受shotdown
命令
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
appBase
的值就是web访问的目录/容器.
-- 测试 --
使appBase="saltfish",在Tomcat根目录下复制webapps文件夹并改名为saltfish,修改saltfish/ROOT/index.jsp
,重启Tomcat。果然看到新的内容
web.xml
结尾处有:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
决定默认访问文件,访问某一目录时依次尝试访问。
系统默认提供web服务的文件夹 可在conf/server.xml 中修改
ROOT
默认根目录浏览器访问 http://localhost:8080/ 时,由 conf/server.xml
得知应当连接到 webapps
文件夹,
设计者为了保持webapps
的简洁,会将其连接到ROOT
文件夹,并根据 conf/web.xml
的 <welcome-file-list>
依次尝试寻找文件。
-- 测试--
在ROOT
下添加index.html
,发现index.jsp
被覆盖了;在web.xml
上调整顺序,发现jsp有覆盖回来了。。
(发现这里和Django的APP都是指一个顶级子目录)
每一个APP目录下都要有 WEB-INF
目录
用于存放配置信息
<servlet>
<servlet-name>libai</servlet-name>
<servlet-class>Saltfish</servlet-class>
<!-- <servlet-class>SessionExample</servlet-class> -->
</servlet>
<servlet-mapping>
<servlet-name>libai</servlet-name>
<url-pattern>/lishuai</url-pattern>
</servlet-mapping>
用于将URL映射到相应文件(servlrt)
如果url不存在,就会尝试寻找静态资源。
但是只会查找.html
.css
.jpg
等
--测试--
\<url-pattern> | 根目录下文件名 | 访问结果 |
---|---|---|
/lishuai | lishuai | 1 |
null | lishuai.html | 2 |
/lishuai.html | lishuai.html | 1 |
null | lishuai.h | 无法访问 |
可见,默认情况下,当用户访问一个url后,Tomcat 优先尝试根据web.xml
寻找对应servlet,再尝试寻找一般的静态资源,不允许访问特殊文件后缀。
当前app的servlet容器。
-- 测试 -- 编写
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Enumeration;
import java.util.ResourceBundle;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import util.HTMLFilter;
public class Saltfish extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final ResourceBundle RB = ResourceBundle.getBundle("LocalStrings");
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html><html>");
out.println("<head>");
out.println("<meta charset=\"UTF-8\" />");
String title = RB.getString("sessions.title");
out.println("<title>" + title + "</title>");
out.println("</head>");
out.println("<body bgcolor=\"white\">");
out.println("<h1>hi</h1>");
out.println("</body>");
out.println("</html>");
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
doGet(request, response);
}
}
通过javac -sourcepath /usr/local/apache-tomcat-8.5.29/webapps/examples/WEB-INF/classes:. -cp /usr/local/apache-tomcat-8.5.29/lib/servlet-api.jar Saltfish.java
编译成.class
文件放置在classes
中
并在web.xml
配置 url-pattern
就可以看到页面了。
-cp
指明以来的servlet包, -sourcepath
指明依赖的util.HTMLFilter
文件
这算是所谓的约定吧,痛恨。。。
工作原理
google https://juejin.im/post/58eb5fdda0bb9f00692a78fc