码迷,mamicode.com
首页 > 编程语言 > 详细

JavaWeb核心编程之(四.1)JSP

时间:2016-08-23 06:50:38      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

JSP简介:

JSP是简化Servlet编写的一种技术,
它将Java代码和HTML语句混合在一个文件中编写,
只对网页中药动态产生的内容采用Java代码来编写,
而对固定不变的静态内容采用普通的静态HTML页面的方式编写

 

案例: Hello JSp

新建动态web工程 helloJSp 

WebContent下新建hello.jsp

会发现有一行为 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>

这是编码格式, 但是我们大多都是用的utf-8编码, 避免每次都写

window->Preferences->查找jsp 选择JSP Files 

技术分享

选择utf-8  

->Apply->OK

新建 hello.jsp

 1 <%@page import="java.util.Date"%>
 2 <%@ page language="java" contentType="text/html; charset=UTF-8"
 3     pageEncoding="UTF-8"%>
 4 <!DOCTYPE html>
 5 <html>
 6 <head>
 7 <meta charset="UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11 <%
12 Date date = new Date();
13 System.out.println(date);
14 %>
15 </body>
16 </html>

右键用tomcat来运行一下, 会在控制台输出

技术分享

这就说明jsp页面执行成功了

 

为了知道jsp页面到底是什么 我们在项目中查找hello.jsp

在工作目录下

.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\helloJSP\org\apache\jsp\hello_jsp.java

  1 /*
  2  * Generated by the Jasper component of Apache Tomcat
  3  * Version: Apache Tomcat/7.0.67
  4  * Generated at: 2016-08-09 16:59:45 UTC
  5  * Note: The last modified time of this file was set to
  6  *       the last modified time of the source file after
  7  *       generation to assist with modification tracking.
  8  */
  9 package org.apache.jsp;
 10 
 11 import javax.servlet.*;
 12 import javax.servlet.http.*;
 13 import javax.servlet.jsp.*;
 14 import java.util.Date;
 15 
 16 public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
 17     implements org.apache.jasper.runtime.JspSourceDependent {
 18 
 19   private static final javax.servlet.jsp.JspFactory _jspxFactory =
 20           javax.servlet.jsp.JspFactory.getDefaultFactory();
 21 
 22   private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
 23 
 24   private volatile javax.el.ExpressionFactory _el_expressionfactory;
 25   private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
 26 
 27   public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
 28     return _jspx_dependants;
 29   }
 30 
 31   public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
 32     if (_el_expressionfactory == null) {
 33       synchronized (this) {
 34         if (_el_expressionfactory == null) {
 35           _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
 36         }
 37       }
 38     }
 39     return _el_expressionfactory;
 40   }
 41 
 42   public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
 43     if (_jsp_instancemanager == null) {
 44       synchronized (this) {
 45         if (_jsp_instancemanager == null) {
 46           _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
 47         }
 48       }
 49     }
 50     return _jsp_instancemanager;
 51   }
 52 
 53   public void _jspInit() {
 54   }
 55 
 56   public void _jspDestroy() {
 57   }
 58 
 59   public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
 60         throws java.io.IOException, javax.servlet.ServletException {
 61 
 62     final javax.servlet.jsp.PageContext pageContext;
 63     javax.servlet.http.HttpSession session = null;
 64     final javax.servlet.ServletContext application;
 65     final javax.servlet.ServletConfig config;
 66     javax.servlet.jsp.JspWriter out = null;
 67     final java.lang.Object page = this;
 68     javax.servlet.jsp.JspWriter _jspx_out = null;
 69     javax.servlet.jsp.PageContext _jspx_page_context = null;
 70 
 71 
 72     try {
 73       response.setContentType("text/html; charset=UTF-8");
 74       pageContext = _jspxFactory.getPageContext(this, request, response,
 75                   null, true, 8192, true);
 76       _jspx_page_context = pageContext;
 77       application = pageContext.getServletContext();
 78       config = pageContext.getServletConfig();
 79       session = pageContext.getSession();
 80       out = pageContext.getOut();
 81       _jspx_out = out;
 82 
 83       out.write("\r\n");
 84       out.write("\r\n");
 85       out.write("<!DOCTYPE html>\r\n");
 86       out.write("<html>\r\n");
 87       out.write("<head>\r\n");
 88       out.write("<meta charset=\"UTF-8\">\r\n");
 89       out.write("<title>Insert title here</title>\r\n");
 90       out.write("</head>\r\n");
 91       out.write("<body>\r\n");
 92 
 93 Date date = new Date();
 94 System.out.println(date);
 95 
 96       out.write("\r\n");
 97       out.write("</body>\r\n");
 98       out.write("</html>");
 99     } catch (java.lang.Throwable t) {
100       if (!(t instanceof javax.servlet.jsp.SkipPageException)){
101         out = _jspx_out;
102         if (out != null && out.getBufferSize() != 0)
103           try {
104             if (response.isCommitted()) {
105               out.flush();
106             } else {
107               out.clearBuffer();
108             }
109           } catch (java.io.IOException e) {}
110         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
111         else throw new ServletException(t);
112       }
113     } finally {
114       _jspxFactory.releasePageContext(_jspx_page_context);
115     }
116   }
117 }

 

 

JavaWEB_JSP 页面的 9 个隐含对象

这部分的案例是抄袭孤傲苍狼 的, 他的总结写的非常全面了, 并且从目前的角度来说非常有深度, 有兴趣的朋友可以直接看他的博客来学习javaweb

在此对孤傲苍狼致敬, 并且无意侵犯您的版权, 如果您觉得侵犯了您的版权, 可以随时联系我

从上面的serlvet中可以得到这么几个对象

1 PageContext pageContext;
2 HttpSession session;
3 ServletContext application;
4 ServletConfig config;
5 JspWriter out;
6 Object page = this;
7 HttpServletRequest request, 
8 HttpServletResponse response

这8个对象在jsp页面中是可以直接使用的
 1 <%
 2         session.setAttribute("name", "session对象");//使用session对象,设置session对象的属性
 3         out.print(session.getAttribute("name")+"<br/>");//获取session对象的属性
 4         pageContext.setAttribute("name", "pageContext对象");//使用pageContext对象,设置pageContext对象的属性
 5         out.print(pageContext.getAttribute("name")+"<br/>");//获取pageContext对象的属性
 6         application.setAttribute("name", "application对象");//使用application对象,设置application对象的属性
 7         out.print(application.getAttribute("name")+"<br/>");//获取application对象的属性
 8         out.print("Hello Jsp"+"<br/>");//使用out对象
 9         out.print("服务器调用index.jsp页面时翻译成的类的名字是:"+page.getClass()+"<br/>");//使用page对象
10         out.print("处理请求的Servlet的名字是:"+config.getServletName()+"<br/>");//使用config对象
11         out.print(response.getContentType()+"<br/>");//使用response对象
12         out.print(request.getContextPath()+"<br/>");//使用request对象
13 %>

 

运行当前jsp页面会有如下显示信息

1 session对象
2 pageContext对象
3 application对象
4 Hello Jsp
5 服务器调用index.jsp页面时翻译成的类的名字是:class org.apache.jsp.hello_jsp
6 处理请求的Servlet的名字是:testJSP
7 text/html;charset=UTF-8
8 /helloJSP

 

 

剩下一个是叫作    java.lang.Throwable  exception  的一个异常类型的对象, 在普通的页面中是无法使用的, 只有在特定的错误页面中才能使用, 

下面的关于jsp的语法中会提到一个错误的页面的定义方法会用到这个类型的对象

JavaWEB_JSP 语法

这里就直接摘抄了, 他写的太好了

一、JSP模版元素

  JSP页面中的HTML内容称之为JSP模版元素。 
  JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。

二、JSP表达式

  JSP脚本表达式(expression)用于将程序数据输出到客户端
      语法:<%= 变量或表达式 %>
      举例:输出当前系统时间:

1 <%= new java.util.Date() %> 

  JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
  JSP脚本表达式中的变量或表达式后面不能有分号(;)

三、JSP脚本片断

  JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。语法:
    <% 
            多行java代码 
    %>

  在<% %>中可以定义变量、编写语句,不能定义方法。

范例:在Scriptlet中定义变量、编写语句

技术分享
1 <%
2     int sum=0;//声明变量
3 
4     /*编写语句*/
5     for (int i=1;i<=100;i++){
6         sum+=i;
7     }
8     out.println("<h1>Sum="+sum+"</h1>");
9 %>
技术分享

  注意事项:

  • JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。
  • JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。
  • 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。

    举例:

技术分享
1 <%
2     int x = 10;
3     out.println(x);
4 %>
5 <p>这是JSP页面文本</p>
6 <%
7     int y = 20;
8     out.println(y);
9 %>
技术分享

  多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);
  单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句,例如:

技术分享
1 <%
2     for (int i=1; i<5; i++) 
3     {
4 %>
5     <H1>http://localhost:8080/JavaWeb_Jsp_Study_20140603/</H1>
6 <%
7     }
8 %>
技术分享

四、JSP声明

  JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
    <%! 
        java代码
    %>
  所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。 
  多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。
  JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。

  JSP声明案例:

技术分享
 1 <%!
 2 static { 
 3     System.out.println("loading Servlet!"); 
 4 }
 5 
 6 private int globalVar = 0;
 7 
 8 public void jspInit(){
 9     System.out.println("initializing jsp!");
10 }
11 %>
12 
13 <%!
14 public void jspDestroy(){
15     System.out.println("destroying jsp!");
16 }
17 %>
技术分享

五、JSP注释

在JSP中,注释有两大类:

   显式注释:直接使用HTML风格的注释:<!- - 注释内容- ->

   隐式注释:直接使用JAVA的注释:///*……*/

 JSP自己的注释:<%- - 注释内容- -%>

这三种注释的区别

技术分享
 1 <!--这个注释可以看见-->
 2 
 3 <%
 4     //JAVA中的单行注释
 5 
 6     /*
 7         JAVA中的多行注释
 8     */
 9 %>
10 
11 <%--JSP自己的注释--%>
技术分享

  HTML的注释在浏览器中查看源文件的时候是可以看得到的,而JAVA注释和JSP注释在浏览器中查看源文件时是看不到注释的内容的,这就是这三种注释的区别。

 

JSP指令

  • page指令
  • Include指令
  • taglib指令

 

JSP指令的基本语法格式:<%@ 指令 属性名="值" %>

  例如:

1 <%@ page contentType="text/html;charset=gb2312"%>

  如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。
  例如:

1 <%@ page contentType="text/html;charset=gb2312"%>
2 <%@ page import="java.util.Date"%>

也可以写作:

1 <%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

JSP 2.0规范中定义的page指令的完整语法:

技术分享
 1 <%@ page 
 2     [ language="java" ] 
 3     [ extends="package.class" ] 
 4     [ import="{package.class | package.*}, ..." ] 
 5     [ session="true | false" ] 
 6     [ buffer="none | 8kb | sizekb" ] 
 7     [ autoFlush="true | false" ] 
 8     [ isThreadSafe="true | false" ] 
 9     [ info="text" ] 
10     [ errorPage="relative_url" ] 
11     [ isErrorPage="true | false" ] 
12     [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 
13     [ pageEncoding="characterSet | ISO-8859-1" ] 
14     [ isELIgnored="true | false" ] 
15 %>
技术分享

可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号(,)分隔

例如:

1 <%@ page import="java.util.*,java.io.*,java.sql.*"%>

上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类

例如:

1 <%@ page import="java.util.Date"%>
2 <%@ page import="java.io.*" %>
3 <%@ page import="java.sql.*" %>

page指令的errorPage在最后说

include指令

在JSP中对于包含有两种语句形式:

  1. @include指令
  2. <jsp:include>指令

3.1、@include指令

  @include可以包含任意的文件,当然,只是把文件的内容包含进来。

  include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

语法:<%@ include file="relativeURL"%>,其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。

include指令细节注意问题:

  1. 被引入的文件必须遵循JSP语法。
  2. 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments(片段))作为静态引入文件的扩展名。
  3. 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。

 include指令使用范例:

  新建head.jspf页面和foot.jspf页面,分别作为jsp页面的头部和尾部,存放于WebRoot下的jspfragments文件夹中,代码如下:

head.jspf代码:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <h1 style="color:red;">网页头部</h1>

foot.jspf代码:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <h1 style="color:blue;">网页尾部</h1>

  在WebRoot文件夹下创建一个IncludeTagTest.jsp页面,在IncludeTagTest.jsp页面中使用@include指令引入head.jspf页面和foot.jspf页面,代码如下:

技术分享
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 3 <html>
 4   <head>
 5     <title>jsp的Include指令测试</title>
 6   </head>
 7   
 8   <body>
 9   <%--使用include标签引入引入其它JSP页面--%>
10     <%@include file="/jspfragments/head.jspf" %>
11     <h1>网页主体内容</h1>
12     <%@include file="/jspfragments/foot.jspf" %>
13   </body>
14 </html>
技术分享

运行结果如下:

  技术分享

  我们查看一下jsp引擎将IncludeTagTest.jsp翻译成IncludeTagTest_jsp类之后的源代码,找到Tomcat服务器的work\Catalina\localhost\JavaWeb_Jsp_Study_20140603\org\apache\jsp目录下找到IncludeTagTest_jsp.java,如下图所示:

  技术分享

打开IncludeTagTest_jsp.java,里面的代码如下所示:

技术分享
 1 package org.apache.jsp;
 2 
 3 import javax.servlet.*;
 4 import javax.servlet.http.*;
 5 import javax.servlet.jsp.*;
 6 import java.util.*;
 7 import java.util.*;
 8 import java.util.*;
 9 
10 public final class IncludeTagTest_jsp extends org.apache.jasper.runtime.HttpJspBase
11     implements org.apache.jasper.runtime.JspSourceDependent {
12 
13   private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
14 
15   private static java.util.List _jspx_dependants;
16 
17   static {
18     _jspx_dependants = new java.util.ArrayList(2);
19     _jspx_dependants.add("/jspfragments/head.jspf");
20     _jspx_dependants.add("/jspfragments/foot.jspf");
21   }
22 
23   private javax.el.ExpressionFactory _el_expressionfactory;
24   private org.apache.AnnotationProcessor _jsp_annotationprocessor;
25 
26   public Object getDependants() {
27     return _jspx_dependants;
28   }
29 
30   public void _jspInit() {
31     _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
32     _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
33   }
34 
35   public void _jspDestroy() {
36   }
37 
38   public void _jspService(HttpServletRequest request, HttpServletResponse response)
39         throws java.io.IOException, ServletException {
40 
41     PageContext pageContext = null;
42     HttpSession session = null;
43     ServletContext application = null;
44     ServletConfig config = null;
45     JspWriter out = null;
46     Object page = this;
47     JspWriter _jspx_out = null;
48     PageContext _jspx_page_context = null;
49 
50 
51     try {
52       response.setContentType("text/html;charset=UTF-8");
53       pageContext = _jspxFactory.getPageContext(this, request, response,
54                   null, true, 8192, true);
55       _jspx_page_context = pageContext;
56       application = pageContext.getServletContext();
57       config = pageContext.getServletConfig();
58       session = pageContext.getSession();
59       out = pageContext.getOut();
60       _jspx_out = out;
61 
62       out.write("\r\n");
63       out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
64       out.write("<html>\r\n");
65       out.write("  <head>\r\n");
66       out.write("  \r\n");
67       out.write("    <title>jsp的Include指令测试</title>\r\n");
68       out.write("  \r\n");
69       out.write("  </head>\r\n");
70       out.write("  \r\n");
71       out.write("  <body>\r\n");
72       out.write("    ");
73       out.write("\r\n");
74       out.write("<h1 style=\"color:red;\">网页头部</h1>\r\n");
75       out.write("\r\n");
76       out.write("    <h1>网页主体内容</h1>\r\n");
77       out.write("    ");
78       out.write("\r\n");
79       out.write("<h1 style=\"color:blue;\">网页尾部</h1>\r\n");
80       out.write("\r\n");
81       out.write("  </body>\r\n");
82       out.write("</html>\r\n");
83     } catch (Throwable t) {
84       if (!(t instanceof SkipPageException)){
85         out = _jspx_out;
86         if (out != null && out.getBufferSize() != 0)
87           try { out.clearBuffer(); } catch (java.io.IOException e) {}
88         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
89       }
90     } finally {
91       _jspxFactory.releasePageContext(_jspx_page_context);
92     }
93   }
94 }
技术分享

  可以看到,head.jspf和foot.jspf页面的内容都使用out.write输出到浏览器显示了。

3.2、总结@include指令

  使用@include可以包含任意的内容,文件的后缀是什么都无所谓。这种把别的文件内容包含到自身页面的@include语句就叫作静态包含,作用只是把别的页面内容包含进来,属于静态包含。

3.3、jsp:include指令

  jsp:include指令为动态包含,如果被包含的页面是JSP,则先处理之后再将结果包含,而如果包含的是非*.jsp文件,则只是把文件内容静态包含进来,功能与@include类似。后面再具体介绍

 

 

旁白: 下面我们来说一下关于

exception  对象和 page属性中的 errorPage   isErrorPage  

新建一个项目 testError

新建 yes.jsp 添加page属性  errorPage   如下

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ page errorPage="error.jsp" %>
 4 <!DOCTYPE html>
 5 <html>
 6 <head>
 7 <meta charset="UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11 
12 </body>
13 </html>

 

 

新建一个error.jsp页面

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ page isErrorPage="true" %>
 4 <!DOCTYPE html>
 5 <html>
 6 <head>
 7 <meta charset="UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11 <%
12 exception.getMessage();
13 %>
14 </body>
15 </html>

 

在yes.jsp故意产生一个错误 例如苍狼的   

int x = 1/0;

按照苍狼的说法, 上面的页面在谷歌和火狐中是没有任何问题的, 但是在ie中, 由于页面过小, 所以显示不出来, 解决办法就是吧页面内容增多, >size=617bytes 时, 在ie下就可以正常显示了

给项目制定500 和404错误的 错误页面
在web.xml 中定义两个错误 如下
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 3   <display-name>testError</display-name>
 4   <welcome-file-list>
 5     <welcome-file>index.html</welcome-file>
 6     <welcome-file>index.htm</welcome-file>
 7     <welcome-file>index.jsp</welcome-file>
 8     <welcome-file>default.html</welcome-file>
 9     <welcome-file>default.htm</welcome-file>
10     <welcome-file>default.jsp</welcome-file>
11   </welcome-file-list>
12   
13   <error-page>
14       <error-code>500</error-code>
15       <location>/ErrorPage/500Error.jsp</location>
16   </error-page>
17   <error-page>
18       <error-code>404</error-code>
19       <location>/ErrorPage/404Error.jsp</location>
20   </error-page>
21 </web-app>

 

 

分别写两个页面, 如果也最好大于上面的ie显示的大小, 当报错的时候就回正常显示着两个内容了, 测试500报错的方法就是把yes.jsp里面的制定错误页面干掉, 或者写一个新的test.jsp页面, 也人为的产生一个错误, 这样就会自动跳转到500错误页面了

500页面内容如下, 

500的错误页面<%= exception.getMessage() %>

报错显示如下

500的错误页面 An exception occurred processing JSP page /test500.jsp at line 11 8: 9: 10: <% 11: int x = 1/0; 12: %> 13: 14: Stacktrace:

 

 

JavaWEB_域对象的属性操作

pageContext, request, session, application 对象 称为域对象

并且都拥有以下四个操作方法

 

Object getAttribute(String name) : 获取指定的属性

Enumeration getAttributeNames() : 获取所有属性的名字组成的Enumeration

removeAttribute(String name) : 移除指定的属性

void setAttribute(String name, Object o) : 设置属性

 

四个域对象的作用范围

pageContext : 只能在一个页面中取得,跳转到其他页面无法取得

request : 设置请求属性后, 跳转页面, 可以继续获得, 可以一直传递下去

session :  当次会话范围内, 以关闭浏览器为标准

application : 应用上下文, 服务器范围内所有应用都可以获得

 

 

JavaWEB_请求的转发和重定向 --- 也直接用苍狼的了, 太完美了

四、Request对象实现请求转发

4.1、请求转发的基本概念

  请求转发:指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
  请求转发的应用场景:MVC设计模式

  在Servlet中实现请求转发的两种方式:

  1、通过ServletContext的getRequestDispatcher(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

例如:将请求转发的test.jsp页面

1 RequestDispatcher reqDispatcher =this.getServletContext().getRequestDispatcher("/test.jsp");
2 reqDispatcher.forward(request, response);

  2、通过request对象提供的getRequestDispatche(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

例如:将请求转发的test.jsp页面

1 request.getRequestDispatcher("/test.jsp").forward(request, response);

  request对象同时也是一个域对象(Map容器),开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

例如:请求RequestDemo06 Servlet,RequestDemo06将请求转发到test.jsp页面

技术分享
 1 package gacl.request.study;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 public class RequestDemo06 extends HttpServlet {
10 
11     public void doGet(HttpServletRequest request, HttpServletResponse response)
12             throws ServletException, IOException {
13 
14         String data="大家好,我是孤傲苍狼,我正在总结JavaWeb";
15         /**
16          * 将数据存放到request对象中,此时把request对象当作一个Map容器来使用
17          */
18         request.setAttribute("data", data);
19         //客户端访问RequestDemo06这个Servlet后,RequestDemo06通知服务器将请求转发(forward)到test.jsp页面进行处理
20         request.getRequestDispatcher("/test.jsp").forward(request, response);
21     }
22 
23     public void doPost(HttpServletRequest request, HttpServletResponse response)
24             throws ServletException, IOException {
25         doGet(request, response);
26     }
27 }
技术分享

test.jsp页面代码如下:

技术分享
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6     <title>Request对象实现请求转发</title>
 7   </head>
 8   
 9   <body>
10       使用普通方式取出存储在request对象中的数据:
11       <h3 style="color:red;"><%=(String)request.getAttribute("data")%></h3>
12      使用EL表达式取出存储在request对象中的数据:
13      <h3 style="color:red;">${data}</h3>
14   </body>
15 </html>
技术分享

运行结果如下:

  技术分享

  request对象作为一个域对象(Map容器)使用时,主要是通过以下的四个方法来操作

  • setAttribute(String name,Object o)方法,将数据作为request对象的一个属性存放到request对象中,例如:request.setAttribute("data", data);
  • getAttribute(String name)方法,获取request对象的name属性的属性值,例如:request.getAttribute("data")
  • removeAttribute(String name)方法,移除request对象的name属性,例如:request.removeAttribute("data")
  • getAttributeNames方法,获取request对象的所有属性名,返回的是一个,例如:Enumeration<String> attrNames = request.getAttributeNames();

4.2、请求重定向和请求转发的区别

  转发: 一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发/307。
  重定向: 一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源进行处理,称之为请求重定向/302。response.sendRedirect(String location)

 

JavaWeb核心编程之(四.1)JSP

标签:

原文地址:http://www.cnblogs.com/azhw/p/5755236.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!