JavaWeb及其框架技术 课件 第3-5章 JSP与JavaBean、Servlet基础、会话及会话技术_第1页
JavaWeb及其框架技术 课件 第3-5章 JSP与JavaBean、Servlet基础、会话及会话技术_第2页
JavaWeb及其框架技术 课件 第3-5章 JSP与JavaBean、Servlet基础、会话及会话技术_第3页
JavaWeb及其框架技术 课件 第3-5章 JSP与JavaBean、Servlet基础、会话及会话技术_第4页
JavaWeb及其框架技术 课件 第3-5章 JSP与JavaBean、Servlet基础、会话及会话技术_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章JSP与JavaBean理解什么是JavaBean掌握两种JavaBean的封装类掌握在JSP页面上如何使用JavaBean掌握<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>动作的用法学习目标JavaBean是Java开发语言中一个可以重复使用的软件组件,本质上是一种特殊的Java类,它通常具有如下特点。(1)JavaBean的类必须是公共的(public)。(2)它必须具有一个公共的、无参的构造方法。(3)属性必须私有的(private)。(4)可以有一系列的获取方法(getter)或设置方法(

setter)去获取或设置JavaBean的属性,通常属性名的首字母应大写。

(5)对于boolean类型的成员变量,允许使用is方法代替上面的get方法。3.1JavaBean的定义JavaBean可分为两种:一种是传统应用中用于实现用户界面(UI,UserInterface)的JavaBean;还有一种是主要负责封装数据或封装业务的JavaBean,在Web应用程序中使用的JavaBean就是这种。3.2.1封装数据的JavaBean封装数据的JavaBean负责数据的存取,需要设置多个属性及其属性值的存取方法。如果属性名字是Xxx,则getXxx方法用于获取属性值;setXxx

用于设置或更改属性值。3.2两种JavaBean的封装类3.2.1封装数据的JavaBean例3-1定义一个简单的JavaBean。新建一个名为javaWeb的Web项目,在javaWeb工程的文件夹src中创建一个名为model的包,在包下定义一个名为User的类,这就是一个JavaBean,此类中定义了五个属性:userId、userName、password、role、status,并提供了公共的setter方法和getter方法供外界访问这些属性。代码如下。3.2两种JavaBean的封装类3.2.1封装数据的JavaBean3.2两种JavaBean的封装类packagemodel;

publicclassUser{

privateintuserId;

privateStringuserName;

privateStringpassword;

privateintrole;//角色1普通2管理员

privatebooleanstatus;

publicintgetUserId(){

returnuserId;

}

publicvoidsetUserId(intuserId){

this.userId=userId;

}

publicStringgetUserName(){

returnuserName;

}

publicvoidsetUserName(StringuserName){

this.userName=userName;

}

publicintgetRole(){

returnrole;

}

publicvoidsetRole(introle){

this.role=role;

}

publicbooleangetStatus(){

returnstatus;

}

publicvoidsetStatus(booleanstatus){

this.status=status;

}

publicStringgetPassword(){

returnpassword;

}

publicvoidsetPassword(Stringpassword){

this.password=password;

}

publicStringtoString(){//列出部分数据

return""+userId+","+userName+","+password+"\n";

}

}3.2.2封装业务的JavaBean封装业务的JavaBean是完成一定运算和操作功能的业务类,主要包含一些实现特定功能的方法,通常与一个封装数据的JavaBean对应。就上述封装数据的JavaBean来说,封装业务的JavaBean用于操作封装数据。比如要将表单中的用户输入的值送入数据库中相应的字段,或者将数据库中的字段值取出并显示到网页中,此时需要一个专门的JavaBean与封装数据的JavaBean配合完成操作。3.2两种JavaBean的封装类3.2.2封装业务的JavaBean例3-2定义封装业务的JavaBean,负责数据库连接及数据库中数据操作的业务流程(1)在sample的数据库中创建一个名为userinfo的表,表结构如下图所示。(2)向该表中插入若干条数据。(3)在javaWeb工程的文件夹src中创建一个名为util的包,在包下定义一个名为ConnectionManager的类,详细代码见教材例3-2。3.2两种JavaBean的封装类3.2.2封装业务的JavaBean例3-2定义封装业务的JavaBean,负责数据库连接及数据库中数据操作的业务流程(4)在javaWeb工程的文件夹src中创建一个名为dao的包,在包下定义一个名为UserDao的类,详细代码见教材例3-2。主要封装的方法如下图:3.2两种JavaBean的封装类类:UserDAOintaddUserifno(Useruser)intdelUserinfo(intid)updateUserifno(Useruser)List<User>findByUserName(StringuserName)List<User>listAll()UserfindByUserId(intid)UserfindByLoginname(StringuserName)在JSP的开发中使用JavaBean可以减少重复代码,使整个JSP代码的开发更简洁。JSP提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为<jsp:useBean>标签、<jsp:setProperty>标签和<jsp:getProperty>标签。<jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。<jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。3.3JavaBean在JSP中的应用3.3.1<jsp:useBean>标签<jsp:useBean>

标签用于在JSP页面中查找或实例化一个JavaBean组件,语法格式:<jsp:useBeanid="JavaBean实例名"class="类名”scope=”范围”/>属性id表示定义的JavaBean的实例名,属性class表示定义的JavaBean类名。属性scope是定义的JavaBean实例的作用域,可有4个取值,分别对应4个范围:Page:表示JavaBean实例在当前页面有效。Application:表示JavaBean实例在项目的各个页面都有效。session:表示JavaBean实例在本次的会话中有效。request:表示JavaBean实例在本次的请求中有效。当定义了一个JavaBean时就可以为其属性赋值,可以使用<jsp:setProperty>动作来设置或修改JavaBean的属性值,也可以使用<jsp:getProperty>动作来获取属性的值。3.3JavaBean在JSP中的应用3.3.2<jsp:setProperty>通过使用<jsp:setProperty>,为已经实例化的JavaBean的属性赋值,语法格式:<jsp:setPropertyname="JavaBean实例名"property="属性名"value="属性值"/>当property="*"时,将前端表单的所有标签与JavaBean属性一一对比,若标签的name与属性名相同,则将标签的值赋给JavaBean实例中对应的属性;当property为指定的某个具体属性时,JavaBean实例中只会有该属性被赋值;当property为指定的某个具体属性,value为指定的一个值时,则是给JavaBean实例中的该属性赋指定的这个值,此时前端的对应标签的值不会赋给JavaBean实例的对应属性。3.3JavaBean在JSP中的应用3.3.3<jsp:getProperty>通过使用<jsp:getProperty>可以获取指定的JavaBean的值,语法格式如下:<jsp:getPropertyname=“JavaBean实例名”property=“属性名”/>例3-3将工程JavaWeb的web目录下的index.jsp文件进行修改,代码如下。3.3JavaBean在JSP中的应用<%@pageimport="model.User"%>

<%@pagecontentType="text/html;charset=UTF-8"language="java"%>

<%@pageimport="java.util.*"%>

<html>

<head>

<title>$Title$</title>

<jsp:useBeanid="dao"class="dao.UserDao"scope="request"/>

</head>

<body>

<%

Useruser=dao.findByLoginname("tom");

%>

<inputtype="text"name="userId"value="<%=user.getUserId()%>"/><inputtype="text"name="userName"value="<%=user.getUserName()%>"/><inputtype="text"name="password"value="<%=user.getPassword()%>"/>

$END$

</body>

</html>

在index.jsp页面中使用<jsp:useBean>标签实例化了UserDao对象。启动Tomcat服务器,打开“index.jsp”页面,在该页面的第一个文本框中显示“aaa”;第二个文本框显示表userinfo中是否有username的值为“tom”的记录,若有,则在此文本框中显示“tom”,若没有,则显示“null”;第三个文本框中显示表userinfo中username的值为“tom”的记录中字段userId、userName及password的值。运行结果如下图所示。3.3JavaBean在JSP中的应用3.3.3<jsp:getProperty>例3-33.4用户信息管理示例

前面封装了数据实体类User与数据访问类UserDao,如何在页面中使用这些对象?我们来做一个JSP与JavaBean结合使用的示例。例3-4在JSP页面中实现对数据表中的数据进行增加、删除、修改及查询操作。详细步骤见教材例3-43.5MVC设计模式

MVC(ModelViewController)是XeroxPARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,指的就是模型-视图-控制器。MVC是Model、View、Controller三个单词首字母的缩写。它是一种成熟的设计模式,并不是Java平台独有的,它将一个应用程序在逻辑上视为三层:负责用户界面的为视图层(View),负责程序流程控制的为控制器(Controller),负责对数据进行建模的为模型(Model),如下图所示。3.5MVC设计模式在JavaWeb的开发设计中,产生了一些设计模式,最典型的就是“JSP+JavaBean”的模式,这种模式将显示和业务逻辑分开。JSP作为视图层,实现流程控制和页面显示,提供页面为用户展示数据,并接受用户请求和调用JavaBean组件来响应用户的请求。JavaBean对象既可以封装数据,又可以处理业务逻辑,主要适合小型Web项目的快速开发。“JSP+JavaBean”的工作原理如下图所示。3.5MVC设计模式“Servlet+JSP+JavaBean”的模式,这是MVC设计模式的一种实现。主要思想是用一个或多个Servlet作为控制器,请求由Servlet接收后,经Servlet处理后再转发给JSP页面。在Servlet作为控制器时,每个Servlet只完成某一个功能,但多个Servlet组合起来就可以完成复杂的功能,这样提高了代码的可重用性。在此模式中,JavaBean的功能其实很单一,它只是充当数据实体对象,用来在M、V、C三个组件之间进行数据传输。MVC的核心是Servlet,JSP只负责输入、输出,它只是一个负责数据显示或传递的工具,至于什么时候显示数据,什么时候输入数据则由控制器Servlet来决定。MVC的工作原理如下图所示。本章主要讲解了JavaBean在JSP中的应用,首先介绍了JavaBean的定义,其次介绍了两种JavaBean的封装类及语法规则,并介绍了JavaBean在JSP中的使用,并给出用户信息管理示例,最后介绍了MVC设计模式。3.6本章小结第4章Servlet编程基础学习目标掌握Servlet接口及其实现类理解Servlet的执行流程和生命周期掌握Servlet的使用和虚拟路径映射的配置掌握Request对象的概念与使用掌握Response对象的概念与使用掌握如何解决请求与响应过程中的中文乱码问题掌握如何实现请求转发与请求重定向能够实现用户管理系统后端增加、修改和删除的功能Servlet是使用Java语言编写的运行在服务器端的程序。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。作用:Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等方法。4.1Servlet的定义及作用Servlet由Servlet容器提供,所谓的Servlet容器是指提供了Servlet功能的服务器(本书中指Tomcat),Servlet容器将Servlet动态的加载到服务器上。Servlet的请求首先会被HTTP服务器接收,HTTP服务器只负责静态HTML页面的解析。Servlet的请求转交给Servlet容器,Servlet容器会根据web.xml文件中的映射关系,调用相应的Servlet。Servlet将处理的结果返回给Servlet容器,并通过HTTP服务器将响应传输给客户端。

Servlet应用程序的体系结构4.1Servlet的定义及作用性能好:因为Servlet在Web服务器的地址空间内执行,这样它就没有必要再创建一个单独的进程来处理每个客户端请求。而且它为每个请求创建一个线程,而不是进程。可移植:因为它使用java语言,独立于平台。安全:Servlet由JVM管理,所以不需要担心内存泄漏、垃圾收集等。可用:Java类库的全部功能对Servlet来说都是可用的。

Servlet的特点Servlet的特点除了上述几点外,Servlet还具有功能强大、能够在各个程序之间共享数据、安全性强等特点。4.1Servlet的定义及作用4.2.1 Servlet接口及其实现类voidinit(ServletConfigconfig)ServletConfiggetServletConfig()StringgetServletInfo()void

service(ServletRequestreq,ServletResponseres)void

destroy()4.2Servlet开发入门4.2.2 体系结构图4-2Servlet的继承结构创建Servlet文件1编译Servlet文件2查找Servlet的JAR包3引入Servlet的JAR包4重新编译Servlet5将编译后的.class文件添加到服务器6创建web.xml文件7运行服务器,查看结果8带领大家编写一个程序4.2.3Servlet继承GenericServlet类的实现HttpServlet类的常用方法protected

voiddoGet(HttpServletRequestreq,HttpServletResponseresp)protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)protectedvoiddoPut(HttpServletRequestreq,HttpServletResponseresp)4.2.4 Servlet继承HttpServlet类的实现重写的doGet()方法重写的doGet()方法配置RequestMethodServlet的映射路径重新编译Servlet将编译后的.class文件添加到服务器运行服务器,查看结果重写doPost()方法重写的doPost()方法配置RequestMethodServlet的映射路径重新编译Servlet将编译后的.class文件添加到服务器运行服务器,查看结果两种实现方法4.2.4 Servlet继承HttpServlet类的实现客户端Servlet容器Servlet1、发送请求2、解析请求3、创建Servlet实例对象4、调用init()方法5、调用service()方法6、输出响应消息7、返回响应8、调用destory()方法初始阶段运行阶段销毁阶段4.2.5Servlet的生命周期和工作流程Servlet的生命周期Servlet的工作流程容器中Servlet的工作流程如下。将请求与web.xml文件中的servlet进行映射。为请求创建请求和响应对象。调用线程上的service方法。公共service方法内部调用受保护的service方法。受保护的service方法根据请求的类型调用doXxx方法。doXxx方法生成响应,并将其传递给客户端。发送响应后,Web容器将删除请求和响应对象。4.2.5Servlet的生命周期和工作流程4.3Servlet部署4.3.1web.xml文件配置部署方式<servlet></servlet>标记示例如下。<servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>info.firstapp.servlet.HelloWorldServlet</servlet-class></servlet><servlet-mapping></servlet-mapping>标记示例如下。<servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/HelloWorldServlet</url-pattern></servlet-mapping><servlet>

<servlet-name>TestServlet01</servlet-name>

<servlet-class>info.servlet.TestServlet01</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>TestServlet01</servlet-name>

<url-pattern>/TestServlet01</url-pattern>

</servlet-mapping>例4-3Web.xml文件配置方式演示1.TestServlet01.java文件,用于测试。2.然后在项目的web.xml文件中填入配置内容,如下所示。4.3.2 Annotation配置部署方式对于同一个TestServlet01,若采用注解方式,则只需要在TestServlet01定义的语句前加一句注解即可,将例4.3中的代码修改如下。@WebServlet(name=”TestServlet01”,urlPatterns={“/TestServlet01”})

publicclassTestServlet01extendsHttpServlet{

protectedvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,IOException{

PrintWriterout=response.getWriter();

out.println("HelloServlet!");

}

protectedvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,IOException{

this.doGet(request,response);

}}name=””的作用等价于<servlet-name></servlet-name>;urlPattern={“”}的作用等价于<url-pattern></url-pattern>。所以使用注解方式同样可以完成部署。注解@WebServlet(name=”TestServlet01”,urlPatterns={“/TestServlet01”})其实可以简化,name参数用于定义Servlet的名字,方便在web.xml文件中查找对应的Servlet实现类,而在注解方式中name参数并不必需(可以省略),因为注解正位于它说明的Servlet实现类的前一行,所以可以省略,这样,注解配置就可以修改为如下形式。@WebServlet(urlPatterns={“/TestServlet01”})如果注解中仅有一个参数,那么可以省略参数名而仅保留参数值,因此注解还可以进一步简化为@WebServlet(“/TestServlet01”)4.3.2 Annotation配置部署方式多重映射Servlet的多重映射是指同一个Servlet可以被映射成多个虚拟路径,客户端可以通过多个路径实现对同一个Servlet的访问。例如,在前一个例子(例4-3)中,我们修改注解为@WebServlet(urlPatterns={"/TestServlet01","/Test01"}),那么在浏览器中输入地址“http://localhost:8080/chapter04/TestServlet01”和“http://localhost:8080/chapter04/Test01”结果相同,说明的确实现了多重映射。4.3.2 Annotation配置部署方式通配符映射开发者有时希望某个目录下的所有路径都可以访问同一个Servlet,这时就需要在Servlet映射的路径中使用通配符“*”,当客户端访问一个Servlet时,如果请求的URL地址能够匹配多个虚拟路径,那么Tomcat将采取最具体的匹配原则查找与请求最接近的虚拟路径,匹配过程涉及到两个路径,所请求的路径称为访问路径,所配置的虚拟路径称为配置路径,路径匹配也就是将访问路径映射为配置路径,其匹配原则依次如下。精确匹配配置路径:@WebServlet(urlPatterns={“/TestServlet01”})

访问路径:http://localhost:8080/chapter04/TestServlet01目录匹配在特定的目录下使用通配符,格式为“/目录名/*”,可以匹配此目录下任意文件的访问路径。扩展名匹配格式为“*.扩展名”,可以匹配任意以“扩展名”结尾的访问路径。任意匹配当我们在注解中配置“/*”时意味着对此项目虚拟路径的任意访问都匹配,4.3.2 Annotation配置部署方式缺省映射如果某个Servlet的映射路径仅仅是“/”,那么这个Servlet就是当前Web应用的缺省Servlet,Servlet服务器在接收到访问请求时,若找不到匹配的Servlet,就会将访问请求交给缺省Servlet处理,也就是说,缺省Servlet用于处理其他Servlet都不处理的访问请求,4.3.2 Annotation配置部署方式Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web服务器在调用service()之前,都会创建两个对象,分别是HttpServletRequest和HttpServletResponse。简介HTTP请求消息HTTP请求消息创建创建读取响应数据调用Servlet从HttpServletRequest对象读取数据将响应数据写入HttpServletResponse对象浏览器访问Servlet过程4.4请求和响应请求行请求消息头请求消息体获取请求行信息的方法获取请求消息体的方法获取请求消息头的方法在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法4.4.1HttpServletRequest对象方法声明功能描述StringgetMethod()该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)StringgetRequestURI()

该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的部分StringgetQueryString()

该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容StringgetProtocol()

该方法用于获取请求行中的协议名和版本,例如,HTTP/1.0或HTTP/1.1StringgetContextPath()

该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以“/”开头,表示相对于整个WEB站点的根目录,路径结尾不含“/”。如果请求URL属于WEB站点的根目录,那么返回结果为空字符串("")StringgetServletPath()

该方法用于获取Servlet的名称或Servlet所映射的路径StringgetRemoteAddr()

该方法用于获取请求客户端的IP地址,其格式类似于“”StringgetRemoteHost()

该方法用于获取请求客户端的完整主机名,其格式类似于“”。需要注意的是,如果无法解析出客户机的完整主机名,该方法将会返回客户端的IP地址方法声明功能描述intgetRemotePort()

该方法用于获取请求客户端网络连接的端口号StringgetLocalAddr()

该方法用于获取Web服务器上接收当前请求网络连接的IP地址StringgetLocalName()

该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名int

getLocalPort()

该方法用于获取Web服务器上接收当前网络连接的端口号StringgetServerName()

该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分intgetServerPort()

该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分StringgetScheme()

该方法用于获取请求的协议名,例如http、https或ftpStringBuffergetRequestURL()

该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改1.获取请求行消息的相关方法请求行包含三部分内容,分别是请求方式、请求资源路径、HTTP协议及版本,对于这三部分内容,request对象提供了对应的API方法来获取,其中比较常用的方法如下。(1) 获取请求方式,图4-26中的请求方式是GET,用下面的方法完成StringgetMethod()(2) 获取虚拟目录(项目访问路径),图4-26中的虚拟目录是/request-demo,用下面的方法完成StringgetContextPath()(3) 获取URL(统一资源定位符),图4-26中的URL是http://localhost:8080/request-demo/req1,用下面的方法完成StringBuffer

getRequestURL()(4) 获取URI(统一资源标识符):图4-26中的URI是/request-demo/req1,用下面的方法完成StringgetRequestURI()(5) 获取请求参数(GET方式):图4-26中的请求参数是username=zhangsan&password=123,用下面的方法完成StringgetQueryString()1.获取请求行消息的相关方法方法声明功能描述StringgetHeader(Stringname)

该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值EnumerationgetHeaders(Stringname)

该方法返回一个Enumeration集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。在多数情况下,一个头字段名在请求消息中只出现一次,但有时候可能会出现多次EnumerationgetHeaderNames()

该方法用于获取一个包含所有请求头字段的Enumeration对象intgetIntHeader(Stringname)

该方法用于获取指定名称的头字段,并且将其值转为int类型。需要注意的是,如果指定名称的头字段不存在,返回值为-1;如果获取到的头字段的值不能转为int类型,将发生NumberFormatException异常longgetDateHeader(Stringname)

该方法用于获取指定头字段的值,并将其按GMT时间格式转换成一个代表日期/时间的长整数,这个长整数是自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值StringgetContentType()

该方法用于获取Content-Type头字段的值,结果为String类型intgetContentLength()

该方法用于获取Content-Length头字段的值,结果为int类型StringgetCharacterEncoding()

该方法用于返回请求消息的实体部分的字符集编码,通常是从Content-Type头字段中进行提取,结果为String类型2.获取请求头的相关方法3.获取请求消息体方法浏览器在发送GET请求时是没有请求体的,所以需要把请求方式变为POST,对于请求体中的数据,Request对象提供了以下两种方式来获取其中的数据。(1)获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用方法ServletInputStream

getInputStream(),该方法也可以获取字节。(2)获取字符输入流,如果前端发送的是纯文本数据,则使用方法BufferedReader

getReader()。响应状态码响应消息头响应消息体获取响应状态码的方法获取响应消息体的方法获取响应消息头的方法在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。4.4.2HttpServletResponse对象该方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而HTTP版本由服务器确定,因此,只要通过setStatus(intstatus)方法设置了状态码,即可实现状态行的发送。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。setState(intstatus)方法该方法用于发送表示错误信息的状态码,例如,404状态码表示找不到客户端请求的资源。在response对象中,提供了两个重载的sendError(int

sc)方法,具体如下:setError(intsc)方法publicvoidsendError(intcode)throwsjava.io.IOExceptionpublicvoidsendError(intcode,Stringmessage)throwsjava.io.IOException1.发送状态码相关的方法设置响应消息头字段的方法方法声明功能描述voidaddHeader(String

name,String

value)

这两个方法都是用来设置HTTP协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段voidsetHeader(String

name,String

value)voidaddIntHeader(Stringname,intvalue)这两个方法专门用于设置包含整数值的响应头。避免了使用addHeader()与setHeader()方法时,需要将int类型的设置值转换为String类型的麻烦voidsetIntHeader(String

name,int

value)voidsetContentLength(int

len)

该方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值用于设置各种头字段方法声明功能描述voidsetContentType(Stringtype)

该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8voidsetLocale(Localeloc)

该方法用于设置响应消息的本地化信息。对HTTP来说,就是设置Content-Language响应头字段和Content-Type头字段中的字符集编码部分。需要注意的是,如果HTTP消息没有设置Content-Type头字段,setLocale()方法设置的字符集编码不会出现在HTTP消息的响应头中,如果调用setCharacterEncoding()或setContentType()方法指定了响应内容的字符集编码,setLocale()方法将不再具有指定字符集编码的功能voidsetCharacterEncoding(Stringcharset)

该方法用于设置输出内容使用的字符编码,对HTTP协议来说,就是设置Content-Type头字段中的字符集编码部分。如果没有设置Content-Type头字段,setCharacterEncoding方法设置的字符集编码不会出现在HTTP消息的响应头中。setCharacterEncoding()方法比setContentType()和setLocale()方法的优先权高,它的设置结果将覆盖setContentType()和setLocale()方法所设置的字符码表可以有效解决乱码问题2.发送响应消息头相关的方法该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。getOutputStream()方法该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。getWriter()方法3.发送响应消息体相关的方法4.5获取请求参数的通用方式4.5.1请求参数什么是请求参数?为了能更好地回答上述两个问题,我们以用户登录为例,用户想要登录网址,需要进入登录页面,在登录页面输入用户名和密码,并将其提交到后台,后台会校验用户名和密码是否正确,若正确,则正常登录,若不正确,则提示用户名或密码错误,在此例中,用户名和密码其实就是我们所说的请求参数。什么是请求数据?请求数据是包含请求行、请求头和请求体的所有数据。请求参数和请求数据的关系是什么?请求参数是请求数据中的部分内容,若是GET请求,则请求参数在请求行中;若是POST请求,则请求参数一般在请求体中对于请求参数的获取,有以下两种常用方式。GET方式,可以使用以下方法获取请求参数:StringgetQueryString()POST方式,可以使用以下方法获取请求参数:BufferedReader

getReader();4.5.2StringgetQueryString()方法和BufferedReader

getReader()方法方法声明功能描述StringgetParameter(Stringname)该方法用于获取某个指定名称的参数值,如果请求消息中没有包含指定名称的参数,getParameter()方法返回null;如果指定名称的参数存在但没有设置值,则返回一个空串;如果请求消息中包含有多个该指定名称的参数,getParameter()方法返回第一个出现的参数值String[]getParameterValues(Stringname)HTTP请求消息中可以有多个相同名称的参数(通常由一个包含有多个同名的字段元素的FORM表单生成),如果要获得HTTP请求消息中的同一个参数名所对应的所有参数值,那么就应该使用getParameterValues()方法,该方法用于返回一个String类型的数组EnumerationgetParameterNames()getParameterNames()方法用于返回一个包含请求消息中所有参数名的Enumeration对象,在此基础上,可以对请求消息中的所有参数进行遍历处理MapgetParameterMap()getParameterMap()方法用于将请求消息中的所有参数名和值装入进一个Map对象中返回获取请求参数的方法4.5.3通用请求参数获取方法4.5.4通过Request对象传递数据setAttribute()方法该方法用于将一个对象与一个名称关联后存储到ServletRequst对象中,语法格式如下。publicvoidsetAttribute(java.lang.String

name,java.lang.Objecto);这里name为属性的名称,o为属性的值对象,若ServletRequst对象中已经存在指定名称的属性,则方法会先删除原来的属性,再添加新的属性。若传递给setAttribute()方法的属性值对象为null,则删除指定名称的属性,此时等效于removeAttribute()方法getAttribute()方法该方法用于从ServletRequst对象中返回指定名称的属性值对象,语法格式如下。publicjava.lang.String

getAttribute(java.lang.Stringname);removeAttribute()方法该方法用于从ServletRequst对象中删除指定名称的属性,语法格式如下。publicvoidremoveAttribute(java.lang.Stringname);getAttribuiteNames()方法该方法用于返回一个包含ServletRequst对象中所有属性名的Enumeration对象,通过此对象,我们可以对ServletRequst对象中的所有属性进行遍历处理。4.6响应信息中文乱码输出问题和请求信息中文请求参数乱码问题4.6.1 响应信息中文乱码输出问题(1)第1种方式。response.setCharacterEncoding("utf-8");//设置响应对象使用utf-8编码response.setHeader("Content-Type","text/html;charset=uft-8");//通知浏览器(2)第2种方式。response.setContentType("text/html;charset=utf-8");//包含第1种方式两个功能第2种方式将第1种方式的两条语句用一条语句来实现,功能相同,比较起来更为简洁,通常的情况下多采用第2种方式。4.6.2 请求信息中文请求参数乱码问题为解决请求参数里中文乱码的问题,只要使得字符串的编码和解码采用同一码表就可以达到。HTML页面中的编码默认采用UTF-8编码,兼容中文,不必修改,Tomcat服务器端默认采用ISO-8859-1解码,不兼容中文,所以只要将服务器端的解码修改为同样的UTF-8编码就可以解决问题。在HttpServletRequest接口中,正好提供了一个setCharacterEncoding()方法,可以设置request对象的解码方式,只要将request对象的解码码表设置成和编码码表一致,就可以解决问题。Web服务器接受到客户端的请求后,由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。sendRedirect()方法的工作原理4.7请求重定向和请求转发4.7.1 请求重定向当一个Web资源收到客户端的请求后,如果希望服务器通知另外一个资源去处理请求,这时,除了使用sendRedirect()方法实现请求重定向外,还可以通过RequestDispatcher接口的实例对象来实现。ServletRequest接口中获取RequestDispatcher对象的方法方法声明功能描述RequestDispatchergetRequestDispatcher(Stringpath)返回封装了某个路径所指定资源的RequestDispatcher对象。其中,参数path必须以“/”开头,用于表示当前Web应用的根目录。需要注意的是,WEB-INF目录中的内容对RequestDispatcher对象也是可见的,因此,传递给getRequestDispatcher(Stringpath)方法的资源可以是WEB-INF目录中的文件方法声明功能描述forward(ServletRequestrequest,

ServletResponseresponse)该方法用于将请求从一个Servlet传递给另外的一个Web资源。在Servlet中,可以对请求做一个初步处理,然后通过调用这个方法,将请求传递给其它资源进行响应。需要注意的是,该方法必须在响应提交给客户端之前被调用,否则将抛出IllegalStateException异常include(ServletRequestrequest,

ServletResponseresponse)该方法用于将其它的资源作为当前响应内容包含进来RequestDispatcher对象中的相关方法4.7.2请求转发请求转发原理图4.7.2请求转发请求包含原理图4.7.3请求包含4.7.3路径配置从前面的案例(例4-17和例4-18)中,我们可以看到在转发的时候路径中没有“/chapter04”,而重定向则有,那么到底什么时候需要“/chapter04”,什么时候不需要呢?其实判断的依据很简单,只需要记住下面的规则即可。访问路径如果是提供给浏览器端访问使用:需要加虚拟目录(项目访问路径);而如果访问路径是提供给服务器端访问使用:不需要加虚拟目录。对于转发来说,因为是在服务端进行的,所以不需要加虚拟目录。对于重定向来说,路径最终是由浏览器来发送请求,就需要添加虚拟目录。路径配置中还存在另一个问题,在重定向的代码中,“/chapter04”是固定编码的,如果后期通过Tomcat插件配置了项目的访问路径,那么所有需要重定向的地方都需要重新修改,这个工作量很大,容易导致不一致现象而引发错误,那么是否存在优化方法呢?

答案也比较简单,我们可以在代码中动态获取项目访问的虚拟目录,具体地,我们可以借助request对象中的getContextPath()方法来获取,修改前面示例(例4-17)代码中对response.sendRedirect()方法的调用,修改后的代码如下。StringcontextPath=request.getContextPath();

response.sendRedirect(contextPath+"目标资源URL");如何获取Servlet的配置信息呢?这是一个Servlet的配置【结论】Servlet的配置信息封装到一个ServletConfig对象中,ServletConfig定义了一系列获取配置信息的方法。4.8.1ServletConfig接口4.8ServletConfig和ServletContextStringgetInitParameter(Stringname)EnumerationgetInitParameterNames()ServletContextgetServletContext()ServletConfig接口中定义的获取配置信息的方法StringgetServletName()4.8.1ServletConfig接口当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用,该对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。No.1No.3读取Web应用下的资源文件No.2实现多个Servlet对象共享数据获取Web应用程序的初始化参数4.8.2ServletContext接口4.9用户管理系统案例的后端实现本章小结本章主要介绍了JavaServlet的基本知识及其接口,HttpServletRequest对象和HttpServletResponse对象的使用。通过本章的学习,读者可以掌握Servlet接口的使用,了解Servlet的生命周期,掌握如何通过HttpServletRequest对象和HttpServletResponse对象与客户端交互信息,并实现请求转发与请求重定向等功能。本章的知识非常重要,为后续的JavaWeb奠定了基础。第5章会话及会话技术第5章Servlet的会话技术学习目标了解什么是Cookie,掌握Cookie对象了解什么是Session,掌握Session对象学会使用Session对象改进用户管理系统了解URL重写技术案例两个人打电话两个人你问我答的过程就是一个会话5.1 会话跟踪技术的概述一个用户在某网站上的整个购物过程就是一个会话Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程。在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。5.1 会话跟踪技术的概述当用户通过浏览器访问服务器,需要服务器跟踪用户的状态时,这种跟踪用户信息的技术就称为会话跟踪技术。为什么需要对会话进行跟踪呢?这是由于Web应用采用无状态的HTTP协议进行通信,HTTP的无状态意味着:用户使用HTTP协议不能够记忆用户自己和相应的请求

,服务器把每一次请求都看作新的请求,总是根据当时提交的信息来给出响应,如此一来,服务器就无法跟踪用户的会话,它会将会话中涉及的多次请求都看作新的请求,而不能将这些请求与用户关联起来,也就无法支持用户会话过程的实现。因此,要想实现用户的会话,就需要采用某种会话跟踪技术,记住用户和其请求,将单个无状态的HTTP请求转换为整体有状态的Web应用。会话跟踪技术的原理比较简单,当服务器收到客户端第一次发来的请求时,服务器会生成一个唯一的标识符,即会话ID,客户端随后发送的每一次请求中都必须包含这个会话ID。服务器可以通过该会话ID来识别用户的请求属于哪一个会话,这样就把用户和该用户的一系列请求关联起来,从而实现用户会话跟踪。在实际应用中,我们既可以选择手动生成并管理会话ID(采用Cookie技术、URL重写技术或隐藏表单字段技术来实现),也可以采用Servlet提供的会话跟踪API,自动生成并管理会话ID。手动实现会话跟踪技术,面临大量重复性工作,而且容易出错。为此,Servlet提供的自动会话跟踪方法,HttpSession接口,就非常地方便,利用此接口可以让程序员在更高层次解决问题,从而摆脱底层的复杂操作。Servlet容器负责HttpSession接口的实现,在需要进行会话跟踪的时候,通过调用此接口中相应的方法,Servlet容器会创建会话对象,通过会话对象HttpSession的相应方法可以存取用户的会话ID的相关信息,从而实现会话跟踪。HttpSession底层是基于Cookie技术或URL重写技术实现的,若客户端支持Cookie技术,则优先使用Cookie进行会话跟踪,并不需要直接操纵Cookie对象,若用户端禁用Cookie技术,则自动使用URL重写技术来进行跟踪。什么是Cookie?通过会员卡可以看到用户的信息用户的消费积分会累计到会员卡会员卡用户Cookie的功能类似于这张会员卡。5.2.1 Cookie5.2 浏览器会话Cookie技术看一下Cookie在浏览器和服务器之间的传输服务器第一次访问Server1,不存在Cookie浏览器Cookie存放区第一次访问Server1第1次响应,setCookie:name=value将Server1的Cookie保存起来后续访问Server1:Cookie:name=value后续访问Server1,直接获取Cookie第一次访问服务器,服务器会增加Set-Cookie头字段,将Cookie信息发送给浏览器,并保存在客户端。当后续访问服务器时,会在请求消息中将用户信息以Cookie的形式发送给服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。【结论】5.2.1Cookie在ServletAPI中提供了javax.servlet.http.Cookie类,它包含了生成Cookie信息和提取Cookie信息各个属性的方法。1、构造方法publicCookie(java.lang.Stringname,java.lang.Stringvalue)Cookie的名称Cookie的值注意:Cookie一旦被创建,它的名称就不能更改。5.2.2CookieAPI方法声明功能描述StringgetName()用于返回Cookie的名称voidsetValue(String

newValue)用于为Cookie设置一个新的值StringgetValue()用于返回Cookie的值voidsetMaxAge(int

expiry)用于设置Cookie在浏览器客户机上保持有效的秒数intgetMaxAge()用于返回Cookie在浏览器客户机上保持有效的秒数voidsetPath(String

uri)用于设置该Cookie项的有效目录路径StringgetPath()用于返回该Cookie项的有效目录路径voidsetDomain(String

pattern)用于设置该Cookie项的有效域StringgetDomain()用于返回该Cookie项的有效域voidsetVersion(int

v)用于设置该Cookie项采用的协议版本int

getVersion()用于返回该Cookie项采用的协议版本voidsetComment(String

purpose)用于设置该Cookie项的注解部分StringgetComment()用于返回该Cookie项的注解部分voidsetSecure(boolean

flag)用于设置该Cookie项是否只能使用安全的协议传送boolean

getSecure()用于返回该Cookie项是否只能使用安全的协议传送这两个方法用于设置和返回Cookie在浏览器上保持有效的秒数。如果设置的值为一个正整数时,浏览器会将Cookie信息保存在本地硬盘中。如果设置值为负整数时,浏览器会将Cookie信息保存在的缓存中,当浏览器关闭时,Cookie信息会被删除。如果设置值为0时,则表示通知浏览器立即删除这个Cookie信息。默认情况下,Max-Age属性的值是-1。2、Cookie类的常用方法这两个方法是针对Cookie的Path属性。如果创建的某个Cookie对象没有设置Path属性,那么该Cookie只对当前访问路径所属的目录及其子目录有效。如果想让某个Cookie项对站点的所有目录下的访问路径都有效,应调用Cookie对象的setPath()方法将其Path属性设置为“/”。这两个方法都是用来设置或获取Cookie的Domain属性。具体来说,setDomain方法用于设置Cookie的Domain属性,而getDomain方法用于获取Cookie的Domain属性。默认情况下,Domain属性的值为当前主机名,浏览器在访问当前主机下的资源时,都会将Cookie信息回送给服务器。5.2.2CookieAPI2任务目标:具体实现步骤(详见教材【5-1】)实现步骤:

1创建Servlet配置映射信息,查看运行效果学会如何使用Cookie技术实现显示用户上次的访问时间的功能5.2.3 Cookie实例

显示用户上次访问时间5.2.4 Cookie的原理分析当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于会员信息,ID就相当于会员卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论