黑马程序员_JavaScript的学习_续讲

来源:互联网 发布:xye刷卡软件 编辑:程序博客网 时间:2024/05/14 08:01

-----------------------------android培训java培训期待与您交流!----详细请看:http://edu.csdn.net/heima---------------


 

1.    JavaServlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。

Servlet可完成如下功能: 

– 创建并返回基于客户请求的动态HTML页面。

– 创建可嵌入到现有HTML 页面中的部分HTML 页面(HTML片段)。

与其它服务器资源(如数据库或基于Java的应用程序)进行通信

2.    每一个Servlet都必须要实现Servlet接口,GenericServlet是个通用的、不特定于任何协议的 Servlet,它实现了 Servlet 接口,而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口,所以我们定义的Servlet只需要继承HttpServlet父类即可。 

3.    Servlet接口中定义了一个service 方法,HttpServlet 对该方法进行了实现,实现方式就是将ServletRequest 与ServletResponse转换HttpServletRequest与HttpServletResponse

4.    在该service方法中,首先获得到请求的方法名,然后根据方法名调用对应的doXXX方法,比如说请求方法为GET,那么就去调用doGet方法;请求方法为POST,那么就去调用doPost方法。

5.  在 HttpServlet 类中所提供的doGet、doPost等方法都是直接返回错误信息,所以我们需要在自己定义的 Servlet类中 override这些方法

6. ServletRequest接口中封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等 。

ServletRequest接口还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream。

7. ServletRequest接口的主要方法

•getAttribute  根据参数给定的属性名返回属性值

•getContentType  返回客户请求数据MIME类型

•getInputStream  返回以二进制方式直接读取客户请求数据的输入流

•getParameter  根据给定的参数名返回参数值

•getRemoteAddr  返回远程客户主机的IP地址

•getRemoteHost  返回远程客户主机名

•getRemotePort  返回远程客户主机的端口

 

8. ServletResponse 接口为Servlet提供了返回响应结果的方法。它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutputStream。

9.  ServletResponse接口的主要方法

•getOutputStream   返回可以向客户端发送二进制数据的输出流对

象ServletOutputStream

•getWriter  返回可以向客户端发送字符数据的PrintWriter对象

•getCharacterEncoding  返回Servlet发送的响应数据的字符编码

•getContentType  返回Servlet发送的响应数据的MIME类型

•setContentType  设置Servlet发送的响应数据的MIME类型

10.   Servlet初始化阶段: 在下列时刻Servlet容器装载Servlet:

–Servlet容器启动时自动装载某些Servlet

Servlet容器启动后,客户首次向 Servlet发出请求 

– Servlet的类文件被更新后,重新装载Servlet 

Servlet被装载后,Servlet容器创建一个Servlet 实例并且调用 Servlet 的 init()方法进行初始化。在Servlet的整个生命周期中,init方法只会被调用一次。

11.     Servlet响应客户请求阶段:对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet 的 service方法。service方法从ServletRequest对象获得客户请求信息、处理该请求,并通过ServletResponse对象向客户返回响应结果。



1.    某些Servlet 在 web.xml 文件中只有<servlet>元素而没有<servlet-mapping>元素,这样我们就无法通过url 地址的方式访问这个Servlet 了,这种 Servlet 通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。

2.   ServletContext和Web应用关系:ServletContext就是JSP内置对象Appriaction它的类型。

当Servlet容器启动Web应用时,并为每个Web应用创建惟一的ServletContext对象。你可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,它提供了读取或设置共享数据的方法:

setAttributeStringname,Object object)把一个对象和一个属性名绑定,将这个对象存储在ServletContext中。

getAttributeString name)根据给定的属性名返回所绑定的对象

3.   创建CounterServlet: CounterServletServletContext中存放了一个count属性:

计数器:

(一):ServletContextcontext = getServletContext();

// 从ServletContext读取count属性

Integercount = (Integer)context.getAttribute("count");

if ( count== null ) {

      count = new Integer(0);

      context.setAttribute("count",new Integer(0));

}

// 创建新的count对象,其值增1

count = newInteger(count.intValue() + 1);

// 将新的count属性存储到ServletContext中

context.setAttribute("count",count);

(二):ServletContextcontext = req.getSession().getServletContext();

              if(null ==context.getAttribute("counter"))

              {

                     context.setAttribute("counter",1);

              }

              else

              {

                     intcounter= (Integer)context.getAttribute("counter");

                    context.setAttribute("counter",counter + 1);

              }

             req.getRequestDispatcher("counter.jsp").forward(req,resp);//转发到页面上显示。

       }

4.   Servlet的多线程同步问题:Servlet是单实例的,因为单实例的,所有线程共享同一个实例里面的成员变量。实例里面进行了写操作。

这样当有多个用户同时访问某个 Servlet时,会访问该唯一的 Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致 Servlet的多线程问题,即数据不一致。

5.    解决Servlet 多线程同步问题的最好方案:(1)去除实例变量,使用局部变量(2) 使用同步代码块:synchronized{…}

6.    Cookie:

一个Cookie包含一对Key/Value。下面的代码生成一个Cookie并将它写到用户的硬盘上:

Cookie  theCookie=new Cookie("cookieName","cookieValue");

response.addCookie(theCookie);

7.   在JSP上写Cookie: <body>

 

<%!         int count1 = 0;

     int count2 = 0;

 %>//先进行声明

    <%Cookie cookie = new Cookie("cookieName" + count1++,"cookieValue" + count2++);

       cookie.setMaxAge(15);//单位是秒,并不是毫秒.

         response.addCookie(cookie);

        %>

   

    <%

   Cookie[] cookies = request.getCookies();

       if(null== cookies)

    {

               return;              

    }

          for(Cookiec : cookies)

    {

     %>

 

    <p>

    <b>cookiename: </b> <%= c.getName() %><br>

     <b>cookie value: </b><%=c.getValue() %>

    </p>

   

<%} %>



8. 比较Servlet和JSP: 

1 )有许多相似之处,都可以生成动态网页 JSP的优点是擅长于网页制作,生成动态页面,比较直观。

2) JSP的缺点是不容易跟踪与排错。

3) Servlet是纯Java语言,擅长于处理流程和业务逻辑。Servlet的缺点是生成动态网页不直观。


练习:
问题:HttpServletRequest对象是由谁创建的?

由Servlet容器负责创建,对于每个HTTP请求, Servlet容器都会创建一个HttpServletRequest对象.JavaWeb应

用并不创建Servlet,由Servlet容器会管理JavaWeb应用.


问题:ServletContext对象是由谁创建的?//( 调用ServletContext对象的getAttribute()方法).

由Servlet容器负责创建,对于每个JavaWeb应用,在启动时,Servlet容器都会创建一个ServletContext对象, 
对于每个HTTP请求,共享 Servlet容器都会创建的同一个ServletContext对象


问题:分析ServletRequest、ServletResponse  Servlet、ServletContext等对象的生命周期何时被创建,何时被销毁?
ServletRequest、ServletResponse请求来了创建,响应过去消毁.

Servlet 自己创建的.
ServletContext服务器启动的时侯,重启时.


问题:jspForward1.jsp要把请求转发给jspForward2.jsp,应该在jspForward1.jsp中如何实现?
<jsp:forward  page=“jspForward2.jsp”>


问题:jspForward1.jsp要把请求转发给jspForward2.jsp,在转发的时候,希望把用户名 “小新”传给jspForward2.jsp,如何实现?
request.setAttribute(“username”, “小新”);


问题:request.getAttribute()request.getParameter()方法有什么异同?

选项有:

前者返回Object类型的对象,后者返回String类型的对象

request.getAttribute()和request.setAttribute()对应

当两个Web组件之间为链接关系时,被链接的组件通过getParameter()方法来获得请求参数//超链接中的关系

当两个Web组件之间为转发关系时,转发目标组件通过getAttribute()方法来和转发源组件共享request范围内的数据。//请求转发.

request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据

request.setAttribute()getAttribute()方法传递的数据只会存在于Web

器内部,在具有转发关系的Web组件之间共享。









-----------------------------android培训java培训期待与您交流!----详细请看:http://edu.csdn.net/heima---------------

原创粉丝点击