JSP内置对象详解
- 格式:doc
- 大小:438.60 KB
- 文档页数:15
详解JSP内置对象request常见⽤法request 对象是 HttpServletRequestWrapper 类的实例。
它的继承体系如下:_request 对象继承层次结构图.pngServletRequest 接⼝的唯⼀⼦接⼝是 HttpServletRequest ,HttpServletRequest 接⼝的唯⼀实现类HttpServletRequestWrapper ,单从 request 对象⼀脉单传的类继承体系可以看出,javaweb 标准类库只⽀持了 http 协议。
Servlet/JSP 中⼤量使⽤了接⼝⽽不是实现类,这恰恰就是⾯向接⼝编程的最佳应⽤啊。
request 内置对象是由 Tomcat 创建的,可以⽤来封装 HTTP 请求参数信息、进⾏属性值的传递以及完成服务端跳转,这就是request 对象最重要的三个功能了。
request 对象的创建流程⼀旦 http 请求报⽂发送到 Tomcat 中, Tomcat 对数据进⾏解析,就会⽴即创建 request 对象,并对参数赋值,然后将其传递给对应的 jsp/servlet 。
⼀旦请求结束,request 对象就会⽴即被销毁。
服务端跳转,因为仍然是同⼀次请求,所以这些页⾯会共享⼀个 request 对象。
1、访问请求参数<a href="login.jsp?name=张三&sex=man&id=" rel="external nofollow" >传递参数</a>login.jsp关键代码<%= "name:"+new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8") %><br><%= "sex:"+request.getParameter("sex") %><br><%= "id:"+request.getParameter("id") %><br><%= "pwd:"+request.getParameter("pwd") %><br>说明:如果指定的参数不存在,将返回null;如果指定了参数名,但未指定参数值,将返回空的字符串"。
第四章JSP 内置对象4.6 实验一:request对象1,相关知识点在就是jsp中,内置对象request封装了用户请求信息时所提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。
2,参考代码:Register.jsp:<%@page contentType="text/html;charset=gb2312"%><head><%@ include file="head.txt"%></head><%@taglib tagdir="/WEB-INF/tags" prefix="look"%><html><body bgcolor=pink><font size=2><form action="Register_1.jsp" method=post>请输入注册信息,用户名必须由字母或数字组成,带*为必填项。
<table border=1><tr><td>员工编号:</td><td><Input type=text name="id">*</td></tr><tr><td>用户名:</td><td><Input type=text name="name">*</td></tr><tr><td>用户密码:</td><td><Input type=text name="password">*</td></tr><tr><td>用户权限(Y/N):</td><td><Input type=text name="right">*</td></tr><tr><td>性别:</td><td><Input type=text name="sex">*</td></tr><tr><td>联系电话:</td><td><Input type=text name="phone"></td></tr><tr><td>备注:</td><td><Input type=text name="remark"></td></tr></table><br><Input type="submit" name="b" value="提交"><br>注册前<look:QueryTag dataSource="SupermarketMS" tableName="Staff" user="sa" password="sa"/><br><%=queryResult%></font></body></html>Register_1.jsp<%@page contentType="text/html;charset=gb2312"%><%@ taglib tagdir="/WEB-INF/tags" prefix="inquire"%><html><body bgcolor=pink><font size=2><%String ID=request.getParameter("id");String aa=request.getParameter("name");String PassWord=request.getParameter("password");String Right=request.getParameter("right");String Sex=request.getParameter("sex");String Phone=request.getParameter("phone");String Remark=request.getParameter("remark");byte bb[]=aa.getBytes("iso-8859-1");aa=new String(bb);%><inquire:Register_2 ID="<%=ID%>" nn="<%=aa%>" pw="<%=PassWord%>"right="<%=Right%>"sex="<%=Sex%>"phone="<%=Phone%>"remark="<%=Remark%>"/><br>注册后所有员工信息<inquire:QueryTag dataSource="SupermarketMS" tableName="Staff" user="sa" password="sa"/><br><%=queryResult%></font></body></html>Register_2.tag代码如下:<%@tag pageEncoding="gb2312"%><%@tag import="java.sql.*"%><%@ attribute name="ID" required="true"%><%@ attribute name="nn" required="true"%><%@ attribute name="pw" required="true"%><%@ attribute name="right" required="true"%><%@ attribute name="sex" required="true"%><%@ attribute name="phone" required="true"%><%@ attribute name="remark" required="true"%><%out.print("hello world");%><% int id=Integer.parseInt(ID);String insert="insert into Staff values("+id+",'"+nn+"','"+pw+"','"+right+"','"+sex+"','"+phone+"','"+remark+"')";try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(Exception e){}Connection con;Statement sql;ResultSet rs;try{String uri="jdbc:odbc:SupermarketMS";con=DriverManager.getConnection(uri,"sa","sa");sql=con.createStatement();sql.executeUpdate(insert);con.close();}catch(Exception e){out.print(""+e);}%>实验2:session对象1,相关知识点Jsp的session是使用bean的一个生存期限,一般为page,session意思是在这个用户没有离开网站之前一直有效,如果无法判断用户何时离开,一般依据系统设定,tomcat中设定为30分钟. 我们使用session功能,可以达到多个jsp程序从操作同一个java bean, 那么这个java bean可以作为我们传统意义上的"全局变量池".(在java中我们可以使用static静态化一个变量和方法,使用singleton唯一化对象.) 2,参考代码inputGuess.jsp<%@ page contentType="text/html;charset=GB2312" %><HTML><BODY bgcolor=cyan><FONT Size=2><P>随机分给了你一个1到100之间的数,请猜!<%int number=(int)(Math.random()*100)+1;session.setAttribute("count",new Integer(0));session.setAttribute("save",new Integer(number));%><FORM action="result.jsp" method="post" name=form>输入你的猜测:<INPUT type="text" name="boy"><INPUT TYPE="submit" value="送出" name="submit"></FORM></FONT></BODY></HTML>Result.jsp 的代码如下:<% String str=request.getParameter("boy");if(str.length()==0){response.sendRedirect("inputGuess.jsp");}int guessNumber=-1;try{guessNumber=Integer.parseInt(str);Integer integer=(Integer)session.getAttribute("save");int realnumber=integer.intValue();if(guessNumber==realnumber){int n=((Integer)session.getAttribute("count")).intValue();n=n+1;session.setAttribute("count",new Integer(n));response.sendRedirect("success.jsp");}else if(guessNumber>realnumber){int n=((Integer)session.getAttribute("count")).intValue();n=n+1;session.setAttribute("count",new Integer(n));response.sendRedirect("large.jsp");}else if(guessNumber<realnumber){int n=((Integer)session.getAttribute("count")).intValue();n=n+1;session.setAttribute("count",new Integer(n));response.sendRedirect("small.jsp");}}catch(Exception e){response.sendRedirect("inputGuess.jsp");}%>Small.jsp参考代码为:<%@ page contentType="text/html;charset=GB2312" %> <HTML><BODY bgcolor=cyan><FONT Size=2><FORM action="result.jsp" method="get" name=form>猜小了,请再猜:<INPUT type="text" name="boy"><INPUT TYPE="submit" value="送出" name="submit"></FORM></FONT></BODY></HTML>Large.jsp 参考代码如下:<%@ page contentType="text/html;charset=GB2312" %> <HTML><BODY bgcolor=cyan><FONT Size=2><FORM action="result.jsp" method="get" name=form>猜大了,请再猜:<INPUT type="text" name="boy"><INPUT TYPE="submit" value="送出" name="submit"></FORM></FONT></BODY></HTML>Success.jsp 的参考代码如下:<%@ page contentType="text/html;charset=GB2312" %> <HTML><BODY bgcolor=cyan><FONT Size=2><%int count=((Integer)session.getAttribute("count")).intValue(); int num=((Integer)session.getAttribute("save")).intValue(); %><P>恭喜你,猜对了<BR>您共猜了<%=count%>次,这个数字就是<%=num%> <BR>单机超链接返回到inputGuess.jsp页面:<BR><A href="inputGuess.jsp">inputGuess.jsp</A></FONT></BODY></HTML>3实验结果及分析。
JSP中的内置对象<j s p:f o r w a r d><jsp:forward>是把一个请求转发到另一个JSP或Servlet或者其他的静态资源(HTML)特点:被forward转发的资源必须与发出请求的页面处于相同的上下文环境中,每当遇到此标签时,容器就会停止执行当前的JSP,转而执行被转发的资源<j s p:p a r a m>l当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给的资源是一个能动态执行的程序时,例如Servlet和JSP页面,那么,还可以使用<jsp:param>标签向这个程序传递参数信息。
l语法1:<jsp:include page="relativeURL | <%=expression%>"><jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include>l语法2:<jsp:forward page="relativeURL | <%=expression%>"><jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include>l<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。
在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
JSP程序设计实验报告(三)院系:计算机科学与工程学院【实验题目】JSP内置对象【实验目的】1、了解JSP中4个内置对象request、reponse、session、pagecontext的基本概念。
2、理解JSP内置对象的常用方法的功能。
3、掌握JSP内置对象的应用。
【实验内容】1、request对象:客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
它是HttpServletRequest类的实例。
2、response对象:response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。
它是HttpServletResponse类的实例。
3、session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。
4、pageContext对象:pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application 的某一属性值,他相当于页面中所有功能的集大成者。
5、练习(自己完成)【实验代码】实验1 request对象使用<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%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>My JSP 'index.jsp' starting page</title></head><body bgcolor="#FFFFF0"><form action="" method="post"><input type="text" name="qwe"><input type="submit" value="提交"></form>请求方式:<%=request.getMethod()%><br>请求的资源:<%=request.getRequestURI()%><br>请求用的协议:<%=request.getProtocol()%><br>请求的文件名:<%=request.getServletPath()%><br>请求的服务器的IP:<%=request.getServerName()%><br>请求服务器的端口:<%=request.getServerPort()%><br>客户端IP地址:<%=request.getRemoteAddr()%><br>客户端主机名:<%=request.getRemoteHost()%><br>表单提交来的值:<%=request.getParameter("qwe")%><br><%String str = "";if (request.getParameter("qwe") != null) {Enumeration enumt = request.getParameterNames();while (enumt.hasMoreElements()) {str = enumt.nextElement().toString();out.println(str + ":" + request.getParameter(str) + "<br>");}}%></body></html>实验2 response对象<%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%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></head><body><%String address = request.getParameter("where");if (address != null) {if (address.equals("sohu"))response.sendRedirect("");else if (address.equals("avceit"))response.sendRedirect("");else if (address.equals("mypage"))response.sendRedirect("mypage.jsp");}%><b>Please select:</b><br><form action="" method="GET"><select name="where"><option val ue="sohu" selected>go to sohu</option><option value="avceit">go to avceit</option><option value="mypage">go to mypage</option></select><input type="submit" value="go"></form></body></html>实验3 session对象使用<%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%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>My JSP 'index.jsp' starting page</title></head><body><br>session的创建时间:<%=session.getCreationTime()%> <%=newDate(session.getCreationTime())%><br><br>session的Id号:<%=session.getId()%><br><br>客户端最近一次请求时间:<%=session.getLastAccessedTime()%> <%=newjava.sql.Time(session.getLastAccessedTime())%><br><br>两次请求间隔多长时间此SESSION被取消(ms):<%=session.getMaxInactiveInterval()%><br><br>是否是新创建的一个SESSION:<%=session.isNew()?"是" : "否"%><br><br><%session.setAttribute("name", "火星人");session.setAttribute("nmber", "1234567");%><%String str;//Enumeration为枚举类Enumeration<String> enum1=session.getAttributeNames();while(enum1.hasMoreElements()){str=enum1.nextElement().toString();out.println(str+":"+session.getAttribute(str)+"<br>");}%><br></body></html>实验4 pageContext对象使用<%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%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>pageContext对象举例</title></head><body><%request.setAttribute("name", "软件001");session.setAttribute("name", "软件002");application.setAttribute("name", "编程001");%>request设定的值:<%=pageContext.getRequest().getAttribute("name")%><br>session设定的值:<%=pageContext.getSession().getAttribute("name")%><br>application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>范围1内的值:<%=pageContext.getAttribute("name", 1)%><br>范围2内的值:<%=pageContext.getAttribute("name", 2)%><br>范围3内的值:<%=pageContext.getAttribute("name", 3)%><br>范围4内的值:<%=pageContext.getAttribute("name", 4)%><br><!--从最小的范围page开始,然后是reques、session以及application--><%pageContext.removeAttribute("name", 3);%>pageContext修改后的session设定的值:<%=session.getAttribute("name")%><br><%pageContext.setAttribute("name", "应用技术培训", 4);%>pageContext修改后的application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>值的查找:<%=pageContext.findAttribute("name")%><br>属性name的范围:<%=pageContext.getAttributesScope("name")%><br> </body></html>【实验结果】request对象:response对象:、session对象:pageContext对象:【实验心得】通过本次实验,我知道了如何在JSP页面中实现使用request、reponse、session、pagecontext4个内置对象,对这四个内置对象有了一定的了解,并且对JSP编程更加得心应手。
jsp九⼤内置对象什么是内置对象 可以在JSP⽂件中直接拿来使⽤的对象 JSP⽂件翻译后⽣成的⽂件:在service⽅法中就引⼊了9个对象,所以在jsp⽂件中才可以直接使⽤九⼤内置对象有哪些四个范围对象的范围从⼩到⼤是什么: 从⼩范围到⼤范围:pageContext、request、session、applicationpageContext对象是什么 pageContext对象代表jsp页⾯上下⽂对象pageContext对象可以⼲什么 通过pageContext对象可以获取整个JSP页⾯环境中的所有数据: 获取当前JSP页⾯中的请求对象:pageContext.getRequest()。
获取当前JSP页⾯中的会话对象:pageContext.getSession()。
获取ServletContext对象:pageContext.getServletContext()。
通过pageContext对象传递数据(只能存储⼀个页⾯中的数据,⽆法跨页⾯。
可以获取include指令包含的jsp页⾯中存储的数据,但是不能获取include动作包含的jsp页⾯中存储的数据): pageContext.setAttribute(“username”,jack); //存 pageContext.getAttribute(“username”); //取 通过pageContext对象往request,session,application对象中存储数据: 向request范围存储数据:pageContext.setAttribute(“username”,”jack”,PageContext.REQUEST_SCOPE); 向session范围存储数据:pageContext.setAttribute(“username”,”jack”,PageContext.SESSION_SCOPE); 向application范围存储数据:pageContext.setAttribute(“username”,”jack”,PageContext.APPLICATION_SCOPE);。
JSP脚本中的九个内置对象JSP脚本中包含九个内置对象,这九个内置对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化(由JSP页面对应的Servlet的_jspService()方法来创建这些实例)。
内置对象名所属类型有效范围说明称application javax.servlet.ServletContext application 该对象代表应用程序上下文,它允许JSP页面与包括在同一应用程序中的任何Web组件共享信息config javax.servlet.ServletConfig page 该对象允许将初始化数据传递给一个JSP页面exception ng.Throwable page 该对象含有只能由指定的JSP“错误处理页面”访问的异常数据out javax.servlet.jsp.JspWriter page 该对象提供对输出流的访问page javax.servlet.jsp.HttpJspPage page 该对象代表JSP页面对应的Servlet类实例pageContext javax.servlet.jsp.PageContext page 该对象是JSP页面本身的上下文,它提供了唯一一组方法来管理具有不同作用域的属性,这些API在实现JSP自定义标签处理程序时非常有用request javax.servlet.http.HttpServletRequest request 该对象提供对HTTP请求数据的访问,同时还提供用于加入特定请求数据的上下文response javax.servlet.http.HttpServletResponse page 该对象允许直接访问HttpServletReponse对象,可用来向客户端输入数据session javax.servlet.http.HttpSession session 该对象可用来保存在服务器与一个客户端之间需要保存的数据,当客户端关闭网站的所有网页时,session变量会自动消失application (javax.servlet.ServletContext的实例)application对象代表Web应用本身,因此使用application来操作Web应用相关的数据。
application通常有如下两个作用:Ø在整个Web应用的多个JSP、Servlet之间的共享数据。
通常被定义为数据字典来使用。
通常在一处实现application.setAttribute(“name”,value);来定义一个变量,在JSP中使用application.getAttribute(“name”);获取值;在Servlet中使用一个实例的ServletContext 对象sc.getAttribute(“name”);获取值。
我们可以把application理解成一个Map对象,任何JSP、Servlet都可以把某个变量放入application中保存,并指出一个属性名;而该应用的其他JSP、Servlet就可以根据该属性名来得到这个变量。
由于application对象代表整个Web应用,所以只应该把Web应用的状态数据放入到application中。
Ø访问Web应用的配置参数,在web.xml中配置类似的参数,该标签是<web-app></web-app>下的子标签。
即<context-param><param-name>name</param-name><param-value>value</param-value></context-param>在JSP中可以通过application.getInitParameter(“name”);取得配置的参数,在Servlet中可以先实例一个ServletContext对象即:final javax.servlet.ServletContext application;然后就可以取值了,即:application = pageContext.getServletContext();application.getInitParameter("name");这里通常被用作普通java Web开发中数据库用户名,密码的获取时使用,因为在项目开发用的密码不一定和部署在服务器上的密码一致,但是把它写到这里便于修改这些有关项目的参数。
config (javax.servlet.ServletConfig的实例)config对象代表当前的JSP配置信息,但JSP页面通常无需配置,因此也就不存在配置信息,该对象在JSP页面用的比较少,但在Servlet中用处则相对较大,因为Servlet需要在web.xml文件中进行配置,可以指定配置参数。
但是如果说要为某个JSP配置一些参数的话,也是跟配置Servlet一样需要在web.xml中配置,也就说吧JSP当成Servlet配置<servlet><servlet-name>Configure</servlet-name><jsp-file>/getcontextparam.jsp</jsp-file><init-param><param-name>conn</param-name><param-value>connnn</param-value></init-param></servlet><servlet-mapping><servlet-name>Configure</servlet-name><url-pattern>/configure</url-pattern></servlet-mapping>其中这里“<jsp-file>/getcontextparam.jsp</jsp-file>”是表明把某个JSP配置成Servlet。
在地址栏中访问时要输入http://localhost:8080/test/configure(url-pattern中内容)在JSP中获取参数时使用config.getInitParameter("conn")即可。
exception (ng.Throwable的实例)exception对象是Throwable的实例,代表JSP脚本中错误和异常,是JSP异常机制的一部分。
在JSP脚本中无需处理异常,即使该异常是checked异常,事实上,JSP脚本包括的所有的可能出现的异常都可交给错误页处理。
异常处理结构如下。
try{//代码处理段}catch(Throwableexception){//异常处理段}其中代码处理段交给普通的JSP脚本,异常处理段是由异常处理界面负责的。
在异常处理段,可以看到有个异常对象,该对象就是异常处理对象exception。
看一下变异后的servlet 文件中有一段:if(_jspx_page_context != null) _jspx_page_context.handlePageException(t);else throw new ServletException(t);这表明JSP脚本和静态的HTML部分都会转换成_jspService()方法里的可执行性代码,既然如此,那么JSP就根本不需要处理异常,因为这一切都是属于try里面的内容。
一旦捕获到JSP页面的异常,并且该页面的page指令指定了errorPage属性(_jsp_page_context!=null),则请求forward到errorPage属性指定的页面,否则使用系统页面来输出异常信息。
如果把某一页面指定为errorPage页面,那么在编译成Servlet时他也就具有了exception 内置对象。
也就是说普通的页面不会有exception对象,错误页才会有。
在错误页面中可以通过<%=exception.getClass()%>//获取异常类型<%=exception.getMessage()%>//获取异常信息out (javax.servlet.jsp.JspWriter的实例)out对象代表一个页面输出流,通常用于在页面上输出变量值及常量。
一般在使用输出表达式的地方都可以使用out对象达到同样的效果。
out是个页面输出流,负责输出页面的内容,但是用out需要编写更多的代码。
<%= %>表达式的本质就是out.write(…);对于页面上的某个html标签来讲<table><tr></tr></table>如果使用了out即:<%out.println(“<table>”);out.println(“<tr>”);out.println(“</tr>”);out.println(“</table>”);%>page (javax.servlet.jsp.HttpJspPage的实例)page代表页面本身,通常没有太大的用处。
也就是Servlet中的this,其类型就是生成的Servlet类,能用page的地方就可以使用this。
pageContext (javax.servlet.jsp.PageContext的实例)该对象代表JSP页面的上下文,使用该对象可以访问页面中的共享数据。
使用pageContext 可以访问page、request、session、application范围的变量。
pageContext时PageContext 类的实例,它提供了两个方法访问四个范围的变量1getAttribute(ng.String name);2getAttribute(ng.String name, int scope)∙PageContext.PAGE_SCOPE:对应page范围--->1∙PageContext.REQUEST_SCOPE:对应request范围--->2∙PageContext.SESSION_SCOPE:对应session范围--->3∙PageContext.APPLICATION_SCOPE:对应application范围--->4与之相对应的也有两个对应的setAttribute()方法。