class="类名" type="类型名"
beanName="bean的名字id"
type="类型名"
动作所引用的类的.class文件必须放在web/WEB-INF/classes下。
6.8 在使用setProperty动作和getProperty动作时应注意些什么?
setProperty动作用来设置Bean的属性值,在使用这个标签前,必须使用动作声明此Bean。实际上,setProperty动作使用Bean给定的setXxx方法来设置Bean的属性值。其语法如下:
...
或者
...
...
其中PropertyDetails可以是下面四个中的一个:
- property="*"
- property="Bean的属性名"
- property="Bean的属性名" param="request中的参数名"
- property="Bean的属性名" value="字符串"或"<%=表达式%>"
getProperty动作是对setProperty动作的补充,用来访问一个Bean的属性,并将获得的一个属性值转化成一个字符串后发送到输出流中。同理,使用这个动作标签之前也需要使用useBean动作进行声明。该动作的使用格式如下:
...
6.9 plugin动作有什么用途?与该动作相关的另一个动作是什么?(略)
6.10 JSP指令与JSP动作在功能上有什么不同?
JSP指令为翻译阶段提供全局信息或静态引入资源,JSP动作在执行阶段为页面提供插件或动态引入资源等。
6.11 什么是EL表达式语言?如何使用EL表达式语言?
- EL表达式语言:EL表达式语言是JSP为了简化表达式的写法,借鉴ECMAScript等脚本语言经验设计而成的一种语言。EL表达式语言和ECMAScript等脚本语言一样都属于弱类型语言,避免了绝大多数的强制类型转换。不同的是,EL不是一种编程语言,不含有选择或循环等控制语句,这些控制语句都由JSTL提供。
- EL的语法结构:${表达式}。一个EL表达式由字面量、通常的算术运算符、用于访问表单的隐含变量以及一般的变量组成。字面量可以是数值、字符串、布尔值;变量则都由JSTL动作元素创建。EL保留的关键字有:and、div、empty、eq、false、ge、gt、instanceof、le、lt、mod、ne、not、null、or、true。
- EL表达式在JSP文档中出现的位置:模板文本或某些动作元素的某些特性中。
在表单中使用EL表达式:${param.address}或${param[‘cust-address’]}
- EL表达式中定义了许多隐含变量,大多数是与请求头、表单值、cookie以及各种各样的作用域变量相关的值的集合。如pageContext.request就是一个对javax.servlet.http.HttpServletRequest对象的引用。
- 当对表达式求值时,EL表达式的值常隐式地放在结果文档中。但是如果插入到结果文档中的文本包含特殊字符,则最好使用out动作元素:
- JSTL中用于控制的动作元素:最常用的有if、forEach、when、choose、otherwise。
<c:if test="bool expression">
jsp元素或标记
c:if>
<c:forEach var="top" items="${paramValues.topping}">
${top}<br/>
c:forEach>
<c:forEach begin="1" end="100" step="2">
${top}<br/>
c:forEach>
<c:choose>
<c:when test="${param.payment=='visa'}">
Visa
c:when>
<c:when test="${param.payment=='mc'}">
mc
c:when>
<c:when test="${param.payment=='discover'}">
discover
c:when>
<c:otherwise>
Check
c:otherwise>
c:choose>
6.12 什么是JSTL?如何使用JSTL?
- JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
- 根据JSTL标签所提供的功能,可以将其分为5个类别:核心标签、格式化标签、SQL 标签、XML 标签、JSTL 函数。
- JSTL库的安装:从Apache的标准标签库中下载的二进制包(jakarta-taglibs-standard-版本号.zip)并解压,将 jakarta-taglibs-standard-版本号/lib/ 下的两个 jar 文件standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。将 tld 下的需要引入的 tld 文件复制到 WEB-INF 目录下。接下来我们在 web.xml 文件中添加以下配置:
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmttaglib-uri>
<taglib-location>/WEB-INF/fmt.tldtaglib-location>
taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt-rttaglib-uri>
<taglib-location>/WEB-INF/fmt-rt.tldtaglib-location>
taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/coretaglib-uri>
<taglib-location>/WEB-INF/c.tldtaglib-location>
taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core-rttaglib-uri>
<taglib-location>/WEB-INF/c-rt.tldtaglib-location>
taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sqltaglib-uri>
<taglib-location>/WEB-INF/sql.tldtaglib-location>
taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql-rttaglib-uri>
<taglib-location>/WEB-INF/sql-rt.tldtaglib-location>
taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/xtaglib-uri>
<taglib-location>/WEB-INF/x.tldtaglib-location>
taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/x-rttaglib-uri>
<taglib-location>/WEB-INF/x-rt.tldtaglib-location>
taglib>
jsp-config>
web-app>
- 引入标签库
引入核心标签库:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
引入格式化标签:<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
引入SQL标签:<%@ taglib prefix=“sql” uri=“http://java.sun.com/jsp/jstl/sql” %>
引入XML标签:<%@ taglib prefix=“x” uri=“http://java.sun.com/jsp/jstl/xml” %>,并且导入XercesImpl.jar和xalan.jar包
引入JSTL函数:<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
第七章 使用JDBC访问数据库
7.1 简述四类JDBC驱动程序的特点。
类型1:JDBC-ODBC Bridge。这类驱动程序的特色是必须在计算机上事先安装好ODBC驱动程序,然后通过JDBC-ODBC Bridge的转换,把Java程序中使用的JDBC API转换成ODBC API,进而通过ODBC来存取数据库。
类型2:JDBC-Native API Bridge。同类型1一样,这类驱动程序的特色是必须在计算机上先安装好特定的驱动程序(类似ODBC),然后通过JDBC-Native API Bridge的转换,把Java程序中使用的JDBC API转换成Native API,进而存取数据库。
类型3:JDBC-Middleware。使用这类驱动程序时不需要在计算上安装任何附加软件,但是必须在安装数据库管理系统的服务器端加装中间件(Middlewa),这个中间件会负责所有存取数据库时必要的转换。
类型4:Pure JDBC Driver。使用这类驱动程序时无需安装任何附加的软件(无论是用户的计算机或是数据库服务器端),所有存取数据库的操作都直接由JDBC驱动程序来完成。
7.2 在JSP中进行JDBC编程要注意什么?
1、导入JDBC标准类库;
2、注册数据库驱动程序;
3、建立与数据库的连接;
4、使用SQL语句对这个数据库进行操作;
5、使用close()方法解除JSP与数据库的连接并关闭数据库,释放占用的资源。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.lang.reflect.InvocationTargetException" %>
<html>
<head>
<title>Title</title>
</head>
<body>
插入前先查询输出浏览一下已有数据:<hr/>
<table style="border: 20px;text-align: center">
<tr>
<th>学号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>院系</th>
</tr>
<%
String driverName="com.mysql.cj.jdbc.Driver";
String userName="root";
String userPasswd="*********";
String dbName="helloworld";
String tableName="student";
String url="jdbc:mysql://localhost:3306/"+dbName+"?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
try{
Class.forName(driverName);
try{
Connection con=DriverManager.getConnection(url,userName,userPasswd);
try{
Statement s=con.createStatement();
String sql="select * from "+tableName;
try{
ResultSet rs=s.executeQuery(sql);
try{
while(rs.next()){
out.println("");
out.println(""+rs.getString("Sno")+" | ");
out.println(""+rs.getString("Sname")+" | ");
out.println(""+rs.getString("Ssex")+" | ");
out.println(""+rs.getInt("Sage")+" | ");
out.println(""+rs.getString("Sdept")+" | ");
out.println("
");
}
}finally{
rs.close();
}
}finally{
s.close();
}
}catch(SQLException e){
e.printStackTrace();
System.out.println("不能执行查询");
}finally{
con.close();
}
}catch(SQLException e){
e.printStackTrace();
System.out.println("Error getConnection,不能连接数据库!");
}
}catch(ClassNotFoundException e){
e.printStackTrace();
System.out.println("Error loading Driver,不能加载驱动程序!");
}
%>
</table>
</body>
</html>
<!--
无法加载驱动管理器!
解决方法:首先driverName应该为com.mysql.cj.jdbc.Driver,其次,下载并放置mysql-connector-java-x.x.x.jar包,
有两种放置方法,可以放在tomcat的lib中,也可以放在web/WEB-INF/lib下
-->
<!-- java.sql.SQLException: The server time zone value '???ú±ê×??±??' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
解决方法:String URL="jdbc:mysql://localhost:3306/jdbc01?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
-->
第八章 JSP与JavaBean
8.1 什么是软件复用技术?什么是组件复用技术?简述软件复用的优点?
软件复用(又称软件重用或软件再生)是指利用事先建立好的软件成分(也称为构件或组件)来创建新软件系统的过程和开发可重用软件组件的技术。这个定义蕴含着软件重用所必须包含的两个方面:
(1)系统地开发可重用的软件部件。这些软件部件可以是代码,也可以是分析、设计、测试数据、原型、计划、文档、模板、框架等等;
(2)系统地使用这些软件部件作为构筑模块来建立新的系统。
软件重用主要体现在以下方面:源代码重用、目标代码重用、类库、组件
组件是继面向对象之后新一代逻辑模型,是最先进的软件复用技术。通过面向对象的技术对所开发的软件系统进行分析与设计,将特定的对象设计为一个个组件,并建立组件库。这样组件不仅可以重复使用,而且还可以由用户自行配置。整个软件系统按照面向对象的软件工程开发。最后将这些组件技术应用与软件设计和开发中是软件产业发展的必然趋势。
软件复用会带来以下好处:
(1)提高软件生产效率;
(2)缩短开发周期;
(3)降低软件开发和维护费用;
(4)生产更加标准的软件;
(5)提高软件开发质量;
(6)增强软件系统的互操作性;
(7)减少软件开发人员的数量;
(8)是开发人员能比较容易地适应不同性质的项目开发。
8.2 JavaBean组件有哪几部分组成?简述这几部分的功能。
JavaBean组件模型由属性、方法和事件三部分组成,并通过封装属性和方法使其成为具有某种功能或者处理某个业务的对象(简称Bean)。Bean的组成特性如下。
1、方法。指在Bean类中定义的、完成各种特定任务的公共方法,这些方法提供给外部调用。
2、属性。Bean的属性是Bean类中的成员变量,它与一般Java程序中所指的属性是同一概念。Bean的属性可以是任何Java支持的数据类型,包括类和接口类型。在JavaBean设计中,按照属性的作用不同又可将Bean属性细分为4类:简单属性、索引属性、绑定属性、约束属性。
(1)简单属性:普通的属性类型。
public class MyBean{
private String value;
public String getValue(){
return value;
}
public void setValue(String newValue){
value = newValue;
}
}
(2)索引属性:以数组形式存在的一组具有相同数据类型的属性。
public class MyBean{
private String[] strs = new String[7];
public String[] getStrs(){
return strs;
}
public void setStrs(String[] newStrs){
strs = newStrs;
}
public String getStrs(int index){
return strs[index];
}
public void setStrs(int index,String newValue){
strs[index]=newValue;
}
}
(3)绑定属性:当值改变时会向其他监听者发送PropertyChange事件的属性。
(4)约束属性:改变约束属性的值必须保证所有监听者都不抛出PropertyVetoException。
import java.beans.*;
public class MyBean{
private int value;
private VetoableChangeSupport vetoableChangeSupport = new VetoableChangeSupport(this);
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
public MyBean(){
value=0;
}
public int getValue(){
return value;
}
public void setValue(int newValue) throws PropertyVetoException{
int oldValue = getValue();
vetoableChangeSupport.fireVetoableChange("value",oldValue,newValue);
value = newValue;
propertyChangeSupport.firePropertyChange("value",oldValue,newValue);
}
public void addVetoableChangeListener(VetoableChangeListener l){
vetoableChangeSupport.addVetoableChangeListener(l);
}
public void removeVetoableChangeListener(VetoableChangeListener l){
vetoableChangeSupport.removeVetoableChangeListener(l);
}
public void addPropertyChangeListener(PropertyChangeListener l){
propertyChangeSupport.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
propertyChangeSupport.removePropertyChangeListener(l);
}
}
3、事件。事件用于传递有关Bean状态变化的通知,以及用户与Bean之间的交互信息,Bean与Bean之间相互连接起来并进行互操作是通过事件处理机制实现的。JavaBean直接继承了JavaAPI中以事件源/收听者模型为基础的事件处理机制。Bean既可以产生事件,也可以收听并处理事件。作为事件源的Bean,既可以产生低层事件,也可以产生语义事件;作为收听者的Bean,向外部提供了响应并处理事件的公共方法。
8.4 简述JavaBean在JSP中的Session生命周期。
1、Page作用域只在本页面,与本页面具有相同生命周期。
2、Request作用域局限在同一个用户请求中,使用forward不会发起新的请求,可以将Bean传给下一个页面。
3、Session作用域与每个用户相关联,session作用域的Bean生命周期是一个访问者的会话期间。当一个访问者访问站点时,则产生一个Session对象。一个访问者开始访问站点时,从他访问的起始页到随后访问的所有页面的集合被称为一个Session。当访问者关闭浏览器时,属于Session作用域的bean对象就被清除,生命周期告终。如果客户在多个页面中相互链接,而每个页面都含有一个useBean标签,并且标签中id的值相同,scope值都是“session”,那么该访问者在这些页面得到的Bean是相同的。如果访问者更改了每个页面的Bean属性,则其他页面的Bean属性将会被修改。
4、Application作用域Bean的生命周期在关闭服务器时结束。
第九章 Servlet
1、什么是Servlet?简述Servlet的工作原理?
Servlet就是使用Java Servlet API及其相关类和软件包的Java程序。Java Applet是运行在客户端的Java类,Servlet则是运行在服务端的Applet,主要用于处理Web请求,动态产生HTML页面。但是Servlet没有运行界面,它与协议和平台无关,不受客户端的安全限制。
Servlet的特点:可移植性好、高效、功能强大、方便、可重用性、模块化、节省投资、安全性
Servlet的工作原理:Servlet由支持Servlet的服务器Servlet引擎负责管理运行,引擎为每一个请求创建一个轻量级的线程并进行管理。Servlet的工作步骤如下:
(1)浏览器向Web服务器发出请求。
(2)Web服务器收到请求后,把需要Servlet处理的请求转交给Servlet引擎负责处理。
(3)Servlet引擎检查对应的Servlet是否已经装载,如果没有装载,则将其载入内存并进行初始化,然后由该Servlet对请求进行处理。Servlet引擎创建特定于这个请求的ServletRequest和ServletResponse对象,然后调用Servlet的service()方法。service()方法从ServletRequest对象获得客户请求的信息,处理该请求;并通过Servlet Response对象向客户返回响应信息。如果请求的Servlet中含有访问数据库的操作,则还要通过相关的JDBC程序建立与数据库的连接。
(4)Servlet将响应信息送回|Web服务器。
(5)Web服务器再将Servlet送来响应信息与原有的HTML内容合并后发送到客户端浏览器上。
2、简述Servlet的主要功能?
Servlet的主要功能是处理Web请求,动态产生HTML页面。它的功能涉及范围很广,例如:
(1)创建并返回一个包含基于客户请求性质的、动态内容的、完整的HTML页面。
(2)创建可嵌入到现有HTML页面中的一部分HTML页面(HTML片段)。
(3)处理多个客户机的连接,接受多个客户机的输入,并将结果广播到多个客户机上。
(4)可以与其他服务器资源(包括数据库和基于Java的应用程序)进行通信,转交请求给其它服务器或Servlet,按照任务类型或组织范围,允许在几个服务器中划分逻辑上的服务器。
(5)Servlet开发人员可以定义彼此之间协同工作的激活代理,每个代理都是一个Servlet,代理者之间可以传送数据。
3、Servlet的生命周期包括哪几部分?说明每一部分的具体功能。
Servlet的生命周期包括三部分:装载Servlet、处理客户请求和结束Servlet。
(1)装载Servlet
Web服务器创建一个Servlet对象,并调用这个对象的init()方法进行初始化。
装载Servlet的时机:配置了自动装载选项并启动服务器、首次向Servlet发送请求、重新装载。
执行init()方法时,服务器会创建ServletConfig对象并传递给该方法,这个对象保存在Servlet中直到Servlet被销毁。服务器只会调用一次init()方法,如果有新的请求不再调用init(),直接调用下面提到的service()方法。
(2)处理客户请求
Servlet初始化结束后,Servlet接受服务器传来的请求,调用service()方法处理客户请求。
service()方法被调用时,首先通过传入的ServletRequest对象来获取请求信息,再根据请求的类型调用相应的服务功能(缺省的服务功能是调用与Http请求的方法相应的do功能),最后通过传入的ServletResponse对象将响应传送到Web服务器,与原有HTML内容合并后由Web服务器发送给客户端。
Servlet的响应类型:可解析的输出流、HTTP错误响应重定向到其他路径
(3)结束Servlet
当Web服务器要卸载Servlet或重新装载时,服务器会调用destroy()方法从内存中删除servlet。
4、Servlet的基本结构是怎样的?有哪些成员方法?如何编写一个Servlet?如何调用?
与Servlet相关的两个包:javax.servlet、javax.servlet.http。javax.servlet包提供了控制Servlet生命周期所必需的Servlet接口,javax.servlet.http包提供了从Servlet接口派生出的专门用于处理HTTP请求的抽象类和一般的工具类。Servlet的基本结构如下图。
HttpServlet类有如下的成员方法,开发者继承HttpServlet类时,必须重载至少一种方法,其中doGet()方法和doPost()方法比较常用。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
定义一个Servlet的步骤:
第一步,导入javax.servlet包和javax.servlet.http包;
第二步,继承HttpRequest类并重写至少一种上述成员方法;
第三步,在web.xml中配置servlet-mapping。
在新版本的tomcat中可以使用注解方式,注解方式为:
@WebServlet(name=“ServletDemo” urlPattern="/servlet/ServletDemo"),其中name等同于servlet标签中的servlet-name,urlPattern等同于servlet-mapping标签中的url-pattern。使用Servlet注解将成为配置Servlet的趋势
public class ServletDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
System.out.println("username = " + username);
String password = request.getParameter("password");
System.out.println("password = " + password);
String address = request.getParameter("address");
System.out.println("address = " + address);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
<servlet>
<description>Just a descriptiondescription>
<display-name>Just display somethingdisplay-name>
<servlet-name>ServletDemoservlet-name>
<servlet-class>cn.ljh.ServletDemoservlet-class>
servlet>
<servlet-mapping>
<servlet-name>ServletDemoservlet-name>
<url-pattern>/ServletDemourl-pattern>
servlet-mapping>
调用Servlet的多种方式:浏览器地址栏输入url直接调用、通过表单的action属性、利用超链接访问Servlet、在JSP页面中调用。
5、简述JSP+JavaBean模式和JSP+JavaBean+Servlet模式之间的主要区别。
JSP+JavaBean模式:当浏览器发出请求时,JSP接受请求并访问JavaBean。若需要访问数据库或后端服务器时,则通过Javabean连接数据库或后端服务器,进行相应的处理。JavaBean将处理的结果数据提交给JSP。JSP提取结果并重新组织后,动态产生HTML页面,返回给浏览器。用户从显示的页面中得到交互的结果。该模式充分利用了JSP技术易于开发动态网页的特点,页面显示层的任务由JSP承担(也含有事务逻辑层的内容),JavaBean主要负责事务逻辑层和数据层的工作。
JSP+Servlet+JavaBean模式:采用了基于MVC(Model-View-Controller)的设计模式,将Web应用的功能分为三个层次,即Model(模型)层、View(视图)层、Controller(控制)层。模型层用来实现事务逻辑,包含了Web应用程序的核心,负责存储与应用程序相关的数据;视图层负责用户界面的显示,它可以访问模型的数据,但不能改变这些数据;控制层主要负责视图层和模型层之间的控制关系。具体实现时,JavaBean作为模型层,Servlet作为控制层,JSP作为视图层。每层的作用如下:
(1)JavaBean作为模型层,实现各个具体的应用逻辑和功能;
(2)Servlet作为控制层,负责处理Http请求,包括数据的检查与转换、JavaBean或对象的初始化、数据库访问、根据不同分支和执行的结果转发到新的路径;
(3)JSP作为用户界面程序,负责生成交互后的界面。它主要通过信息共享获取Servlet生成的对象或JavaBean,从中取出相关数据,插入到HTML页面中。
这种设计模式通过JSP与Servlet的合作来实现交互处理,很好地实现了表示层、事务逻辑层和数据层的分离。
两种模式的比较:
(1)处理流程的主控部分不同,模式Ⅰ利用JSP作为主控部分,将请求、JavaBean、JSP页面有效地衔接起来,模式Ⅱ则通过Servlet实现。
(2)实现表示层、事务逻辑层和数据层的分离程度不同,模式Ⅱ分离得更加彻底,模式Ⅰ中的JSP页面部分承担了事务逻辑层的功能。
(3)适用于动态交互处理的需求不同。事务逻辑比较复杂时需要将表示层与事务逻辑层分离得彻底一些,采用模式Ⅱ;如果事务逻辑比较简单,那么就没有必要使用Servlet了。
6、在doPost()方法或doGet()方法中如何转发或重定向到另一个路径?
使用response.sendRedirect()方法实现页面重定向,使用RequestDispatcher对象实现页面的转发。
response.sendRedirect("index.jsp");
ResquestDispatcher requestDispatcher = request.getRequestDispatcher("index.jsp");
requestDispatcher.forward(request,response);
注意,只有在尚未向客户端输出响应时才可以调用forward()方法;调用forward()方法时,如果页面缓存不为空,则在转发前将自动清空缓存,否则将抛出一个IllegalStateException异常。
7、如何实现Servlet的会话跟踪?
要想实现会话跟踪就要想方设法得到session对象,在Servlet中可以调用request.getSession(true)获得HttpSession对象(true表示如果当前session不存在则新创建一个,如果传入false则返回null)。同样该方法需要在尚未向客户端输出响应之前调用,否则如果Servlet容器正在使用cookies维持session的完整性的同时被要求创建一个新session会抛出IllegalStateException异常。
HttpSession session = request.getSession(true);
session.setAttribute("name","崔尚森");
System.out.println(session.getAttribute("name"));
8、什么是cookie?如何利用cookie来实现会话追踪?
Cookie:
(1)Http协议本身是无连接的,它无法存储一个session的信息使得这些信息对后续会话也有效。如果服务器能够在能够在当前会话的不同请求之间以及同一客户在当前会话和后续会话发生的其他请求之间建立联系会非常有用,Cookie就是为了实现这一功能而被设计出来的。
(2)Cookie的两个常用用途是进行会话跟踪和页面的个性化配置。
(3)Cookie提供了一种通用的方法为浏览器系统自身存储会话信息,当浏览器向同一服务器发起请求时,cookie的值也会被发送给服务器。
(4)Cookie是个小信息对象,由一个名称和文本值组成,由服务器上的某个软件系统创建。
Servlet对cookie的支持:
(1)在服务器端,对应于一个Servlet的Java cookie是Cookie类的一个对象;在客户端cookie只是一个文本形式的数据值。
(2)Cookie对象常用的数据成员:用于存储cookie的生命周期或最长存在时间的数据成员、用于存储cookie名称和值的字符串的数据成员、以及用来说明该cookie用途的注释字符串。
(3)Cookie对象常用的方法:setComment(String)、setMaxAge(int)、setValue(String)、getComment()、getMaxAge()、getName()、getValue()。
(4)创建cookie:
Cookie cookie = new Cookie("name","崔尚森");
默认情况下cookie的生存期从创建那一刻直至当前会话结束,调用setMaxAge(int)可以设置cookie的最长生存周期。
(5)添加Cookie:
response.addCookie(cookie);
注意必须在尚未向客户端输出响应之前调用addCookie()方法。
(6)获得cookie的值:
Cookie[] cookies = request.getCookies();
第十章 JSP中的文件操作(略,参考Java基础)
第十一章 XML简介(待续)