第6章 Servlet技术 在Web应用程序开发中,一般由JSP技术、JavaBean技术和Servlet技术的结合实现MVC开发模式。 在MVC开发模式中,将Web程序的组件分为3部分:视图、控制、业务,分别由JSP、Servlet和JavaBean实现。 前几章已经介绍了JSP和JavaBean技术。本章介绍Servlet技术,以及它与JSP、JavaBean技术的集成。
第6章 Servlet技术 6.1 Servlet技术 6.2 Servlet常用对象及其方法 6.3 综合案例—基于Jsp+Servlet的用户登录验证 6.4 在Servlet中使用JavaBean 6.5 Jsp与Servlet的数据共享 6.6 Jsp与Servlet的关联关系 6.7 基于JSP+Servlet+JavaBean实现复数运算 6.8 Cookie管理 本章小结
6.1 Servlet技术 Servlet是用Java语言编写的服务器端程序,是由服务器端调用和执行的、按照Servlet自身规范编写的Java类。 Servlet可以处理客户端传来的HTTP请求,并返回一个响应。本节介绍Servlet的设计方法。 本节主要内容: 6.1.1 Servlet编程接口 6.1.2 设计Servlet
6.1.1 Servlet编程接口 功能 类和接口 Servlet实现 javax.servlet.Servlet,javax.servlet.SingleThreadModel javax.servlet.GenericServlet,javax.servlet.http.HttpServlet Servlet配置 javax.servlet.ServletConfig Servlet异常 javax.servlet.ServletException, javax.servlet.UnavailableException 请求和响应 javax.servlet.ServletRequest,javax.servlet.ServletResponse javax.servlet.ServletInputStream, javax.servlet.ServletOutputStream javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse 会话跟踪 javax.servlet.http.HttpSession, javax.servlet.http.HttpSessionBindingListener javax.servlet.http.HttpSessionBindingEvent Servlet上下文 javax.servlet.ServletContext Servlet协作 javax.servlet.RequestDispatcher 其他 javax.servlet.http.Cookie,javax.servlet.http.HttpUtils
6.1.2 设计Servlet (1)Servlet基本结构
说明: Servlet类需要继承类HttpServlet Servlet的父类HttpServlet中包含了几个重要方法,根据需要重写它们: init():初始化方法,Servlet对象创建后,接着执行该方法。 doGet():当请求类型是“get”时,调用该方法。 doPost():当请求类型是“post”时,调用该方法。 service():Servlet处理请求时自动执行service()方法,该方法根据请求的类型(get或post),调用doGet()或doPost()方法,因此,在建立Servlet时,一般只需要重写doGet()和doPost()方法。 destroy():Servlet对象注销时自动执行。
(2)Servlet建立步骤: Step1:建立Web工程 Step2:建立Servlet 在项目src下创建。 重写Servlet的doGet或doPost方法。 修改web.xml配置文件,注册所设计的Servlet。 Step3:部署并运行Servlet
6.2 Servlet常用对象及其方法 JSP内置对象与Servlet类(接口)的关系 JSP内置对象 Servlet类或接口 out javax.servlet.http.HttpServletResponse 得到PrintWriter类并创建Servlet的out对象 request javax.servlet.http.HttpServletRequest response session javax.servlet.http.HttpSession application javax.servlet.ServletContext config javax.servlet.ServletConfig exception javax.servlet.ServletException
1.javax.servlet.http.HttpServletRequest 类HttpServletRequest的对象对应JSP的request对象, 常用方法: void setCharacterEncoding(): 设置请求信息字符编码,常用于解决post方式下参数值汉字乱码问题。 String getParameter(String paraName):获取单个参数值。 String[] getParameterValues(String paraName): 获取同名的参数的多个值。 Object getAttribute(String attributeName): 获取request范围内属性的值。 void setAttribute(String attributeName,Object object): 设置request范围内属性的值。 void removeAttribute(String attributeName): 删除request范围内的属性。
2.javax.servlet.http.HttpServletResponse 类HttpServletResponse对象对应JSP的response对象, 常用方法: void response.setContentType(String contentType): 设置响应信息类型。 PrintWriter response.getWriter(): 获得out对象。 void sendRedirect(String url): 重定向。 void setHeader(String headerName,String headerValue) 设置http头信息值。
3.javax.servlet.http.HttpSession 类HttpSession的对象对应JSP的session对象,但在Servlet中,该对象需要由request.getSession()方法获得。常用方法: HttpSession request.getSession():获取session对象。 long getCreationTime():获得session创建时间。 String getId():获得session id。 void setMaxInactiveInterval():设置最大session不活动间隔(失效时间),以秒为单位。 boolean isNew():判断是否是新的会话,是返回true,不是返回false。 void invalidate():清除session对象,使session失效。 object getAttribute(String attributeName):获取session范围内属性的值。 void setAttribute(String attributeName,Object object):设置session范围内属性的值。 void removeAttribute(String attributeName):删除session范围内的属性。
4. javax.servlet.ServletContext 类ServletContext的对象对应JSP的application对象,但在Servlet中,该对象需要由this.getServletContext()方法获得。常用方法: ServletContext this.getServletContext(): 获得ServletContext对象。 object getAttribute(String attributeName): 获取应用范围内属性的值。 void setAttribute(String attributeName,Object object): 设置应用范围内属性的值。 void removeAttribute(String attributeName): 删除应用范围内的属性。
6.3 综合案例 —基于Jsp+Servlet的用户登录验证 【例6-1】实现一个简单的用户登录验证程序,如果用户名是abc,密码是123,则显示欢迎用户的信息,否则显示“用户名或密码不正确”。 【分析】 该案例采用JSP页面只完成提交信息和验证结果的显示,而验证过程由Servlet完成,这些组件通过request(或HttpServletRequest)对象实现数据共享。由提交页面将数据传递给Servlet,而Servlet获取数据并实现验证,根据验证结果,转向显示验证结果的页面。
【设计】 根据分析,该系统需要设计3个组件以及修改web.xml文件。 (1)登录表单页面:login.jsp。 (2)处理登录请求并实现验证的Servlet:LoginCheckServlet.java。 (3)显示提示的页面:info.jsp。 (4)修改web.xml,配置Servlet的信息。 假设,组件之间共享数据的参数为:username(用户名称)和userpwd(密码)。
【实现】 (1)登录页面login.jsp (2)处理登录的Servlet:LoginCheckServlet.java (3)修改配置文件: 在web.xml中,添加LoginCheckServlet的配置信息。 (4)显示结果的页面Info.jsp 【运行】《程序执行》
6.4 在Servlet中使用JavaBean Servlet和JavaBean都是类,但JavaBean是供JSP或Servlet调用。 在JSP中使用JavaBean,第5章已经介绍。 在Servlet使用JavaBean有两种方式: 在一个Servlet中单独使用JavaBean。 在Servlet与JSP之间或Servlet之间实现共享的JavaBean。 (1)在一个Servlet中单独使用JavaBean 一般需要完成的操作是: 在Servlet中实例化JavaBean。 通过实例化的对象调用JavaBean方法,完成业务处理,并获得处理结果。 将获得的结果交给Servlet继续处理。 (2)在Servlet与JSP之间或Servlet之间实现共享的JavaBean
6.5 Jsp与Servlet的数据共享 JSP组件之间通过内置对象(request、session和application)实现数据共享。 对于一个Web应用程序,其中的JSP组件与Servlet组件之间可以通过request(HttpServletRequest)、session(HttpSession)和application(ServletContext)实现不同作用范围的数据共享。 本节主要内容: 6.5.1 基于请求的数据共享 6.5.2 基于会话的数据共享 6.5.3 基于应用的数据共享
6.5.1 基于请求的数据共享 请求共享的范围是用户请求访问的当前Web组件以及和当前的Web组件共享同一请求的其他Web组件。 6.5.1 基于请求的数据共享 基于请求的共享就是共享用户的请求数据,请求数据存放在“请求对象”中。 请求共享的范围是用户请求访问的当前Web组件以及和当前的Web组件共享同一请求的其他Web组件。 服务器响应完用户请求后,相应的request对象也会结束其生命周期,request对象占用的内存也会被回收,因此,基于请求的数据共享的效率是比较高的。 请求共享的数据有两类: 请求参数数据 请求属性数据。
(1)请求参数的传递 (2)请求参数的获取 共享请求参数的传递有4种传递方式: 通过表单提交后,由表单action属性指定进入的页面或Servlet,它们所接受的表单数据,就是请求参数数据。 带参数的超链接,所传递的参数也是请求参数。 在地址栏中,输入的参数,也是请求参数。 在jsp中,利用Forward或include动作时,利用参数子动作标签所传递的数据,也是请求参数。 (2)请求参数的获取 在另一个组件内,可以从请求对象内获取请求参数并进行加工处理。通过request/HttpServletRequest的实例,利用getParameter()方法获取,其格式为: String request.getParameter("参数变量名称");
2.共享请求属性数据 对于请求属性数据的共享,需要先保存形成属性值,然后,在另一个组件,再取出该属性的值,经进行处理加工。 (1)请求属性数据的形成与保存 通过request/HttpServletRequest的实例,利用setAttribute()方法形成属性及其属性值并保存,其格式为: request.setAttribute("属性名",对象类型的属性值); (2)请求属性数据的获取 对于请求属性数据在另一个组件中,获取属性数据的格式(注意数据类型): 对象类型 (强制类型转换)request.getAttribute("属性名"); (3)若不想再共享某属性,可从request中删除该属性,删除格式为: request.removeAttribute("属性名");
6.5.2 基于会话的数据共享 1.会话属性数据的形成与保存 6.5.2 基于会话的数据共享 对于会话共享采用的是属性数据共享,其共享过程是:需要先形成属性并保存到会话对象(session)内值,然后,在另一个组件,再取出该属性的值并进行处理加工。 1.会话属性数据的形成与保存 通过session/HttpSession的实例对象,利用setAttribute()方法形成属性及其属性值并保存,其格式为: session.setAttribute("属性名",对象类型的属性值); 注意:对于Servlet组件,需要先获取HttpSession的实例对象,然后再使用setAttribute()方法。 获取HttpSession的实例对象的语句为: HttpSession request.getSession(boolean create) 2.会话属性数据的获取 会话属性数据在另一个组件中,获取属性数据的格式(注意数据类型): 对象类型 (强制类型转换)session.getAttribute("属性名"); 3.删除共享会话属性 若不想再共享某属性,可从session中删除该属性,删除格式为: session/application.removeAttribute("属性名");
6.5.3 基于应用的数据共享 对于基于应用的数据共享与会话数据共享的处理类似。 1.应用属性数据的形成与保存 利用setAttribute()方法形成属性及其属性值并保存,格式: application.setAttribute("属性名",对象类型的属性值); 注意:对于Servlet组件,要首先获取ServletContext的实例对象,其获取方法: ServletContext application=this.getServletContext() 2.应用属性数据的获取 应用属性数据在另一个组件中,获取属性数据的格式: 对象类型 (强制类型转换) application.getAttribute("属性名"); 3.删除共享应用属性 若不想再共享某属性,可从application中删除该属性,删除格式为: application.removeAttribute("属性名");
6.6 Jsp与Servlet的关联关系 JSP和Servlet都是在服务器端执行的组件,两者之间可以互相调用,JSP可以调用Servlet,Servlet也可以调用JSP;同时,一个JSP可以调用另一个JSP,一个Servle也可以调用另一个Servlet。但它们的调用格式是不同的。 1. JSP页面调用Servlet 2. Servlet跳转到JSP页面 3. Servlet调用另一个Servlet 4. JSP跳转到另一个JSP
1、JSP页面调用Servlet 在JSP页面中,通常通过提交表单和超链接两种方式访问Servlet。 (1)通过表单提交调用Servlet <form action="servlet访问地址">……</form> 提示:这里的访问地址是在web.xml中配置的地址。 (2)通过超链接调用Servlet 在JSP网页中,也可以采用超链接调用Servlet,并且也可以给Servlet传递参数,其调用格式: <a href="servlet访问地址">提示信息</a> 或 <a href="servlet访问地址"?要传递的参数>提示信息</a>
2. Servlet跳转到JSP页面 Servlet调用JSP,由两种方式:转向和重定向。 转向:是在一个Web工程内部,各组件之间的调用,在调用时,request对象中的信息不丢失(request对象不消亡),进入另一个组件后,request对象中的数据可以在新组件中继续使用。 重定向:可以在一个Web工程内部,各组件之间实现调用,也可以直接跳转到其他Web工程的JSP页面。并且,在跳转到新组件后,重新创建request对象。
转向与重定向的实现 (1)转向 RequestDispatcher rd=request.getRequestDispatcher("jsp网页") rd.forward(request,response); (2)重定向: response.sendRedirect("JSP网页地址");
3. Servlet调用另一个Servlet 一个Servle调用另一个Servlet,其调用格式同Servlet调用JSP,只是将JSP网页地址更换为Servlet映射地址即可。
4、JSP跳转到另一个JSP 一个JSP跳转到另一个JSP,其跳转方法在地3章中已经详细介绍,请参考第3章中的有关内容。
6.7 基于JSP+Servlet+JavaBean实现复数运算 【例6-2】设计程序完成复数运算,用户在页面上输入两个复数的实部和虚部,并选择运算类型,程序完成复数的指定运算。运行界面如图所示。
【分析】该案例使用JSP、Servlet、JavaBean三种技术集成,实现系统的设计,JSP主要完成信息的提交和显示;Servlet主要完成对请求数据的获取与处理;JavaBean主要用于业务处理并实现数据的存储。 【设计】该程序需要设计: (1)输入表单页面input.jsp:将该页面的请求参数信息,传给Servlet。 (2)接收运算请求的Servlet,CaculateServlet.java:该Servlet接受input.jsp的请求信息,并创建JavaBean对象实例,然后调用JavaBean的业务处理方法,完成业务处理,形成新的结果,并将结果在request范围内实现属性数据共享,然后转向输出信息页面output.jsp。 (3)封装复数运算的JavaBean,Complex.java:该JavaBean有2个属性,并有完成加、减、乘、除的4种业务方法。 (4)显示结果的页面output.jsp:接受Servlet传递的共享数据,并显示。
【实现】 (1)首先编写复数类JavaBean:Complex. java (2)提交信息的页面input 【实现】 (1)首先编写复数类JavaBean:Complex.java (2)提交信息的页面input.jsp,在该页面内需要提交5个参数 (3)实现控制的Servlet:CaculateServlet.java (4)修改web.xml,完成对CaculateServlet.java的配置 (5)显示计算结果的页面:output.jsp 【运行】《执行程序》
6.8 Cookie管理 在Java Web开发中经常用到Cookie对象。Cookie对象是由服务器产生并保存到客户端(内存或文件中)的信息,常用它记录用户个人信息及个性化设置。用户每次访问站点时,Web应用程序都可以读取Cookie包含的信息。例如,当用户访问站点时,可以利用Cookie保存用户首选项或其他信息,这样当用户下次再访问站点时,应用程序就可以检索以前保存的信息。 Cookie对象所属于的类是javax.servlet.http.Cookie,要注意的是它不是JSP的内置对象,在页面中使用时需要通过其构造方法创建。 本节主要内容: 6.8.1 Cookie基本用法 6.8.2 Cookie相关方法 6.8.3 案例—利用Cookie实现自动登录
6.8.1 Cookie基本用法 对于Cookie对象的使用,一般需要两步操作,首先由服务器创建Cookie对象保存到客户端,然后在JSP页面或Servlet中读取Cookie并进行处理。因此,Cookie也是实现Web组件间共享的一种方式。 注意:session和Cookie两种技术的区别和联系: (1)session是借助于Cookie实现的,sessionId就是通过Cookie对象保存到客户端的(对象名为JSESSIONID,对象值为sessionId),客户端向服务器发出请求时,服务器可以从Cookie对象中获得sessionId从而识别用户身份。 (2)保存sessionId的Cookie对象存在于客户端的内存中,当浏览器关闭时,sessionId就会丢失,导致服务器无法获取而使session失效。而一般的Cookie对象可以通过设置有效时间(setMaxAge(int expiry))以文件的形式保存到客户端,这样浏览器关闭或关机都不会导致信息丢失 。因此使用Cookie实现数据共享可以获得更长的生命周期。
6.8.2 Cookie相关方法 方法 说明 Cookie(String name, String value) void response.addCookie(Cookie c) 向客户机添加一个Cookie对象 Cookie[] request.getCookies() 用于取得所有Cookie对象的数据,存放到一个 数组中 String getName() 取得Cookie对象的属性名 String getValue() 取得Cookie对象的属性对应的属性值 setMaxAge(int expiry) 设置cookie有效时间,以秒为单位,设置了有 效时间的cookie将以文件形式保存在客户端, 否则只是存储在浏览器的内存区域中
6.8.3 案例—利用Cookie实现自动登录 【例6-3】利用Cookie实现自动登录。 【设计】本案例包含三个文件: (1)login.jsp:为用户登录页面; (2)loginCheck.jsp:用于登录处理,为简单起见不做用户名和密码验证。接收用户输入并创建Cookie保存用户输入的用户名和密码,同时在session中保存用户名,转入页面main.jsp。 (3)main.jsp:系统主页面,需要登录才能访问。先检验用户是否已经登录,如果已经登录则显示欢迎信息;如果没登录,启动自动登录功能,读取Cookie信息:如果读取到用户名信息(不做密码验证),则显示欢迎信息;否则转到登录页面。
【实现】 (1)登录页面:login.jsp (2) 登录处理:logincheck.jsp (3) 主页面:main.jsp 【运行】《执行程序》
本章小结 介绍了Java Web程序重要组件—Servlet的设计与使用。介绍了Servlet的工作原理、编程接口、基本结构、信息配置及部署和运行等知识; 最后阐述了JSP与Servlet、以及Servlet和JavaBean的关系并通过两个实例说明它们如何结合起来使用,并简单介绍了Cookie的使用。
习题 1. 设计一个Web应用程序,当用户在提交页面上输入圆的半径,提交后显示出圆的周长和面积。 要求: (1)使用Servlet,获取提交的信息,并计算求值,求值后跳转到显示结果页面。 (2)使用例5-1的JavaBean类,并由Servlet,获取提交的信息,并计算求值,求值后跳转到显示结果页面。 2.设计一个注册页面register.jsp,用户填写的信息包括:姓名、性别、出生年月、民族、个人介绍等,用户点击注册后将注册信息通过output.jsp显示出来。 要求,使用Servlet获取提交的信息,然后跳转到显示结果页面。