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作用域中,则该数据可以被本次会话中的其他页面所访问。sessiQn 作用域可以通过 session 对象setAttribute ()和 getAttributet ()方法进行访问;
|
|||||
|
●application作用域:相对于 session 作用域针对一个会话,application作用域则针对整个 Web 应用,被该应用下所用户所共享。在 Web 应用运行期间,所有页面都可以访问application作用域内的变量,其作用域最大,application 作用域通过 application对象的 setAttribute ()和 getAttribute()方法访问;
|
|||||
3、 cookie:是Web服务器保存在客户端的一系列文本信息;
|
●简介:cookie由Netscapt公司发明,是最常用的跟踪用户会话的方式,它是由服务器端生成并发送客户端浏览器的,浏览器会将其保存为某个目录下的文本文件; |
||||||||||||||||||||||||
|
●说明: ★当用户在浏览网站时,Web 服务器会将一些资料存放在客户端,这些资料包括用户在浏览网期间输入的文字或是一些选择记录。当用户下一次访问该网站时,服务器会先从客户端查看是否保留下来的 emkie 信息,然后依据 cookie 的内容,呈现特定的页面内容给用户。 ★cookie 最典型的用是判定注册用户是否已经登录网站,用户可能会得到提示,是否保存状态以便在下一次进入系时可以简化登录。另外 cookie 还会应用到 '最近浏览过的商品’ 之类的业务处理中, 用户在购网站中浏览过不同的商品信息,都可以使用 eooki, 在客户端进行存储,方便用户快速定位到已浏过的商品; |
||||||||||||||||||||||||
|
●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+/;