Servet和JSP学习总结(转载)

前天去面试,遇到一个搞技术的面试官。问了好多问题,好多没答上来,不是不会而是掌握的不够扎实,没有进行归纳和总结。最典型的是集合类的层次结构,Jsp内置对象之间的关系。这些问题不能说不会,而是不够扎实,没有站在一个系统的高度来看这些问题。虽然面试的不成功,但收获的还是挺大的。使我看到了自己学的还是很不够,很多东西要学习。面试主要是搞Web开发,使用三大框架:Struts,Spring,Hibernate。这半年都在搞安全了,搞的也是桌面应用程序,没有做Web开发,Java主要的优势还在于Web开发。面试回来后打算把三打框架好好看看。我相信我的学习能力,遗憾没有在面试官面前表现出来。下面是我照着张孝祥老师编写的《深入体会Javaweb开发内幕》写的。

Servelt就是由两个包组成javax.servlet和javax.servelt.http
前者装是基本的servet类,后者是与http有关的类。后者中大部分类都实现了前者的类。我们在写Servelt时很多都直接使用后者中的类。
GenericServlet实现了Servlet和ServletConfig接口。
HttpServlet继承了GenericServlet类
我们在写Servlet时继承HttpServlet。

ServletConfig对象可以获得Servlet的配置参数:如Web.xml中设置的初始化参数等通过Servlet.getServletConfig()获得ServletConfig对象。
ServletConfig对象中包括对ServletContext的引用。

ServletContext是Web应用程序中所有的Servelt共享,通过getServletContext()获得serveltContext对象。它的作用域是整个Web应用程序。所以它可以访问资源文件,可以使用相对路径。可以获得虚拟路径所映射的本地路径。

HttpServletResponse是ServletResponse子接口,用于响应请求。代表用于Http协议的响应消息对象。可以产生响应状态行、构造响应消息头(设置字符集编码)、创建响应正文等。
   cookie的增加使用方法:HttpServletResponse.addCookie(Cookie)。
   Servelt中文输出问题可以用下面语句解决:
        response.setCharacterEncoding("GB2312");
        response.setContentType("text/html;GB2312");
        response.setLocale(new java.util.Locale("zh","CN"));
   让浏览器定时刷新网页或跳转至其他页面
        response.setHeader("Refresh","2");
        response.setHeader("Refresh","2;URL=http://www.it315.org");
   禁止缓存当前文档的内容可以用
        response.setDateHeader("Expires",0);
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma","no-cache");
    创建响应正文:response.getOutputStream()和getWriter()
          分别得到ServletOutputStream和PrintWriter对象,可以看到一个是字节流,一个是字符流。
    请求重定向和请求转发:
         请求重定向用RequestDispatcher.forward(),请求转发用HttpServletResponse.sendRedirect()。                   RequestDispatcher通过ServletContext接口中的getRequestDispatcher方法获得。
    区别在于重定向是调用别的Servlet来处理,对用户是透明的,而sendRedirect() 是将请求转发给到别的页面。重定向只能在同一个Web应用程序内资源内转发请求,而sendRedirect()可以在任意页面间转发。
    区别RequestDispatcher.indlude()和RequestDispatcher.forward()。
       indlude被调用者不能改变响应消息的状态码和消息头。forward方法中调用者和被调用者之间共享相同的   request对象和response对象。
RequestDispatcher.forward和HttpServletResponse.sendRedirect方法在调用它们之前都不能有缓冲区输出到客户端。缓冲区的内容会被清空。

HttpServletRequest是ServletRequest的子接口,它代表请求消息。
    通过它的方法可以获得请求行的相关信息、网络连接信息、请求头信息、传递的参数等。
     请求行:对于如下请求:
         http://localhost:8080/it315/controller/one.jsp?param1=abc
         下面方法可以得到如下信息:
             request.getMethod() :GET
             request.getRequestURI() :/it315/controller/one.jsp
             request.getQueryString():param1=abc
             request.getProtocol():http/1.1
             request.getContextPath:/it315
             request.getPathInfo:/one.jsp
             request.getPathTranslated:C:\tomcat-5.5.4\webapps\it315\one.jsp
             request.getServletPath: /controller
      网络连接就是些IP地址,端口什么的,不看了。
      请求头信息:可以获得指定名称的头字段的值,日期,Content-Type头字段,请求消息的实体部分的字符集编码等。
      防盗链技术:
          防止被人直接超链接内容,判断请求头referer字段是否来自本站。
     获取请求参数:getParameter(String)
     获取请求消息实体内容:与response对应,有获取请求消息实体内容的方法。request.getInputStream()和getReader()方法。分别表示字节流和字符流
      利用请求域传递属性信息。方法是request.setAttribute()。然后将请求重定向forward到别的处理模块。

会话和状态管理
有两种方式Cookie和Session。Cookie保存在客户端,Session保存在服务端。形象的比喻是Cookie是商场发放的优惠卡,优惠卡上记录优惠政策。Session比喻为病历卡,医院为每个病人保留病历档案。病历卡上只填写了卡号。
Cookie是一个类,它通过new Cookie(String name,String value)实例化。request.getCookies()返回所有的Cookie。response.addCookie(Cookie cookie)。HttpSession是接口。Request.getSession()的到Session对象。


JSP
Jsp内置对象与Servlet中的类对应关系
             application----> ServletContext
             config    -----> ServletConfig
             session   ----->HttpSession
             request   ----->HttpServletRequest
             response ----->HttpServletResponse
             page是Jsp被翻译成Servlet对象自身
             out是JspWriter的实例,调用ServletResponse.getWriter()的到的PrintWriter将out对象的缓冲区内容写入到Servlet引擎提供的缓冲区中。
             pageContext是javax.servlet.jsp.JspContext的子类,pageContext对象封装了当前JSP页面的运行信息,它提供了返回JSP页面的其他内置对象的方法。
            由servelt中的关系,可以得到内置对象之间的关系。通过config可以获得application,通过session可以获得application。通过request可以获得session。通过pageContext可以获得所有的内置对象。


原文地址:https://www.cnblogs.com/pricks/p/1601892.html