request 信息

登录 注册 常见问题
6 JSP Web程序设计第六章本章目录 ??6.1 JSP简介 ??6.2 JSP指令 ??6.3 JSP脚本程序 ??6.4 JSP动作 ??6.5 JSP内置对象 ??6.6 JSP开发实例 ??6.7 本章小结 Web程序设计第六章引例 JSP(Java Server Pages)是一种动态网页技术,该技术为创建显示动态生成内容的Web页面提供了一种简捷而快速的方法。图6-1 JSP被服务器处理后返回的页面虽然返回到每个用户的浏览器中的注册信息都是不同的,但是其实这些 HTML页面都是由服务器执行同一个JSP产生的结果。 Web程序设计第六章 6.1 JSP简介 JSP也是J2EE组件技术之一,从Web应用的开发架构来看,JSP属于MVC(Model -View-Controller)架构中的视图层( View)组件,有两个主要功能:一是将用户表单的输入数据和请求传递给控制器层和模型层组件,另一个则是接受模型层处理完的数据显示给用户。 Web程序设计第六章 JSP的工作原理 JSP基本的工作原理与Serlvet相似,但是在细节上JSP则较为复杂。在JSP第一次被用户请求时, JSP文件将被容器的JSP引擎转换成为一个类似 Servlet的Java代码。如果转换成功了,则所转换生成的Servlet代码继续被编译生成二进制字节码文件(Class文件)。下面以MyEclipse中一个Web Project的默认页面index.jsp为例(如图6-2所示),来看看 index.jsp是怎么运行的。 Web程序设计第六章将该项目部署到 Tomcat的webapps 目录下,做如下测试图6-2 MyEclipse中的Web Project 1.在浏览器中输入 http://localhost:8080/jsptest1/index.jsp,并按回车发送请求,等待一段较长的时间后,浏览器中输出了 “This is my JSP page.”。 2.关闭浏览器再此访问。 Web程序设计第六章 JSP的工作原理在以上两个测试过程中,可以明显体验到第一次访问index.jsp的速度比后来访问的速度慢。我们来分析一下在刚才的过程中Tomcat究竟做了什么处理。打开Tomcat的work/Catalina/localhost目录,如图6-3所示。 Web程序设计第六章 JSP的工作原理整个JSP的工作原理如图6-5所示。图6-5 JSP的工作原理 Web程序设计第六章 JSP的特点 JSP与静态网页HTML以及客户端动态脚本JavaScript之间的区别与联系: 1.客户端动态网页和服务器端动态网页都是以基本的 HTML为基础,在HTML中分别嵌入JavaScript和JSP代码而构成的动态网页。 Web程序设计第六章 JSP的特点 2. HTML代码的解析由客户端浏览器完成,由浏览器显示其页面效果;客户端动态网页程序也是由浏览器执行,处理各种用户行为与浏览器、页面对象之间的交互事件;而服务器端动态网页则是由应用服务器执行,执行完后将处理的结果以HTML的形式返回给客户端浏览器。 Web程序设计第六章 3. HTML和JavaScript代码的执行是直接被浏览器解析执行,没有任何中间代码产生;而JSP页面则需要先被编译成为Servlet程序,并进一步被编译生成二进制字节码文件,最终被服务器的Java虚拟机所执行。 4. HTML和客户端动态网页的源代码都可以在客户端被查看,而由于服务器端动态网页的执行在服务器端,因此客户端得到的结果中并不包含原始的服务器端动态代码,所以服务器端动态网页的源代码是比较安全的,只有在服务器端才能被查看。 Web程序设计第六章 6.2 JSP指令 JSP指令主要用来提供整个JSP网页相关的信息,并且用来设定JSP页面的相关属性。 JSP 指令的一般语法形式为: 常用指令: page include Web程序设计第六章 page 指令 page指令定义JSP文件中的全局属性。它的作用范围是整个JSP页面。 page指令具有以下常用属性:(1)language:该属性用于指定当前JSP页面将使用的语言。例如: (2)import:该属性用于指定当前页面需要导入的包或类,与Java程序中的import语句类似。如果需要导入多个包或类,则用逗号隔开。例如: Web程序设计第六章(3)contentType:该属性用于指定向客户端输出内容的类型。例如: (4)errorPage:该属性用于指定一个JSP作为专门的错误处理页来处理当前页面所有抛出的未被处理的意外错误。例如: (5)isErrorPage:该属性用于指定当前页面是否可以处理来自其它页面的错误,缺省为“false”。例如: Web程序设计第六章 include 指令 include指令的作用是包含另一个文件,其语法相当简单: 图6-6 index.jsp的页面结构 图6-7 product.jsp的页面结构以下分别是index.jsp和product.jsp的页面结构图,如图 6-6和图6-7所示: Web程序设计第六章在index.jsp和product.jsp中均包含top.jsp、 left.jsp和bottom.jsp,仅仅网页主体部分包含的JSP文件不同,分别是indexContent.jsp和 productContent.jsp。采用JSP的include指令来创建复合式页面,可以提高代码的重用性。index.jsp和 product.jsp中包含3部分相同的内容,可以把这些内容放在单独的JSP页面中。index.jsp 和product.jsp只需通过include指令把这几个 JSP包含进来即可。 Web程序设计第六章 JSP中主要的程序就是脚本程序,其中包括三个部分:JSP声明(Declaration)、JSP表达式Expression)和JSP代码段(Scriptlet)。从功能上讲,JSP声明用于声明一个或多个变量,JSP表达式是一个完整的语言表达式,而 JSP代码段则是一些Java程序片断。三种脚本程序的基本语法都是以“” 结尾的。 Web程序设计第六章 JSP 声明 JSP声明是在当前页面范围内声明合法的变量或方法,这些变量或方法也仅在当前页面中有效。语法如下: 或者 以上是两种声明变量或方法的方式,区别在于是否在前面加“!”进行声明 Web程序设计第六章举例如下: 假设我们把以上的JSP声明嵌入到index.jsp中,然后打开浏览器访问index.jsp,最后打开 Tomcat的work/Catalina/localhost目录下的 index_jsp.java,我们可以看到,当前变量i已经成为这个Servlet类的成员变量,而变量j则出现在_jspService方法中。 Web程序设计第六章我们可以分析得出:加“!”声明的变量其实就是该JSP生成的Servlet类的成员变量,属于全局变量,它的作用域是整个Servlet对象,只要Servlet对象在Tomcat容器中产生后,该变量就随着Servlet对象的存在而存在,直到Servlet对象被容器所释放;而不加“!” 声明的变量则是该JSP生成的Servlet类中 _jspService方法的局部变量,它的作用域仅仅是_jspService方法体,这个方法一旦被调用结束,该变量的生命周期也就结束了。 Web程序设计第六章 JSP 表达式 JSP表达式包含一个符合Java语法的表达式。语法如下: JSP表达式在运行后被自动转化为字符串,然后输出到这个表达示在JSP文件中所在的位置。 Web程序设计第六章假设我们把以上的JSP声明和JSP表达式嵌入到index.jsp的中,然后打开浏览器访问index.jsp,得到结果如下图所示: i的值为:
j的值为: 比如: Web程序设计第六章第一次访问: i的值为:0 j的值为:0 第二次访问: i的值为:1 j的值为:0 Web程序设计第六章 ?? 在首次访问index.jsp后,返回的结果i和j的值都为0,而第二次访问后,返回的结果i的值为 1,j的值仍然为0,这样的现象可以用前面介绍的JSP工作原理和JSP声明来解释。 ?? 由于i用“!”声明,j没有用“!”声明,因此,i为当前JSP编译生成的Servlet对象的全局变量,而j只是_jspService方法中的局部变量。当客户端第一次访问index.jsp时,Tomcat容器创建该JSP对应的Servlet的对象后,把i和j的值返回给客户端,再对i和j做后缀加法(++),i 和j的值都为1。 Web程序设计第六章由于i是该Servlet对象的成员变量,该 Servlet对象从创建以后就一直在容器中,因此i 的状态也随着Servlet对象的存在而延续;由于j 是_jspService方法中的局部变量,它的作用范围仅在该方法体内部,虽然首次执行后j的值通过后缀加已经变为1,但是该方法执行完后,j的生命周期也就结束了,因此当客户端第二次访问该对象的时候,_jspService方法重新被执行,而每次执行_jspService方法时,方法体内部的局部变量j都是重新声明的新变量,每次执行都是先输出“0”,然后做后缀加法。核心代码如下: Web程序设计第六章 Web程序设计第六章 JSP 代码段 JSP代码段的具体编写规范是:如果是 Java代码段,必须放置于之间;如果出现了HTML的标记或文字,必须把这些内容放置在之外。基于这样的规范,通常我们所写的JSP代码段将会是由Java 代码和HTML交叉混合的代码体。举例如下:在网页中嵌入Java代码,这些嵌入后的代码就称为JSP代码段,又叫做“scriptlet”。 Web程序设计第六章 She is a girl. He is a boy. 以上代码等价于该JSP编译生成的Servlet中的如下代码: Web程序设计第六章 _jspService(HttpServletRequest request, HttpServletResponse response) java.io.IOException, ServletException { …… String gender="female"; if(gender.equals("female")){ out.write(" /r/n"); out.write(" She is a girl. /r/n"); }else{ out.write(" /r/n"); out.write("/t He is a boy. /r/n"); } …… } } Web程序设计第六章小提示: JSP表达式的末尾是没有分号的,这点和本节中的JSP声明、JSP代码不同,在 JSP声明和JSP代码中,每个声明或每行代码的结尾都要使用分号结尾,否则当前JSP被编译时就会报语法错误。 Web程序设计第六章 JSP 动作 JSP动作利用形如XML格式的标签来控制JSP引擎的行为,利用JSP动作可以实现动态包含网页文件、请求转发等功能。语法如下: JSP动作以也可以叫做JSP标签,JSP标签以 “jsp”为前缀。在JSP页面被编译为Servlet文件期间,当容器遇到这个标记时,就用相应的Java代码来代替它。 Web程序设计第六章 include 动作 标签表示包含一个静态的或者动态的网页文件。语法如下: 前面JSP指令中,我们已经介绍过include指令,它是在JSP文件被转换成Servlet时引入包含文件,而这里的动作则不同,引入包含文件的时间是在页面被请求的时候, 动作的文件引入时间决定了它的效率要稍微差一点。 Web程序设计第六章 forward 动作 标签表示把当前流程控制转发到另一个网页文件。语法如下: 这个动作将结束对当前页面的处理,而开始处理由page 属性所指定的页面,整个转发过程中共用一个请求。 Web程序设计第六章例子:以get方式向forward1.jsp发送请求传入参数,再以 forward方式转发给forward2.jsp,由forward2.jsp取出参数。 forward1.jsp的代码如下: Web程序设计第六章 forward2.jsp的代码如下: Hello , 在地址栏中输入 “http://127.0.0.1:8080/forwardtest/forward1.jsp?user name=michael”,得到最后的结果如图6-10所示: Web程序设计第六章 Web程序设计第六章 6.5 JSP内置对象 JSP基于Java语言,面向对象也是它的一大特色。JSP中包含大量的内置对象,其中有6个常用的内置对象,这6个对象分别是: out request response session application page 这些对象不用声明就可以在JSP中直接使用。 Web程序设计第六章 out对象 out对象是javax.servlet.jsp.JspWriter的实例。 out对象一般只在JSP代码段内使用,它的主要功能是把HTML的内容输出到网页中。表6-1 out对象的方法 print 输出各种类型的数据,不换行 newLine 输出一个换行符号 println 输出各种类型的数据,输出完毕后,进行换行 close 关闭输出流,终止当前页面的剩余部分输出 Web程序设计第六章 out对象的使用示例:用out对象输出多种类型的数据。 Web程序设计第六章以上代码中分别用out对象的print方法和println方法输出字符串类型、double类型以及int类型的数据,访问得到的结果如图6-11所示:为什么调用了println方法并没有起到换行的效果? Web程序设计第六章在当前浏览器中点击右键菜单查看源文件,我们可以看到当前客户端得到的HTML的内容,如图6-12所示:原来println方法的换行指的是在HTML源文件中输出后的“换行”,而并不是页面被浏览器解析后呈现出来的“换行” Web程序设计第六章 request对象是 javax.servlet.http.HttpServletRequest的实例。当客户端请求一个JSP网页时,Tomcat服务器会将客户端的请求信息包装在这个request对象中,请求信息的内容包括参数名、参数值以及客户端的主机地址、名称、端口等,然后我们可以通过这个request对象来取得上述有关客户端的信息。 Web程序设计第六章表6-2 request对象的方法 getServerName 返回接收请求的服务器的主机名 getRemoteAddr 返回发送请求的接口程序的IP地址 getServerPort 返回接收请求的端口 getMethod 返回请求所使用的方法 getParameter 返回包含指定参数的单独值的字符串 getParameterValues 返回作为字符串列举的指定参数的值 setAttribute 设置请求中属性的值 getAttribute 返回请求中属性的值 getCookies 返回客户端的Cookie信息 Web程序设计第六章 1.用request对象来获取服务器和客户端的各种信息。 服务器的IP:
服务器的端口:
客户端IP地址:
请求方式:
Web程序设计第六章在地址栏中访问request1.jsp后得到的结果如图6-13所示 Web程序设计第六章 2.用request对象来获取表单提交的参数值。
动态网页有: ASP  ASP.NET  JSP  Web程序设计第六章 PHP  
你选择的有: Web程序设计第六章在地址栏中访问request2.jsp后得到的结果如图 6-14所示: Web程序设计第六章选择其中的“ASP”、“ASP.NET”和“JSP”后,点击“选择”,显示的结果是“你选择的有:ASP ASP.NET JSP”,如图6-15所示: Web程序设计第六章小提示:只有对于表单POST提交的参数才可以用 request.setCharacterEncoding("gb2312") 进行中文处理,其它情况只能用上一章中 所 介 绍 的 方 式 new String(tempStr.getBytes("iso-8859- 1"),"gb2312")。 Web程序设计第六章 3.用request对象获取客户端的Cookie信息。 Cookie是当用户浏览某网站时,网站服务器存储到客户机上的一个小文本信息,它可以记录用户的会话ID以及登录名、密码等信息,当用户再次来到该网站时,网站通过读取该用户的Cookie,便可以得知用户曾经访问该网站的相关信息 Cookie默认保存在客户机的内存里,如果设置了Cookie的过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器访问该网站,这些 Cookie仍然有效,直到超过设定的过期时间。 Web程序设计第六章 Java中,实现Cookie对象的类是javax.servlet.http.Cookie JSP内置对象request中有getCookies方法,返回的是Cookie 对象数组。此外,response对象有addCookie方法,可以将服务器端自定义的Cookie对象向客户机写入。 Web程序设计第六章首先用request.getCookies()取出用户本机所有访问该网站留下的Cookie信息,如果本次是第一次访问该网站,则 Cookie对象为空,显示的结果如图6-16所示: Web程序设计第六章看到以上结果后,其实服务器已经在客户端留下了Cookie信息,默认只有一个Cookie,即会话 Cookie。在J2EE中,会话Cookie针对某一次用户与服务器的会话而言,如果不设置Cookie过期时间,则表示这个Cookie的生命周期为会话期间,只要客户端关闭浏览器,结束本次与服务器的会话,Cookie就消失了。这种Cookie被称为会话 Cookie。当用户再次刷新cookie.jsp,此时 request.getCookies()取出的Cookie不再为空,而是用户上次访问该页面留下的会话Cookie,因此可以用循环的方式遍历Cookie数组 Web程序设计第六章会话Cookie对象的名称为JSESSIONID,值为服务器生成的具有唯一性的字符串。 Web程序设计第六章 response对象是javax.servlet.http.HttpServletResponse 的实例,Tomcat服务器会根据客户端的请求建立一个默认的response对象,它通常用于将服务器端的处理结果返回给客户端的浏览器或进行重定向等操作。表6-3 response对象常用方法 sendRedirect 重定向客户端的地址 addCookie 添加一个Cookie对象,用来保存客户端的用户信息 Web程序设计第六章用response对象实现页面重定向功能 response.jsp Web程序设计第六章这里的“response重定向”与前面所介绍的 “转发”是不是实现完全一样的功能?答案是否定的。重定向最大的一个特点就是:结束本次用户的请求,发送新的请求给下一个页面,因为此时的请求和用户最初的请求已经不属同一请求了。而转发是继续把当前的请求对象传递给转发后的页面,因此前后可以共用同一个请求对象。重定向后在地址栏里最终显示的也是重定向以后页面的URL,这也是它与转发的区别之一,转发后在地址栏里最终显示的是转发前页面的 URL。 Web程序设计第六章用response对象实现向客户端写入Cookie的功能
test getcookie! addcookie.jsp Web程序设计第六章访问的结果 Web程序设计第六章在testcookie.jsp中,取到的Cookie对象不为空,以取出 Cookie中的用户名,一旦取到则停止循环。 Web程序设计第六章在访问完addcookie.jsp后的120秒钟Cookie有效期内点击图6-18中指向testcookie.jsp的超链接后,得到的结果如图6-19所示:图6-19 在Cookie有效期内访问testcookie.jsp Web程序设计第六章关闭浏览器,再等待一段时间,等Cookie失效之后重新打开浏览器直接访问testcookie.jsp,此时得到的结果如图6-20所示: Web程序设计第六章 session对象是javax.servlet.http.HttpSession的实例。session对象指的是客户端与服务器的一次会话,从客户访问服务器的一个Web应用开始,直到客户端与服务器断开连接为止。session对象存在于服务器的内存中。通常会话管理是通过服务器将session ID作为一个cookie存储在用户的Web浏览器中来唯一标识每个用户会话,session ID的值是一个不会重复的字符串。 Web程序设计第六章客户端与服务器的交互过程中,这个session对象一直存在,直到客户端关闭所有与该网站相关的网页后,这个 session对象才被释放。表6-4 session对象常用方法 isNew 检查用户的会话对象是否是新创建的 getId 返回会话标识符,即session ID getMaxInactiveInte rval 返回会话对象所允许的最大的不活动持续时间 setMaxInactiveInte rval 设置会话对象所允许的最大的不活动持续时间 invalidate 使会话强制失效 setAttribute 设置会话中属性的值 getAttribute 返回会话中属性的值 Web程序设计第六章获取并设置session对象本身的各种信息。 是否是新一次的会话?
会话标识Sessionid:
本次会话的最大不活动持续时间 :秒 Web程序设计第六章访问session1.jsp得到的结果如图6-21所示: Web程序设计第六章客户端在首次访问后的10秒之内再次刷新session1.jsp,得到的结果如图6-22所示。 Web程序设计第六章如果在首次访问后的10秒之后再次刷新session1.jsp或者关闭浏览器重新访问session1.jsp,此时原先的session已经失效,得到的结果如图6-23所示。 Web程序设计第六章获取并设置session对象中的自定义属性。 用户名: 密码: Web程序设计第六章首次访问session2.jsp得到的结果如图6-24所示: Web程序设计第六章当session2.jsp中的setAttribute方法被执行后,我们再次刷新session2.jsp,得到的结果如图6-25所示。 Web程序设计第六章 application对象是javax.servlet.ServletContext的实例。一个Web项目只有一个application对象,它开始于服务器的启动,直到服务器的关闭。在此期间,application 对象一直存在于服务器内存中。application对象是所有用户共享的,可以存放公用的全局变量,与application 对象相比,session对象则是每个客户各自专有的,不同用户的session对象之间不可以共享和交互数据。表6-5 application对象的常用方法 setAttribute 设置某个application对象的某个属性值 getAttribute 以Object对象的形式返回对应名称的application 对象的属性值 Web程序设计第六章使用application对象实现网站计数器。 Web程序设计第六章打开浏览器首次访问该页面得到的结果如图6-26所示,不断的刷新该页面,计数值也会不断的增加。 Web程序设计第六章 page对象是java.lang.Object类型的,它是处理当前请求的JSP页的实现类的实例。page对象的常用方法也是setAttribute和getAttribute,使用方式与request、session以及application相似,只是所存储的属性其作用域仅仅是当前页面,一旦离开当前页面,page中的属性也就随着page 对象的结束而失效。 Web程序设计第六章 6.6 JSP开发实例在Java Web开发过程中,我们经常需要进行程序或页面间的转发。因为完成一个业务操作往往需要经历多个步骤,每一步骤完成处理后要转到下一个步骤。转发的方式主要有两种:(1)是使用请求转发器(RequestDispatcher)进行请求转发;(2)是使用HttpServletResponse的 sendRedirect方法,即响应重定向。 Web程序设计第六章 6.6.1 请求转发实例 RequestDispatcher是请求转发器,RequestDispatcher 接口中定义了forward方法,它可以将当前的request对象转发到该RequestDispacher指定的Web资源,可能是一个 Servlet或者JSP,然后由该资源文件继续处理请求并完成响应。 forward方法不能通过get方式将参数附带在要转发到的资源路径的后面,但我们可以通过 request.setAttribute("username",username)来储存参数并传至下一个资源文件,然后再通过 request.getAttribute("username")来获取参数值。跳转后,服务器自动以下一页来回应客户端的请求,但在浏览器中的地址栏中不会看到下一页的URL地址。 Web程序设计第六章实例简介下面通过具体实例对请求转发进行介绍。本例中有一个JSP注册页面,用户填写完注册 信息后提交给一个Servlet文件进行处理,Servlet 文件接收数据后将请求转发到另一个JSP文件,最后由这个JSP文件将用户的注册信息打印出来。具体步骤如下: Web程序设计第六章 1.在新建的项目中右键点击WebRoot文件夹,选择【新建】→【JSP】,新建一个名为 “reguser1.jsp”的JSP 页面。如图所示: Web程序设计第六章 reguser1.jsp的主要代码如下:以上JSP文件的内容是由HTML文件直接修改而来,其中需要注意的是
标签的method 属性和action属性。method属性必须为POST方式,其含义是以POST方式将整个表单数据提交给服务器端的Servlet程序。 action属性指定需要提交给哪一个Servlet的 URL。 Web程序设计第六章需要注意的是:通常我们更习惯采用Dreamweaver来设计 html,如果在Dreamweaver中设计好上述页面后,必须在整个文件前面添加如下代码: 完成以上修改后,将文件的后缀名修改为JSP,然后直接用鼠标拖拽的方式导入到MyEclipse中。 Web程序设计第六章 2.通过MyEclipse的Servlet创建向导新建一个名为 RegServlet的Servlet文件,其“Mapping URL”设置为“/reg”,作为该Servlet文件的访问路径。 web.xml中的主要代码如下: MyServlet servlet.RegServlet MyServlet /reg Web程序设计第六章 if (interest != null) { for (int i = 0; i < interest.length; i++) { interests = interests + StrConvert.ToChinese(interest[i]) + " "; }} else interests = "没有任何爱好"; String username = StrConvert.ToChinese(request.getParameter("username")); String sex = StrConvert.ToChinese(request.getParameter("sex")); String[] interest = request.getParameterValues("interest"); String interests = ""; 1 2 RegServlet Web程序设计第六章 request.setAttribute("username", username); request.setAttribute("sex", sex); request.setAttribute("interests", interests); RequestDispatcher dispatcher = request.getRequestDispatcher ("/reguser2.jsp"); dispatcher.forward(request, response); 3 Web程序设计第六章 …… 您的注册信息 ……
您的用户名 ……
性别:
……
个人爱好:
…… Web程序设计第六章 ??3.部署完毕后,在地址栏中输入 “http://localhost:8080/requestDis/reguser1.jsp”,得到如图6-28所示页面: Web程序设计第六章 ??4.填写完注册信息后,单击【提交】按钮,生成如所示页面:采用forward方法进行页面跳转后,浏览器地

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值