1.JSP的地位
JSP结合了Servlet和JavaBean技术,充分继承了Java的众多优势,包括一次编写到处运行、高效的性能和强大的可扩展性。如今,JSP被广泛使用于Web应用开发,被认为是当今最有前途的Web技术之一。
2.JSP工作原理
JSP本质上就是Servlet。当JSP被第一次请求时,Web服务器上的JSP容器将其转化为相应的Servlet文件,再编译为相应的Servlet类文件,并且被装载和实例化。本次以及以后对于此JSP的请求都将通过调用已经实例化的Servlet对象中的方法来产生响应。这就是为什么在访问JSP页面时,第一次响应速度很慢而后来很快的原因。
3.JSP指令标记
JSP的指令标记是通知JSP容器的消息,其不直接生成输出。JSP一共3种指令标记:page指令、include指令和taglib指令。page指令用于控制从JSP页面中生成Servlet的属性和结构;include指令用于包含一个文件;taglib指令用于自定义标记。
(1)page指令
page指令通常位于JSP页面的顶端,是用来设置整个JSP页面的相关属性和功能的一种指令,作用于整个JSP页面,包括使用include指令包含进来的其他文件。其基本语法为:
</pre><pre name="code" class="html"><%@page attribute1="value1";attribute2="value2"……%>
(2)include指令
网站中经常会出现重复性页面,如许多网站每个网页中都包含了一个导航栏。include指令是解决此类问题的有效方法,使得开发者们不必花时间去为每个页面复制相同的XHTML/HTML代码。include中包含的文件在本页面编译时会被引入,其基本语法如下:
<%/@include file="url"%>(3)taglib
taglib指令用于提供类似于XML中的自定义新标记的功能,其基本语法如下:
<%@taglib url="relative taglibURL" prefix="taglibPrefix"%>其中,url用于指明自定义标记库存放的相对URL地址;prefix用于区分不同标记库中具有相同标记名的标记,类似于Java中的包名。
JSP动作元素是一个XML元素,用来控制JSP容器的动作,可以动态插入文件、重用JavaBean组件、导向另一个页面等。在JSP中可以使用3种动作元素,即:标准动作元素,JSP标准标签库动作元素和自定义动作元素。
在JSP中有7种标准的动作元素,也称为行为元素
<jsp:include>:在当前页面添加动态和静态的资源
<jsp:forward>:引导请求进入新的页面
<jsp:plugin>:连接客户端的Applet和Bean插件
<jsp:param>:提供其他JSP动作的名称/值信息
<jsp:useBean>:应用JavaBean组件
<jsp:getProperty>:将JavaBean的属性插入到输出中
<jsp:setProperty>:设置JavaBean组件的属性值
5.JSP内置对象
(1)request对象
request对象代表来自客户端的请求(如在form表单中填写的信息等),是最常用的对象。常用方法如下:
用户登录界面搭建
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>用户登录页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>用户注册</h1> <hr> <% int number=-1; //说明用户第一次访问页面,计数器对象还未创建 if(application.getAttribute("counter")==null) { application.setAttribute("counter", 0); } number = Integer.parseInt(application.getAttribute("counter").toString()); number++; application.setAttribute("counter", number); %> <form name="regForm" action="request.jsp" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>爱好:</td> <td> <input type="checkbox" name="favorite" value="read">读书 <input type="checkbox" name="favorite" value="music">音乐 <input type="checkbox" name="favorite" value="movie">电影 <input type="checkbox" name="favorite" value="internet">上网 </td> </tr> <tr> <td colspan="2"><input type="submit" value="提交"/></td> </tr> </table> </form> <left> 您是第<%=number %>位访问本页面的用户。 </left> </body> </html>
request显示用户请求信息
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>request页面</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>request内置对象</h1> <% request.setCharacterEncoding("utf-8"); //解决中文乱码问题,无法解决URL传递中文出现的乱码问题。 request.setAttribute("password", "123456"); %> 用户名:<%=request.getParameter("username") %><br> 爱好 :<% if(request.getParameterValues("favorite")!=null) { String[] favorites = request.getParameterValues("favorite"); for(int i=0;i<favorites.length;i++) { out.println(favorites[i]+" "); } } %> <br> 密码:<%=request.getAttribute("password") %><br> 请求体的MIME类型:<%=request.getContentType() %><br> 协议类型及版本号: <%=request.getProtocol() %><br> 服务器主机名 :<%=request.getServerName() %><br> 服务器端口号:<%=request.getServerPort() %><BR> 请求文件的长度 :<%=request.getContentLength() %><BR> 请求客户端的IP地址:<%=request.getRemoteAddr() %><BR> 请求的真实路径:<%=request.getRealPath("request.jsp") %><br> 请求的上下文路径:<%=request.getContextPath() %><BR> </body> </html>
(2)response对象
response对象是java.servlet.ServletResponse接口中一个针对HTTP协议而实现的子类,具有page作用范围。response对象是表示服务器对请求的响应的HttpServletResponse实例,包含服务器向客户端发出的响应信息。response对象常用方法如下:
在JSP页面中,可以通过调用response对象的方法来设置响应信息。通常,使用response对象来完成的操作有3个:输出缓冲、设置响应报头和重定向。
程序示例
<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%> <% response.setContentType("text/html;charset=utf-8"); //设置响应的MIMI类型 out.println("<h1>response内置对象</h1>"); out.println("<hr>"); PrintWriter outer = response.getWriter(); //获得输出流对象 outer.println("大家好,我是response对象生成的输出流outer对象"); %>
请求转发和请求重定向的区别
1,请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保持,地址栏的URL地址会改变。
2,请求转发:服务器行为,request.getRequsetDispatcher().forward(requset,response);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。(服务器内部转发,所有客户端看不到地址栏的改变)
(3)out对象out是向客户端输出流进行写操作的对象,主要应用在脚本程序中,会通过JSP容器自动转换为java.io.PrintWriter对象。在JSP页面中,可以用out对象把信息发送到客户端的浏览器上。常用方法如下:
程序实例:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>out内置对象</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>out内置对象</h1> <% out.println("<h2>静夜思</h2>"); out.println("床前明月光<br>"); out.println("疑是地上霜<br>"); out.println("举头望明月<br>"); out.println("低头思故乡<br>"); %> 缓冲区大小:<%=out.getBufferSize() %>byte<br> 缓冲区剩余大小:<%=out.getRemaining() %>byte<br> 是否自动清空缓冲区:<%=out.isAutoFlush() %><BR> </body> </html>
(4)session对象
session对象表示客户端与服务器端的一次会话。这里的会话是指一段时间内单个客户与Web服务器一连串相关的交互过程。在一个会话中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。每个客户都对应一个session对象,用来存放与这个客户相关的信息。
session对象的设定方法:
<%@page session="true|false">
常用方法如下:
(5)application对象
有的服务器需要管理面向整个Web应用的参数,使每个客户都能获得同样的参数值。application对象可以解决此类问题,负责提供应用程序在服务器中运行时的一些全局信息
常用方法如下:
(6)page对象
page对象是this变量的别名,是一个包含当前Servlet接口引用的变量,设置page对象是为了执行当前页面的应答请求
常用方法如下:
(7)pageContext对象
pageContext对象能够存取其他内置对象,当内置对象包括属性时,也可以读取和写入这些属性。
注意:pageContext是一个抽象类,实际运行的JSP容器必须扩展它才能被使用
主要对象如下:
(8)exception对象
简单的说,exception对象就是异常对象,与错误不同,这里的异常是指Web应用程序中所能够识别并处理的问题。在Java中,通常使用try、catch等关键字来处理异常。
常用方法如下: