Spring Boot 嵌入式Web容器——传统Servlet容器(上)

传统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" />
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值