添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Java Web

引言

刚接触Java开发的时候,就直接从Spring Boot入手了,所以一直对Spring下层使用的Servlet和Tomcat等技术认识很模糊,所以整理了本文,其中介绍了Java Web技术的发展,与各个技术相关的核心内容,以及一些关于Web的小知识。更多有价值的文章均收录于 贝贝猫的文章目录

CGI

CGI(通用网关接口)CGI即使可以让服务器能够调用外部程序,并将HTTP请求信息传递给外部程序处理,对于每一个请求,会启动一个新的进程。


CGI的不足之处

  • 需要为每个请求启动一个操作CGI程序的系统进程。如果请求频繁,这将会带来很大的开销。
  • 需要为每个请求加载和运行一个CGI程序,这将带来很大的开销
  • 需要重复编写处理网络协议的代码以及编码,这些工作都是非常耗时的。

Servlet

Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程序,一个基于Java的Web应用通常包含一个或多个Servlet类。Servlet不能够自行创建并执行,它是在Servlet容器中运行的,容器将用户的请求传递给Servlet程序,并将Servlet的响应回传给用户。通常一个Servlet会关联一个或多个JSP页面。以前CGI经常因为性能开销上的问题被诟病,然而Fast CGI早就已经解决了CGI效率上的问题,事实上有很多你熟悉的网站都使用了CGI技术。

A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol. To implement this interface, you can write a generic servlet that extends javax.servlet.GenericServlet or an HTTP servlet that extends javax.servlet.http.HttpServlet. This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence: The servlet is constructed, then initialized with the init method. Any calls from clients to the service method are handled. The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized. In addition to the life-cycle methods, this interface provides the getServletConfig method, which the servlet can use to get any startup information, and the getServletInfo method, which allows the servlet to return basic information about itself, such as author, version, and copyright.


Servlet的优点

  • 只需要启动一个操作系统进程以及加载一个JVM,大大降低了系统的开销
  • 如果多个请求需要做同样处理的时候,这时候只需要加载一个类,这也大大降低了开销
  • 所有动态加载的类可以实现对网络协议以及请求解码的共享,大大降低了工作量。
  • Servlet能直接和Web服务器交互,而普通的CGI程序不能。Servlet还能在各个程序之间共享数据,使数据库连接池之类的功能很容易实现。

Tomcat和Servlet

The Apache Tomcat software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies. Tomcat作为Servlet容器,当然也可以当作web服务器直接使用,负责把接收和返回http请求。

下面,我们通过一个更细致的时序图来看一下具体工作过程:

从上图我们看出一个Http的具体处理流程:

  1. Web客户向Servlet容器(Tomcat)发出Http请求
  2. Servlet容器分析客户的请求信息
  3. Servlet容器创建一个HttpRequest对象,将客户请求的信息封装到这个对象中
  4. Servlet容器创建一个HttpResponse对象
  5. Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象
  6. HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息
  7. HttpServlet调用HttpResponse对象的有关方法,生成响应数据
  8. Servlet容器把HttpServlet的响应结果传给Web客户

Servlet的基本目录


在tomcat/webapps目录下创建上述目录结构,所有HTML,静态文件直接保存在应用程序目录下,所有的Servlet类保存在web-inf/classe目录或子目录下,web.xml(部署描述,filter,url与servlet的对应关系)文件保存在web-inf目录下。

Servlet接口

在最基本的Servlet类中,需要实现Servlet接口定义的init()、servic()、destroy()、getServletConfig()和geServletInfo()方法,其中业务逻辑在service中编写,在service方法中最常用的是通过PrintWriter对象进行内容的输出。

后来,为了简化实现Servlet的成本,GenericServlet抽象类诞生了,它实现了Servlet接口的大部分函数。在GenericServlet抽象类的帮助下,只需要重写service方法即可实现Servlet接口。

之后出现了HttpServlet,它覆写了GenericServlet类,将ServletRequest和ServletResponse对象分别封装为HttpServletRequest和HttpServletResponse对象。HttpServlet同时实现了service方法,在请求进来时,Web容器首先调用HttpServlet的service方法,并根据请求的类型调用doGet或doPost方法,所以我们只需要覆盖doGet()和goPost()方法即可。

JSP

Servlet的最大缺点就是在Servlet类中编写大量繁杂的HTML代码,使得Java代码与HTML代码糅杂在一起,所以JSP应运而生。

JSP本质也是Servelt,然而其不需要编译,JSP页面是一个以.jsp扩展名的文本文件。简单的JSP页面在第一次请求后被翻译为(JSP名)_jsp的servlet,翻译之后的Servelt可以看到:_jspInit(),_jspDestory(),_jspService()这样的方法其实都是和Servlet相对应的。

Spring MVC

当要使用Servlet完成的复杂的功能时,需要编写多个Servlet类,并且在web.xml进行注册,这对于完成复杂的Web应用,代码编写会变得很复杂,开发成本也会很高。所以Spring提供了强大的Web开发框架Spring MVC。Spring MVC是Spring产品的一部分,享有Spring松耦合等所有优点。

Spring MVC是一个模型-视图-控制器的Web框架,建立在前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来返回响应结果。

Spring MVC的架构:

Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合

  • 模型(Model):封装了应用程序的数据,通常由POJO类组成
  • 视图(View):负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出
  • 控制器(Controller):负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染

DispatcherServlet组件类 Spring MVC框架是围绕DispatcherServlet设计的,它处理所有的请求和响应。Spring MVC DispatcherServlet的工作流程:


会话跟踪技术

Cookie

向客户端发送Cookie

Cookie c =new Cookie("name","value"); //创建Cookie
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
response.addCookie(c); //把Cookie放入到HTTP响应中

从客户端读取Cookie

String name ="name";
Cookie[]cookies =request.getCookies();
if(cookies !=null){
   for(int i= 0;i<cookies.length;i++){
    Cookie cookie =cookies[i];