JavaWeb之JSP技术总结

刚接触JSP技术的时候让我想起了在大学学的Asp+VBScript,记得当时我还用aspstudy做了一个小的新闻发布系统作为期末作品,也正是在那时候在卢哥卢老师的指导下走向编程的道路,对编程越来越感兴趣。为什么会让我想起asp呢?因为Jsp和它还挺类似的,asp本身就是把vbscript都放在asp页面,没有像asp.net那样界面与逻辑分离,这样更加清楚。

一、工作原理与生命周期

JSP编译之后也是一个继承HttpServlet的类,所以也能完成HttpServlet能完成的所有事。只是工作方式和Servlet不一样,Servlet是先编译后部署,而jsp是先部署后编译。jsp是一个Servlet那它的生命周期也和Servlet一样,只是它有自己的初始化和销毁方法。

  public void _jspInit() {}

  public void _jspDestroy() {}

我们可以查看下它生成的java类是什么样的。在工作空间下找到下面的路径.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\HelloWorld\org\apache\jsp,会出现两个文件,一个是.java文件,一个是.class文件,当客户端第一次请求时Tomcat先将test.jsp文件转化为.java文件,并将.java文件编译成.class文件,该.class便是jsp对应的Servlet,编译完之后再运行.class文件来响应客户请求,以后客户访问会直接调用.class来响应,下面的代码是.java的代码。

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.9
 * Generated at: 2017-03-18 03:41:35 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import com.test.cyw.Person;

public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = new java.util.HashSet<>();
    _jspx_imports_classes.add("com.test.cyw.Person");
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("\r\n");
 Person person=new Person("CuiYW",25); 
      out.write('\r');
      out.write('\n');
 
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID");


      out.write("\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
View Code

二、JSP指令

JSP的语法这块比较简单,就此略过。在新建jsp页面时会在页面的第一行会有类似下面的一行代码,它就是jsp指令,

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.test.cyw.Person"%>

jsp指令主要来声明jsp页面的一些属性,格式为<%directive{attribute=}*%>,*表示一个或多个属性。JSP最常见的有3种指令:Page,include,taglib.

1.Page指令

Page指令一般生命页面属性,多个属性可以写在一个Page指令或多个Page指令中。不过属性只能出现一次,除了import属性除外。Page指令中常见属性如下:

 
说明
语法格式
language属性 language属性主要用来声明所使用的脚本语言种类,目前暂时只能使用Java语言。不过不排除以后可以使用如C、C++或其他语言的可能。language属性的默认值也是java。 <%@ page language="java">
extends属性 extends属性用来指定该JSP页面生成的Servlet是继承于哪个父类,设定时必须指定该类的全名,即包名加类名。一般很少使用,而且必须慎重的使用,否则可能限制到JSP的编译能力。 <%@ page extends="继承的父类"%>
import属性 import属性用来指定导入的Java包,和Java语言基础中的import语句作用类似。不过有些包在JSP编译时就已经导入了,可以不用再进行导入 <%@ page import="导入的包名" %>
session属性 session属性用来指定该JSP页面中是否可以使用session对象。如果设置为true,则表示该JSP页面中可以使用session对象;如果设置为false,则表示该JSP页面中不可以使用session对象。session属性的默认值为true。 <%@ page session="true | false "%>
buffer属性 buffer属性用来指定输出流是否具有缓冲区,以及设置缓冲区大小。如果设置为none,则表示输出流不具有缓冲功能;如设置为具体的数据,如“40KB”,则表示设置的缓冲区大小为40KB。其默认值为8KB。 <%@ page buffer="none | 40KB"%>
autoFlush属性 autoFlush属性用来指定缓冲区是否自动进行强制输出。如果设置为true,那么当缓冲区满的时候仍然能够输出正常;如果设置为false,那么当缓冲区满的时候,将会产生异常。如果buffer属性设置为none,那么就不能将autoFlush属性设置为false。autoFlush属性的默认值为true。 <%@ page autoFlush="true | false"%>
isThreadSafe属性 isThreadSafe属性用来指定该JSP文件是否支持多线程使用。如果设置为true,则表示该JSP文件支持多线程的使用,也就是表示该JSP文件能够同时处理多个用户的请求;如果设置为false,则表示该JSP文件不支持多线程的使用,也就是表示该JSP文件只能一次处理一个用户的请求。isThreadSafe属性的默认值为true。 <%@ page isThreadSafe="true | false"%>
info属性 info属性用来设置该JSP文件的相关信息,可以是任何的信息字符串,并通过Servlet.getServletInfo方法来取得该信息。 <%@ page info=“JSP文件相关信息”%>
errorPage属性 errorPage属性用来设置如果当前JSP文件发生异常错误时,网页重新跳转到能够处理异常的JSP文件。 <%@ page errorPage="错误处理页面"%>
isErrorPage属性 isErrorPage属性用来指定该JSP文件是否为能够处理异常的JSP文件,其默认值为false。 <%@ page isErrorPage="true | false"%>
contentType属性 contentType属性用来指定该JSP文件的MIME格式,以及网页编码格式。 <%@ page contentType="text/html;charset=ISO-8859-1"%>
pageEncoding属性 pageEncoding属性用来制定网页的编码格式 <%@ page pageEncoding=” ISO-8859-1”%>
isELIgnored属性 isELIgnored属性用来指定该JSP文件是否支持EL表达式。如果设置为true,则表示JSP文件讲忽略EL表达式,也就是EL表达式不会被执行;如果设置为false,则表示EL表达式不会被忽略,该EL表达式将会被执行。 <%@ page isELIgnored="true | false"%>

下面来做个实验主要使用下errorPage、isErrorPage属性。

首先新建一个错误页面error.jsp,isErrorPage="true"

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
this is error page
</body>
</html>
View Code

 在test.jsp制造一个错误 1/0,抛出异常 errorPage="/error.jsp"

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.test.cyw.Person" errorPage="/error.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<% Person person=new Person("CuiYW",25); %>
<% 
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
session.setAttribute("Person", person) ;
session.setAttribute("ID", "123456");
session.setAttribute("ID", "abcdef");
session.removeAttribute("ID");

%>
<%=1/0 %>
</body>
</html>
View Code

浏览器请求test.jsp时会跳转到错误页面error.jsp

2.include指令

include指令格式:<%@include file="relativeURL"%>,relativeURL可以是本应用的jsp或html文件路径,用它可以将复用的页面分离出来,类似模板页的功能。

还是接着上面的demo,新建一个jsp页面,part.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是错误页面的一部分
</body>
</html>
View Code

在error.jsp中使用include指令引入part.jsp

<body>
this is error page<br>
<%@include file="/part.jsp"  %>
</body>
</html>
View Code

刷新test.jsp请求

3.taglib指令

jsp支持标签技术,taglib用来指明JSP页面用的JSP标签库,格式为:<% taglib url="" prefix=""%>.这个以后会在JSTL标签库中经常用到,就不举例了。

三、行为

jsp行为是一组jsp内置的的标签.jsp行为是对常用jsp功能的抽象与封装。有两种一是自定义的jsp行为,二是标准的jsp行为.自定义的行为就是jsp自定义标签,这个会专门介绍。下面的是标准jsp行为。

1.<jsp:include/>行为

include行为用于运行时包含某个文件。如果被包含的文件是jsp程序,则先会执行jsp程序,后把执行的结果包含进来。语法:<jsp:include page="relativeURL" flush="true"/>,属性page是必需的,为被包含文件的相对路径必须为本web应用程序内的文件。属性flush布尔类型,默认false,设置读入被保存文件内容前是否清空缓存。

这个与jsp指令中的include指令有点类似,把test.jsp中的include 指令换成下面的语句也是显示一样的结果。

<jsp:include page="/part.jsp" flush="true"></jsp:include>

 不过,两个的实现原理并不一样。include指令是编译时包含,包含的是源代码,而行为是运行时包含,只保护运行结果,我们可以看下.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\HelloWorld\org\apache\jsp文件夹的文件变化就知道了。

(1).首先使用指令包含part.jsp,请求test.jsp页面,然后查看上面路径文件夹下的文件

<%@include file="/part.jsp"  %>

(2).清空该文件下的文件,使用行为来引入part.jsp

<jsp:include page="/part.jsp" flush="true"></jsp:include>

可以看到上面的两个运行之后生成的文件,使用指令是包含源代码,把part.jsp包含在error.jsp中,程序都是先编译后运行,按一个文件编译,编译时包含,而行为是两个分开编译,只是运行的时候把结果包含。

 2.使用Java Bean(POJO)Plain Ordinary Java Object 普通的Java类

 在asp.net中提交表单数据,从表单中获取数据,在没有MVVM模式的情况下,如果表单中数据比较多,也要一行一行的获取,这样就会变得特别麻烦。MVC中有了MVVM之后可以直接把页面数据映射到VM对象中,这样也不用一行一行的获取变量了,非常方便,JavaBean与它很类似。JavaBean行为是一组与JavaBean相关的行为,包括useBean行为、setProperty行为、getProperty行为。

(1).useBean行为

用于在jsp中定义一个POJO对象.格式:<jsp:useBean id="beanId" class="calssName" scope="value"/>

属性用法: 
id:  命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。 
class:指定Bean的完整包名。 
scope:指定Bean在哪种上下文内可用,可以取下面的四个值之一:page,request,session和application。
      默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。
      request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。
      session表示该Bean对当前HttpSession内的所有页面都有效。
      application,则表示该Bean对所有具有相同ServletContext的页面都有效。 
scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。

(2)getProperty行为

useBean定义了对象之后,使用getProperty行为来获取useBean对象的属性.<jsp:getProperty name="beanName" property="propertyName"/>

(3)setProperty行为

useBean定义了对象之后,使用getProperty行为来设置useBean对象的属性.<jsp:setProperty name="beanName" property="propertyName" value=""/>

实验一 :提交表单

1.新建User类

package com.test.cyw;

public class User {
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public boolean isSex() {
        return sex;
    }
    public void setSex(boolean sex) {
        this.sex = sex;
    }
    private String name;
    private int age;
    private boolean sex;
    
}
View Code

 2.新建useBean.jsp页面

在这个页面中将页面提交给自己,判断是否是post提交,如果是则实例化一个User对象,然后从request中获取值给user对象赋值,最后获取值。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="useBean.jsp" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="name" value=""  style="width:200"/></td></tr>
<tr><td>年龄:</td><td><input type="text" name="age" value="" style="width:200"/></td></tr>
<tr><td>性别:</td><td><input type="radio" name="sex" value="True" checked="true" />男<input type="radio" name="False" value="0" />女</td></tr>
<tr><td clospan="2"><input type="submit" name="submit" value="提交"/></td></tr>
</table>
</form>
<% 
request.setCharacterEncoding("UTF-8");
if(request.getMethod().toString().equalsIgnoreCase("post")){%> 
<!-- 在page中实例化一个id为user类型为com.test.cyw.User的对象 -->
<jsp:useBean id="user" class="com.test.cyw.User" scope="page"></jsp:useBean>
<!-- 设置use对象的各个属性,*代表所有,会自动从request中找  -->
<jsp:setProperty property="*" name="user"/>
姓名:<jsp:getProperty property="name" name="user"/><br>
年龄:<jsp:getProperty property="age" name="user"/><br>
性别:<jsp:getProperty property="sex" name="user"/><br>
<%
}
%>
</body>
</html>
View Code

实验二、scope实现计数器

上面列了scope的作用范围,这个demo主要是对scope的使用。利用它的作用域不同可以实现计数器功能。当scope为session时统计该用户的访问次数,使用application时统计该网站的访问次数。使用两个浏览器来刷新,不然两个的数量是相等的。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.test.cyw.Person" errorPage="/error.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="sessionCounter" class="com.test.cyw.Counter" scope="session"></jsp:useBean>
<jsp:useBean id="applicationCounter" class="com.test.cyw.Counter" scope="application"></jsp:useBean>
个人访问次数:<jsp:getProperty property="count" name="sessionCounter"/><br>
总访问次数:<jsp:getProperty property="count" name="applicationCounter"/><br>
</body>
</html>
View Code

3.<jsp:forward/>行为

.<jsp:forward/>行为是对request.getRequestDispatcher()的封装,使用它也可以实现页面挑战,也可以添加参数

 

<jsp:forward page="test.jsp">
<jsp:param value="qaz" name="name"/>
</jsp:forward>
View Code

 

四、JSP隐藏对象

jsp中有9大隐藏对象,隐藏就是默认存在,可以直接使用1.out输出流对象
隐藏对象out是javax.servlet.jsp.JspWriter类的实例。服务器向客户端输出的字符类内容可以通过out对象输出。
2.request 请求对象
隐藏对象request是javax.servlet.ServletRequest类的实例。代表客户端的请求。request包含客户端的信息以及请求的信息,如请求哪个文件,附带的地址栏参数等。每次客户端请求都会产生一个request实例。
3.response 响应对象
隐藏对象response是javax.servlet.ServletResponse类的实例,代表服务器端的响应。服务器端的任何输出都是通过response对象发送到客户端浏览器。每次服务器端都会产生一个response实例。
4.config 配置对象
隐藏对象config是javax.servlet.ServletConfig类的实例,ServletConfig封装了配置在web.xml中初始化JSP的参数。JSP中通过config获取这些参数。每个JSP文件都有一个config对象。
5.session 会话对象
隐藏对象session是javax.servlet.http.HttpSession类的实例。session与cookie是记录客户访问信息的两种机制,session用于服务器端保存用户信息,cookie用于客户端保存用户信息。
Servlet通过request.getSession()获取session对象,而在JSP中可以直接使用。如果JSP中配置了<%@ page session="false" %>,则隐藏对象session不可用。每个用户对应一个session对象。
6.application 应用程序对象
隐藏对象application是javax.servlet.ServletContext类的对象。application封装了JSP所在的Web应用程序的信息,例如web.xml中配置的全局的初始化信息。Servlet中application对象通过ServletConfig.getServletContext()来获取。整个Web应用程序对应一个application对象。
7.page 页面对象
隐藏对象page为javax.servlet.jsp.HttpJspPage类的实例,page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。page相当于普通java类中的关键字this。
8.pageContext 页面上下文对象
隐藏对象pageContext为javax.servlet.jsp.PageContext类的实例。pageContext对象代表当前JSP页面编译后的内容。通过pageContext能够获取到JSP中的资源。
9.exception 异常对象
隐藏对象exception为java.lang.Exception类的对象。exception封装了JSP中抛出的异常信息。要使用exception对象,需要设置<%@ page isErrorPage="true" %>。隐藏对象exception通常被用来处理错误页面。

五、配置

配置和Servlet的一样,只是在将 <servlet-class>转换为<jsp-file>即可。

六、EL表达式

POJO是为了简便获取页面请求的参数而生的,EL则是为了方便获取对象或变量而生的,以往获取对象或者属性需要使用XXX().XXXX().XX()这种,如果树比较深那就需要一直调用方法,也是比较麻烦的事情,而有了EL这个就很好解决。

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="useBean.jsp" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="name" value=""  style="width:200"/></td></tr>
<tr><td>年龄:</td><td><input type="text" name="age" value="" style="width:200"/></td></tr>
<tr><td>性别:</td><td><input type="radio" name="sex" value="True" checked="true" />男<input type="radio" name="False" value="0" />女</td></tr>
<tr><td clospan="2"><input type="submit" name="submit" value="提交"/></td></tr>
</table>
</form>
<% 
request.setCharacterEncoding("UTF-8");
if(request.getMethod().toString().equalsIgnoreCase("post")){%> 
<!-- 在page中实例化一个id为user类型为com.test.cyw.User的对象 -->
<jsp:useBean id="user" class="com.test.cyw.User" scope="page"></jsp:useBean>
<!-- 设置use对象的各个属性,*代表所有,会自动从request中找  -->
<jsp:setProperty property="*" name="user"/>
姓名:<jsp:getProperty property="name" name="user"/><br>
年龄:<jsp:getProperty property="age" name="user"/><br>
性别:<jsp:getProperty property="sex" name="user"/><br>
姓名:${user.name}<br>
年龄:${user.age}<br>
性别:${user.sex}<br>
<%
}
%>
</body>
</html>
View Code

 

隐含对象名称描 述
pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)
pageScope 代表page域中用于保存属性的Map对象
requestScope 代表request域中用于保存属性的Map对象
sessionScope 代表session域中用于保存属性的Map对象
applicationScope 代表application域中用于保存属性的Map对象
param 表示一个保存了所有请求参数的Map对象
paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
header 表示一个保存了所有http请求头字段的Map对象
headerValues 同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
cookie 表示一个保存了所有cookie的Map对象
initParam 表示一个保存了所有web应用初始化参数的map对象
posted @ 2017-03-18 17:36  社会主义接班人  阅读(546)  评论(6编辑  收藏  举报