JavaWeb入门笔记
1、无状态
服务端不会记录客户端每次提交的请求,服务器一旦相应客户端之后,就会结束本次的通信过程。客户端下一次的请求是一个新的 连接,和上一次通信没有任何关系。
2、简单灵活
HTTP是基于请求(request)和响应(response)的模型
3、支持客户端与服务端
支持主流的B/S架构的通信以及C/S架构的通信。
注意:C/S架构可选的协议有多种,例如:TCP/IP,UDP,HTTP
而B/S架构通常只支持HTTP协议
二、服务器
1、概念
服务器通常由硬件和软件部分构成,统一对用户提供多种不同的服务。
1、硬件:包括响应的CPU、内存、磁盘等等
2、软件:包括操作系统、运行环境、服务器软件、数据库等等
2、web服务器
web服务器是提供服务端程序运行的一个环境,它本身也是一个软件。
例如:将我们编写HTML文件放入到web服务器中,那么外界就可以通过浏览器访问我们的html页面
常见的web服务器有Apache,Tomcat、Jetty、Nginx等等。
而Tomcat、Jetty这些web服务器更准确的说是一个Servlet容器。
三、JavaWeb项目结构
项目根目录,例如:myweb、ch01 | 通常存放静态资源文件(如:html等等) | ||
---|---|---|---|
WEB-INF | 这个目录是当前项目私有的一个文件夹,只能提供给项目内部访问,对于客户端来说是访问不到了,通常这个目录下存放的是Java源代码、编译后的字节码文件以及Servlet的核心配置文件web.xml | ||
src | 存放java源代码的目录 | ||
classes | 存放编译后的字节码文件 | ||
lib | lib目录存放当前项目所需要的jar文件 | ||
JSP | 用于存放JSP动态页面 | ||
web.xml | 项目的配置文件,用于配置Servlet的请求映射、过滤器、监听器等等信息。每一个web项目都对应一个web.xml配置文件 | ||
META-INF | 配置应用程序、扩展程序、类加载服务等等 |
四、Servlet基础
1、什么是Servlet
Servlet是JavaEE中标准组件,专门用于处理客户端提交的HTTP请求。并且它必须依赖于Servlet容器才可以运行(Tomcat就是一个标准的Servlet容器),Servlet容器给Servlet提供一个运行环境,所以Servlet组件必须要这个环境中可以运行,而不能脱离这个环境而单独执行。因为Servlet的实例是由容器创建和销毁的,并不是通过我们平常使用的new关键创建出来。
2、开发一个Servlet的步骤
1.编写一个类,然后继承HttpServlet这个父类
2.重写父类的service方法,这个就是专门处理客户端请求的方法,这个方法有两个参数(HttpServletRequest,HttpServletResponse),同时这个方法会抛出两个异常(ServletException,IOException)
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; //要让当前的类是一个Servlet,必须继承HttpServlet public class HelloServlet extends HttpServlet{ //重写父类的service方法,处理客户端请求, //这个方法私有servlet容器去调用, //并且request和response参数都是由servlet容器传递进来的 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Hello Servlet"); //响应一些信息回馈给客户端浏览器 //1.设置要响应的类型,这里就响应简单的html文本类型 //通过response参数来进行设置,如:text/html,text/plain response.setContentType("text/html;charset=utf-8"); //2.获取输出流并写回html数据 response.getWriter().println("<h1>Hello Servlet</h1>"); } }
3.编译Servlet,需要依赖servlet-api.jar文件
4.编写web.xml,为servlet配置请求映射的URL
<?xml version="1.0" encoding="utf-8"?> <!-- 配置根节点 --> <web-app> <!-- 配置servlet类 --> <servlet> <!-- 指定servlet的别名 --> <servlet-name>hello</servlet-name> <!-- 指定Servlet的完整类名--> <servlet-class>HelloServlet</servlet-class> </servlet> <!-- 配置请求映射--> <servlet-mapping> <!-- 这里的servlet-name和上面的servlet-name要一一对应 --> <servlet-name>hello</servlet-name> <!-- 配置请求映射的url,必须以“/”开头--> <url-pattern>/test</url-pattern> </servlet-mapping> </web-app>
5.将项目部署到Tomcat的webapps目录中
3、servlet处理请求的流程
1.浏览器发起http的请求,这个请求首先会被servlet容器(Tomcat)截获,然后容器会根据web.xml文件中配置servlet的<url-pattern>来找到相应的<servlet-name>这个别名,然后再根据这个别名找到具体Servlet的类,然后容器会创建这个Servlet类的实例并调用Servlet方法来处理这个请求。
请求网页地址:
4、Servlet的生命周期
所谓的生命周期,就是从Servlet的创建一直到它销毁的整个过程。并且它的 整个生命周期都是由Servlet容器(Tomcat)负责管理和维护的。(补充:在Tomcat中,Servlet是以单实例多线程的方式处理客户端请求)
4.1 Servlet对象创建的过程
当第一次请求某个Servlet的时候,容器会先查找之前有没有创建过这个Servlet的实例,如果没有则创建一个实例并缓存起来。后续 所有请求这个Servlet的时候,都会使用这个缓存的对象来处理客户端请求。(注意“这里说的是第一次请求时创建。另外一种情况则是在容器启动的时候就创建Servlet的实例,在web.xml中为Servlet指定<load-on-startup>配置,这个配置的值是一个整形,数值越小,则初始化 的优先级别越高)
4.2 生命周期方法
方法名 | 描述 |
---|---|
init | 在Servlet对象创建之后立即执行的初始化方法,且只执行一次 |
service | 核心的请求处理方法,这个方法可以执行多次 |
destroy | 容器准备销毁Servlet实例之前执行的方法,也是执行一次 |
5、HTTP请求报文
5.1 请求报文
请求行:请求报文的第一行就是请求行。包括请求方法、请求URL地址、HTTP协议版本
请求头:请求行之后的信息就是请求头,它是以“名称:内容”的格式体现。主要包括服务器主机地址及端口号、连接状态、接收的数据类型、编码、语言等等
请求体:请求头结束之后会有一个空行,空行之后就是请求体的内容。通常使用POST提交的数据信息会存放在请求体中,然后传递给服务器。
5.2 响应报文
状态行:主要包括HTTP协议、响应状态码(例如:200表示OK,成功响应)
响应头:主要包括服务器信息、响应的类型及编码、内容的长度、响应的时间等
响应体:服务器将信息携带到响应体中,带回客户端。
6、HTTP请求方法
在HTTP/1.1协议中,请求方法主要包括8个,下面列举常用的请求方法进行说明。
请求方法 | 说明 |
---|---|
GET | 向服务器请求指定的资源,并返回响应主体。一般来说GET方法应该只用于数据的读取(类似于查询) |
POST | 向指定的服务器提交数据(例如:表单数据的提交、文件上传等),并且提交的数据会放入请求体中(类似于新增) |
PUT | 向服务器提交数据,但是和POST有所区别。如果服务器不存在此资源的时候,则执行新增,如果存在则执行修改。(类似于修改) |
DELETE | 根据uri的表示删除服务器上的某个资源(类似于删除) |
... | ... |
备注:GET与POST区别:
1.GET主要用于获取数据,POST用于提交数据。
2.GET请求所带的参数是放在请求行的url地址后面,而POST这是放在请求体中。
3.通常浏览器会对GET请求的url长度有所限制 ,而POST通常在请求体中,可以提交更多的数据信息。
4.浏览器会对GET请求进行缓存。
7、Servlet的请求处理方法
方法 | 说明 |
---|---|
service | 可以处理任何的请求类型 |
doGet | 处理对应的GET请求 |
doPOST | 处理对应的POST请求 |
doPut | 处理对应的PUT请求 |
doDelete | 处理对应的DELETE请求 |
说明:通过HttpServlet的源代码得知,默认的所有请求都会先经过service方法,然后service方法根据请求的方法类型判断来决定交给doGet或者是doPOST方法来处理请求。如果子类重写了service方法同时还重写了其他的doXxx的方法,那么只有service方法会处理请求,其他方法将失效。
上一篇: 为什么要过元旦
下一篇: Shell过滤器的具体使用
推荐阅读
-
Android 入门第十讲02-广播(广播概述,使用方法(系统广播,自定义广播,两个activity之间的交互和传值),EventBus使用方法,数据传递,线程切换,Android的系统广播大全)
-
数据结构学习笔记(3)——树
-
c++primer plus阅读笔记(八)
-
Javascript 学习笔记之 对象篇(二) : 原型对象_基础知识
-
《C++ Primer Plus 第六版》学习笔记:第十一章 使用类
-
HTML DOM(学习笔记一)_html/css_WEB-ITnose
-
学习Class类笔记
-
php程序员入门必读_PHP教程
-
CSS3弹性盒模型flex box快速入门 2016.03.16_html/css_WEB-ITnose
-
C Primer Plus笔记(3)