传统Servlet容器
Jetty
Eclipse Jetty:Jetty的Web服务提供http服务和servlet容器并且支持动态和静态两种内容,从jetty-7开始将jetty的web服务和相关核心放到了Eclipse上面
Jetty提供的功能:
- 异步的HttpServer
- 标准Servlet容器
- webSocket服务器
- http/2服务
- 异步Client(http/1.1,http/2,websocket)
- OSGI、JNDI、JMX、JASPI、AJP支持
java从1.0-1.3之前是BIO阻塞的
1.4-1.6属于NIO 非阻塞IO
1.7开始AIO 异步IO
Apache Tomcat
Apache Tomcat:Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。
标准实现:
- Servlet
- JSP
- Expression Language
- WebSocket
核心组件(Components)
1.Engine:引擎是由catalina(空炸机)命名
2.Host
3.Context
静态资源处理
org.apache.catalina.servlets.DefaultServlet 在web.xml中将listings false改成true 就可以看到静态的一个目录(没有index.html),如果设置成false则访问不到
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
JSP处理
org.apache.jasper.servlet.JspServlet
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<!-- development 参数的作用是如果是开发状态true我允许你修改页面后自动编译 -->
<init-param>
<param-name>development</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
欢迎页面(Welcome file list)
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>
类加载(Classloading)
双亲委派模型
- Bootstrap ClassLoader(jre的jar包)
- System ClassLoader(用户系统指定)
- Common ClassLoader(公用的)
- Webapp ClassLoader
public class ServletContextListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
ClassLoader classLoader = sc.getClassLoader();
while (true) {
System.out.println(classLoader.getClass().getName());
classLoader = classLoader.getParent();
if (classLoader == null) {
break;
}
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
JNDI(Java Naming and Directory Interface)
基本类型
- 资源(Resource)
- 环境(Environment)
配置方式
- context.xml 配置
- web.xml 配置
JDBC 数据源(DataSource)
这里需要和JNDI相结合在context.xml中配置Resouce结点把jdbc的资源jar引入进来,然后通过JNDI的方式(jdbc/TestDB)获取到DataSource对象,还需要在web.xml引入进来如第二个diamante,这也就是Spring里面的IOC控制反转的原型
content.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
license agreements. See the NOTICE file distributed with this work for additional
information regarding copyright ownership. The ASF licenses this file to
You under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of
the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License. --><!-- The contents of this file will be loaded for each web application -->
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!-- <Manager pathname="" /> -->
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
username="root" password="123456" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/?useSSL=false" />
</Context>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd ">
<listener>
<listener-class>com.servlet.ServletContextListenerImpl</listener-class>
</listener>
<servlet>
<servlet-name>JDBCTestServlet</servlet-name>
<servlet-class>com.servlet.JDBCTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JDBCTestServlet</servlet-name>
<url-pattern>/jdbc/test</url-pattern>
</servlet-mapping>
<resource-ref>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<env-entry>
<env-entry-name>Bean</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>Hello,World</env-entry-value>
</env-entry>
</web-app>
JDBCTestServlet
import java.io.IOException;
import java.io.Writer;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
public class JDBCTestServlet extends HttpServlet {
private static final long serialVersionUID = 6917571910801949833L;
private DataSource dataSource;
public void init(ServletConfig servletConfig) throws ServletException {
try {
Context context = new InitialContext();
Context evnContext = (Context) context.lookup("java:comp/env");
dataSource = (DataSource) evnContext.lookup("jdbc/TestDB");
String bean = (String) evnContext.lookup("Bean");
System.out.println(bean);
} catch (Exception e) {
throw new ServletException(e);
}
}
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Writer writer = response.getWriter();
response.setContentType("text/html;charset=UTF-8");
try {
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SHOW DATABASES;");
while (resultSet.next()) {
String dataname = resultSet.getString(1);
writer.write(dataname);
writer.write("<br />");
writer.flush();
}
} catch (SQLException e) {
throw new ServletException(e);
}
}
}
连接器(Connectors)
端口(port)
协议(protocol)
线程池(Thread Pool)
超时时间(Timeout)
server.xml
<Executor name="tomcatThreadPool" namePrefix="xiaomage-exec-"
maxThreads="150" minSpareThreads="4"/>
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />