java web 第三天笔记

来源:互联网 发布:透视数据复制出来 编辑:程序博客网 时间:2024/04/29 19:12

61.检索客户端有关信息 

String getRemoteHost()  返回客户机的主机名

String getRemoteAddr()  返回客户端的IP地址

int getRemotePort()     返回客户端的IP地址的端口号

String getProtocol()     返回客户使用的请求协议名和版本。

String getContentType()  返回请求体的MIME类型 

String getCharacterEncoding() 返回客户请求的编码方式

public Cookie[] getCookies() 返回客户与该请求一同发送的Cookie对象数组。

62检索HTTP请求头 

HTTP请求头是针对HTTP协议的,因此处理头的方法属于HttpServletRequest接口。 

下面是HttpServletRequest接口中提供的用于检索头信息的方法: 

 String getHeader(String name) 

 Enumeration getHeaders(String name) 

 Enumeration getHeaderNames() 

常用的HTTP请求头 

    请求头名      内容

user-agent       关于浏览器和它的平台的信息 

accept           客户能处理的页面的类型 

accept-charset    客户可以接受的字符集 

accept-encoding  客户能处理的页面编码的方法 

acceptlanguage  客户能处理的语言 

host             服务器的DNS名字 

authorization    客户的信任凭据的列表 

cookie           将一个以前设置的cookie送回服务器 

date             消息被发送的日期和时间 

63下面是HttpServletRequest接口中提供的用于检索头信息的方法:

 

1、设置响应头。

public String getHeader(String name) 返回指定名称的请求头的值。

public Enumeration getHeaders(String name) 返回指定名称的请求头的Enumeration对象。

public Enumeration getHeaderNames() 返回一个Enumeration对象,它包含所有请求头名。

public int getIntHeader(String name) 返回指定名称的请求头的整数值。

public long getDateHeader(String name) 返回指定名称的请求头的日期值。

2、

3、通过设置refresh响应头实现每5秒钟刷新一次页面。 

如:response.setHeader("refresh","5");

4、要告诉浏览器在5秒钟后跳转到http://host/path页面,可以使用下面语句:

 response.setHeader("Refresh","5;URL=http://host/path/");

实际上,在HTML页面中通过在<head>标签内添加下面代码也可以实现这个功能:

       <meta http-equiv="Refresh" content="5; URL= http://host/path/">

7响应重定向

1Servlet可能决定不直接向浏览器发送响应,而是将响应重定向到其他资源。 

      public void sendRedirect(String location) 

向客户发送一个重定向的响应,location为指定的新的资源的URL。该URL可以是绝对URL,也可以是相对URL

2、关于sendRedirect()方法,记住下面两点。

1)如果响应被提交,即响应头已经发送到浏览器,就不能调用该方法。此时如果调用该方法,方法将抛出异常。例如:

    public void doGet(HttpServletRequest req, 

                HttpServletResponse res){

      PrintWriter pw = res.getWriter();      

     pw.println("<html><body>Hello orld!</body></html>");

     pw.flush();

     res.sendRedirect("http://www.cnn.com");

}

解释:flush() 是把缓冲区的数据强行输出主要用在IO中,即清空缓冲区数据,一般在读写流(stream)的时候,数据是先被读到了内存中,再把数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还有一部分有可能会留在内存这个缓冲区中。这时候如果你调用了close()方法关闭了读写流,那么这部分数据就会丢失,所以应该在关闭读写流之前先flush()

(2)只有当浏览器从第一个资源收到重定向消息后,它才请求第二个资源。 

8、重定向与请求响应的区别

1、请求转发

2、重定向

3、比较:

1RequestDispatcher对象是一个Web资源的包装器,可以用来把当前请求转发到该资源。

这种转发是在服务器端控制权的转向,客户端发来的请求将交由新的页面进行处理。

使用请求转发,在客户的浏览器地址栏中不会显示转发后的资源地址。

使用请求转发,可以将前一个页面的数据、状态等信息传到转发的页面。

2sendRedirect()方法实际是服务器向浏览器发送一个特殊的响应头(Location,状态码302),它命令浏览器连接到新的位置。

因此,使用这种方法在浏览器的地址栏中可以看到地址的变化。

重定向是作为不同请求来看待的,因此,所有请求作用域的参数在重定向到下一个页面时都会失效。

使用sendRedirect()方法重定向时,资源不能位于WEB-INF目录中。

在调用sendRedirect()方法之前,主页面不能有内容输出。在调用sendRedirect()方法之后应该有一个return语句。 

9、发送状态码和错误消息

1Web服务器对请求的响应一般由状态行、响应头、空行和相应的文档构成。状态行由3部分组成:HTTP版本、状态码和状态码的描述信息。如下是一个典型的状态行:

         HTTP/1.1 200 OK

由于HTTP的版本是由服务器决定的,而状态的消息是与状态码有关的,因此,在Servlet中一般只需要设置状态码。 

状态码200是系统自动设置的,Servlet一般不需要指定该状态码。对于其他状态码,可以使用HttpServletResponse接口中定义的setStatus()方法设置,该方法的格式为:

     public void setStaus (int sc)

可以设置任意的状态码。参数sc表示要设置的状态码

对于404状态码,其消息为Not Found,所以HttpServletResponse接口中为该状态码定义的常量名为SC_NOT_FOUND。  

2、在HTTP协议1.1版中定义了若干状态码,这些状态码是由3位整数表示的,一般分为5类  

关于其他状态码的含义可以参阅参考文献[1]

直接到http://www.w2.org/Protocols上查阅相关文档。

3HTTP为常见的错误状态定义了状态码,这些错误状态包括:资源没有找到、资源被永久移动以及非授权访问等。

所有这些代码都在接口HttpServletResponse中作为常量定义。HttpServletResponse也提供了sendError()方法用来向客户发送状态码,该方法有两个重载的形式,如下所示:

       public void sendError (int sc)

       public void sendError (int sc, String msg)

第一个方法使用一个状态码,第二个方法同时指定显示消息。服务器在默认情况下创建一个HTML格式的响应页面,其中包含指定的错误消息。

如果为Web应用程序声明了错误页面,将优先返回错误页面。

例如,如果Servlet发现客户不应访问其结果,它将调用

sendError(HttpServletResponse.SC_UNAUTHORIZED)

第三章:Servlet容器模型

1、web应用程序

所谓Web应用程序是一种可以通过Web访问的应用程序。 

一个Web应用程序是由完成特定任务的各种Web组件构成的并通过Web将服务展示给外界。

多个Servlet

多个JSP页面

HTML文件

图像文件等 

2、应用服务器

Web 应用程序驻留在应用服务器上。 

应用服务器为 Web 应用程序提供一种简单的和可管理的对系统资源的访问机制。

它也提供低级的服务,

如 HTTP 协议的实现

数据库连接管理。

Servlet 容器仅仅是应用服务器的一部分。

市场上可以得到多种Servlet容器,其中包括:

Apache Tomcat 

Caucho Technology Resin

Macromedia JRun

JBoss

BEA WebLogic

IBM WebSphere等。

其中有些如WebLogicWebSphere不仅仅是Servlet容器,它们也提供对EJBEnterprise JavaBeans)、JMSJava Message Service)以及其他Java EEEnterprise Edition)技术的支持。

3、Web应用程序的目录结构

名为bookstoreWeb应用程序

├ webapps

├ bookstore

├ html (包含所有的HTML文件)

├ images (包含所有的GIFJPEGBMP图象文件)

├ javascripts (包含所有的*.js文件

├ jsp (包含所有的JSP文件)

├ index.html (默认的欢迎文件)

WEB-INF

 ├ classes(应用程序的类文件)

   ├ com

       ├mycompany

           ├ MyClass.class

 ├ lib(驱动程序包和标签库包文件)

      ├ *.jar(jdbcdriver.jar,mytaglib.jar)

 ├ web.xml(部署描述文件) 

31. 理解文档根目录

假设服务器主机名为www.myserver.com,如果要访问bookstore Web应用程序根目录下的index.html 文件,应该使用下面的URL

  http://www.myserver.com/bookstore/index.html

要访问html目录中的/hello.html 文件,使用下面的URL

       http://www.myserver.com/bookstore/html/hello.html 

32. 理解WEB-INF目录

1classes目录

2lib目录

3web.xml文件

  

在创建Web应用程序时,可能需要阻止用户访问一些特定资源而允许Servlet容器访问它们。为了保护这些资源,应将它们存储在WEB-INF目录中。 

33. Web归档文件 

扩展名为.warWeb归档文件(web archive),一般称为WAR文件。 

创建一个WAR文件:使用Javajar工具将bookstore目录打包: 

jar cvf  bookstore.war  *

34. 默认的Web应用程序 

Tomcat服务器维护一个默认的Web应用程序。

<CATALINA_HOME>\webapps\ROOT目录被设置为默认的Web应用程序的文档根目录。

访问它的资源不需要指定应用程序的名称。例如,访问默认Web应用程序的URL为:

http://localhost:8080/

4部署描述文件

Web.xml

<?xml version="1.0" encoding="UTF-8" ?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  version="2.5">

<display-name> Webapp Test </display-name>

<context-param>

<param-name>email</param-name>

<param-value>hacker@163.com</param-value>

</context-param>

<servlet>

<servlet-name>loginServlet</servlet-name>

<servlet-class>com.abc.LoginServlet</servlet-class>

<init-param>

<param-name>greeting</param-name>

<param-value>Good Morning</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>loginServlet</servlet-name>

<url-pattern>/login.do</url-pattern>

</servlet-mapping>

<welcome-file-list>

       <welcome-file>index.html</welcome-file>

       <welcome-file>index.jsp</welcome-file>

</welcome-file-list>

          <session-config>

             <session-timeout>20</session-timeout>

          </session-config>

</web-app>

41

DD文件是一个XML文件。

第一行指定了XML的版本及所使用的字符集。

下面所有的内容都包含在<web-app></web-app>元素中,它是DD文件的根元素

DD文件的模式定义:

下面的代码展示了在部署描述文件中<servlet>元素的一个典型的使用:

<servlet>

   <servlet-name>helloServlet</servlet-name>

   <servlet-class>

       com.myserver.HelloServlet

   </servlet-class>

  <init-param>

      <param-name>email</param-name>

      <param-value>hacker@163.com</param-value>

  </init-param>

  <init-param>

      <param-name>limit</param-name>

      <param-value>200</param-value>

  <init-param>

 <load-on-startup>2</load-on-startup>

</servlet>

42使用<servlet-mapping>元素

<servlet-mapping>元素用来定义一个映射,它为Servlet分配一个URL,客户使用该URL访问Servlet。。

<servlet-name>元素应该是使用<servlet>元素定义的Servlet名,而<url-pattern>可以包含要与该Servlet关联的模式字符串。下面是在DD文件中使用<servlet-mapping>元素的例子:

<servlet-mapping>

    <servlet-name>helloServlet</servlet-name>

    <url-pattern>/helloServlet/hello/*</url-pattern>

</servlet-mapping>

下面的URL就与上面的URL模式匹配:

http://www.myserver.com/mywebapp/helloServlet/hello/abc.jsp

1. URL的组成

协议与主机名      上下文路径    Servlet路径    路径信息     查询串

http://www.myserver.com /mywebapp/helloServlet/hello/abc.jsp?userName=Hacker

 

                     请求URI

2. <url-pattern>的三种形式

目录匹配:以斜杠“/”开头,以“/*”结尾的形式。例如:

            /helloServlet/hello/*

扩展名匹配:以星号“*.”开始,后接一个扩展名 

      <servlet-mapping>

         <servlet-name>pdfGeneratorServlet</servlet-name>

         <url-pattern>*.pdf</url-pattern>

      </servlet-mapping>

精确匹配:所有其他字符串都作为精确匹配。 

      <servlet-mapping>

           <servlet-name>reportServlet</servlet-name>

           <url-pattern>/report</url-pattern>

      </servlet-mapping>

原创粉丝点击