web框架的前生今世--從servlet到spring mvc到spring boot

背景

上世紀90年代,隨著Internet和瀏覽器的飛速發展,基於瀏覽器的B/S模式隨之火爆發展起來。最初,用戶使用瀏覽器向WEB服務器發送的請求都是請求靜態的資源,比如html、css等。 但是可以想象:根據用戶請求的不同動態的處理並返回資源是理所當然必須的要求。

servlet的定義

  • Servlet is a technology which is used to create a web application. servlet是一項用來創建web application的技術。
  • Servlet is an API that provides many interfaces and classes including documentation. servlet是一個提供很多接口和類api及其相關文檔。
  • Servlet is an interface that must be implemented for creating any Servlet.servlet是一個接口,創建任何servlet都要實現的接口。
  • Servlet is a class that extends the capabilities of the servers and responds to the incoming requests. It can respond to any requests. servlet是一個實現了服務器各種能力的類,對請求做出響應。它可以對任何請求做出響應。
  • Servlet is a web component that is deployed on the server to create a dynamic web page.servlet是一個web組件,部署到一個web server上(如tomcat,jetty),用來產生一個動態web頁面。

servlet的歷史

web框架的前生今世--從servlet到spring mvc到spring boot

web Container

web容器也叫servlet容器,負責servlet的生命週期,映射url請求到相應的servlet。

A web container (also known as a servlet container;[1] and compare "webcontainer"[2]) is the component of a web server that interacts with Java servlets. A web container is responsible for managing the lifecycle of servlets, mapping a URL to a particular servlet and ensuring that the URL requester has the correct access-rights.
A web container handles requests to servlets, JavaServer Pages (JSP) files, and other types of files that include server-side code. The Web container creates servlet instances, loads and unloads servlets, creates and manages request and response objects, and performs other servlet-management tasks.
A web container implements the web component contract of the Java EE architecture. This architecture specifies a runtime environment for additional web components, including security, concurrency, lifecycle management, transaction, deployment, and other services.

常見的web容器如下:

web框架的前生今世--從servlet到spring mvc到spring boot

在web容器中,web應用服務器的結構如下:

web框架的前生今世--從servlet到spring mvc到spring boot

1.普通servlet實現頁面訪問

web框架的前生今世--從servlet到spring mvc到spring boot

1.1 實例1:使用web.xml實現一個http服務

實現一個簡單的servlet

package com.howtodoinjava.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyFirstServlet extends HttpServlet {

private static final long serialVersionUID = -1915463532411657451L;

@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
// Write some content
out.println("");
out.println("");
out.println("<title>MyFirstServlet/<title>");
out.println("");
out.println("");
out.println("

Servlet MyFirstServlet at " + request.getContextPath() + "

");
out.println("");
out.println("");
} finally {
out.close();
}
}

@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//Do some other work

}

@Override
public String getServletInfo() {
return "MyFirstServlet";
}
}

web.xml配置servlet


<web-app> 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_0.xsd"
version="3.0">

<welcome-file-list>
<welcome-file>/MyFirstServlet/<welcome-file>
/<welcome-file-list>

<servlet>
<servlet-name>MyFirstServlet/<servlet-name>
<servlet-class>com.howtodoinjava.servlets.MyFirstServlet/<servlet-class>
/<servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet/<servlet-name>
<url-pattern>/MyFirstServlet/<url-pattern>
/<servlet-mapping>

/<web-app>

1.2 編程方式實現一個http服務請求

不需要xml

package com.journaldev.first;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FirstServlet
*/
@WebServlet(description = "My First Servlet", urlPatterns = { "/FirstServlet" , "/FirstServlet.do"}, initParams = {@WebInitParam(name="id",value="1"),@WebInitParam(name="name",value="pankaj")})
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public static final String HTML_START="";
public static final String HTML_END="";

/**
* @see HttpServlet#HttpServlet()
*/
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
Date date = new Date();
out.println(HTML_START + "

Hi There!


Date="+date +"

"+HTML_END);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}

2.spring mvc實現頁面訪問

2.1 web.xml方式

web框架的前生今世--從servlet到spring mvc到spring boot

示例:

<web-app> xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Gradle + Spring MVC Hello World + XML/<display-name>
<description>Spring MVC web application/<description>

<servlet>
<servlet-name>hello-dispatcher/<servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet/<servlet-class>
<init-param>
<param-name>contextConfigLocation/<param-name>
<param-value>/WEB-INF/spring-mvc-config.xml/<param-value>
/<init-param>
<load-on-startup>1/<load-on-startup>
/<servlet>
<servlet-mapping>
<servlet-name>hello-dispatcher/<servlet-name>
<url-pattern>//<url-pattern>
/<servlet-mapping>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener/<listener-class>
/<listener>
<context-param>
<param-name>contextConfigLocation/<param-name>
<param-value>/WEB-INF/spring-core-config.xml/<param-value>
/<context-param>
/<web-app>

2.2 編碼方式

public class MyWebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext container) {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(AppConfig.class);

// Manage the lifecycle of the root application context

container.addListener(new ContextLoaderListener(rootContext));

// Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherContext =
new AnnotationConfigWebApplicationContext();
dispatcherContext.register(DispatcherConfig.class);

// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher =
container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}

}

內部實現

web框架的前生今世--從servlet到spring mvc到spring boot

3.spring boot

繼承了spring mvc的框架,實現SpringBootServletInitializer

package com.mkyong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
@SpringBootApplication
public class SpringBootWebApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringBootWebApplication.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootWebApplication.class, args);
}
}

然後controller

package com.mkyong;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class WelcomeController {
// inject via application.properties
@Value("${welcome.message:test}")
private String message = "Hello World";
@RequestMapping("/")
public String welcome(Map<string> model) {
model.put("message", this.message);
return "welcome";
}
}
/<string>

總結:

1.servlet的本質沒有變化,從web框架的發展來看,web框架只是簡化了開發servlet的工作,但還是遵循servlet規範的發展而發展的。

2.servlet的歷史發展,從配置方式向編程方式到自動配置方式發展

3.spring mvc框架的分組:root和child(可以有多個dispatcherservlet),多個child可以共享root,child直接不共享

參考文獻:

【1】https://en.wikipedia.org/wiki/Web_container

【2】https://baike.baidu.com/item/servlet/477555?fr=aladdin

【3】https://www.javatpoint.com/servlet-tutorial

【4】https://www.journaldev.com/1854/java-web-application-tutorial-for-beginners#deployment-descriptor

【5】https://blog.csdn.net/qq_22075041/article/details/78692780

【6】http://www.mkyong.com/spring-mvc/gradle-spring-mvc-web-project-example/

【7】http://www.mkyong.com/spring-boot/spring-boot-hello-world-example-jsp/


分享到:


相關文章: