JSP/Servlet开发——第二章 JSP数据交互(二)
1、 JSP 内置对象 application:
●application 对象类似于系统的 "全局变量", 用于同一个应用内的所有用户之问的数据共享; |
|||||||||||||
●application对象的常用方法:
|
|||||||||||||
eg:在网站系统中统计并显示已访问的在线人数: |
|||||||||||||
eg:登陆页面的JSP代码: <html> <head> <title>My JSP 'login.jsp' starting page</title> </head> <% Integer count = (Integer) application.getAttribute("count"); if(count != null){ count = 1 + count; }else{ count = 1; } application.setAttribute("count", count); %> <body> <form name="loginForm" method="post" action="showCount.jsp"> 用户名:<input type="text" name="userName" /> 密码:<input type="password" name="pwd" /> <input type="submit" value="登录"> </form> </body> </html> |
eg:统计页面的JSP代码: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% Integer i = (Integer) application.getAttribute("count"); out.println("统计访问量:目前有 " + i + " 个人访问过本网站" ); %> |
||||||||||||
运行结果: |
|||||||||||||
分析:这里使用 count 存储统计的访问人数,由干无法控制是第几个用户访问本网站,所以先通过 getAttribtue 方法取值进行判断,如果count 为 null ,说明是第一个访问本网站的用户,赋值为1,否则在原来的计数上进行累加; |
|||||||||||||
●JSP常用内置对象:
|
|||||||||||||
●JSP的其他内置对象: ◆pageContext : 提供了在 JSP 运行时访问和其相关的环境信息的能力,通过 pageContcx对象可以访问和当前 JSP 页面相关联的所有作用域,以及一些页面属性; ◆pageContext 对象的常用方法: ☉ ServletRequest getRequest( ): 获得 request 对象 ☉ ServletResponse getResponse () : 获得 response 对象 ☉HttpSession getScssion(): 获得 session 对象 ☉JspWriter getOut ): 获得 out 对象 ☉void setAtMbute( ): 保存属性 ☉Object getAttrubute (): 获得属性 ☉void include( ): 请求指定的资源,并将目标资源的响应结果包含在调用页面的响应中。 ◆page: 表示当前页面,类似于 Java 中的 this。在 JSP 页面中 ,很少使用 page 对象; ◆config: 用于存放 JSP 编译后的初始数据。 与 page 对象-样 , 在 JSP 页面中很少使用; ◆exception: 表示 JSP 页面运行时产生的异常和错误信息,该对象只有在错误页面(pag指令中设定 isErrorPage 为true的页面 ) 中才能够使用; |
2、 对象的作用域:
●分别是 page 作用域、request 作用域 、session 作用域和 application作用域; ▲page作用域:对应的作用域访问对象为pageContext 对象,在一个页面范围内有效,通过pageContext对象访问; ▲request作用域:对应的作用域访问对象为request 对象,在一个服务器请求范围内有效; ▲session作用域:对应的作用域访问对象为session 对象,在一次会话范围内容有效; ▲application作用域:对应的作用域访问对象为application 对象,在一个应用服务器范围内有效;
|
|||||
●page作用域:page 作用域指单一JSP页面的范围,page 作用域内的对象只能在创建该对象的页面中访问,page作用域可以使用 pageContext 对象的 setAttribute()和 getAttribute()方法访问,page 作用域在客户每次请求 JSP 页面时创建,在服务器发送响应或请求转发到其他的页面或资源后失效;
|
|||||
● request作用域:page 作用域与当前页面绑定在一起 . 而 request 作用域则是与客户端的请求绑定在一起的 , 其用范围要比 page 作用域大 , request作用域可以通过调用 request 对象的 setAttribute ( ) 与 getAttribute()方法进行访问。request 作用域在页面转发或包含中同样有效,即在调用 RequestDlspatcher 的 forward ()方法转向的页面或者调用include() 方法包含的页面中,都可以共享同一个 request 作用域,访问其中的数据,需要注意的是,request 作用域对于每次客户端的请求都是不同的,对于任何一个新的请求都会重新创建与本次请求相对应的 request作用域。而当请求结束后,与之相关的 request 作用域也随之失效; ★RequestDlspatcher对象的include()方法与pageContext对象的include()方法与pageContext对象的include()方法实现相同的效果;
|
|||||
●session作用域:JSP 容器为每一次会话创建一个 session 作用域。在会话有效期内,只要将数据绑定到 session作用域中,则该数据可以被本次会话中的其他页面所访问。session 作用域可以通过 session 对象setAttribute ()和 getAttributet ()方法进行访问;
|
|||||
●application作用域:相对于 session 作用域针对一个会话,application作用域则针对整个 Web 应用,被该应用下所用户所共享。在 Web 应用运行期间,所有页面都可以访问application作用域内的变量,其作用域最大,application 作用域通过 application对象的 setAttribute ()和 getAttribute()方法访问;
|
3、 cookie:是Web服务器保存在客户端的一系列文本信息;
●简介:cookie由Netscapt公司发明,是最常用的跟踪用户会话的方式,它是由服务器端生成并发送客户端浏览器的,浏览器会将其保存为某个目录下的文本文件; |
||||||||||||||||||||||||
●说明: ★当用户在浏览网站时,Web 服务器会将一些资料存放在客户端,这些资料包括用户在浏览网期间输入的文字或是一些选择记录。当用户下一次访问该网站时,服务器会先从客户端查看是否保留下来的 emkie 信息,然后依据 cookie 的内容,呈现特定的页面内容给用户。 ★cookie 最典型的用是判定注册用户是否已经登录网站,用户可能会得到提示,是否保存状态以便在下一次进入系时可以简化登录。另外 cookie 还会应用到 '最近浏览过的商品’ 之类的业务处理中, 用户在购网站中浏览过不同的商品信息,都可以使用cookie在客户端进行存储,方便用户快速定位到已浏过的商品; |
||||||||||||||||||||||||
●cookie的作用表现: ★对特定对象的追踪,如访问者的访问次数、最后访问时间、路径等; ★统计网页浏览次数; ★在cookie有效期内,记录用户登陆信息; ★实现各种个性化服务,如针对不同用户喜好以不同的风格展示不同的内容等; |
||||||||||||||||||||||||
●注:由于cookie会将用户的个人信息保存在客户端,如用户名、计算机名、浏览记录等,这些信息中会包含一些比较敏感的内容,尤其是用户私人的信息。所以从安全角度上,使用cookie存在着一定的风险 , 因此不建议在cookie中保存比较重要或敏感的内容; |
||||||||||||||||||||||||
●在JSP中使用cookie: 1、创建cookie对象: Cookie newCookie = new Cookie(String key, String value); 注:Cookie 类在 javax.servlet.http包下,当 JSP 翻译成.java 文件时,会自动导入 java.servlet.http 的类。在JSP中,通过调用构造方法 Cookie(String name , String value)创建新的cookie 对象。// name: 用于代表 cookie 的名称,value: 用于表示该名称所对应的值 2、写入cookie: ★在学习 JSP 内置对象 response 的常用方法时,有一个 addCookie ) 方法。在创建 cookie对象使用response 对象的 addCookie() 方法实现写入cookie; 其代码:response.addCookie(newCookie); ★cookie对象的常用方法:
eg:添加cookie信息:
3、读取cookie:Cookie[] cookies = request.getCookies(); ★JSP 通过 response 对象的 addCookie()方法写cookie后,读取时需要调用 JSP 中 request 对象getCookies )方法 ,该方法将返回 HTTP请求中的cookie 对象数组 , 因此必须通过遍历的方式进访问; ★cookie 是通过 name/value 方式进行保存的 , 因而在遍历数组时,需要通过调用 cookie 对象getNarne ( ) 方法对每个数组成员的名称进行检查,直至找到我们需要的cookie,然后调用cookie对象 getValue方法取得与名称对应的值; eg:读取上面的(第二步)数据信息:
|
||||||||||||||||||||||||
●cookie 的有效期: ★当用户访问网页时,cookie 能够在客户端创建一个文件,用于记录用户的有关数据。但是一个cookie 在客户端存在的时间并不是无限期的,也有其生命周期,可以指定cookie的有效期 ,在由效期内cookie始终存在并能够被读取,当达到cookie 有效期后,cookie 会被从客户端清除; ★设置cookie有效期的方法是调用 cookie 对象的 setMaxAge (int expiry) 方法,其中参数 expiry代表cookie的有效时间 , 以秒为单位;
|
4、 cookie与 session 作用域的对比:
session 作用域 |
cookie作用域 |
在服务器端保存用户信息 |
在客户端保存用户信息 |
保存的值是 Object 类型 |
保存的值是 String类型 |
随会话的结束而将其存储的数据销毁 |
可以长期保存在客户端 |
保存重要的信息 |
通常用于保存不重要的用户信息 |
5、JDBC中访问数据库:
●使用JDBC访问数据库的步骤: 1、加载 JDBC 驱动,使用 Class.forName() 方法将给定的 JDBC 驱动类加载到Java虚拟机中,如果系统中不存在给定的类,则会引发 ClassNotFoundException异常; 2、与数据库建立连接。DriverManager类是JDBC的管理层,作用于用户和驱动程序之间。DriverManager类跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接,当调getConnection ( ) 方法时,DriverManager 类首先从已加载的驱动程序列表中找到一个可以接受该库 URL 的驱动程序,然后请求该驱动程序,使用相关的URL、用户名和密码连接到数据库中,于是建立了与数据库的连接,创建连接对象并返回引用; 3、发送 SQL 语句, 并得到返回结果。一旦建立连接, 就使用该连接创建 Statement接口的实例,并将 SQL 语句传递给它所连接的数据库,如杲是查询操作 , 将返回类型为 ResultSet 的结果集,其包含执行 SQL 查询的结果。如果是其他操作 , 将根据调用方法的不同返回布尔值或操作影晌的记录数目; 4、处理返回结果,主要是针对查询操作的结果集,通过循环取出结果集中每条记录并做相的处理; 5、数据库访问结束后,进行资源释放; |
||||||||||
●JSP访问数据库: ◆分层实现:数据访问层(DAO):对数据库的增、删、改、查操作是数据访问层, 表示层(JSP):JSP 是用户直接访问的,主耍是用获取客户的数据和显示数据,作为表示层; ◆DAO 模式的主要组成: ★DAO 接口:把对数据库的所有操作定义成抽象方法; ★DAO 实现类,给出 DAO 接口中定义方法的具体实现; ★实体类:用于存放. 传输对象数据; ★数据库连接和关闭工具类:对数据库连接和关闭代码进行集中管理,减少冗余; |
||||||||||
eg:下面通过完成新闻发布系统中的一个开发任务来具体了解在 JSP 中如何实现数据库访问,本务主要包括以下几个步骤: ◆新闻发布系统的数据库中包含一个和用户表,NEWS_USERS,表中包含用户编号(uid)、用户名称(uname)、用户密码(upwd)三个字段;
★1、了解需求:实现用户注册功能,在注册页面中输入用户名、密码,如上图(左), 单击 ’注册’ 按钮.数据保存至数据库中. 如果注册成功,跳转至登录页面,如图上图(右),如果注册失败,跳转至注册页面; ★2、准备环境:使用MySOL数据库实现数椐存储,因而需耍将 MySQL 的驱动包添加到项目的/WEB-INF/lib目录下; ★3、数据访问层:代码如下:
★4、表示层:JSP代码:
|
6、在JSP中使用 JavaBean:
●JavaBean的优势: ☉解决代码重复编写,减少代码冗余 ☉功能区分明确 ☉提高了代码的维护性 |
●JavaBean 是 Java 中开发的可以跨平台的重用组件. ●JavaBean 在服务器端的应用中表现出了强的生命力,在 JSP 程序中常用于封装业务逻辑、数据库操作等; ●JavaBean 组件本质上就是一个类,只是这个类需要遵循一些编码的约定; |
●JavaBean 实际上是一个 Java 类 , 这个类可以重用。 ★从 JavaBean 的功能上可以分为以下两类:封装数据、封装业务; ●JavaBean般情况下要满足以下要求: ★JavaBean 是一个公有类,并提供无参的公有的构造方法; ★属性私有; ★具有公有的访问属性的 getter 和 setter 方法; ☉符合上述条件的类,都可以把它看成 JavaBean 组件; ☉在程序中,开发人员所要处理的无非是业务逻辑和数据,而这两种操作都可以封装成 JavaBe组件. 一个应用程序中会使用很多 JavaBean,由此可见 , JavaBean 组件是应用程序的重要组成部分: |
eg:下面这段代码实际上就是实现用户登录时用于封装用户的实体类,这也是一个很典型的封装数据JavaBean。这个 JavaBean封装了用户所用的数据,uid、uname 等是用户的属性,外部通过 getter /setter方法可以对这些属性进行操作;
★使用工具自动生成getter/setter方法: Alt+Shift+S -> Generate Getters and Setters |
●规范:Sun 推荐的属性命名规则为xxx的属性对应setXxx ()方法; ◆一般情况下,Java的属性变量都以小写字母开始,eg:name、userName 等; ◆但也存在殊的情况,如一些特定意义的大写英文缩略词(如 XML、URL 等). ◆JavaBean 也允许使大写字母开头的属性变量名,但是必须满足“变量的前两个字母要么全部大写,要么全部小写“的要求, eg:IDCode、ID、ICCard 等属性变量名是合法的,而 iDCode、 iD 、 iCCard等属性变量名则是非法的, ◆有些情况下非法的变量名再以属性名第一个字母大写的方式命名getter/setter方法,会导致找不到属性错误; ◆解决方法如下: ★如果属性名的第二个字母大写,那么该属性名直接用作 getter/setter 方法中 get/set后部分,就是说大小写不变。 eg:属性名为 uName , 方法是 getuName/setuName ★如果前两个字母大写( 一般的专有名词和缩略词都会大写 ) 则属性名直接用作getter/setter方法,eg:属性名为URL, 方法是 getURL/ setURL; ★如果首宇母大写,则属性名直接用作 getter/setter方法中 get/set的后部分。例如:属性名为 Name,方法是 getName/setName,这是最不符合规范的情况,很容易发错误,因为通过 getter/setter方法得到的 默认属性名是name; |
●在编写程序时一个封装数据的,JavaBean一般情况下对应着数据库内的一张表(或视图),JavaBean的属性与表(或视图)内字段的属性一一对应。同样 , 相对于一个封装数据的 JavaBean一般都会有一个封装该类的业务逻辑和业务操作的 JavaBean 相对应; |
7、JSP与JavaBean:
●在JSP页面中导入JavaBean:
★在 JSP 页面中,可以像使用普通类一样实例化一个 JavaBean 对象,调用它的方法。
★在 JSP 中引入并使用 JavaBdan 的语法如下:
//引入JavaBean <%@ page import="org.news.bean.*" %> //使用JavaBean <% Comment c = new Comment(); c.setCid(1014); c.getCauthor(); %> |
★代码提示:Alt+/;
●访问JavaBean:
访问JavaBean <jsp:useBean> 标签可以在JSP中声明一个JavaBean,然后使用。声明后,JavaBean对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。<jsp:useBean>标签的语法格式如下: <jsp:useBean id="bean 的名字" scope="bean 的作用域" typeSpec/> 其中,根据具体情况,scope的值可以是page,request,session或application。id值可任意只要不和同一JSP文件中其它<jsp:useBean>中id值一样就行了。 接下来给出的是 <jsp:useBean> 标签的一个简单的用法: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>useBean 实例</title> </head> <body> <jsp:useBean id="date" class="java.util.Date" /> <p>日期为:<%= date %> </body> </html> 它将会产生如下结果: 日期为:Tue Jun 28 15:22:24 CST 2016 访问 JavaBean 对象的属性 在 <jsp:useBean> 标签主体中使用 <jsp:getProperty/> 标签来调用 getter 方法,使用 <jsp:setProperty/> 标签来调用 setter 方法,语法格式如下: <jsp:useBean id="id" class="bean 编译的类" scope="bean 作用域"> <jsp:setProperty name="bean 的 id" property="属性名" value="value"/> <jsp:getProperty name="bean 的 id" property="属性名"/> ........... </jsp:useBean> name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。 |
8、Jsp中EL(Expression Language)基础详解:
★为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。 JSP EL语言定义 E L(Expression Language)目的:为了使JSP写起来更加简单。 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。 一、JSP EL简介 1、语法结构 ${expression} 2、[ ]与.运算符 EL 提供"."和"[ ]"两种运算符来存取数据。 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用"[ ]"。例如: ${user.My-Name} 应当改为${user["My-Name"]} 如果要动态取值时,就可以用"[ ]"来做,而"."无法做到动态取值。例如: ${sessionScope.user[data]}中data 是一个变量 3、变量 EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。 因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。 假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
二、JSP EL 中的有效表达式 有效表达式可以包含文字、操作符、变量(对象引用)和函数调用。我们将分别了解这些有效表达式中的每一种: 1、文字 JSP 表达式语言定义可在表达式中使用的以下文字:
2、操作符 JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:
3、隐式对象 JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:
此外,还提供几个隐式对象,允许对以下对象进行简易访问:
除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:
三、特别强调: 1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext}也返回 PageContext 对象。 2、 注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。 四、举例说明 1、例如, <%=request.getParameter("username")%> 等价于 ${param.username} 2、例如,但是下面的那句EL语言可以完成如果得到一个username为空,则不显示null,而是不显示值。 <%=user.getAddr()%> 3、例如: <%=request.getAttribute("userlist")%> 等价于 ${ requestScope.userlist } 4、例如,原理如上例3。 ${sessionScope.userlist} 1 ${requestScope.userlist} 2 ${applicationScope.userlist} 3 ${pageScope.userlist} 4 ${uselist}:执行顺序为4 "."后面的只是一个字符串,并不是真正的内置对象,不能调用对象。 5、例如, <%=user.getAddr()%> 等价于 ${user.addr} 第一句前面的user,为一个变量。 第二句后面user,必须为在某一个范围里的属性。 EL即Expression |
JSP/Servlet开发——第二章 JSP数据交互(二)的更多相关文章
- JSP/Servlet开发——第二章 JSP数据交互(一)
1. JSP内置对象:JSP内置对象是 Web 容器创建的一组对象: ●JSP常用的内置对象:out.request.application.session.response等: ●内置对象不需要 ...
- 基于JSP+Servlet开发手机销售购物商城系统(前台+后台)源码
基于JSP+Servlet开发手机销售购物商城系统(前台+后台) 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MySQL数据库 运行效果图: ...
- 基于JSP+Servlet开发高校社团管理系统(前台+后台) 源码
基于JSP+Servlet开发高校社团管理系统(前台+后台): 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat+MYSQL数据库 运行效果 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
原文:ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 第二章 继承于WebControl的自定义控件 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支 ...
- 第二章 jsp数据交互(一)
JSP如何处理客户端的请求? 解析:通过jsp内置对象 表单数据被提交到了jsp页面! 什么是JSP内置对象(jsp核心)? Java 内置对象 Java 作用域 解析:jsp内置对象是web容器创 ...
- JSP/Servlet开发——第一章 动态网页基础
1.动态网页:在服务端运行的使用程序语言设计的交互网页 : ●动态网站并不是指具有动画功能的网站,而是指网站内容可根据不同情况动态变更的网站(股票网站),一般情况下动态网站通过数据库进行架构. ●动态 ...
- 第二章.JSP/Servlet及相关技术详解
JSP的4种基本语法: 1.JSP注释: <%-- JSP注释部分 --%> 2.JSP声明: <%! //声明一个整型变量 public int count; //声明一个方法 p ...
- windows7_下Eclipse中部署tomcat7.0进行JSP+servlet开发
环境:windows 7+EclipseJava EE IDE for Web Developers +tomcat 7.02 插件:tomcatPluginV321.zip(百度搜索下载即可) 一. ...
随机推荐
- 如何才能快速入门python3?
一些朋友自学python过程中,发现书也能看懂,书上的玩具代码也能看懂,但为啥自己不能做习题,不能写代码解决问题,自己不能动手写代码? 原因是初学者没有学会计算思维.解决问题的方法.编程思路. 编程思 ...
- ArcGIS Enterprise 10.5.1 静默安装部署记录(Centos 7.2 minimal)- 2、安装WebAdapter
解压webadapter安装包,tar -xzvf Web_Adaptor_Java_Linux_1051_156442.tar.gz 进入下Webadapter目录下静默安装 ./Setup -m ...
- Android NDK开发 网址
http://www.cnblogs.com/shangdahao/archive/2013/05/01/3053146.html http://www.cnblogs.com/shangdahao/ ...
- 使用Unicode写文本文件:一个简单类的示例
参考了http://forums.codeguru.com/showthread.php?457106-Unicode-text-file示例. class WOFSTREAM : public st ...
- solidity语言3
#函数类型(function type) function (<parameter types>) {internal|external(public)} [pure|constant|v ...
- linux下使用ntfs-3g挂载NTFS出错
挂载报错如下图: 根据图中的报错:The disk contains an unclean file system (0, 0). 在网上搜索了一下原因,由于之前Windows系统未被正常关闭产生了错 ...
- 【Spring实战】—— 5 设值注入
本篇主要讲解了Spring的最常用的功能——依赖注入. 注入的方式,是使用Getter Setter注入,平时大多的编程也都是使用这种方法. 举个简单的例子,还是表演者. 表演者有自己的属性,年龄或者 ...
- Ajax 重构的步骤
Ajax重构大致可以分为以下3三个步骤. 一 创建一个单独的JS文件,名称为AjaxRequest.js,并且在该文件中编写重构Ajax 所需的代码具体代码如下:var net = new Objec ...
- IOS PushMeBaby(是一款用来测试ANPs的开源Mac项目)
● PushMeBaby是一款用来测试ANPs的开源Mac项目 ● 它充当了服务器的作用,用法非常简单 ● 它负责将内容提交给苹果的APNs服务器,苹果的APNs服务器再将内容推送给用户 的设备 ● ...
- Android(java)学习笔记31:泛型高级之通配符
1. 泛型高级之通配符: package cn.itcast_07; import java.util.ArrayList; import java.util.Collection; /* * 泛型高 ...