zoukankan      html  css  js  c++  java
  • javaweb 学习总结

    http://www.cnblogs.com/xdp-gacl/category/574705.html

    这个总结很好,以前看书没搞懂的,这里基本上都清楚了,赞一个,推荐。

    Servlet与普通Java类的区别

     Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
      针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
      在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

    ServletContex

    ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
      由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

    servletContext实现请求转发

    ServletContext context = this.getServletContext();//获取ServletContext对象

    19         RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");//获取请求转发对象(RequestDispatcher)

    20         rd.forward(request, response);//调用forward方法实现请求转发

    通过ServletContext获取web资源的绝对路径

    String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db3.properties");

     70         InputStream in = new FileInputStream(path);

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
    request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。

    HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

    调用response对象的sendRedirect方法实现请求重定向。

    response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");

    如果"/"是给服务器用的,则代表当前的web工程,如果"/"是给浏览器用的,则代表webapps目录。

    form表单提交

    <form action="${pageContext.request.contextPath}/servlet/CheckServlet" method="post">

    18            <input type="submit" value="提交">

    19        </form>

    HttpServletRequest

    概述

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

    获得客户机请求参数(客户端提交的数据)

    • getParameter(String)方法(常用)
    • getParameterValues(String name)方法(常用)
    • getParameterNames()方法(不常用)
    • getParameterMap()方法(编写框架时常用)
      • request.getParameter("userid");//获取填写的编号,userid是文本框的名字,<input type="text" name="userid">
      • String[] insts = request.getParameterValues("inst");

    Request对象实现请求转发

    请求转发的基本概念

      请求转发:指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
      请求转发的应用场景:MVC设计模式

      在Servlet中实现请求转发的两种方式:

      1、通过ServletContextgetRequestDispatcher(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

    例如:将请求转发的test.jsp页面

    1 RequestDispatcher reqDispatcher =this.getServletContext().getRequestDispatcher("/test.jsp");

    2 reqDispatcher.forward(request, response);

      2、通过request对象提供的getRequestDispatche(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

    request.getRequestDispatcher("/test.jsp").forward(request, response);

    Session

    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

    Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

    服务器是如何实现一个session为一个用户浏览器服务的?

    服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。

    JSP

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
      JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

    JSP属性范围

    JSP中提供了四种属性范围,四种属性范围分别指以下四种:

    • 当前页:一个属性只能在一个页面中取得,跳转到其他页面无法取得【page属性范围(pageContext
    • 一次服务器请求:一个页面中设置的属性,只要经过了服务器跳转,则跳转之后的页面可以继续取得。【request属性范围:request属性范围表示在一次服务器跳转中有效,只要是服务器跳转,则设置的request属性可以一直传递下去。】
    • 一次会话:一个用户设置的内容,只要是与此用户相关的页面都可以访问(一个会话表示一个人,这个人设置的东西只要这个人不走,就依然有效)【session属性范围:session设置的属性不管如何跳转,都可以取得的。当然,session只针对一个用户
    • 上下文中:在整个服务器上设置的属性,所有人都可以访问【application属性范围是在服务器上设置的一个属性,所以一旦设置之后任何用户都可以浏览到此属性】

      1、request:如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的。
      2、session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐。
      3、application(servletContext):如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在application(servletContext)域中,像聊天数据。

    Web服务器是如何调用并执行一个jsp页面的?

    浏览器向服务器发请求,不管访问的是什么资源,其实都是在访问Servlet,所以当访问一个jsp页面时,其实也是在访问一个Servlet,服务器在执行jsp的时候,首先把jsp翻译成一个Servlet,所以我们访问jsp时,其实不是在访问jsp,而是在访问jsp翻译过后的那个Servlet。

    HttpJspBase类是继承HttpServlet的,所以HttpJspBase类是一个Servlet,而index_jsp又是继承HttpJspBase类的,所以index_jsp类也是一个Servlet,所以当浏览器访问服务器上的index.jsp页面时,其实就是在访问index_jsp这个Servlet,index_jsp这个Servlet使用_jspService这个方法处理请求。

    在jsp中编写的java代码和html代码都会被翻译到_jspService方法中去,在jsp中编写的java代码会原封不动地翻译成java代码,如<%out.print("Hello Jsp");%>直接翻译成out.print("Hello Jsp");,而HTML代码则会翻译成使用out.write("<html标签> ");的形式输出到浏览器。在jsp页面中编写的html排版标签都是以out.write("<html标签> ");的形式输出到浏览器,浏览器拿到html代码后才能够解析执行html代码。

    Web服务器在调用jsp时,会给Jsp提供如下的8个java对象:

    PageContext pageContext;

    HttpSession session;

    ServletContext application;

    ServletConfig config;

    JspWriter out;

    Object page = this;

    HttpServletRequest request,

    HttpServletResponse response

    其中page对象,request和response已经完成了实例化。

    JSP基本语法

    任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用。

    JSP页面中的HTML内容称之为JSP模版元素。
    JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。

    JSP脚本表达式

    (expression)用于将程序数据输出到客户端
          语法:<%= 变量或表达式 %>

    JSP脚本片断

     JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。语法:
        <%
                多行java代码
        %>

      <% %>中可以定义变量、编写语句,不能定义方法。

    JSP声明

    JSP页面中编写的所有代码,默认会翻译到servletservice方法中,Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
        <%
            java代码
        %>
      所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法

    <%!

    static {

        System.out.println("loading Servlet!");

    }

    private int globalVar = 0;

    public void jspInit(){

        System.out.println("initializing jsp!");

    }

    %>

    <%!

    public void jspDestroy(){

        System.out.println("destroying jsp!");

    }

    %>

    JSP注释

    在JSP中,注释有两大类:

       显式注释:直接使用HTML风格的注释:<!- - 注释内容- ->

       隐式注释:直接使用JAVA的注释:///*……*/

     JSP自己的注释:<%- - 注释内容- -%>

     

    <!--这个注释可以看见-->

    <%

        //JAVA中的单行注释

        /*

            JAVA中的多行注释

        */

    %>

    <%--JSP自己的注释--%>

    HTML的注释在浏览器中查看源文件的时候是可以看得到的,而JAVA注释和JSP注释在浏览器中查看源文件时是看不到注释的内容的,这就是这三种注释的区别。

    JSP指令

    JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

      在JSP 2.0规范中共定义了三个指令:

    • page指令
    • Include指令
    • taglib指令

    JSP指令的基本语法格式:<%@ 指令属性名="" %>

    Page指令

    page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

    import属性

     在Jsp页面中,Jsp引擎会自动导入下面的包

    • java.lang.*
    • javax.servlet.*
    • javax.servlet.jsp.*
    • javax.servlet.http.*

      可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号(,)分隔

    errorPage属性明出错后跳转的错误页面

    1 <%@ page language="java" import="java.util.*" errorPage="/ErrorPage/error.jsp" pageEncoding="UTF-8"%>

    include指令

      在JSP中对于包含有两种语句形式:

    1. @include指令
    2. <jsp:include>指令

    @include指令

    使用@include可以包含任意的内容,文件的后缀是什么都无所谓。这种把别的文件内容包含到自身页面的@include语句就叫作静态包含,作用只是把别的页面内容包含进来,属于静态包含。

     @include可以包含任意的文件,当然,只是把文件的内容包含进来。

      include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

    语法:<%@ include file="relativeURL"%>,其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。

    include指令细节注意问题:

    1. 被引入的文件必须遵循JSP语法。
    2. 被引入的文件可以使用任意的扩展名,即使其扩展名是htmlJSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspfJSP fragments(片段))作为静态引入文件的扩展名。
    3. 由于使用include指令将会涉及到2JSP页面,并会把2JSP翻译成一个servlet,所以这2JSP页面的指令不能冲突(除了pageEncoding和导包除外)。

    4.      <body>

    5.       9   <%--使用include标签引入引入其它JSP页面--%>

    6.      10     <%@include file="/jspfragments/head.jspf" %>

    7.      11     <h1>网页主体内容</h1>

    8.      12     <%@include file="/jspfragments/foot.jspf" %>

    9.       13   </body>

    jsp:include指令

    jsp:include指令为动态包含,如果被包含的页面是JSP,则先处理之后再将结果包含,而如果包含的是非*.jsp文件,则只是把文件内容静态包含进来,功能与@include类似。

    JSP中的九个内置对象

     每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
      由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
      JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。

    NO.

    内置对象

    类型

    1

    pageContext

    javax.servlet.jsp.PageContext

    2

    request

    javax.servlet.http.HttpServletRequest

    3

    response

    javax.servlet.http.HttpServletResponse

    4

    session

    javax.servlet.http.HttpSession

    5

    application

    javax.servlet.ServletContext

    6

    config

    javax.servlet.ServletConfig

    7

    out

    javax.servlet.jsp.JspWriter

    8

    page

    java.lang.Object

    9

    exception

    java.lang.Throwable

     page对象

    page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把一个JSP当作一个对象来看待。page对象在开发中几乎不用,了解一下即可

     pageContext对象

     pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

    通过pageContext获得其他对象:

    • getException方法返回exception隐式对象
    • getPage方法返回page隐式对象
    • getRequest方法返回request隐式对象
    • getResponse方法返回response隐式对象
    • getServletConfig方法返回config隐式对象
    • getServletContext方法返回application隐式对象
    • getSession方法返回session隐式对象
    • getOut方法返回out隐式对象

    pageContext对象可以作为容器来使用,因此可以将一些数据存储在pageContext对象中。

    当要查找某个属性时,findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。

    PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。 

    JSP属性范围

    JSP中提供了四种属性范围,四种属性范围分别指以下四种:

    • 当前页:一个属性只能在一个页面中取得,跳转到其他页面无法取得【page属性范围(pageContext
    • 一次服务器请求:一个页面中设置的属性,只要经过了服务器跳转,则跳转之后的页面可以继续取得。【request属性范围:request属性范围表示在一次服务器跳转中有效,只要是服务器跳转,则设置的request属性可以一直传递下去。】
    • 一次会话:一个用户设置的内容,只要是与此用户相关的页面都可以访问(一个会话表示一个人,这个人设置的东西只要这个人不走,就依然有效)【session属性范围:session设置的属性不管如何跳转,都可以取得的。当然,session只针对一个用户
    • 上下文中:在整个服务器上设置的属性,所有人都可以访问【application属性范围是在服务器上设置的一个属性,所以一旦设置之后任何用户都可以浏览到此属性】

      1、request:如果客户向服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,像新闻数据,属于用户看完就没用的。
      2、session:如果客户向服务器发请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,像购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结帐。
      3、application(servletContext):如果客户向服务器发请求,产生的数据,用户用完了,还要给其它用户用,像这样的数据就存在application(servletContext)域中,像聊天数据。

     JavaBean

     JavaBean是一个遵循特定写法的Java,它通常具有如下特点:

    • 这个Java类必须具有一个无参的构造函数
    • 属性必须私有化。
    • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。

    JavaBean在J2EE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。

     JSP中使用JavaBean

    JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:

    • <jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。
    • <jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。
    • <jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。

    <jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象,如果存在则直接返回该JavaBean对象的引用,如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。
      语法
        <jsp:useBean id="beanName" class="package.class" scope="page|request|session|application"/>
      "id"属性用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称。
      "class"属性用于指定JavaBean的完整类名(即必须带有包名)。
      "scope"属性用于指定JavaBean实例对象所存储的域范围,其取值只能是page、request、session和application等四个值中的一个,其默认值是page。

    <jsp:useBean id="person" class="gacl.javabean.study.Person" scope="page"/>

     <jsp:useBean>执行原理

    上面我们在index.jsp中使用<jsp:useBean id="person" class="gacl.javabean.study.Person" scope="page"/>实例化了一个gacl.javabean.study.Person类的对象,那么这个peson对象是怎么实例化出来的呢?index.jsp在执行的过程中首先会翻译成一个servlet,因此我们可以通过查看index.jsp页面生成的servlet的java代码来查看peson对象的实例化过程:

    首先是定义一个person对象,值是null;

    然后是使用pageContext对象的getAttribute方法获取存储在PageContext.PAGE_SCOPE域中的Person对象;如果在PageContext.PAGE_SCOPE域中的Person对象没有找到person对象,那么就创建一个新的person对象,然后使用pageContext对象的setAttribute方法将新创建的person存储在PageContext.PAGE_SCOPE域中;

    也就是说,在index.jsp中使用<jsp:useBean id="person" class="gacl.javabean.study.Person" scope="page"/>来实例化person对象的过程实际上是执行了上述的java代码来实例化Person对象。这就是<jsp:useBean>标签的执行原理:"首先在指定的域范围内查找指定名称的JavaBean对象,如果存在则直接返回该JavaBean对象的引用,如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。

  • 相关阅读:
    2、什么是session?
    1、什么是cookie?
    Vuejs实战项目五:数据列表
    Vuejs实战项目四:权限校验
    vue开发中控制台报错问题
    Vuejs实战项目三:退出系统功能实现
    Vuejs实战项目:登陆页面
    Vuejs实战项目步骤一
    springmvc:文件上传
    ssm整合:搭建环境
  • 原文地址:https://www.cnblogs.com/quietwalk/p/6141107.html
Copyright © 2011-2022 走看看