《Java EE 6企业级应用开发教程:第2章 Servlet程序开发》由会员分享,可在线阅读,更多相关《Java EE 6企业级应用开发教程:第2章 Servlet程序开发(76页珍藏版)》请在金锄头文库上搜索。
1、第2章Servlet程序开发吉林大学软件学院课程内容安排:第1章Java EE概述 2课时WebWeb应用开发应用开发第2章Servlet 2课时 第3章JSP程序开发 2课时第4章JSF 4课时JDBC和JNDI 第5章和第6章 2课时EJB第7章 EJB概述 2课时 第8章会话Bean 4课时 第9章消息驱动Bean 2课时 JPA 第10章 JPA 4课时 第11章JPQL 2课时 第12章 Web Service 2课时第13章 Java EE安全性 2课时第14章 SSH架构 2课时主要内容Servlet概念与简单示例Servlet工作原理Servlet开发过程 Servlet主要接
2、口和类Servlet共享变量用servlet读写文件用servlet访问数据库2.0 Web应用Web应用程序C/S、B/S浏览器:IE、Firefox、Safari、Chrome及OperaWeb服务器:Apache、IIS、Tomcat、Jboss、WebLogic。2.0 Web应用静态Web程序采用HTTP协议+HTML2.0 Web应用HTTP请求HTTP应答2.0 Web应用HTML12简单的HTML示例345欢迎使用HTML!656静态Web缺点(1)无法加载动态内容,只能通过修改html代码实现内容重新加载(2)界面不够美观动态WebuServletuJSP2.1 Servle
3、t概念及其简单示例什么是Servlet? Servlet=Server + let,表示小的服务程序,它是运行在Web服务器上的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载和调用。我们可以在客户端的浏览器中像访问Web页面一样对Servlet进行访问。2.1 Servlet概念及其简单示例2.1 Servlet概念及其简单示例 packagejavaee.servlet;importjava.io.*;importjavax.servlet.*;importjavax.servlet.annotation.*;importjavax.ser
4、vlet.http.*;/标注,这是一个Servlet,访问路径为“/HelloWorld”WebServlet(/HelloWorld)publicclassHelloWorldServletextendsHttpServlet/继承HttpServlet抽象类/处理浏览器发送来的HTTPGET类型的请求protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptionresponse.setContentType(text/html;chars
5、et=UTF-8);PrintWriterout=response.getWriter();/获得输出对象/向请求端输出信息out.println(HelloWorld.ItisHelloWorldServlet.+);一个Servlet类的简单示例2.1 Servlet概念及其简单示例 packagejavaee.servlet;importjava.io.*;importjavax.servlet.*;importjavax.servlet.annotation.*;importjavax.servlet.http.*;WebServlet(/HelloWorld)publicclassH
6、elloWorldServletextendsHttpServlet/继承HttpServlet抽象类/处理浏览器发送来的HTTPGET类型的请求protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptionresponse.setContentType(text/html;charset=UTF-8);PrintWriterout=response.getWriter();/获得输出对象/向请求端输出信息out.println(HelloWo
7、rld.ItisHelloWorldServlet.+);一个Servlet类的简单示例服务器路径项目路径Servlet路径运行结果优点:可以使用Java语言的所有特性,灵活、方便缺点:使用Java代码打印出Web形式的输出结果繁杂,阅读困难2.2 Servlet的工作原理2.2.1 Servlet的调用过程2.2 Servlet的工作原理2.2.2 Servlet的生命周期 Servlet的运行状态完全由Servlet容器维护和管理,一个Servlet的生命周期一般有初始化、提供服务和销毁三个阶段。Servlet实质上是以单例的形式被实现的,它在被初始化之后将一直在内存中活动,后续的客户请求
8、Servlet服务时将不再创建该Servlet的新的对象,只是新建一个线程调用service()方法提供服务。2.3Servlet开发过程 Servlet有着完备的规范,开发一个Servlet就是说开发一个遵守规范中各项规定、满足各种特征的Java类,该类接收用户Web形式的输入进行相关的处理并以Web的形式给出响应结果。 Servlet的开发过程包括了以下五个步骤:1、创建工程2、创建Servlet类3、配置Servlet类4、发布Servlet类5、调用Servlet类2.3Servlet开发过程1、 创建工程2.3Servlet开发过程2.3Servlet开发过程2.3Servlet开发
9、过程创建好的动态Web工程及其目录组织结构2.3Servlet开发过程放置Servlet类的源文件,*.java文件2.3Servlet开发过程显示工程所包含或者已经引入的类库2.3Servlet开发过程放置Web工程的配置文件、页面文件及资源文件,如*.xml,*.class等2.3Servlet开发过程放置工程需要包含的库文件,如数据库驱动。2.3Servlet开发过程Web工程部署配置文件。2.3Servlet开发过程2、创建Servlet类在Web应用中如果没有特殊需要,一般开发者定义的Servlet类都扩展HttpServlet。2.3Servlet开发过程2、创建Servlet类H
10、ttpServlet中最为常用的是doGet和doPost方法,在其中加入对客户端请求的相应处理逻辑。2.3Servlet开发过程2、创建Servlet类HttpServletRequest类的对象用来封装了客户端提交的请求,是输入参数HttpServletResponse类的对象将处理结果进行封装,用来向客户端返回,是输出参数2.3Servlet开发过程3、 配置Servlet类 定义了Servlet类之后,还需要对其进行配置才能使Servlet容器发现找到Servlet类,从而使其发挥作用。配置Servlet的方法有两种:一种是使用标注的方式进行配置一种是使用xml文件进行配置2.3Ser
11、vlet开发过程1)标注配置 Servlet3.0中加入了新增的标注支持,用于简化 Servlet的配置。通过在Servlet类文件中类定义之前的位置添加标注信息来实现的,类的其它部分不变。WebServlet是这个标注的名称,括号中的是这个标注的属性说明。这行标注的作用有两个,第一说明这个类是一个Servlet,第二说明了这个Servlet的访问路径。2.3Servlet开发过程2) xml文件配置 传统配置方法是使用web应用中WEB-INF文件夹下的web.xml部署描述文件来进行。需要在web.xml文件的元素之间添加如下代码2.3Servlet开发过程2.3.4 发布Servlet类
12、 Servlet类编写和配置完成之后还需要将其发布到Web服务器上,Servlet类的发布是与该Servlet类所在的Web应用一起进行的。 发布过程就是将Web应用按照特定的打包格式进行打包,然后将其拷贝到Web服务器规定的目录下,并让服务器更新加载这个Web应用的过程。 这一过程用户可以手工完成,也可以使用Eclipse开发工具自动完成。使用Eclipse进行发布的过程如下:2.3Servlet开发过程2.3.4 发布Servlet类2.3Servlet开发过程2.3.4 发布Servlet类2.3Servlet开发过程2.3.4 发布Servlet类2.3Servlet开发过程2.3.4
13、 发布Servlet类成功发布之后,在Web服务器的指定目录下,能够看到打包好的工程发布文件2.3Servlet开发过程2.3.5调用Servlet类调用Servlet类的基本方法有两种:一种是直接使用Servlet的URL对Servlet进行访问,这种情况包括使用HTML链接、JSP跳转、或者浏览器地址栏中输入地址等方式。这种方式Web容器将调用Servlet的doGet()方法为请求提供服务。另一种是在表单中设置提交目标为Servlet的URL,这种方式Web容器将调用Servlet的doPost()方法为请求提供服务。2.3Servlet开发过程链接调用SayHelloServlet2.
14、4Servlet主要接口和类 Java Servlet包括两个基本的包,javax.servlet和javax.servlet.http,主要的接口和类都放在这两个中。Servlet接口ServletRequest、ServletResponse接口GenericServlet抽象类HttpServlet抽象类HttpServlettRequest、HttpServletResponse接口2.4Servlet主要接口和类2.4Servlet主要接口和类1、Servlet接口、GenericServlet类和HttpServlet类Servlet:init、destroy、service、ge
15、tServletConfig、getServletInfoGenericServlet:getInitParameter、log、getServletContextHttpServlet:doGet、doPost2.4Servlet主要接口和类2、ServletRequest、HttpServlettRequest接口ServletRequest:getParameter、getAttribute、setAttribute、getInputStream、getCharacterEncoding、getContentLength、getContentTypeHttpServletRequest:
16、getHeader、getMethod、getCookies、getSession2.4Servlet主要接口和类3、ServletResponse、HttpServletResponse接口ServletResponse:getWriter、getOutputStream、setContentLength、setContentTypeHttpServletResponse:setHeader、addCookie、sendRedirect、sendError2.4Servlet主要接口和类4、ServletConfig和ServletContext接口ServletConfig:每一个Serv
17、letConfig对象对应着一个唯一的Servlet。 Servlet容器在调用init方法时,把servletConfig对象当做参数传递给servlet对象。getInitParameter、getServletContextServletContext:servlet与servlet容器之间的直接通信的接口。Servlet容器在启动一个Web应用时,会为它创建一个servletContext对象。每个web应用有唯一的servletContext对象。2.4Servlet主要接口和类servletContext接口提供的方法分为以下几种类型:1、用于在Web应用范围内存取共享数据的方法:
18、setAttribute、 getAttribute、removeAttribute2、访问当前Web应用的资源: getInitParameter、getRequestDispatcher3、访问servlet容器的相关信息: getContext4、访问web容器的相关信息: getServerInfo5、访问服务器端的文件系统资源: getRealPath、getResource6、输出日志: log2.4Servlet主要接口和类5、HttpSession接口和Cookie类HttpSession:通过这个接口,Servlet引擎可以有效地跟踪用户的会话。同时可以通过绑定对象到Sess
19、ion中实现数据共享。getId、getValue、putValue、removeValue、setMaxInactiveInterval、getMaxInactiveIntervalCookie:一个由服务器端生成,发送给客户端保存和使用的 name-value对,用于服务器对客户端的识别。2.4Servlet主要接口和类6、RequestDispatcher接口将请求发送到服务器上的任何资源(比如 servlet、HTML文件或 JSP文件)的对象。定义了二种方法用于请求转发:forward:转发,将当前request和response对象保存,交给指定的url处理。include:包含,
20、用当前servlet的request和respose来执行url中的内容处理业务,并将执行结果包含进当前的servlet当中来。2.4Servlet主要接口和类关于路径1)链接地址、表单提交、重定向、转发的路径四种情况链接地址:表单提交:重定向:response.sendRedirect(“”);转发:getRequestDispatcher(“”);2)两种路径表示方法不以“/”开头的路径,比如:。在当前路径下跳转。以”/“开头的路径,比如:链接、表单提交、重定向,从应用名开始写。而转发要从应用名后开始写。2.5Servlet共享变量 在servlet中进行变量的共享可以通过Servlet容
21、器中存在的ServletContext、HttpSession和HttpServletRequest的实例来实现。这几种方式共享变量和获得变量的方法都是一致的,只是在变量的作用域,也就是共享的范围上有所不同。 ServletContext范围最大,应用程序级别的,整个应用程序都能访问。 HttpSession次之,会话级别的,在当前的浏览器中都能访问。 HttpServletRequest范围最小,请求级别,请求结束,变量的作用域也结束。ServletContext、HttpSession和HttpServletRequest的作用域:2.5Servlet共享变量 这三种方式共享变量的方法是使
22、用Context、Session或Request类型的实例调用setAttribute(“varName”,obj)方法将需要共享的变量存储到对象当中。然后在需要使用该共享变量的地方再通过,再通过实例的getAttribute(“varName”)方法来获得变量。/1使用ServletContext共享变量ServletContextsc=this.getServletContext();sc.setAttribute(sharingvar_sc,context);/2使用HttpSession共享变量HttpSessionsession=request.getSession();sessio
23、n.setAttribute(sharingvar_se,session);/3使用HttpServletRequest共享变量request.setAttribute(sharingvar_req,request);2.5Servlet共享变量 这三种方式共享变量的方法是使用Context、Session或Request类型的实例调用setAttribute(“varName”,obj)方法将需要共享的变量存储到对象当中。然后在需要使用该共享变量的地方再通过,再通过实例的getAttribute(“varName”)方法来获得变量。/4在同一个页面中读取共享变量Stringsc_value=
24、(String)sc.getAttribute(sharingvar_sc);Stringsession_value=(String)session.getAttribute(sharingvar_se);Stringrequest_value=(String)request.getAttribute(sharingvar_req);2.5Servlet共享变量在同一个页面中读取共享变量结果转发到新的页面读取共享变量结果跳转到新的页面读取共享变量结果重启浏览器后跳转到新页面读取共享变量结果2.6用servlet读写文件 Servlet类实质上就是一个继承了HttpServlet的Java类。该
25、类由Web容器进行实例化,运行在服务器上。因此在Servlet类中可以使用Java提供的输入/输出流来完成对服务器上文件的读取和写入。 用来读写文件的Servlet类和其它普通Servlet类没有区别,客户端的请求会被doPost()或者doGet()方法响应,在请求中一般会包含读取/写入文件的文件路径。Servlet类在doPost()或者doGet() 中获得客户端请求的信息,然后根据这些信息完成对文件的读写操作。2.6用servlet读写文件2.6.1 读文件 在Servlet中读取文件的操作和步骤与在普通Java程序中读取文件相同,一般利用File、FileReader和Buffere
26、dReader 类的组合来完成。 下面以一个简单的例子加以说明。该示例将服务器上当前运行项目中的/WEB-INF/web.xml文件读取出来,并输出到页面中进行显示。protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /设置页面的文档类型和字符集,页面中的字符所采用的字符集 response.setContentType(text/html;charset=UTF-8); /设置页面的编码方式,即以什么样的编码方式
27、来保存页面文件 response.setCharacterEncoding(UTF-8); /从response中获得PrintWriter类的对象,以用于向页面输出信息 PrintWriter out = response.getWriter(); /向页面输出信息 out.println(“HTML文件头.); /文件相对路径 String fileName = /WEB-INF/web.xml; /文件绝对路径文件绝对路径 String filePath = this.getServletContext().getRealPath(fileName); /使用文件的绝对路经打开文件 Fi
28、le file = new File(filePath); if(file.exists() /使用打开的文件对象,创建FileReader类的实例 FileReader reader = new FileReader (file); /使用打开文件对应的reader对象,创建BufferedReader 类的实例 BufferedReader bufferReader = new BufferedReader (reader); String line = null; /逐行读取文件,并输出到页面上 while(line = bufferReader.readLine()!=null) ou
29、t.println(line); bufferReader.close(); else out.print(未找到文件!); out.println(“HTML文件尾.); out.flush(); out.close(); 2.6用servlet读写文件2.6.2 写文件 在Servlet中写文件的方法和步骤也是和普通的Java程序一致的,通常使用File、FileWriter和BufferedWriter的组合来完成。 下面我们通过一个简单实例进行说明。该示例在服务器上运行的当前项目的根目录下创建一个名为temp.txt的文件,并向其中写入信息。protected void doPost(
30、HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8);response.setCharacterEncoding(UTF-8); /从response中获得PrintWriter类的对象,以用于向页面输出信息 PrintWriter out = response.getWriter(); String fileName = temp.txt;/文件相对路径/文件绝
31、对路径 String filePath = this.getServletContext().getRealPath(fileName); /使用文件的绝对路经打开文件,如果文件不存在则创建文件 File file = new File(filePath); /使用打开的文件对象,创建FileWriter类的实例 FileWriter writer = new FileWriter(file); /使用打开文件对应的writer对象,创建BufferedWriter类的实例 BufferedWriter bufferWriter = new BufferedWriter(writer); /通
32、过BufferedReader 类的实例,向文件中写入信息bufferWriter.write(Servlet写文件); /刷新缓存,将缓存中的内容写入到文件中 bufferWriter.flush(); bufferWriter.close(); writer.close(); out.print(文件写入完毕,路径:+file.getAbsolutePath);2.6用servlet读写文件2.6.1 上传文件 在Servlet3.0之前,对于处理上传文件的操作一直是让开发者头疼的问题,因为 Servlet 本身没有对此提供直接的支持,需要使用第三方框架来实现,而且使用起来也不够简单。 S
33、ervlet 3.0 提供了对文件上传的支持,通过MultipartConfig标注和HttpServletRequest的两个新方法getPart()和getParts(),开发者能够很容易的实现文件上传操作。2.6用servlet读写文件2.6.1 上传文件 MultipartConfigMultipartConfig标注写在标注写在 Servlet Servlet 类的声明之类的声明之前前,以表示该 Servlet 希望处理的请求是 multipart/form-data类型的。另外,该标注还提供了若干属性用于简化对上传文件的处理。属性名类型可选描述fileSizeThresholdin
34、t是当数据量大于该值时,内容将被写入文件。locationString是存放生成的文件地址。maxFileSizelong是允许上传的文件最大值。默认值为-1,表示没有限制。maxRequestSizelong是针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。MultipartConfig标注属性说明表2.6用servlet读写文件2.6.1 上传文件 HttpServletRequest 提供的两个新方法如下所示,它们用于从请求中解析出上传的文件: Part getPart(String name) Collection getParts() 前
35、者用于获取请求中给定 name 的文件,后者用于获取所有的文件。每一个文件用一个 javax.servlet.http.Part 对象来表示。该接口提供了处理文件的简易方法,比如 write()、delete() 等。结合 HttpServletRequest 和 Part 来保存上传的文件变得非常简单,如下所示: Part file = request.getPart(file); file.write(filename); 需要注意的是,如果请求的需要注意的是,如果请求的 MIME MIME 类型不是类型不是 multipart/form-datamultipart/form-data,则
36、不能使用上面的两个方法,否则,则不能使用上面的两个方法,否则将抛异常。将抛异常。界面文件中,文件上传部分代码 Servlet中,文件上传部分代码protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException request.setCharacterEncoding(utf-8); /Servlet3.0中新引入的方法,用来处理multipart/form-data类型的表单 Part part = request.getPar
37、t(file); /获取HTTP头信息,并从HTTP头信息中获取文件名 String headerInfo = part.getHeader(content-disposition); String fileName = headerInfo.substring(headerInfo. lastIndexOf() + 1, headerInfo.length() - 1); /获得存储上传文件的完整路径(文件夹路径+文件名),文件夹位置固定, /文件名采用与上传文件的原始名字相同) String fileSavingFolder = this.getServletContext().getRe
38、alPath(/UpLoad_3.0); String fileSavingPath = fileSavingFolder+File.separator+fileName;/如果存储上传文件的文件夹不存在,则创建文件夹File f = new File(fileSavingFolder + File.separator);if (!f.exists() f.mkdirs();/将上传的文件内容写入服务器文件中part.write(fileSavingPath);/输出上传成功信息OutPut.outputToClient(文件已上传到:+ fileSavingPath, response);
39、2.6用servlet读写文件2.6.1 下载文件 Servlet类也可以用来响应客户端的文件下载请求。Servlet实现文件下载是通过对响应对象response的操作来完成的。 首先需要在response中对需要下载的文件类型、头信息、文件长度等信息进行设置。 然后读取服务器上文件的内容并写入到response的输出流中。protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException try String filepath
40、= /WEB-INF/web.xml;/服务器上文件的相对路径/服务器上文件的绝对路径 String fullFilePath = getServletContext().getRealPath(filepath); File file = new File(fullFilePath);/打开文件,创建文件对象 if (file.exists() /如果文件存在 /获得文件名,并采用UTF-8编码方式进行编码,以解决中文问题 String filename = URLEncoder.encode(file.getName(),UTF-8); response.reset();/重置respon
41、se对象 /设置文件的类型,xml文件采用text/xml类型,详见MIME类型说明 response.setContentType(text/xml); /设置HTTP头信息中内容 response.addHeader(Content-Disposition, attachment; filename= + filename + ); int fileLength = (int) file.length();/设置文件长度 response.setContentLength(fileLength); if (fileLength != 0) /如果文件长度大于0 InputStream in
42、Stream = new FileInputStream(file);/创建输入流 byte buf = new byte4096; /创建输出流 ServletOutputStream servletOS = response.getOutputStream(); int readLength; /读取文件内容并写入到response的输出流当中 while (readLength = inStream.read(buf) != -1) servletOS.write(buf, 0, readLength); inStream.close();/关闭输入流 servletOS.flush()
43、;/刷新输出缓冲 servletOS.close(); /关闭输出流 else System.out.println(文件不存在); PrintWriter out = response.getWriter(); out.println(文件 +fullFilePath+ 不存在); catch (Exception e) System.out.println(e); 下载文件2.7用servlet访问数据库 使用Servlet访问数据库也和普通的Java程序访问数据库的方法相同,都是利用JDBC提供的接口来完成数据库的连接以及数据库的相关操作。 首先,必须下载所用数据库的数据驱动Jar包,并
44、将其放到项目的WEB-INF/lib目录下。 而后根据数据库驱动的名字加载数据库驱动,并配置好数据库的地址、用户名和密码,使用DriverManager的getConnection方法建立并获得数据库连接。2.7用servlet访问数据库 在获得数据连接之后,开发者就能通过JDBC提供的接口来完成数据库的存取操作了。其中常用到的类是Connection类、Statement类和ResultSet。 Connection类表示的是一个数据库连接。 Statement类封装了使用SQL语句访问数据库的方法,该类的对象是通过调用Connection类的createStatement()获得的,该类提
45、供了三个执行SQL语句的方法:executeQuery()、executeUpdate()和execute()。 ResultSet类用来保存SQL查询返回的结果集,并提供了迭代访问的相关接口。2.7用servlet访问数据库public void insert(Student st) ./从Student类的实例中获得各个学生信息int id=st.getId();String name=st.getName();int age=st.getAge();String gender=st.getGender();String major=st.getMajor();/创建插入数据库的SQL语句
46、String sql=insert into student(id,name,age,gender,major) + values(+id+,+name+,+age+,+gender+,+major+);/执行数据库操作Statement stat=null;stat=conn.createStatement();stat.executeUpdate(sql); if(stat!=null) stat.close();.1 1、数据库插入操作、数据库插入操作2.7用servlet访问数据库/数据库删除方法,输入参数为需删除的学生的学号public void delete(String id)t
47、ry Statement stat=null;stat=conn.createStatement();String sql = delete from student where id=+id;stat.executeUpdate(sql);if(stat!=null) stat.close(); catch (SQLException e) e.printStackTrace();2 2、数据库删除操作、数据库删除操作2.7用servlet访问数据库public void update(Student st). /从Student类的实例中获得各个学生信息int id=st.getId();
48、String name=st.getName();int age=st.getAge();String gender=st.getGender();String major=st.getMajor();/创建更新数据库的SQL语句String sql = update student set id=+id+,name=+name+,age=“ +age+,gender=+gender+,major=+major+ where id=+id+;/执行数据库操作Statement stat=null;stat=conn.createStatement();stat.executeUpdate(sq
49、l);if(stat!=null) stat.close(); . 3 3、数据库修改操作、数据库修改操作2.7用servlet访问数据库public Set searchStudents(String id, String name) .Set sts= new HashSet();Statement stat=conn.createStatement();ResultSet rs=stat.executeQuery(select * from student); /遍历查询结果,依次读取每个学生的信息,创建Student类型的对象 while(rs.next() Student st =
50、new Student(); st.setId(rs.getInt(id); . sts.add(st); /将学生对象添加的集合中 if(rs!=null) rs.close(); if(stat!=null) stat.close(); return sts ; /返回查询到的所有学生的集合.4 4、数据库查询操作、数据库查询操作小结 本章首先通过一个输出Hello World的简单例子,对Servlet程序进行展示,说明了Servlet程序的基本构成和形式,即继承HttpServlet类,实现doGet或doPost方法,设置访问访问路径。 通过对Servlet的调用过程和Servlet的生命周期的描述,揭示了Servlet的工作原理。 详细地介绍了使用Eclipse开发工具开发Servlet应用的过程。 给出了Servlet主要接口和类的说明以及使用Servlet完成数据共享、读写文件和数据访问的实例。