学习笔记-轻量级Java EE:jsp的指令、动作、内置对象

时间:2020-12-24 21:04:28

1.三个编译指令:page,include,taglib

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

<1>静态编译指令 include

     将被包含的页面嵌入到页面中,融合成一个页面;会将其所包含的所有其他编译指令都包含进来,而动态的include则不会.

2.动作指令

  <1> forward, 转发不会丢失参数,即不仅仅传递了下方param所带参数,自身参数也会传递到新指定页面,其地址栏不变

<jsp:forward page="forward-result.jsp">
<jsp:param name="age" value="29"/>
</jsp:forward>
  <2>include,亦称之为动态导入

         与静态include的区别在于:

         【1】静态导入是将被导入页面的代码完全融入,整合成一个完整的servlet,而动态则在servlet中使用include方法引入被导入页面的内容;在这一点上,可以说,如果被导入的页面常常改变,则应使用动态导入;

         【2】静态导入时被导入页面的编译指令会起作用,而动态导入时被导入页面的编译指令会失去作用,仅仅导入body部分;

         【3】动态还可以增加额外的参数。

3.内置对象

   <1>application, javax.servlet.ServletContext的实例,该实例代表JSP所属的Web应用本身

    因此对应用下的每个jsp页面或servlet都可以访问该对象;

    一般用于页面之间或页面与servlet之间的数据共享;和整个应用的一些配置参数,在web.xml文件中配置

<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
    可使用application.getInitParameter()获得。

   <2>config,代表当前jsp页面的配置信息,在配置servlet信息时配置,一般比较少用

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

            只有当page编译指令中指定了isErrorPage属性被设为true,才能访问exception对象,否则将没有提供其对象。

   <4>out对,代表一个页面输出流,但在jsp中,能使用此对象的地方,都可用输出表达式来代替,更简洁。

  <5>pageContext对象

       代表页面上下文,该对象主要用于访问jsp之间的共享数据,使用pageContext可以访问page、request、session、application范围的变量。pageContext是PageContext类的实例;

  <6>request对象,HttpServletRequest接口的实例

        Web应用是请求/响应架构的应用,一般浏览器发送请求时会附带一些请求头,还可能包含一些请求参数,服务器负责解析请求头/请求参数的任务是有jsp或servlet来接受,而取得请求参数的途径就是request;

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

           对于开发人员来说,请求头和请求参数都是由用户发送到服务器的数据,区别在于请求头通常由浏览器自动添加,因此一次请求总是包含多个请求头;而请求参数则通常需要开发人员控制添加,让客户端发送请求参数一般分为俩种:

           【1】GET方式的请求:在浏览器地址栏直接输入访问地址的请求或提交表单时,该表单对应的form元素没有设置method属性或设置其属性为get,请求都是get方式。get的请求方式会将请求参数的名和值转换成字符串(url?param1=value1&param2=value2,若请求里有非西欧字符,则需要使用URLDecoder解码,例如中文),并附加在URL之后,因此在浏览器地址栏能看到,且get请求传送的数据量较小,一般不能超过2k。另外,一般用于不会对服务器端造成数据修改时,才能使用该方式

           【2】POST方式的请求:通常使用提交表单(由form HTML元素表示)的方式来发送,其需要设置form元素的method属性为post。Post方式传输的数据量较大,通常认为请求参数的大小不受限制,取决于服务器。其请求参数以及对应的值放在HTML HEADER中传输,不能在地址栏看到,安全性相对较高。一般采用此方式。

            request还有一个功能就是执行forward和include,代替jsp所提供的forward和include动作指令,例如

getRequestDispatcher("/a.jsp").include(request , response);
该语句可将a.jsp页面include到本页面中;

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

该语句则将请求forward到a.jsp页面;其中path路径必须要以"/"开头。

   <7>response,服务器对客户端的响应

          大部分时候,程序无需使用response来响应请求,一般使用out,但是out是字符流(JSPWriter的实例),所以无法输出非字符内容。假如需要在jsp页面中动态生成一副位图或者pdf文档,此时必须使用response作为响应输出。

          重定向是response的另外一个用处,与forward不同的是,重定向会丢失所有的请求参数和request范围的属性,因为重定向将生成第二次请求,意味这不在一个request范围内,所以发送一次请求的请求参数和request范围的属性全部丢失。地址栏也会变为指定的路径.

response.sendRedirect("redirect-result.jsp");
          增加cookie,通常用于网站记录客户的某些信息,存放在客户端机器上,只要没有超出其生命周期或被客户端清除,就将一直存在(前提是客户端浏览器允许或支持cookie),下面是添加一个cookie:

//获取请求参数
String name = request.getParameter("name");
//以获取到的请求参数为值,创建一个Cookie对象
Cookie c = new Cookie("username" , name);
//设置Cookie对象的生存期限,如果不设置,将会随浏览器的关闭而自动消失
c.setMaxAge(24 * 3600);
//向客户端增加Cookie对象
response.addCookie(c);
下面是获得已存在的cookie,如果想从其中找到某个cookie,如下:

//获取本站在客户端上保留的所有Cookie
Cookie[] cookies = request.getCookies();
//遍历客户端上的每个Cookie
for (Cookie c : cookies)
{
//如果Cookie的名为username,表明该Cookie是我们需要访问的Cookie
if(c.getName().equals("username"))
{
out.println(c.getValue());
}
}

   <8>session

           代表了一次用户回话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止;通常用于跟踪用户的回话信息,如判断用户是否登录等;

           通常使用应该只把与用户会话状态相关的信息放入session范围内;

           另注:session中的消息保存在服务器上,即要求session中的属性值是必须可序列化的,否则将引发不可序列化异常。