深入了解JSP技术

jsp指令

jsp指令用来声明jsp页面的一些属性等,比如编码,文档类型,导入java包等。

jsp指令以符号<%@开始,以符号%>结束,jsp中最常见的指令就是:

<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>

这个page指令有三个常用属性language='java"表示脚本语言是javaimport标签用于导入java包,此处导入了java.util.*下的所有类,pageEncoding限定了字符编码,常用字符编码有utf-8,gb2312,gbk,iso8859-1

有时候我们需要导入多个包或类,可以在import中用逗号分隔:

<%@page language="java" import="java.util.*,java.io.*"pageEncoding="UTF-8"%>

也可以每个page指令导入一个:

<%@page import="java.sql.Connection" %>

<%@ pageimport="java.sql.PreparedStatement" %>

<%@ pageimport="java.sql.ResultSet" %>

<%@ pageimport="db.DBOperator" %>

最常见的jsp指令还有include,taglib等。

include指令可以使当前页面包含本应用程序内的另外一个jsp或者html页面。

比如有时候网站需要相同风格的头部和尾部,甚至是左右两边的广告位,按照以往,我们需要编写很多重复代码,

假设某天需求变化了,需要更改某个头部的风格,那么每个页面都需要修改,往往这种工作量也是不可想象的。

此时我们可以把头部或尾部的效果独立成一个页面,然后使用include指令来包含这些公共页面,以后即使要修改,

也只需要在公共页面修改。

 <%@include file="head.jsp" %>

  <br/>  

我是中间内容

  <br/>    

 <%@include file="footer.jsp" %>

 file属性指定引用的文件路径,注意:通过这种方式引用jsp的时候,其实是把head.jspfooter.jsp的源代码添加到了当前页面。

jsp内置对象

   jsp有九大内置对象:out,request,response,config,session,application,page,pageContext,exception

   out:输出流对象

   request:请求对象,代表客户的请求

   response:响应对象,可以给用户响应一些信息

   session:会话对象,可以长时间保持服务器和客户的状态

   page:表示当前jsp的对象(jsp也可以看成一个特殊的Servlet类)

 pageContext:代表当前jsp编译后的内容(可以得到其他八种内置对象)

三,两种跳转方式:redirectforward

   redirect:请求重定向,APIresponse.sendRedirect("index.jsp");这种跳转方式就和直接在浏览器上输入url差不多,

浏览器地址栏会变成目标url,可以看成一个自动执行的a标签;使用sendRedirect跳转时,会截断先前请求,开始新的请求;

不仅可以定向到当前web程序内的url,还可以定向到当前web程序外的其他url,比如 response.sendRedirect("http://www.baidu.com");

   forward:请求转发,APIrequest.getRequestDispatcher("index3.jsp").forward(request,response);这种跳转方式,相当于把对前面那次url  

的请求转发到下一个url,前后会共用同一个请求内的资源,浏览器地址栏上还是会显示之前的url。使用forward只能定向到当前web程序内的url

JavaWeb作用域(scope

作用域简单来讲就是数据的范围,javaweb包含四个作用域,

  page域:处于page作用域的数据只能在当前页面使用

把一个数据(或对象)存入page作用域的API是: pageContext.setAttribute("uname","王五");        

得到page作用域中某个数据的API是:pageContext.getAttribute("uname");

   getAttribute()方法返回的是Object对象,接收的时候可以根据传入的数据的类型来确定强制转换的类型,

比如此处,我们可以使用String类来强制转换:

Stringuname=(String)pageContext.getAttribute("uname");

请求域(request):处在请求域中的数据在请求的生命周期中都有效。请求的生命周期包含本页资源和请求转发后访问的资源。

把一个数据(或对象)存入请求域的API是:request.setAttribute("company","甲骨文");

一旦把数据存入存入请求域,那么就可以在当前页面和请求转发后的页面得到这个数据。

我们可以新建一个jsp,取名index2.jspjsp中的html元素我们暂时忽略:

        <%

          Stringpath = request.getContextPath();

          request.setAttribute("company","甲骨文");

request.getRequestDispatcher("index3.jsp").forward(request,response);

        %>

然后新建index3.jsp,脚本如下:

        <%

Stringmycompany=(String)request.getAttribute("company");

         %>

  <%=mycompany%>

当我们访问index2.jsp时,会把请求转发到index3.jsp,我们会看到网页上输出了甲骨文”.

会话作用域(session):用户和服务器的一次连接其实就是一次会话(session),但是会话(session)更多的是描述用户跟服务器某一段

时间长久保持连接的状态。最常见的场景是:当用户去访问需要登录的页面时,假如用户没有登录过,那么

必须输入账号和密码进行登录,登录后就可以直接访问任何其他需要登录的页面。那么这个登录状态是怎么保持的呢?就是session

登录验证通过后,我们一般会通过session.setAttribute("user",loginUser)的方式把登录用户的pojo对象存入session

域;然后在其他需要登录的页面把session中的“user”值拿出来验证是否为空(null),假如为空,说明没有登录,或者登录失效。假如不为空,说明之前登录过,不再需要登录。

session的超时时间可以通过web.xml中的session-config元素来设定:

                   <session-config>

               <session-timeout>60</session-timeout>

                  </session-config>

这里的单位是:分钟。

注销功能我们有两种实现办法:

1session.invalidate(),此方法直接让当前session失效,session中存储过的所有值全部失效不可用。

2session.removeAttribute("属性名");此方法可以删除指定名称的属性,比如之前登录时存储过的 loginUser

应用程序作用域(application):存储在此作用域的数据可以在整个web程序内都有效

jsp中,可以直接使用applicationapplication.setAttribute("message","studyhard");  

servlet中,可以使用ServletContextsetAttribute方法来存储数据。