JavaWeb应用程序中所有的请求-响应都是由Servlet来完成的。Servlet是Java Web的核心程序,所有的网址(请求-响应)都交给Servlet来处理。
Servlet在Web应用中被映射成一个URL(Uniform Resource Locator),该URL可以被客户端浏览器请求,当用户向指定URL对象的Servlet发送请求时,该请求被Web服务器接收到,该Web服务器负责处理多线程、网络通信等功能,而Servlet的内容则决定了服务器对客户端的响应内容。
#.常用的Web服务器
1)Apache
2)IIS
3)Tomcat
#.主流的(Java Web)应用服务器(不仅包括web服务...)
1)Tomcat或者Tomcat+Apache
2)Resin
3)JBoss
4)WebLogic Server
5)WebSphere
6)IIS
#.Tomcat的目录结构
1)lib目录:存放部署Java类库
2)bin目录:存放与Tomcat运行有关的类、类库和DOS的批处理文件
3)webapps目录:存放部署的Web应用
4)work目录:存放临时生成的Servlet源文件和class文件
5)logs目录:存放Tomcat服务器运行时所产生的日志文件
6)temp目录:存放临时文件
#.Servlet是sun公司制订的一种用于扩展web服务器功能的组件规范。
扩展方式:早期采用CGI(common gateway interface)技术。因采用 cgi程序编写的代码,可移植性差、编程相当复杂。
现在,采用的是 【容器+组件】的方式来扩展。
【组件:】符合规范,实现特定功能,并且可以部署在容器上的软件模块。
【容器:】符合规范,为组件提供运行环境,并且管理组件的生命周期
(将组件实例化,调用其方法、销毁组件的过程)的软件程序;
采用【容器+组件】这种编程模型的优势:容器负责大量的基础服务
(包括浏览器与服务器之间的网络通信、多线程、参数传递等等)。而组件只需要处理业务逻辑。另外,组件的运行不依赖于特定的容器。
#.Servlet处理流程
1)客户端使用浏览器提交对Servlet的调用的Get或者Post请求
2)服务器接到请求后,如果该Servlet是第一次被调用,实例化这个Servlet
3)服务器调用该Servlet对象的service()方法
4)Servlet产生动态的回复内容
5)服务器发送服务内容给客户端的浏览器
#.Servlet生命周期:
1)加载Servlet类
2)实例化(调用类的构造方法)
3)初始化(调用该类对象的init()方法)
4)处理请求(调用该类对象的service()、doGet()或doPost()方法)
5)销毁对象(调用该类对象的destory()方法)
注:在整个Servlet生命周期,只创建一个Servlet对象,提供服务,处理请求是以多线程的方式进行的,为了线程安全,一般不要在Servlet类中定义成员变量,避免多个请求共用一个成员变量,而是在方法中定义局部变量。
Servlet会在服务器启动(如果load-on-startup为1)或第一次请求Servlet时(如果load-on-startup为0)初始化一个Servlet对象,然后用这个Servlet对象去处理所有客户端的请求。服务器关闭时才销毁这个Servlet对象。无论请求多少次Servlet,最多只有一个Servlet实例。多个客户端并发请求Servlet时,服务器会启动多个线程分别执行该Servlet的service()方法。一个Servlet的生命周期如下图所示:
#.servlet是如何运行的?
当用户向浏览器地址栏输入:http://ip:port/appname/servlet的url-pattern配置
1)浏览器使用ip:port(端口号)连接服务器
2)浏览器将请求数据按照http协议封装成一个数据包(请求数据包)发送给服务器
请求数据包的内容包含了请求资源路径(/helloweb/sayhello?name=zs),另外,
在请求数据包中,还会包含浏览器自动生成的一些信息。
3)服务器创建两个对象:请求对象(Request)和响应对象(Response)
服务器解析请求数据包,将解析之后的数据存放到请求对象里面,方便
servlet读取请求数据(因为servlet不用解析请求数据包,否则,需要理解http协议)。
请求对象是HttpServletRequest接口的一个实现。
响应对象是HttpServletResponse接口的一个实现,响应对象用于存放servlet处理的结果。
4)依据请求资源路径找到相应的servlet配置,通过反射创建servlet实例,
然后调用其service()方法。在调用service()方法时,会将事先创建好的请求对象(request)
和响应对象(response)作为参数进行传递。在servlet内部,可以通过request获得请求数据,
或者通过response设置响应数据。
5)服务器从response中获取数据,按照http协议打成一个数据包(响应数据包),发送给浏览器。
6)浏览器会解析响应数据包,取出相应的数据,生成相应的页面。
#.javac-cp servlet-api.jar -d . HelloServlet.java
# -cp表示告诉java编译器去哪里找需要的class文件
# -d .表示将编译生成的字节码文件放入当前文件夹下
#.运行Servlet,
如果报500错误,一般是程序写错了;
如果报404错误,访问地址有错;
如果报405错误,请检查service方法名、方法参数等
#.http(超文本传输协议,hypertexttransport protocal) 是一种应用层协议,定义了浏览器(也可以是其它程序)与web服务器之间通讯的过程与数据的格式。浏览器与服务器之间的连接,只能处理一次请求,然后立即关闭。这种通讯方式,可以让服务器以有限的资源为更多的客户端服务。
#.http协议数据包的结构:
1)请求数据包的结构
第一部分:请求行(数据包中的一行内容)
请求行包括三部分内容:
!请求方式(get/post)
!请求资源路径(端口号之后的内容,比如/appname/servlet)
!协议的类型与版本
第二部分:若干消息头(由W3C定义的一些有特殊含义的键值对)
消息头的样式,比如:content-type=text/html;
服务器和浏览器都会遵守这些消息头的约定。
消息头一般由服务器或者浏览器自动生成,但也可以通过编程的方式生成
第三部分:实体内容
如果请求方式是post方式,请求参数及值会放在这儿。
如果请求方式是get方式,请求参数与值是包含在请求资源路径里
2)响应数据包的结构:
第一部分:状态行
协议的类型与版本
状态码(状态码是一个数字,不同的数字代表不同的含义,如:
500:系统错误,即程序代码有错误
404:找不到资源,访问路径错误
200:正确)
状态码的描述
第二部分:若干消息头
第三部分:实体内容
服务器返回给浏览器的处理结果
#get/post请求
1)哪一些是get请求
!在浏览器地址栏直接输入一个地址
!表单默认的提交方式
!点击链接
2)哪一些是post请求
!给表单设置method="post"
3)get/post方式的区别
!get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交
!安全上讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get方式会将请求参数及值显示在浏览器地址栏)。但是要注意,post方式并没有将数据加密。
#表单处理,如何获得请求参数值
1)String request.getParameter(String paraName);
要注意的问题:如果paraName与实际的请求参数名不一致,则返回null。如果没有输入参数值,则返回“”。
2)String[] request.getParameterValues(StringparaName);
用在有多个请求参数名相同的情况下使用。比如:?interest=fishing&interest=cooking
#重定向:
服务器向浏览器发送一个状态码302及一个消息头location,浏览器收到后,会立即向location所指向的地址发送请求。
使用:response.sendRedirect(String url);//url是重定向的地址
特点:重定向的地址是任意的;重定向之后,浏览器地址栏的地址变成了location所指定的地址。
注意:重定向之前,不能够有out.close()或者out.flush()操作。
重定向之前,若response对象缓存有数据,则这些数据会被清空。
#cookies介绍
1.服务器可以向客户端写内容
2.只能是文本内容,而且有大小限制,一般是小于4K
3.客户端可以阻止服务器写入
4.只能拿自己webapp写入的东西
5.Cookie分为两种:
!属于窗口/子窗口(放在浏览器对应内存中,与浏览器共存亡)
!属于文本(有生命周期的)
6.一个Servlet/Jsp设置的cookies能够被同一路径下面或者子路径下面的Servlet/Jsp读到(路径=URL;路径!=真实文件路径)
7.如何创建cookies?(在服务端创建,存放到客户端)
Cookie cook = new Cookie(Stringname,String value);
cook.setMaxAge(30);//存在时间,单位:秒,若不设置,则不保存
8.如何将cookie添加到客户端?
response.addCookie(cook);
9.如何读取客户端的cookie到服务器端?
Cookie[] cookies = request.getCookies();
10.在服务器端删除客户端的Cookies?
Cookie[] cookies = request.getCookies();
cookies[i].setMaxAge(0);//设置生存期为0,即删除
#Session介绍
1.服务器的一块内存(存Key-Value)
2.和客户端窗口对应(包括其子窗口)
3.客户端和服务器端有对应的SessionID
4.客户端向服务器端发送SessionID的两种方式:
!cookie(内存cookie)
!rewrite URL
5.浏览器禁掉cookie,就不能使用session(使用cookie实现的session)
6.如果想安全的使用session(不论客户端是否禁止cookie),只能使用URL重写方式。
7.如何得到session
HttpSession hs = request.getSession(true);
8.向session添加属性
hs.setAttribute(String name,Object value);
9.从session得到某个属性
String name = hs.getAttribute(String name);
10.从session删除某个属性
hs.removeAttribute(String name);
#CookieVS Session比较
1.Cookie保存在客户端,Session保存在服务器端,
安全性:Cookie<Session;
2.Cookie生命周期是累积的,从创建时开始计时,并且不受主机关机影响;Session生命周期是间隔的,不访问Session连续时间达到设定值时,生命周期才结束,并且主机关机将使Session生命周期结束;
3.Cookie通过网络在客户端与服务器端传输,而Session保存在服务器端不需要传输,但需要在浏览器端保存一个SessionId即可;
#ServletContext用法
1.存在于服务器端,所有访问服务器的客户端共用
2.得到ServletContext:this.getServletContext();(this-->Servlet子类)
3.添加属性:setAttribute(String name,Object obj);
4.获得属性:(Object)getAttribute(String name);
5.删除属性:removeAttribute(String name);
6.生命周期:ServletContext中的属性从创建开始,到服务器关闭而结束,鉴于其长期存在于服务器内存中,一般不会向其中放入太大数据量;
#.JavaWeb的目录结构
根据Servlet规范,Web程序有自己特定的结构,部署时必须按照这样的结构部署。
Web应用程序访问过程:
用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求。服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应。浏览器收到回应,再把回应的内容显示出来。这种请求-响应模式(Request-Response)就是典型的Web应用程序的访问过程。
请求与响应:
客户端浏览器发送一个请求,服务器处理一系列操作后做出一个响应,发送给客户端,完成一次Web过程操作。
客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。所有的信息包括请求的地址,请求的参数,提交的数据,上传的文件,客户端的IP地址甚至客户端操作系统都包含在HttpServletRequest对象中。
Java Web应用程序中,处理请求并发送响应的过程是一种叫做Servlet的程序来完成的。Servlet是Java Web的核心程序,所有的网址最终都交给Servlet来处理。Servlet并没有main之类的执行方法。当用户访问服务器的时候,Tomcat是通过调用Servlet的某些方法来完成整个处理过程的。浏览器与服务器的交互都是利用HTTP协议完成的。