深入了解JSP技术
jsp指令
jsp指令用来声明jsp页面的一些属性等,比如编码,文档类型,导入java包等。
jsp指令以符号<%@开始,以符号%>结束,jsp中最常见的指令就是:
<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
这个page指令有三个常用属性language='java"表示脚本语言是java,import标签用于导入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.jsp和footer.jsp的源代码添加到了当前页面。
jsp内置对象
jsp有九大内置对象:out,request,response,config,session,application,page,pageContext,exception
out:输出流对象
request:请求对象,代表客户的请求
response:响应对象,可以给用户响应一些信息
session:会话对象,可以长时间保持服务器和客户的状态
page:表示当前jsp的对象(jsp也可以看成一个特殊的Servlet类)
pageContext:代表当前jsp编译后的内容(可以得到其他八种内置对象)
三,两种跳转方式:redirect和forward
redirect:请求重定向,API:response.sendRedirect("index.jsp");这种跳转方式就和直接在浏览器上输入url差不多,
浏览器地址栏会变成目标url,可以看成一个自动执行的a标签;使用sendRedirect跳转时,会截断先前请求,开始新的请求;
不仅可以定向到当前web程序内的url,还可以定向到当前web程序外的其他url,比如 response.sendRedirect("http://www.baidu.com");
forward:请求转发,API:request.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.jsp,jsp中的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>
这里的单位是:分钟。
注销功能我们有两种实现办法:
1,session.invalidate(),此方法直接让当前session失效,session中存储过的所有值全部失效不可用。
2,session.removeAttribute("属性名");此方法可以删除指定名称的属性,比如之前登录时存储过的 loginUser。
应用程序作用域(application):存储在此作用域的数据可以在整个web程序内都有效
在jsp中,可以直接使用applicationapplication.setAttribute("message","studyhard");
在servlet中,可以使用ServletContext的setAttribute方法来存储数据。