1. 请求(request)—响应(response)模式:用户在浏览器的地址栏中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求,服务器端程序接受这个请求,并对请求做出处理,然后发出一个回应,浏览器收到这个回应,并把回应的内容显示出来,这就是web应用程序的访问过程。
2. HTTP协议:浏览器单击链接是,会向服务器发送一段文本,告诉服务器请求的是那个网页,这段文本遵循HTTP协议格式,包含访问方式,HTTP协议版本,所用的浏览器,访问的地址等。
3. Servlet概述:Java web应用程序中所有的请求与响应都是通过servlet来完成的,servlet是java web的核心程序,所有的网址最终都要交给servlet来处理,servlet没有main之类的执行方法,当用户访问服务器是,服务器通过调用servlet的某些方法来处理整个过程。
4. Servlet的工作流程:浏览器提交的数据是遵循HttP协议的文本,这段文本由服务器接受并解析,封装成httpservletrequest类型的request对象,所有的http头数据都可以通过request的相应方法得到。Tomcat同时把输出流封装成HTTPServletresponse类型的response,通过设置response的相关属性就可以控制输出的内容,然后服务器将request和response作为参数,调用servlet的相应方法比如doPost,doGet等。
5. Servlet的作用:主要处理业务逻辑,比如读取数据库,权限检查,业务处理等。
6. Servlet接口:servlet是一种实现了javax.servlet.Servlet接口的类,servlet规定了特定的方法来处理特定的请求,开发者只需要实现servlet的相应方法,用户访问web程序的时候,服务器会调用这些方法来完成业务处理。
7. 访问方式:servlet是建立在HTTP规范基础上的,HTTP1.1支持options,get,post,head,put,delete,以及trace七种访问方式,各方式的意义分别是:
Get表示查询信息,URL中可以附少量的参数信息,但是URL总长度不能超过255个字符,并且参数会显示在浏览器的地址栏。
Post表示提交信息,一般用于提交大数据信息或者文件,提交的内容不受长度限制,并且不会显示在浏览器的地址栏。
Options,put,delete,trace属于被声明了,但是没有被使用的web访问方式,现在的浏览器也很少用到这几种方式。
8. Java web 目录结构:web程序部署在tomcat下的webapps下面,一个webapps下可以部署多个web项目,根据servlet规范,web程序自己有特定的结构,部署时必须安装这样的目录结构:
文件夹 | 描述 |
/ | Web应用根目录 |
/WEB-INF/ | WEB-INF文件夹,tomcat会隐藏该文件夹下的所有文件和文件夹,保护它们不能通过浏览器直接访问。 |
/WEB-INF/web.xml | Web.xml,web程序最主要的配置文件 |
/WEB-INF/lib/ | Jar文件放在该目录下 |
9. servlet:servlet是一个接口,此接口定义了初始化servlet的方法,为请求提供服务的方法和从服务器移除的方法,这些方法称为生命周期方法,它们是按以下顺序调用的:
l 构造servlet,然后使用init()方法将其初始化
l 处理来自客户端对service()的全部调用
l 从服务器中取出servlet,然后使用destory()方法将其销毁,最终进行垃圾回收并终止它。
10. servlet的方法:
(1)public void destory()
(2)public void init(ServletConfigconfig ) throws ServletException
(3)public void service(ServletRequestreq,ServletResponse res)throws ServletException,java.io.IOexception
(4)public ServletConfiggetServletConfig()
(5)public StringgetServletInfo()
11.编写servlet:
直接实现servlet接口来编写servlet很不方便,需要实现的方法太多,真正编写servlet时直接实现httpservlet,并覆盖相应的方法即可,一般只需要覆盖doGet()或doPost()方法。在myeclipse中,可以之间新建一个servlet,且默认已经完成配置。
12.请求和相应:
客户端浏览器发出一个请求,服务器做出一系列操作后做出一个响应,发送给浏览器,完成一次web过程操作,web编程的过程就是分析客户需要什么信息或者做出什么操作,然后进行一系列的处理,然后通过相应结果显示给客户。
(1) 获取request的变量:客户端浏览器发出的请求被封装成一个httpservletrequest对象,所有的信息包括请求的方式,请求的参数,请求的地址,上传的文件,提交的数据,客户端Ip地址甚至客户端操作系统信息都包含在其中。
l getContentLength()
返回请求正文的长度(以字节为单位),并使输入流可以使用它,如果长度未知,则返回 –1,对于 HTTP servlet,返回的值与 CGI 变量 CONTENT_LENGTH 的值相同。
l getContentType()
返回请求正文的 MIME 类型,如果该类型未知,则返回 null。对于 HTTP servlet,返回的值与 CGI 变量 CONTENT_TYPE 的值相同。
l getLocalAddr()
返回接收请求的接口的 Internet Protocol (IP) 地址。
l getLocalPort()
返回接收请求的接口的 Internet Protocol (IP) 端口号。
l getLocale()
基于 Accept-Language 头,返回客户端将用来接受内容的首选 Locale。如果客户端请求没有提供 Accept-Language 头,则此方法返回服务器的默认语言环境
l getRemotePort()
返回发送请求的客户端或最后一个代理的 Internet Protocol (IP) 源端口。
l getMethod()
返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT。返回的值与 CGI变量 REQUEST_METHOD 的值相同。
l getProtocol()
以 protocol/majorVersion.minorVersion 的形式(例如 HTTP/1.1)返回请求使用的协议的名称和版本。对于 HTTP servlet,返回的值与 CGI 变量 SERVER_PROTOCOL 的值相同。
l getQueryString()
返回包含在请求 URL 中路径后面的查询字符串。如果 URL 没有查询字符串,则此方法返回null。返回的值与 CGI 变量 QUERY_STRING 的值相同。
getRequestDispatcher(String path)
返回一个 RequestDispatcher 对象,它充当位于给定路径上的资源的包装器。可以使用 RequestDispatcher 对象将请求转发给资源,或者在响应中包含资源。资源可以是动态的,也可以是静态的。
指定的路径名可以是相对的,尽管它无法扩展到当前 servlet 上下文之外。如果该路径以 "/" 开头,那么可以相对于当前上下文根解释它。如果servlet 容器无法返回 RequestDispatcher,则此方法将返回 null。
l getScheme()
返回用于发出此请求的方案的名称,例如 http、https 或 ftp。不同方案具有不同的构造 URL 的规则,这一点已在 RFC 1738 中注明。
(2) 获取相应的变量:
l addCookie(Cookie cookie)
将指定 cookie 添加到响应。可多次调用此方法设置一个以上的 cookie。
l addDateHeader(String name, long date)
用给定名称和日期值添加响应头。该日期根据距历元时间的毫秒数指定。此方法允许响应头有多个值
l encodeRedirectURL(String url)
对指定 URL 进行编码,以便在 sendRedirect 方法中使用它,如果不需要编码,则返回未更改的 URL。此方法的实现包含可以确定会话 ID 是否需要在 URL 中编码的逻辑。因为进行此确定的规则可能不同于用来确定是否对普通链接进行编码的规则,所以此方法与 encodeURL 方法是分开的。
l encodeURL(Stringurl)
通过将会话 ID 包含在指定 URL 中对该URL 进行编码,如果不需要编码,则返回未更改的 URL。此方法的实现包含可以确定会话 ID 是否需要在 URL 中编码的逻辑。例如,如果浏览器支持 cookie,或者关闭了会话跟踪,则 URL 编码就不是必需的。
l sendError(int sc,String msg) throws java.io.IOException
使用指定状态将错误响应发送到客户端。默认情况下,服务器将创建类似 HTML 格式的服务器错误页面的响应,该页面包含指定消息,内容类型设置为"text/html",并且保持 cookie 和其他头不变。 如果已经对 Web 应用程序进行了对应于传入状态代码的错误页面声明,则将优先处理建议的 msg 参数。
l sendRedirect(Stringlocation) throws java.io.IOException
使用指定重定向位置 URL 将临时重定向响应发送到客户端。此方法可以接受相对 URL;servlet 容器必须在将响应发送到客户端之前将相对 URL 转换为绝对 URL。如果位置是相对的,没有前导 '/',则容器将相对于当前请求 URI 对其进行解释。如果位置是相对的,有一个前导 '/',则容器将相对于 servlet 容器根对其进行解释。
如果已经提交了响应,则此方法抛出 IllegalStateException。使用此方法后,响应应该被视为已经被提交,不能再写入。
l setHeader(String name,String value)
用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在。
l setStatus(int sc)
设置此响应的状态代码。此方法用于设置没有错误时的返回状态代码(例如状态代码 SC_OK 或 SC_MOVED_TEMPORARILY)。如果有错误,并且调用者希望调用 Web 应用程序中定义的错误页面,则应改用 sendError 方法。
容器清除缓冲区,设置 Location 头,并保留 cookie 和其他头
l setCharacterEncoding(String charset)
设置将发送到客户端的响应的字符编码 (MIME charset),例如,将它设置为 UTF-8。如果已通过 #setContentType 或 #setLocale 设置了字符编码,则此方法将重写该字符编码。用 text/html 的 String 调用 #setContentType并用 UTF-8 的String 调用此方法等效于用 text/html; charset=UTF-8 的 String 调用 setContentType。
l getCharacterEncoding()
返回用于此响应中发送的正文的字符编码 (MIME charset) 名称。可能已使用 #setCharacterEncoding或 #setContentType方法显式指定字符编码,或使用#setLocale方法隐式指定它。显式指定优先于隐式指定。在已调用 getWriter 之后或者在已提交响应之后调用这些方法不会对字符编码产生任何影响。如果未指定字符编码,则返回 ISO-8859-1。
l getContentType()
返回用于此响应中发送的 MIME 正文的内容类型。必须在提交响应之前已使用 #setContentType指定适当的内容类型。如果未指定内容类型,则此方法返回 null。如果已指定内容类型,并且已经如#getCharacterEncoding中所述显式或隐式指定了字符编码或者已调用#getWriter,则返回的字符串中将包含 charset 参数。如果未指定字符编码,则省略 charset 参数。
l getOutputStream() throws java.io.IOException
返回适用于在响应中编写二进制数据的 ServletOutputStream。servlet 容器不会编码二进制数据。
l getWriter() throwsjava.io.IOException
返回可将字符文本发送到客户端的PrintWriter 对象。PrintWriter 使用 #getCharacterEncoding返回的字符编码。如果未如 getCharacterEncoding 中所述指定响应的字符编码(即该方法只返回默认值 ISO-8859-1),则 getWriter 会将字符编码更新到 ISO-8859-1。
对 PrintWriter 调用 flush() 将提交响应。
l setContentLength(int len)
设置 HTTP servlet 中响应的内容正文的长度,此方法设置HTTP Content-Length 头。
l setContentType(String type)
设置将发送到客户端的响应的内容类型,如果该响应尚未提交。给定内容类型可能包含字符编码规范,例如text/html;charset=UTF-8。如果在调用 getWriter 之前调用此方法,则只根据给定内容类型设置响应的字符编码。
l setBufferSize(int size)
设置响应正文的首选缓冲区大小。servlet 容器将使用至少与所请求大小一样大的缓冲区。可使用 getBufferSize 获得使用的实际缓冲区大小。
l getBufferSize()
返回用于该响应的实际缓冲区大小。如果未使用任何缓冲,则此方法返回 0。
l flushBuffer() throwsjava.io.IOException
强行将缓冲区中的所有内容写入客户端。调用此方法会自动提交响应,这意味着将编写状态代码和头。
l resetBuffer()
清除响应中底层缓冲区的内容,而不清除头或状态代码。如果已提交响应,则此方法将抛出IllegalStateException。
l isCommitted()
返回指示响应是否已提交的 boolean 值。已提交的响应已将其状态代码和头编写好。
(3) 提交表单信息:Web程序的任务就是实现服务器与客户端浏览器之间的信息交互,客户端提交的信息可能来自表单里的文本框,密码框,选择框,单选按钮,复选框以及文本域,这些表单信息以参数的形式提交到了服务器,servlet的任务就是准确的获取这些信息,并根据信息输出不同的响应。
提交信息的方式包括Get和Post,分别触发servlet的doGet和doPost方法,一般而言,get用于从服务器获取信息(通过提交的参数指定要获取的内容),post用于向服务器提交信息,post提交数据又包括两种形式,普通内容提交和带文件上传的提交。
l Post提交个人信息:由于get方式存在各种限制,所以提交表单时选择用post方式,把HTML中Form的method属性设置成post,浏览器即以post方式提交数据。
l 客户端上传文件:除了提交表单,上传文件也是很常见的客户端与web程序交互的操作,电子相册,网络硬盘,邮件附件,视频网站都采用web文件上传的形式,相对于ftp文件上传,web文件上传速度要慢一些,但是使用方便,不需要客户端,只需要一个浏览器即可,而且权限也比FTP容易控制,web文件上传也采用Post方式,但上传文件需要将form的enctype属性设置为multipart/form-data,由于上传的文件可能会比较大,因此需要设置该参数指定浏览器使用二进制上传。
13.Servlet的生命周期:每个servlet都有自己的生命周期,servlet的生命周期由Web服务器来维护,servlet的生命周期遵循servlet规范。
Servlet会在服务器启动或第一次请求该servlet时开始servlet生命周期,在服务器结束的时候结束生命周期,无论请求多少次servlet,最多只有一个servlet实例,多个客户端并发请求servlet时,服务器会启动多个线程分别执行servlet的servlce()方法。
14.servlet之间的跳转:servlet之间可以相互跳转,从一个servlet程序跳向另一个servlet程序,利用servlet的跳转很容易把一项任务按模块分开,实现程序模块化。跳转有两种方法:请求转发和请求重定向
(1)请求转发是通过requestDispatcher对象的forward(httpservletrequestreq,httpservletresponse res)方法来实现的,requestDispatcher可以通过gethttpservletresponse()来得到,gethttpservletresponse方法的参数必须以“/”开头。当使用forward形式跳转servlet时,地址栏会显示跳转前的servlet地址,因为该跳转是在服务器端实现的,客户端浏览器并不知道该动作,也就是说该动作对浏览器来说是透明的。
(2)重定向(Redirect)
重定向是利用服务器返回的状态码实现的,客户点浏览器访问服务器的时候,服务器端会返回一个状态码,服务器端会通过HTTPservletresponse的setstatus(int status)方法设置状态码,状态码的代表意义:
响应状态代码是一个3位整数,以1、2、3、4或5开头。
1xx ::信息提示,表示临时的响应
2xx :响应成功,表示服务器成功地接收了客户端请求
3xx :重定向
4xx :客户端错误,表明客户端可能有问题
5xx :服务器错误是,表明服务器由于遇到某种错误而不能响应客户端请求。
HTTPservletresponse把setStatus和setHeader方法封装成一个sendRedirect()方法,只需要调用这个方法即可实现跳转,当使用这个方法实现跳转时,跳转是在客户端实现的,也就是说客户端浏览器实际上请求了两次服务器,第一次获取了servlet的状态码和重定向的地址,第二次访问真实地址。