zoukankan      html  css  js  c++  java
  • JSP/Servlet(一)

    JSP/Servlet(一)

     

    Web应用和web.xml文件:

    一、构建Web应用:

    1、在任意目录下创建一个文件夹。

    2、在第1步所建的文件夹内建一个WEB-INF文件夹(注意大小写)。

    3、进入Tomcat或任何其他web容器内,找到任何一个web应用,将Web应用的WEB-INF下的web.xml文件

    复制到第2步所建的文件夹下。

    4、修改复制后的web.xml文件,将该文件修改成只有一个跟元素的XML文件,如下。 

    复制代码
    <?xml version="1.0" encoding="GBK"?>

    <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
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    </web-app>
    复制代码

      在WEB-INF文件下新建两个文件夹:classes和lib。

        classes文件夹:保存单个*.class文件;lib文件夹:保存打包后的JAR文件。

    5、把该web应用复制到Tomcat的webapps路径下。通常我们只要将jsp放在web应用的根目录下,就可以通过浏览器来访问这些页面了。

    <webDemo>---------这是应用的名称,可以改变

    |-WEB-INF

    |  |-classes

    |  |-lib

    |  |-web.xml

    |-<*.jsp>

     

    JSP的基本原理:

      jsp的本质是servlet。jsp通过在标准的HTML页面中嵌入java代码,其静态的部分无需Java程序控制,只有那些需要从数据库读取或需要

    动态生成的的页面内容,才使用Java脚本控制。

      jsp页面内容:

      >静态部分:标准的HTML标签、静态的页面内容,这些内容与静态HTML页面相同。

      >动态部分:受Java程序控制的内容,这些内容由Java程序来控制。

    复制代码
    <%@ page language="java" contentType="text/html; charset=UTF-8"  language = "java" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>这是一个jsp页面代码</title>
    </head>
    <body>
    欢迎进入<br>
    现在是时间是:
    <%out.println(new java.util.Date()); %>
    </body>
    </html>
    复制代码

    注意:JSP的本质依然是servlet,每个JSP页面就是一个Servlet实例——JSP页面有系统编译成Servlet,Servlet再负责响应用户请求。

    JSP的工作原理:

        Client            →发出请求→        JSP Server(如果该JSP页面第一次收到请求,先编译JSP文件,生成对应的Servlet,如果该JSP页面已有对应的

              ←返回标准的HTML页面←    的Servlet,这根据请求动态生成标准的HTML页面。注:每次都会根据请求动态生成HTML文档。)

    1、JSP文件必须在JSP服务器内运行。

    2、JSP文件必须生成servlet才能执行。 

    3、每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。

    4、JSP页面的访问者无须安装任何客户端,甚至不需要可以运行的Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。

    JSP注释:

      JSP注释格式: <%-- 注释内容 --%>

      而HTML注释格式:<!-- 注释内容 -->

      HTML的注释可以通过源代码查看到,但JSP的注释是无法通过源代码查看到的。这表名JSP注释不会被发送到客户端。

    JSP声明:

      JSP声明用于声明变量和方法。JSP声明的语法格式如下:

      <%!  声明部分   %>  

    <%@ page language="java" contentType="text/html; charset=UTF-8"  language = "java" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>这是一个jsp页面</title>
    </head>
    <!-- 下面是JSP声明部分 -->
    <%!
    // 声明一个变量
    public int count = 0 ;
    // 声明一个方法
    public String info()
    {
    return "hello : " + count ;
    }
    %>
    <body>
    <!-- 每次刷新count的值都会加1 -->
    <%
    out.println(++ count) ;
    %><br/>
    <%
    out.println(info()) ;
    %>
    </body>
    </html>

    输出JSP表达式:

      输出表达式值的语法格式: <%=表达式>

      输出表达式将转换成Servlet里面的输出语言。

    JSP脚本:

      JSP脚本中可以放置任何可执行性语句,所以可以充分利用Java语言的功能,例如连接数据库和执行数据库。

      例子:

    <%@page import="java.sql.*"%>
    <%@page language="java" contentType="text/html; charset=UTF-8" errorPage=""%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <head>
    <title>连接数据库脚本测试</title>
    </head>
    <body>
    <table bgcolor = "yellow" border = "1" width = "300px">
    <%
    // 注册数据库驱动
    Class.forName("com.mysql.jdbc.Driver") ;
    // 获取数据库连接
    Connection conn = DriverManager.getConnection(
    "jdbc:mysql://127.0.0.1:3306/select_test","root","hezuoan") ;
    // 创建Statement
    Statement stmt = conn.createStatement() ;
    // 查询
    ResultSet rs = stmt.executeQuery("select * from student_table") ;
    while(rs.next())
    {
    %>
    <tr>
    <td><%=rs.getString(1)%> </td>
    <td><%=rs.getString(2)%> </td>
    <td><%=rs.getString(3)%> </td>
    </tr>
    <%
    }
    %>
    </table>
    </body>

      (执行SQL查询需要使用MySQL驱动程序,将驱动的JAR文件放在Tomcat的lib路径下。)

    JSP的三个编译指令:

    > page :该指令是针对当前页面的指令。

    > include :用于指定包含另一个页面。

    > taglib :用于定义和访问自定义标签。

    格式如下:<%@ 编译指令名 属性名="属性值"... %>

    一、page 指令:

      page指令通常位于JSP页面的顶端,一个JSP页面可以使用多个page指令。语法格式如下:

      <%@page

      [language="Java"]

      [extends= "package.class"]

      [import = "package.class|package.*..."]

      [session= "true|false"]

      [buffer = "none|8KB|size Kb"]

      [autoFlush = "true|false"]

      [isThreadSafe = "true|false"]

      [info = "text"]

      [errorPage = "relativeURL"]

      [contentType = "mimeType[; charset = characterSet]"|"text/html ; charset = ISO-8859-1"]

      [pageEncoding = "ISO-8859-1"]

      [isErrorPage = "true|false"]

      %>

      各指令的属性定义:

      language : 声明当前JSP页面使用的脚本语言的种类,通常默认是Java 。 

      extends  : 指定JSP页面编译所产生的Java类所继承的父类,或所实现的接口。

      import : 导入包。 (下面几个包是系统默认导入的:java.lang.* ; javax.servlet.*; javax.servlet.jsp.*;javax.servlet.http.* ;)

      session : 设定这个JSP页面是否需要HTTP Session。

        buffer : 指定输出缓冲区的大小。

      autoFlush : 当输出缓冲区即将溢出时,是否需要强制输出缓冲区的内容。

      info : 设置该JSP程序的信息,也可以看做其说明,可以通过Servlet.getServletInfo()方法获取。

      errorPage : 指定错误处理页。

      isErrorPage : 设置本JSP页面是否为错误处理程序。

      contentType : 用于设定生成网页的文件格式和编码字符集,即MIME类型和页面字符集类型。  

              默认的MIME类型是 text/html ;默认的字符集类型为ISO-8859-1.

      PageEncoding :是定生成网页的编码字符集。

    二、include指令

      使用include指令,可以将一个外部文件嵌入到当前JSP文件中。语法格式:

      <%@include file = "relativeURLSpec"%> 

    JSP/Servlet(二)

     

    JSP的7个动作指令:

      编译指令是通知Servlet引擎的处理消息,而动作指令只是运行时的动作。

      jsp:forward : 执行页面转向,将请求的处理转发到下一个页面。

      jsp:param : 用于传递参数,必须与其他支持参数的标签一起使用。

      jsp:include : 用于动态引入一个JSP页面。

      jsp:plugin : 用于下载JavaBean或Applet到客户端。

      jsp:useBeam : 创建一个JavaBean的实例(初始化)。

      jsp:setProperty : 设置JavaBean实例的属性值。

      jsp:getProperty : 输出JavaBean实例的属性值。

      

    一、forward 指令

      forward指令用于将页面响应转发到另外的页面。

      JSP使用语法:

    对于JSP1.1

        <jsp:forward page = "{relativeURL|<%=expression%>}"/>

          {<jsp:param .../>}

        </jsp:forward>

      在转发时增加额外的请求参数。增加的请求参数值可以通过HttpServletRequest类的getParameter()方法获取。

      在另一页面使用request内置对象(request内饰对象是HttpServletRequest的实例)来获取增加的请求参数值 。 

      <%=request.getParameter("参数名字")%>

      

    二、include指令

      下面是include动作指令的语法格式:

      <jsp:include page = "{relativeURL|<%=experssion%>}" flush = "true"/>

      或者

      <jsp:include page = "{relativeURL|<%=experssion%>}" flush = "true"/>  

            <jsp:param name = "parameterName" value= "parameterValue"/>

      </jsp:include>

      flush 属性用于指定输出缓存是否转移到被导入文件中。

      

    三、useBean、setProperty、getProperty指令 

      如果多个JSP页面需要重复使用某一段代码,我们可以把这段代码定义成Java类的方法,然后让多个JSP页面

    调用该方法便可。

      useBean语法格式:

      <jsp:useBean id = "name" class = "classname" scope = "page|request|ssesion|application" />

      id属性是JavaBean的实例名。

      class属性确定JavaBean的实现类。

      scope属性用于指定JavaBean实例的作用范围该范围有4个值。

        1、page : 该JavaBean实例只在该页面有效。

        2、request : 该JavaBean实例只在本次请求有效。

        3、session : 该JavaBean实例只在本次Session有效。

        4、application  : 该JavaBean实例在本次应用内一直有效。

      setProperty的语法格式:

      <jsp:setProperty name = "BeanName" property = "propertyName" value = "value" />

        name 属性确定需要设定的JavaBean的实例名 ;

        prototype 属性确定需要设定的属性名 ;

        value 属性确定设定需要设置的属性值。

      getProperty 的语法格式:

      <jsp:getProperty name = "BeanName" property = "propertyName" />

       例子如下: 

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>BeanTest</title>
    </head>
    <body>
    <!-- 创建实例 -->
    <jsp:useBean id="BeanTest_1" class = "com.cnblogs.jbelial.Person" scope = "page" ></jsp:useBean>
    <!-- 设置属性值 -->
    <jsp:setProperty property="name" name="BeanTest_1" value = "hezuoan"/>
    <jsp:setProperty property="age" name="BeanTest_1" value = "19"/>
    <jsp:setProperty property="sex" name="BeanTest_1" value = "M"/>
    <!-- 输出属性值 -->
    <jsp:getProperty property="name" name="BeanTest_1"/>
    <jsp:getProperty property="age" name="BeanTest_1"/>
    <jsp:getProperty property="sex" name="BeanTest_1"/>
    </body>
    </html>

      

    package com.cnblogs.jbelial;
    public class Person {
    String name ;
    String sex ;
    int age ;
    public Person()
    {
    }
    public Person(String name , int age , String sex)
    {
    this.name = name ;
    this.sex = sex ;
    this.age = age ;
    }
    public void setName (String name)
    {
    this.name = name ;
    }
    public void setSex (String sex)
    {
    this.sex = sex ;
    }
    public void setAge (int age)
    {
    this.age = age ;
    }
    public String getName()
    {
    return this.name ;
    }
    public String getSex()
    {
    return this.sex ;
    }
    public int getAge()
    {
    return this.age ;
    }

    四、param指令 

      param指令用于设置参数。参考上面的代码。

      param指令不能单独使用。

    JSP/Servlet(三)

     

    JSP脚本中的9个内置对象:

      JSP脚本中包含了9个内置对象,这9个内置对象都是Servlet API接口的实例(可以直接使用)。

      JSP内置对象的实质:他们要么是_jspService()方法的形参,要么是_jspService()方法的局部变量,所以在

    JSP脚本中调用这些对象,无须创建它们。

    application 对象

      application是javax.servlet.ServletContext的实例。代表JSP所属的Web应用本身,可用于JSP页面,或者

    在Servlet之间交换数据。

      对于application通常有如下两个作用:

      >在整个Web应用的多个JSP、Servlet之间共享数据。

      >访问Web应用的配置参数。

    1、让多个JSP、Servlet共享数据

      application 通过 setAttribute(String attrName , Object value)方法将一个值设置成application的attrName属性

    该属性的值对整个Web应用有效,该Web应用的每个JSP页面或Servlet都可以通过getAttribute(String attrName)来访问

    该属性。

      实例:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>application_setAttribute test</title>
    </head>
    <body>
    <%!
    int i ;
    %>
    <%
    application.setAttribute("count", String.valueOf(++i)) ;
    %>
    <%= i %>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>application_getAttribute test</title>
    </head>
    <body>
    <%=application.getAttribute("count") %>
    </body>
    </html>

      application不仅可以用于两个JSP页面之间的共享数据,还可以用于JSP和Servlet之间共享数据。

      注意:不要仅为了JSP、Servlet共享数据就将数据库放入application中,通常只应该把Web应用的状态数据放入application里。

    2、获得Web应用配置参数。

      application还可以获取Web应用的配置参数。如下代码:

      

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>application test</title>
    </head>
    <body>
    <%
    // 从配置中获取参数
    String driver = application.getInitParameter("driver") ;
    String url = application.getInitParameter("url") ;
    String user = application.getInitParameter("user") ;
    String pass = application.getInitParameter("pass") ;
    // 注册驱动
    Class.forName(driver) ;
    // 连接数据库
    Connection conn = DriverManager.getConnection(url, user, pass) ;
    Statement stmt = conn.createStatement() ;
    ResultSet rs = stmt.executeQuery("select * from student_table ") ;
    %>
    <table bgcolor = "yellow" border = "1" width = "500">
    <!-- 遍历结果 -->
    <%
    while(rs.next())
    {
    %>
    <tr>
    <td><%=rs.getString("student_id") %></td>
    <td><%=rs.getString("student_name") %></td>
    <td><%=rs.getString("java_teacher") %></td>
    </tr>
    <%
    }
    %>
    </table>
    </body>
    </html>

      

      使用application的getInitParameter(String paramName) 来获取Web应用的配置参数,这些参数应该在web.xml文件中。

    同时web.xml文件中使用context-param元素配置,每一个<context-param.../>元素配置一个参数。该元素有如下两个子元素。

      >param-name:配置Web参数名。

      >param-value:配置Web参数值。

      格式如下:

      <context-param>

        <param-name> driver </param-name> 

        <param-value> com.mysql.jdbc.Driver </param-value>

      </context-param>

     

    config 对象:

      config 是javax.servlet.ServletConfig的实例,该实例代表JSP的配置信息。常用的方法有:

      getInitParameter(String paramName)和getInitParameternames() 等。由于JSP页面通常无须配置,因此也就不存在配置信息。

      所以在JSP页面中较少使用,但在Servlet中则用处相对较大。

    exception对象:

      exception是Throwable的实例,代表JSP脚本中产生的异常和错误,是JSP页面异常机制的一部分。

      exception对象仅在异常处理页面才有效,即isErrorPage为true时。

    out对象:

      out对象代表一个页面的输出流,通常用于在页面上输出变量值及常量。

      

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>application test</title>
    </head>
    <body>
    <%
    // 从配置中获取参数
    String driver = application.getInitParameter("driver") ;
    String url = application.getInitParameter("url") ;
    String user = application.getInitParameter("user") ;
    String pass = application.getInitParameter("pass") ;
    // 注册驱动
    Class.forName(driver) ;
    // 连接数据库
    Connection conn = DriverManager.getConnection(url, user, pass) ;
    Statement stmt = conn.createStatement() ;
    ResultSet rs = stmt.executeQuery("select * from student_table ") ;
    %>
    <table bgcolor = "yellow" border = "1" width = "500">
    <!-- 遍历结果 -->
    <%
    while(rs.next())
    {
    //输出表格行
    out.println("<tr>") ;
    out.println("<td>") ;
    out.println(rs.getString("student_id")) ;
    out.println("</td>") ;
    out.println("</tr>") ;
    }
    %>
    </table>
    </body>
    </html>

      out负责输出页面表格及所有内容。

      注意:所有使用out的地方,都可使用输出表达式来代替。<%=...%>的本质就是out.write(...)。

    pageContext对象:

      pageContext是javax.servlet.jsx.PageContext的实例,这个对象代表页面上的上下行,

      该对象主要用于访问JSP之间的共享数据。使用pageContext()可以访问page、request、session、application范围的变量。

    它提供了如下两个方法来访问变量:

      >getAttribute(String name) :取得page范围内的name属性。

      >getAttribute(String name , int scope):取得指定范围内的name属性,

       其中scope可以是下面几个值。

          > PageContext.PAGE_SCOPE :对应与page范围。

          > PageContext.REQUEST_SCOPE :对应与request范围。

          > PageContext.SESSION_SCOPE :对应与session范围。

          > PageContext.APPLICATION_SCOPE :对应与application范围。

      与getAttribute()方法相对应,PageContext也提供了两个setAttribute()方法。用于将指定变量放入四个范围内。

      pageContext还可用于获取其他内置对象,pageContext对象包含如下方法

      > ServletRequest getRequest() :获取request对象。

      > ServletResponse getResponse() :获取response对象。

      > ServletConfig getServletConfig() :获取application对象。

      > ServletContext getServletContext() : 获取application对象。

      > HttpSession getSession() : 获取session对象。

    request对象:

      每一个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取

    请求参数的重要途径。

      1、获取请求头/请求参数

      (web应用是请求/响应架构的应用,浏览器发送请求时通常会附带一些请求,还可能包含一些请求参数发送给服务器,

      服务器端负责解析请求头/请求参数的就是JSP或Servlet,而JSP和Servlet取得请求参数的途径就是request。)

      request是HttpServletRequest接口的实例,它提供了如下的几个方法来获取请求参数。

      >String getParameter(String paramName) :获取paramName请求参数的值。

      >Map getParameterMap() : 获取所有请求参数名和参数值组成Map对象。

      >Enumeration getParameterNames() :获取所有请求参数名所组成的Enumeration对象。

      >String[] getParameterValues(String name) :paramName请求参数的值,当参数有多个值的时候,该参数方法返回多个参数值。

      

      HttpServletRequest提供了如下方法来访问请求头:

      >String getHeader(String name):根据指定请求头的值。

      >Enumeration<STring> getHearderNames() :获取所有请求头的名称。

      >Enumeration<STring> getHearders(String name) :获取请求头的多个值。

      >int getIntHeader(String name):获取指定请求头的值,并将该值转化为整数值。

      客户端发送参数通常分为两种情况:

      GET方式请求:GET方式的请求会将请求参数的名和值转换成字符串,并附加在原URL之后,且GET请求传送的数据量比较小。

      POST方式请求:通常使用提交表单的方式来发送,且需要在form元素的method属性设置为post。POST请求传输的数据量总

              GET传输的数据量大。

      

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>收集参数</title>
    </head>
    <body>
    <form id = "form_1" method = "post" action = "requestTest_1.jsp">
    姓名:<br/>
    <input type = "text" name = "name" ><hr/>
    性别:<br/>
    男:<input type = "radio" name = "gender" value = "男">
    女:<input type = "radio" name = "gender" value = "女"><hr/>
    年龄:<br>
    <input type = "text" name = "age"><hr>
    最喜欢的颜色:<br>
    红:<input type = "checkbox" name = "color" value = "红" >
    绿:<input type = "checkbox" name = "color" value = "绿" >
    蓝:<input type = "checkbox" name = "color" value = "蓝" ><hr>
    博客:<br>
    <input type = "text" name = "blog"><hr>
    来自的国家:<br>
    <select name = "country">
    <option value = "中国">中国</option>
    <option value = "美国">美国</option>
    </select><hr>
    <input type = "submit" value = "提交">
    <input type = "reset" value = "重置">
    </form>
    </body>
    </html>
    <!--requestTest_1.jsp-->
    <%@page import="java.util.Enumeration"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>获取请求参数/请求头</title>
    </head>
    <body>
    <%
    //获取所有请求头的名称:
    Enumeration<String> headerNames = request.getHeaderNames() ;
    while (headerNames.hasMoreElements())
    {
    String headerName = headerNames.nextElement() ;
    //获取每个请求、以及其对应的值
    out.println(headerName + "-->" + request.getHeader(headerName)+"<br>") ;
    }
    out.println("<hr>") ;
    //设置解码方式
    request.setCharacterEncoding("UTF-8") ;
    //下面一次获取表的单体值
    String name = request.getParameter("name") ;
    String gender = request.getParameter("gender") ;
    String age =request.getParameter("age") ;
    //如果某个参数有多个值,将使用该方法获取多个值
    String[] color = request.getParameterValues("color") ;
    String blog = request.getParameter("blog") ;
    String national = request.getParameter("country") ;
    %>
    <!-- 下面一次输出参数值 -->
    名字:<%=name %><hr>
    性别:<%=gender %><hr>
    年龄:<%=age %><hr>
    blog:<%=blog %><hr>
    喜欢的颜色:<%for (String c : color){out.println(c + " ");} %><hr>
    国家:<%=national %><hr>
    </body>
    </html>



      2、操作request范围的属性

      HttpServletRequset还包含如下两个方法,用于设置和获取request范围的属性。

      >setAttribute(String serName , Object attValue): 将attValue设置成request范围的值。

      >Object getAttribute(String attName) : 获取request范围的属性。

      当forward用户请求时,请求的参数和请求属性都不会丢失,即forward动作还是原来的请求,并没有在此向服务器发送请求。

      3、执行forward或include

      request还有一个共能就是执行forward和include,也就是代替JSP所提供的forward和include动作指令。

      HttpServletRequest类提供了一个getRequestDispatcher(String path)方法,其中path就是forward或者include的目标路径。

      该方法返回RequestDispatcher,该对象提供了如下的两个方法。

      >forward(ServletRequest request , ServletResponse respone) ;  执行forward 。

      >include(ServletRequest request , ServletResponse respone) ; 执行include .

      例子:  getRequestDispatcher("/a.jsp").include(request, response) ; 

      注意:使用request的getRequestDispathcher(String path)方法时,path字符串必须以斜线开头。

    response对象:  

      response 代表服务器对客户端的响应。大部分时候,程序无须使用respone来响应客户端请求,

    因为有个更简单的响应对象——out,代表页面的输出流。

      由于out无法输出非字符串(out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流),所以当需要在JSP页面中动态的

    生成一幅位图、或者输出一个PDF文档,则必须使用response作为响应输出。

      1、response响应生成非字符串响应。

      img.jsp:

    <%-- 通过contentType 指定响应的数据是图片 --%>
    <%@ page language="java" contentType="image/jpeg" %>
    <%@ page import = "java.io.*,java.awt.*,javax.imageio.*,java.awt.image.*" %>
    <%
    //建立一个BufferedImage对象
    BufferedImage image = new BufferedImage(340,160,BufferedImage.TYPE_INT_RGB) ;
    //通过Image对象获得一个Graphics对象
    Graphics graphics = image.getGraphics();
    //使用Graphics画图,所画的图像,将会出现在image对象中。
    graphics.fillRect(0,0,400,400) ;
    //设置成红色
    graphics.setColor(new Color(255,0,0)) ;
    /*
    画弧线
    public abstract void fillArc(int x,
    int y,
    int width,
    int height,
    int startAngle,
    int arcAngle)
    参数:
    x - 要填充弧的左上角的 x 坐标。
    y - 要填充弧的左上角的 y 坐标。
    width - 要填充弧的宽度。
    height - 要填充弧的高度。
    startAngle - 开始角度。
    arcAngle - 相对于开始角度而言,弧跨越的角度。

    */
    graphics.fillArc(20,20,100,100,30,120) ;
    //设置成绿色
    graphics.setColor(new Color(0,255,0)) ;
    graphics.fillArc(20,20,100,100,150,120) ;
    //设置成蓝色
    graphics.setColor(new Color(0,0,255));
    graphics.fillArc(20,20,100,100,270,120) ;
    //设置成黑色
    graphics.setColor(new Color(0,0,0)) ;
    /*
    设置字体。
    public abstract void setFont(Font font)
    将此图形上下文的字体设置为指定字体。使用此图形上下文的所有后续文本操作均使用此字体。

    Font(String name, int style, int size)
    根据指定名称、样式和磅值大小,创建一个新 Font。
    */
    graphics.setFont(new Font("Arial Black" , Font.PLAIN , 16)) ;
    //画出三个字符串
    graphics.drawString("red", 50,50);
    graphics.drawString("green", 20,80);
    graphics.drawString("blue", 80,80);
    graphics.dispose() ;
    //将图象输出到页面的响应
    ImageIO.write(image, "jpg", response.getOutputStream()) ;
    %>

      在标签中使用<img src = "img.jsp"> 便可以显示出上面代码的图片。实例:网页上的图形验证码功能。同时使用response生成PDF文件、Excel文件等等。

      2、重定向

      重定向是response的另外一个用处,与forward不同的是,重定向会丢失所有的请求数据,包括request范围的属性。

      HttpServletRespone提供了一个sendRedirect(String path)方法,重定向到path资源,即重新向path资源发送请求。

      其中,与forward的区别如下:

    转发(forward) 重定向(redirect)

         执行forward后依然是上次请求。

         执行redirect后是第二次请求。

         forward的目标页面可以访问原请求的请求参数,因为依然是同一次

    请求,所有原请求的请求参数、request范围的属性全部都存在。

         全部丢失。
         地址中的URL不会改变      改变

      3、增加Cookie

      response对象提供了如下方法来增加Cookie。

      void addCookie(Cookie cookie):增加Cookie。

      增加Cookie之前,必须创建Cookie对象。增加步骤如下:

      1、创建Cookie实例,Cookie的构造器为Cookie(String name , String value).

      2、设置Cookie的生命期限。

      3、向客户端写Cookie。

      

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>增加Cookie</title>
    </head>
    <body>
    <%
    //获取请求参数
    String name = request.getParameter("name") ;
    //以获取的请求参数为值,创建一个Cookie对象
    Cookie cookie = new Cookie("useName" , name) ;
    //设置Cookie的生存期限
    cookie.setMaxAge(24*3600) ;
    //向客户端增加Cookie对象
    response.addCookie(cookie) ;
    %>
    </body>
    </html>

      访问客户端Cookie使用request对象,request对象使用了getCookie()方法,该方法将返回客户端机器上所有Cookie组成数组,

    遍历该数组的每一个元素,找到希望可以访问的Cookie即可。

    session对象:

      session是javax.servlet.http.HttpSession 的实例 , 该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端

    关闭浏览器时,会话结束。

      session通常用于跟踪用户的会话信息,session范围内的属性可以在多个页面的跳转之间共存。

      >setAttribute(String attName , Object attValue) :设置session 范围内attName属性的值为attValue 。

      >getAttribute(String attName):返回session范围内attName属性的值。

        

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>商品列表</title>
    </head>
    <body>
    <!-- 建立一个表,列举出商品 -->
    <form method = "post" action="processBuy.jsp">
    书籍:<input type = "checkbox" name = "item" value = "book" /><br>
    电脑:<input type = "checkbox" name = "item" value = "compute"/><br>
    <input type = "submit" value = "buy" >
    </form>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import = "java.util.*" %>
    <%
    //取出session范围的ItemMap属性
    Map<String , Integer> itemMap = (Map<String , Integer>)session.getAttribute("itemMap");
    //如果Map对象为空,则初始化Map对象
    if(itemMap == null)
    {
    itemMap = new HashMap<String , Integer>() ;
    itemMap.put("书籍", 0) ;
    itemMap.put("电脑", 0) ;
    }

    //获取上一个页面的请求参数
    String[] buys = request.getParameterValues("item") ;
    //遍历数组的各元素
    for(String item : buys)
    {
    if(item.equals("book"))
    {
    int num = itemMap.get("书籍").intValue() ;
    itemMap.put("书籍", num + 1) ;
    }
    else if(item.equals("compute"))
    {
    int num = itemMap.get("电脑").intValue() ;
    itemMap.put("电脑", num + 1) ;
    }
    }
    //将itemMap对象放到设置成session范围的itemMap属性
    session.setAttribute("itemMap", itemMap) ;
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>购物车</title>
    </head>
    <body>
    您购买的商品:<br>
    书籍:<%=itemMap.get("书籍") %>本<br>
    电脑:<%=itemMap.get("电脑") %>台<br>
    <p><a href = "shop.jsp">再次购买</a></p>
    </body>
    </html>
  • 相关阅读:
    ie下常见的css兼容问题
    jQuery Easing 使用方法及其图解
    数组中常用的15个方法
    js按位运算符及其妙用
    图片格式知多少
    Linux top命令的用法详解
    Another app is currently holding the yum lock; waiting for it to exit...
    ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this S tatem
    Gitlab与Jenkins结合构成持续集成(CI)环境
    cobbler无人值守安装
  • 原文地址:https://www.cnblogs.com/wlming/p/5465971.html
Copyright © 2011-2022 走看看