原来准备简单点,用一篇文章介绍完JSP的,没想到细节很多。这是第三篇也是最后一篇,这三篇文章介绍了基本的JSP知识,很多名词概念和用法,一定要在实践项目中使用之后才会有更加亲切的体会。第三篇接着上篇介绍的JSP内置对象。

     上篇我们说过,在我们的响应用户请求的方法_jspservice()方法的头部,定义和初始化了一些局部变量。他们其实就是我们现在说的jsp内置对象,通过这些对象所封装的方法,我们可以完成一些关于数据共享,数据传输,浏览器响应等操作。

     第一个内置对象是,application。熟悉.net的朋友可能知道,在.net中,可以使用session,cookies来实现多个不同页面之间数据的共享,在我们JSP 中上述有着更加完善的共享数据机制,上述的session和cookies只是其中的一部分。所有被application设置访问范围的数据在整个web应用中都是可见的,无论你是jsp页面还是servlet页面,只要是位于当前的web应用中的页面都是可以访问该数据的。这叫全局可见性,是所有共享数据中范围最大的。具体的使用方法如下:

<html>
<head>
<title>1</title>
</head>
<body>
<h1>index.jsp</h1>
<%application.setAttribute("name","张三");%>
</body>
</html> <html>
<head>
<title>2</title>
</head>
<body>
<h1>convert.jsp</h1>
<%=application.getAttribute("name")%>
</body>
</html>

     访问过index页面之后访问convert页面,可以看到我们在index页面设置的全局性变量,在另外的页面是可以访问的到的。这种是将数据设置在整个web应用下的,所以在可以放在更低范围内的情况下(后文会介绍在更小的范围设置共享数据),尽量还是不要设置在全局下,因为这样很有可能在不经意之间被修改了值产生数据不一致性。

     application对象的第二个作用是可以读取web.xml中的配置信息,这是一种可能会经常使用到的操作。因为我们的数据库用户名和密码等参数的配置一般都是配置在web.xml中的,当我们在程序中需要用到的时候,就可以考虑这种操作来读取配置信息。

/首先在web.xml文件中配置一下信息/

<html>
<head>
<title>1</title>
</head>
<body>
<h1>index.jsp</h1>
<%=application.getInitParameter("a")%>
</body>
</html>

     通过上述操作,我们成功的访问了配置信息内容,web.xml中< context-param>标签中的就是类似于键值对的作用,子标签配置的是name和value和我们的param动作指令的传参是类似的,之后便可以同过方法getInitParameter("name")来获取对应的value的值。

     第二个内置对象,pageContext。这是一个非常大佬的对象,他可以获取其他的内置对象。

ServletReques getRequest();  //获取Request对象
ServletResponse getResponse(); //获取Response对象
SerletConfig getServletConfig();//获取config对象
ServletContext getServletContext();//获取application对象
HttpSession getSession(); //获取session对象

     以上的有些对象我们说了,有些对象会在后文中说明,有些暂时不会介绍,原因是他们不是很常用。

     pageContext对象的主要作用还是对共享数据的范围设定。

pageContext.setAttribute("name","li",pageContext.PAGE_SCOPE); //设置变量位于当前page范围内可见

pageContext.setAttribute("name","li",pageContext.REQUEST_SCOPE); //设置变量位于本次请求中可见

pageContext.setAttribute("name","li",pageContext.SESSION_SCOPE); //设置变量位于当前会话范围内可见(就是浏览器关了就没了)

pageContext.setAttribute("name","li",pageContext.APPLICATION_SCOPE); //设置变量位于当前Web应用范围内可见

当然,对应的获取方法是:pageContext.getAttribute("name")。

第三个内置对象是,request对象。这个对象封装了用户的某次请求的所有内容,有浏览器自动生成的请求头,还有用户提交的请求参数。请求头对于我们来说暂时可能没怎么使用到,但是请求参数还是需要好好的研习一下的。下面提供了几个获取请求参数的方法:

String getParameter(String paramName)  //获取指定name的参数值

Map getParameterMap()  //获取所有请求参数名和请求参数值,以键值对的形式返回

Enumeration getParameterNames()  //获取所有请求参数名构成的Enumeration集合

String[] getParameterValues(String name) //获取指定name的所有参数值,可能一个参数name对应了多个参数值
<html>
<head>
<title>1</title>
</head>
<body>
<h1>提交表单</h1>
<form method="get" action="index.jsp">
<input type="text" name="name" />
<input type="text" name="age" />
<input type="submit" value="提交" />
</form>
</body>
</html> <html>
<head>
<title>1</title>
</head>
<body>
<h1>index.jsp</h1>
<%=request.getParameter("name")%>
<%=request.getParameter("age")%>
</body>
</html>

     相信大家已经知道结果了,我们知道浏览器的请求方法是有两种的,Get和Post请求,两种请求方式的优劣相信大家都知道,此处不再啰嗦。虽然是两种请求方式,但是我们在获取请求参数的数值的时候是一样的方法,不要做另外的改变。以上至演示了一种形式,其他形式获取参数的情况大家可以自行测试。

     request对象还有一个操作也是经常会做的,官方说法,操作request范围的属性。其实就是将某个变量放到request请求参数中,在接受页面出可以接受该参数。

<html>
<head>
<title>1</title>
</head>
<body>
<h1>index.jsp</h1>
<%request.setAttribute("abc","hello");%> //实现转发
<jsp:forward page="convert.jsp" />
</body>
</html> <html>
<head>
<title>2</title>
</head>
<body>
<h1>convert.jsp</h1>
<%=request.getAttribute("abc")%>
</body>
</html>

     我们可以简单的理解为,这个操作就是将指定的参数添加到请求本页面的这个request对象中,一旦此页面实现跳转,必然可以携带者这个参数转发到另外的页面中。

     最后,我们说说这个response内置对象。刚才我们介绍的request是处理用户请求的,主要是接受用户传入的请求参数,或者解析请求头信息等。而正真决定怎么响应我们用户的是response对象。

     首先我们看看第一个作用,response的getOutputStream()方法,这个方法返回响应输出字节流,一个OutputStream对象。我们在介绍流那块知识的时候说过,每个流都会绑定一个文件,这个文件可以是字节数组,或者磁盘上的实际文件,因为这些操作最终都会流到实际的文件中。(不可能是一个抽象不存在的文件,那我们的一切操作岂不是操作空气,又没有改变什么),此处可以将getOutputStream方法理解为绑定了当前请求的浏览器,也就是我们队流进行写入会写到浏览器中。看个例子:

<html>
<head>
<title>1</title>
</head>
<body>
<h1>index.jsp</h1>
<%
response.setHeader("content-type", "text/html;charset=UTF-8");
OutputStream outputStream = response.getOutputStream();
String str = "hello world";
byte[] buffer = str.getBytes();
outputStream.write(buffer);
%>
</body>
</html>

     结果显而易见,但是不要忘记引入Java.io.* 这个包,否则会报错,不能识别OutputStream。

     第二个用法,页面重定向。使用的是方法,response.sendRedirect(String path)。这个页面重定向和之前的forward动作指令是不一样的,之前的forward指令不会丢弃当前request的请求参数,而这也页面重定向会丢弃所有的请求参数,重新开一个request,并且地址栏的地址也是会随之改变的。具体代码很简单,不演示了,要不然就写不完了。

     最后一个response对象的操作是,增加cookies,我们知道cookies是保存在用户本机电脑上的,对服务器带宽没什么影响,但是会有不安全隐患,如果被用户删了怎么办?但是我们还是会经常的使用它的,现在我们看看怎么使用这个cookies。

<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.io.*,javax.servlet.http.Cookie"  %>
<html>
<head>
<title>1</title>
</head>
<body>
<h1>index.jsp</h1>
<%
Cookie c = new Cookie("name","zhangsan");
c.setMaxAge(3600);
response.addCookie(c);
%> <%
Cookie[] cookies = request.getCookies();
for(Cookie a : cookies){ if(a.getName().equals("name")){
out.println(a.getValue());
}
} %>
</body>
</html>

     设置cookie只需要三个步骤,在上述代码中已经得到体现,第一步,创建cookie对象,没引入cookie包的会报错的,第二步,设置cookie的声明周期,也就是什么时候过期失效,单位毫秒,第三部使用response.addCookie()方法设置cookie。

     cookie的读出,我觉的是设计的不合理的地方,它竟然需要将所有的cookie全部读取出来,然后需要遍历找到我们需要的cookie。当然可能.net中的底层也是这么实现的,但是人家提供的接口就很简洁,根据名称就可以直接找到值。

     至此,JSP的基本知识就介绍完了,其实还是不全面,但是我会在继续学习中进行补充的。如果文章哪里有错误,欢迎大家指出来。

Java EE基础之JSP(三)的更多相关文章

  1. Java EE基础之JSP

    从本篇文章开始,我会用文章记录下我在学习Java EE过程中的一些笔记和感悟,至于还没有更新结束的Java SE还是会继续写的,只是我觉得一直写语法很枯燥,自己也没法继续下去,所以带着点web学习,会 ...

  2. Java EE基础之JSP(二)

    接着上篇文章,我们上篇文章讲到了jsp的基本原理以及和servlet的关系,还介绍了jsp的基本语法部分,本篇文章就继续介绍余下的内容. 编译指令Page和include 基本的动作指令 内置对象 一 ...

  3. 学习java之基础语法(三)

    学习java之基础语法(三) java运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运 ...

  4. Java Web基础:JSP基础概念

    JSP介绍 JSP全称是Java Server Pages,它和Servlet都是Sun公司定义的用于开发动态Web资源的技术,它解决了Servlet输出流排版复杂和难以维护的问题.JSP完美融合了H ...

  5. Eclipse Java EE IDE中jsp页面编码修改

    Eclipse Java EE IDE模板编码是ISO8859,肯定不是我们需要的,修改方法如下图: 依次点击:Window---->Preference---->Web---->J ...

  6. 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇

    本文是Java IO总结系列篇的第3篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  7. java面试基础题(三)

    程序员面试之九阴真经 谈谈final, finally, finalize的区别: final:::修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此 ...

  8. java面试基础篇(三)

    1.Q:ArrayList 和 LinkedList 有什么区别? A:ArrayList查询快!LinkedList增删快.ArrayList是基于索引的数据接口,它的底层是数组.空间占用相对小一些 ...

  9. 【视频+图文】Java经典基础练习题(三):输入3个整数,并将其由小到大输出

    目录 一.视频讲解 二.思路分析 总结: 三.代码+详解+结果 四.彩蛋 能解决题目的代码并不是一次就可以写好的 我们需要根据我们的思路写出后通过debug模式找到不足再进行更改 多次测试后才可得到能 ...

随机推荐

  1. 学习ui-router

    ui-router的学习 在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的.Angular原始的路由机制靠ngRoute提供,通过hash和history来实现的,可以检测浏览器是否支 ...

  2. python - bilibili(二)出错的解决办法

    在获取房间号之前我们先解决上篇文章遗留的bug,即输入的房间号不是数字和对应的房间号不存在而产生的问题. 输入的房间号不是数字: 在python中,你所输入的必定是字符串,虽然你输入的是数字,但是类型 ...

  3. iptables 完成联网控制 (续) ,独立native进程监听。

    上一篇:http://www.cnblogs.com/oscar1011/p/5243877.html 之前做的iptables 来进行的联网控制,一直耿耿于怀,想要知道系统里的netd等等是如何做到 ...

  4. 在Express的页面模板中的变量的定义与使用总结

    前言 最近在使用Express框架中的ejs页面模板趟了些许坑,仅以本文记录总结. 本文简述的均为ejs页面模板. 创建ejs变量的各种方法 1. 在Nodejs定义的ejs变量 ejs由是在node ...

  5. [2017.02.21] 《Haskell趣学指南 —— Learning You a Haskell for Great Good!》

    {- 2017.02.21 <Haskell趣学指南 -- Learning You a Haskell for Great Good!> [官网](http://learnyouahas ...

  6. TCP详解

    1. 数据进入协议栈的封装过程 2. TCP连接的三次握手 3. TCP连接的三次握手和关闭时的四次握手 各个状态的意义如下: LISTEN - 侦听来自远方TCP端口的连接请求: SYN-SENT ...

  7. loadrunner测试结果分析

    LR性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源 ...

  8. linux 下 zookeeper安装

    1.安装zookeeper-3.4.6cd /usr/soft#解压zookeeper 安装包tar -zvxf zookeeper-3.4.6#拷贝安装包到安装目录cp zookeeper-3.4. ...

  9. 每天一个Linux命令(04)--mkdir命令

    Linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项]目录 2.命令功能: ...

  10. js substr和substring的区别

    在js中substring和substr都是用来截取字符串的,substr函数和substring函数都是用来从某个“母字符串”中提取“子字符串”的函数.但用法有些差别,下面分别介绍但是它们还是有区别 ...