利用帝国软件如何做网站,大连建设局网站地址,a做片手机免费网站,夸克看网站要钱吗2019独角兽企业重金招聘Python工程师标准 一、JSP运行原理 每个JSP 页面在第一次被访问时#xff0c;WEB容器都会把请求交给JSP引擎#xff08;即一个Java程序#xff09;去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) #xff0c;然… 2019独角兽企业重金招聘Python工程师标准 一、JSP运行原理 每个JSP 页面在第一次被访问时WEB容器都会把请求交给JSP引擎即一个Java程序去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) 然后按照servlet的调用方式进行调用。 由于JSP第一次访问时会翻译成servlet所以第一次访问通常会比较慢但第二次访问JSP引擎如果发现JSP没有变化就不再翻译而是直接调用所以程序的执行效率不会受到影响。 JSP引擎在调用JSP对应的_jspServlet时会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用特意定义了9个相应的变量开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。 二、认识九个内置对象 NO.内置对象类型1pageContextjavax.servlet.jsp.PageContext2requestjavax.servlet.http.HttpServletRequest3responsejavax.servlet.http.HttpServletResponse4sessionjavax.servlet.http.HttpSession5applicationjavax.servlet.ServletContext6configjavax.servlet.ServletConfig7outjavax.servlet.jsp.JspWriter8pagejava.lang.Object9exceptionjava.lang.Throwable requestresponsesessionapplicationconfig这些对象在前面都已经作了详细的介绍这里重点介绍一下剩下的pageContext对象out对象page对象。 三、内置对象使用说明 3.1、page对象 page对象表示当前一个JSP页面可以理解为一个对象本身即把一个JSP当作一个对象来看待。page对象在开发中几乎不用了解一下即可 3.2、out对象 out对象用于向客户端发送文本数据。 out对象是通过调用pageContext对象的getOut方法返回的其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。 JSP页面中的out对象的类型为JspWriterJspWriter相当于一种带缓存功能的PrintWriter设置JSP页面的page指令的buffer属性可以调整它的缓存大小甚至关闭它的缓存。 只有向out对象中写入了内容且满足如下任何一个条件时out对象才去调用ServletResponse.getWriter方法并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中 设置page指令的buffer属性关闭了out对象的缓存功能out对象的缓冲区已满整个JSP页面结束out对象的工作原理图 3.3、pageContext对象 pageContext对象是JSP技术中最重要的一个对象它代表JSP页面的运行环境这个对象不仅封装了对其它8大隐式对象的引用它自身还是一个域对象(容器)可以用来保存数据。并且这个对象还封装了web开发中经常涉及到的一些常用操作例如引入和跳转其它资源、检索其它域对象中的属性等。 3.4、通过pageContext获得其他对象 getException方法返回exception隐式对象 getPage方法返回page隐式对象getRequest方法返回request隐式对象 getResponse方法返回response隐式对象 getServletConfig方法返回config隐式对象getServletContext方法返回application隐式对象getSession方法返回session隐式对象 getOut方法返回out隐式对象3.5、pageContext封装其它8大内置对象的意义 如果在编程过程中把pageContext对象传递给一个普通java对象那么这个java对象将可以获取8大隐式对象此时这个java对象就可以和浏览器交互了此时这个java对象就成为了一个动态web资源了这就是pageContext封装其它8大内置对象的意义把pageContext传递给谁谁就能成为一个动态web资源那么什么情况下需要把pageContext传递给另外一个java类呢什么情况下需要使用这种技术呢在比较正规的开发中jsp页面是不允许出现java代码的如果jsp页面出现了java代码那么就应该想办法把java代码移除掉我们可以开发一个自定义标签来移除jsp页面上的java代码首先围绕自定义标签写一个java类jsp引擎在执行自定义标签的时候就会调用围绕自定义标签写的那个java类在调用java类的时候就会把pageContext对象传递给这个java类由于pageContext对象封装了对其它8大隐式对象的引用因此在这个java类中就可以使用jsp页面中的8大隐式对象(requestresponseconfigapplicationexceptionSessionpageout)了pageContext对象在jsp自定义标签开发中特别重要。 3.6、pageContext作为域对象 pageContext对象可以作为容器来使用因此可以将一些数据存储在pageContext对象中。 pageContext对象的常用方法 1 public void setAttribute(java.lang.String name,java.lang.Object value)
2 public java.lang.Object getAttribute(java.lang.String name)
3 public void removeAttribute(java.lang.String name)
4 public java.lang.Object findAttribute(java.lang.String name) 重点介绍一下findAttribute方法这个方法是用来查找各个域中的属性的查看这个方法的API可以看到关于这个方法的描述 Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null. 当要查找某个属性时findAttribute方法按照查找顺序page→request→session→application在这四个对象中去查找只要找到了就返回属性值如果四个对象都没有找到要查找的属性则返回一个null。 范例使用pageContext的findAttribute方法查找属性值 1 %page contentTypetext/html;charsetUTF-8%2 %page importjava.util.*%3 !DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN4 head5 titlepageContext的findAttribute方法查找属性值/title6 /head7 %8 pageContext.setAttribute(name1, 孤傲苍狼);9 request.setAttribute(name2, 白虎神皇);
10 session.setAttribute(name3, 玄天邪帝);
11 application.setAttribute(name4, 灭世魔尊);
12 %
13 %
14 //使用pageContext的findAttribute方法查找属性由于取得的值为Object类型因此必须使用String强制向下转型转换成String类型
15 //查找name1属性按照顺序page→request→session→application在这四个对象中去查找
16 String refName1 (String)pageContext.findAttribute(name1);
17 String refName2 (String)pageContext.findAttribute(name2);
18 String refName3 (String)pageContext.findAttribute(name3);
19 String refName4 (String)pageContext.findAttribute(name4);
20 String refName5 (String)pageContext.findAttribute(name5);//查找一个不存在的属性
21 %
22 h1pageContext.findAttribute方法查找到的属性值/h1
23 h3pageContext对象的name1属性%refName1%/h3
24 h3request对象的name2属性%refName2%/h3
25 h3session对象的name3属性%refName3%/h3
26 h3application对象的name4属性%refName4%/h3
27 h3查找不存在的name5属性%refName5%/h3
28 hr/
29 h1使用EL表达式进行输出/h1
30 h3pageContext对象的name1属性${name1}/h3
31 h3request对象的name2属性${name2}/h3
32 h3session对象的name3属性${name3}/h3
33 h3application对象的name4属性${name4}/h3
34 h3不存在的name5属性${name5}/h3 运行结果 EL表达式语句在执行时会调用pageContext.findAttribute方法用标识符为关键字分别从page、request、 session、application四个域中查找相应的对象找到则返回相应对象找不到则返回”” 注意不是null而是空字符串。 pageContext对象中封装了访问其它域的方法 1 public java.lang.Object getAttribute(java.lang.String name,int scope)
2 public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
3 public void removeAttribute(java.lang.String name,int scope) 代表各个域的常量 1 PageContext.APPLICATION_SCOPE
2 PageContext.SESSION_SCOPE
3 PageContext.REQUEST_SCOPE
4 PageContext.PAGE_SCOPE 范例pageContext访问其它域 1 %page contentTypetext/html;charsetUTF-8%2 %page importjava.util.*%3 !DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN4 head5 titlepageContext访问其它域/title6 /head7 %8 //此时相当于往session对象中存放了一个name属性等价于 session.setAttribute(name,孤傲苍狼);9 pageContext.setAttribute(name,孤傲苍狼,PageContext.SESSION_SCOPE);
10 %
11 %
12 //取得session对象的属性使用pageContext对象获取
13 String refName1 (String)pageContext.getAttribute(name,PageContext.SESSION_SCOPE);
14 //由于取得的值为Object类型因此必须使用String强制向下转型转换成String类型
15 String refName2 (String)session.getAttribute(name);
16 %
17 h1取出存放在session对象中的属性值/h1
18 p第一种做法使用pageContext.getAttribute(attributeName,PageContext.SESSION_SCOPE);去取出session对象中值/p
19 h3姓名%refName1%/h3
20 p第二种做法使用session.getAttribute(attributeName);去取出session对象中值/p
21 h3姓名%refName2%/h3 3.7、PageContext引入和跳转到其他资源 PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。 方法接收的资源如果以“/”开头 “/”代表当前web应用。 范例使用pageContext的forward方法跳转到其他页面 1 %page contentTypetext/html;charsetUTF-8%2 %page importjava.util.*%3 !DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN4 head5 title使用pageContext的forward方法跳转页面/title6 /head7 %8 //使用pageContext的forward方法跳转到pageContextDemo05.jsp页面/代表了当前的web应用9 pageContext.forward(/pageContextDemo05.jsp);
10 //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)
11 //使用RequestDispatcher的forward方法实现的跳转方式
12 //pageContext.getRequest().getRequestDispatcher(/pageContextDemo05.jsp).forward(request, response);
13 % 运行结果如下 1 pageContext.forward(/pageContextDemo05.jsp); 这种写法是用来简化和替代pageContext.getRequest().getRequestDispatcher(/pageContextDemo05.jsp).forward(request, response);这种写法的。在实际开发中使用pageContext.forward(relativeUrlPath)方法跳转页面用得不多主要是因为要在Jsp页面中嵌套java代码所以这种做法简单了解一下即可在开发中要想从一个Jsp页面采用服务器端跳转的方式跳转到另一个Jsp页面那么一般会使用jsp:forward标签jsp:forward标签用于把请求转发给另外一个资源。 范例使用pageContext的include方法引入资源 1 % page languagejava importjava.util.* pageEncodingUTF-8%2 !DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN3 head4 title使用pageContext的include方法引入资源/title5 /head6 %7 pageContext.include(/jspfragments/head.jsp);8 %9 使用pageContext的include方法引入资源
10 %
11 pageContext.include(/jspfragments/foot.jsp);
12 %
13 hr/
14 %--
15 jsp:include page/jspfragments/head.jsp/
16 使用jsp:include标签引入资源
17 jsp:include page/jspfragments/foot.jsp/
18 --% 运行结果 在实际开发中使用pageContext的include方法引入页面这种做法也很少用一般都使用jsp:include标签引入资源因此这种做法了解一下即可。 转载于:https://my.oschina.net/u/204616/blog/548940