Download presentation
Presentation is loading. Please wait.
1
| 百 乃 | 千 则 |岂能事事如意,但求无愧于心。 | 川 大 | 仞 刚 |把微笑留给世界,让世界因你微笑!
| 海 有 | 壁 无 |一切为了学生。 | 纳 容 | 立 欲 |为了学生一切。 | 百 乃 | 千 则 |岂能事事如意,但求无愧于心。 | 川 大 | 仞 刚 |把微笑留给世界,让世界因你微笑! 2018年11月16日
2
温故而知新! 2018年11月16日
3
第8章 JSP与JavaBean 8.1 JavaBean基础知识 8.2 编写和使用JavaBean 8.2.1 编写JavaBean组件
8.5 常见问题及解决方案 2018年11月16日
4
第9章 Java Servlet技术 9.1 Servlet基础知识 9.2 JSP与Servlet常见用法
9.4 常见问题及解决方案 2018年11月16日
5
9.1 Servlet基础知识 9.1.1 什么是Servlet 9.1.2 Servlet生命周期 9.1.3 Servlet的技术特点
Servlet与JSP的区别 Servlet在Java Web项目中的作用 Servlet部署 开发一个简单的Servlet 2018年11月16日
6
什么是Servlet Servlet是Java Web应用程序中的组件技术,是运行在服务器端的Java应用程序,实现与JSP类似的功能,Servlet本身是一个Java类,可以动态地扩展服务器的能力。 Web服务器上执行JSP文件的时候,首先JSP 容器会将其转译为Servlet文件,并自动编译解释执行。JSP中使用到的所有对象都将被转换为Servlet,然后被执行。 Servlet接收来自客户端的请求,将处理结果返回给客户端。 2018年11月16日
7
Servlet在服务器端处理用户信息可以完成以下任务: (1)获取客户端浏览器通过HTML表单提交的数据及相关信息。
Servlet是运行在Web服务器上的Java程序,作为来自Web浏览器或其它HTTP客户端的请求与HTTP服务器上的数据库和应用程序之间的中间层。所有的JSP文件都要事先转换为一个Servlet才能运行。 Servlet在服务器端处理用户信息可以完成以下任务: (1)获取客户端浏览器通过HTML表单提交的数据及相关信息。 (2)创建并返回对客户端的动态响应页面。 (3)访问服务端资源,如文件、数据库。 (4)为JSP页面准备动态数据,与JSP一起协作创建响应页面。 2018年11月16日
8
9.1 Servlet基础知识 9.1.1 什么是Servlet 9.1.2 Servlet生命周期 9.1.3 Servlet的技术特点
Servlet与JSP的区别 Servlet在Java Web项目中的作用 Servlet部署 开发一个简单的Servlet 2018年11月16日
9
Servlet生命周期 Servlet是在服务器端运行的。Servlet是javax.servlet包中HttpServlet类的子类,由服务器完成该子类的创建和初始化。Servlet的生命周期定义了一个Servlet如何被加载、初始化,以及它怎样接收请求、响应请求、提供服务。Servlet的生命周期主要由3个过程组成。 1. init()方法:服务器初始化 当首次创建Servlet时会调用init()方法,而不是每个用户请求都会调用此方法。当用户首次调用对应于Servlet的URL或再次启动服务器时,就会创建Servlet。当有客户再请求Servlet服务时,Web服务器将启动一个新的线程,在该线程中,调用service()方法响应客户的请求。 2018年11月16日
10
2. service()方法:初始化完毕,Servlet对象调用该方法响应客户的请求
对于每个请求,Servlet引擎都会调用此方法,并把Servlet的请求对象和响应对象传递给service()方法作为参数。方法声明如下: public void service(ServletRequest request,ServletResponse response) 其中,request对象和response对象由Servlet容器创建并传递给service()方法,service()方法会根据HTTP请求类型,调用相应的doGet()或doPost()等方法。service()方法可以被调用多次。 3. destroy()方法:调用该方法销毁Servlet对象 当Servlet被卸载时此方法被自动调用。可以用来释放Servlet占用的资源,比如数据库连接、Socket连接等。destroy()方法只会被调用一次。 2018年11月16日
11
9.1 Servlet基础知识 9.1.1 什么是Servlet 9.1.2 Servlet生命周期 9.1.3 Servlet的技术特点
Servlet与JSP的区别 Servlet在Java Web项目中的作用 Servlet部署 开发一个简单的Servlet 2018年11月16日
12
Servlet的技术特点 1.有效性 (有改进)在使用传统的CGI时,人们需为每一项Http请求启动新进程。如果CGI程序本身相对较短,启动进程的开销可以决定执行过程的时间。在使用Servlet时,使用“轻量” Java线程处理每一项请求,而不使用“重量”操作系统进程。在传统的CGI中,如果n项请求同时指向同一个CGI程序,则该CGI程序代码就会载入内存n次。但在使用Servlet时,可以存在n个线程,而只使用Servlet类的一个副本。 最后一点是,当CGI程序完成请求的处理工作时,就会终止程序,这样就难以缓存计算结果、保持数据库连接开放,并允许依赖于永久数据的其它优化操作。但在完成响应之后, Servlet仍然保留在内存中,因此可以直接在请求之间存储任意复杂的数据。 2018年11月16日
13
2.方便 Servlet包含扩展基础结构,能够自动对HTML表单数据进行分析和解码、读取和设置 Http头、处理Cookie、跟踪会话以及许多其它类似的高级功能。 2018年11月16日
14
3. 强大 Servlet可以支持几种功能,但利用常规的CGI却难以或无法实现这些功能。Servlet 可以直接与Web服务器对话,而常规的CGI程序则无法做到,至少在没有使用服务器专用的API的情况下无法实现这一点。例如,与Web服务器的通信更易于将相对URL转换成具体的路径名。多个Servlet之间还能共享数据,这更易于实现数据库连接共享和类似资源共享优化操作。Servlet还可以保留不同请求的信息,从而简化了类似会话跟踪和缓存早期计算结果的一些技术。 2018年11月16日
15
4. 可移植性 Servlet是使用Java编程语言并遵循标准的API编写的,所以几乎不进行任何更改便可以在各种服务器上运行。实际上,几乎每种主要的Web服务器都可通过插件或直接支持Servlet。如今它们已成为J2EE的一部分,因此业界对Servlet的支持逐渐变得越来越普及。 2018年11月16日
16
5. 安全性 2018年11月16日
17
6. 便宜 有许多免费可用的或者极为廉价的Web服务器适合于“个人”或小型Web站点使用。 除了Apache可免费使用之外,多数商业性质的Web服务器都相对比较昂贵,但一旦拥有了某种Web服务器,不管其成本如何,添加Servlet支持(如果原来的配置不支持Servlet)几乎无需花费额外成本。与其它许多支持CGI的服务器相比,后者要购买专用软件包,需要投入巨大的启动资金。 2018年11月16日
18
9.1 Servlet基础知识 9.1.1 什么是Servlet 9.1.2 Servlet生命周期 9.1.3 Servlet的技术特点
Servlet与JSP的区别 Servlet在Java Web项目中的作用 Servlet部署 开发一个简单的Servlet 2018年11月16日
19
Servlet与JSP的区别 Servlet是一种在服务器端运行的Java程序。而JSP是继Servlet后Sun公司推出的新技术,它是以Servlet为基础开发的。Servlet是JSP的早期版本,在JSP中,更加注重页面的表示,而在Servlet中则更注重业务逻辑的实现。因此,当编写的页面显示效果比较复杂时,首选是JSP。或者在开发过程中,HTML代码经常发生变化,而Java代码则相对比较固定时,可以选择JSP。而在处理业务逻辑时,首选则是Servlet。同时,JSP只能处理浏览器的请求,而Servlet则可以处理一个客户端的应用程序请求。因此,Servlet加强了Web服务器的功能。 2018年11月16日
20
Servlet与JSP相比有以下几点区别: (1)编程方式不同
Servlet是按照Java规范编写的Java程序,JSP是按照Web规范编写的脚本语言。 (2)编译方式不同 Servlet每次修改后需要编译后才能运行,JSP是被JSP Container编译为Servlet文件。 (3)运行速度不同 由于一个JSP页面在第一次被访问时要被编译成Servlet需要一段时间,所以客户端得到响应所需要的时间比较长。当该页面再次被访问时,它对应的.class文件已经生成,不需要再次翻译和编译,JSP引擎可以直接执行.class文件,因此JSP页面的访问速度会大为提高。总之,在运行速度上,Serlvet比JSP速度快。 2018年11月16日
21
9.1 Servlet基础知识 9.1.1 什么是Servlet 9.1.2 Servlet生命周期 9.1.3 Servlet的技术特点
Servlet与JSP的区别 Servlet在Java Web项目中的作用 Servlet部署 开发一个简单的Servlet 2018年11月16日
22
9.1.5 Servlet在Java Web项目中的作用
在浏览器访问服务器时,所有的JSP文件都会转化为Servlet文件,Servlet文件负责在服务器端处理用户的数据。这部分功能在开发服务器时已经封装成底层的功能,我们可不用关心这部分功能,除非自己在开发一个服务器时候才用到。 2018年11月16日
23
其中,控制器部分由Servlet完成,这也是我们实际在项目开发中用到的Servlet。
2.Servlet在MVC设计模式中应用 MVC是一种目前广泛流行的软件设计模式,早在70年代,IBM就进行了MVC设计模式的研究。近来,随着JavaEE的成熟,它成为在JavaEE平台上推荐的一种设计模型,是广大Java开发者非常感兴趣的设计模型。随着网络应用的快速增加,MVC模式对于Web应用的开发无疑是一种非常先进的设计思想,无论选择哪种语言,无论应用多复杂,它都能为理解分析应用模型提供最基本的分析方法,为构造产品提供清晰的设计框架,为软件工程提供规范的依据。MVC 设计模式是目前用得比较多的一种设计模式,被广泛应用于Web 应用程序中。Model(模型)表示业务逻辑层,View(视图)代表表示层,Controller(控制器)代表控制层。有关MVC设计模式的详细介绍请参考第1和12章。 其中,控制器部分由Servlet完成,这也是我们实际在项目开发中用到的Servlet。 2018年11月16日
24
3.Servlet在Web框架中的应用 在Java Web项目开发中用到的主要组件技术有JSP、Servlet、JavaBean、JDBC、XML、Tomcat等技术。为了整合Java Web组件技术提高软件开发效率,近年来推出许多基于MVC模式的Web框架技术,如,Struts,Maverick,WebWork 和Turbine 等。其中比较经典框架技术是Struts。 在Struts框架技术中,实现了MVC模式,其中已封装好核心控制器,由Servlet实现;我们还需要实现Action来完成对数据流量的控制,Action在Struts1.X版本中由Servet实现控制功能,在Struts2.X版本中Action是业务控制器,由Java类来实现。有关Servlet在Struts中的应用请参考Struts相关资料。 2018年11月16日
25
9.1 Servlet基础知识 9.1.1 什么是Servlet 9.1.2 Servlet生命周期 9.1.3 Servlet的技术特点
Servlet与JSP的区别 Servlet在Java Web项目中的作用 Servlet部署 开发一个简单的Servlet 2018年11月16日
26
Servlet部署 Servlet配置包含Servlet的名字、Servlet的类、初始化参数、启动装入的优先级、Servlet的映射、运行的安全设置、过滤器的名字和类以及它的初始化参数。 部署描述符文件是JavaEE程序的重要组成部分,通常位于“/WEB-INF”目录。主要功能包括如下几个方面。 (1)用于Servlet和Web应用程序的初始化。通过配置文件,可以减少初始化值的硬编码。 (2)Servlet/JSP定义。在Web应用程序中的每个Servlet和预编译的JSP文件都应在部署描述符中定义。 (3)MIME类型。可以在部署描述符中为每种内容定义MIME类型。 (4)安全。可以使用部署描述符控制对应用程序的访问。 将一个标准的部署描述符文件(web.xml)放在/WEB-INF目录下。 2018年11月16日
27
【例9-1】配置Servlet文件的配置文件(web.xml)
<?xml version="1.0" encoding="UTF-8"?> <!--指定Servlet文件需要使用到的类库以及解析文件--> <web-app version="3.0" xmlns=" xmlns:xsi=" xsi:schemaLocation=" <servlet> <!--指定servlet的名称--> <servlet-name>FirstServlet</servlet-name> <!--指定servlet编译好的.class文件的相对路径,区分大小写--> <servlet-class>ch10.FirstServlet</servlet-class> </servlet> <!--在解析到<url-pattern>中的路径请求时,由<servlet-name>指定的servlet来处理;<servlet-mapping>用于对<servlet>中指定的servlet来映射路径--> <servlet-mapping> <url-pattern>/FirstServlet</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> </web-app> 2018年11月16日
28
9.1 Servlet基础知识 9.1.1 什么是Servlet 9.1.2 Servlet生命周期 9.1.3 Servlet的技术特点
Servlet与JSP的区别 Servlet在Java Web项目中的作用 Servlet部署 开发一个简单的Servlet 2018年11月16日
29
开发一个简单的Servlet 2018年11月16日
30
2018年11月16日
31
2018年11月16日
32
【例9-2】Java Servlet应用实例(FirstServlet.java) package ch09;
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //Servlet文件继承父类HttpServlet public class FirstServlet extends HttpServlet { /*该方法是由NetBeans工具生成,工具不同该方法名称和写法不同,该方法不是必须的方法可以删除*/ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置客户端的文件类型和编码方式 response.setContentType("text/html;charset=UTF-8"); //生成标准的输出对象out PrintWriter out = response.getWriter(); 2018年11月16日
33
out.println("<html>"); out.println("<head>");
try { out.println("<html>"); out.println("<head>"); out.println("<title>Servlet FirstServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>这是我的第一个Servlet文件" + request.getContextPath () + "</h1>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } 2018年11月16日
34
/*使用Servlet文件时常用的两个方法之一,如果表单中请求是get,调用doGet方法执行*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /*使用Servlet文件时常用的两个方法之一,如果表单中请求是post,调用doPost方法执行*/ protected void doPost(HttpServletRequest request, HttpServletResponse response) //获取Servlet版本信息,在MVC编程中可以不使用该方法,可以删除 public String getServletInfo() { return "Short description"; 2018年11月16日
35
第9章 Java Servlet技术 9.1 Servlet基础知识 9.2 JSP与Servlet常见用法
9.4 常见问题及解决方案 2018年11月16日
36
9.2 JSP与Servlet常见用法 9.2.1 通过Servlet获取表单中的数据及其应用实例 9.2.2 重定向与转发及其应用实例
重定向与转发及其应用实例 2018年11月16日
37
9.2.1 通过Servlet获取表单中的数据及其应用实例
本应用实例有一个paramsForm.jsp页面,页面中输入数据提交后由Servlet文件(ThreeParams.java)处理。 2018年11月16日
38
【例9-3】数据页面(paramsForm.jsp)
contentType="text/html" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>数据页面</title> </head> <body> <form method="post" action="/ch09/ThreeParams"> <p>数据1<input type="text" name="gr1"></p> <br> <p>数据2<input type="text" name="gr2"></p> <p>数据3<input tupe="text" name="gr3"></p> <p> <input type="submit" value="提交"> <input type="reset" value="清除"> </p> </form> </body> </html> 2018年11月16日
39
2018年11月16日
40
【例9-4】读取表单参数的Servlet文件(ThreeParams.java) package ch09;
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ThreeParams extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println(request.getParameter("gr1") +"<br>"); out.println(request.getParameter("gr2") +"<br>"); out.println(request.getParameter("gr3") +"<br>"); out.println("</body>"); out.println("</html>"); out.close(); } 2018年11月16日
41
throws ServletException, IOException {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) 2018年11月16日
42
【例9-5】Servlet的配置文件(web.xml)
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns= xmlns:xsi=" xsi:schemaLocation=" <servlet> <servlet-name>ThreeParams</servlet-name> <servlet-class>ch09.ThreeParams</servlet-class> </servlet> <servlet-mapping> <url-pattern>/ThreeParams</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> </web-app> 2018年11月16日
43
2018年11月16日
44
2018年11月16日
45
9.2 JSP与Servlet常见用法 9.2.1 通过Servlet获取表单中的数据及其应用实例 9.2.2 重定向与转发及其应用实例
重定向与转发及其应用实例 2018年11月16日
46
重定向与转发及其应用实例 重定向的功能是将用户从当前页面或者Servlet定向到另外一个JSP页面或者Servlet;转发的功能是将用户对当前JSP页面或者Servlet对象的请求转发给另外一个JSP页面或者Servlet对象。在Servlet类中使用HttpServletResponse类的重定向方法sendRedirect(),以及RequestDispatcher类的转发方法forward()。 尽管HttpServletResponse的sendRedirect()方法和RequestDispatcher的forward()方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。下面是HttpServletResponse的sendRedirect()方法实现的重定向与RequestDispatcher的forward()方法实现的转发的比较: 2018年11月16日
47
RequestDispatcher的forward()方法只能将请求转发给同一个Web应用中的组件;而HttpServletResponse的sendRedirect()方法不仅可以重定向到当前应用程序中的其它资源,还可以重定向到同一个站点上的其它应用程序中的资源,甚至是使用绝对URL重定向到其它站点的资源。如果传递给HttpServletResponse的sendRedirect()方法的相对URL以“/”开头,它是相对于整个Web站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。 调用HttpServletResponse的sendRedirect()方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用RequestDispatcher的forward()方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。 2018年11月16日
48
HttpServletResponse的sendRedirect()方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。可见,“浏览器”一共发出了两封信和收到了两次回复,“浏览器”也知道他借到的钱出自李四之手。RequestDispatcher的forward()方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。可见,“浏览器”只发出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。 2018年11月16日
49
RequestDispatcher的forward()方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse的sendRedirect()方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。对于同一个Web应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletResponse的setAttribute()方法传递预处理结果,那就应该使用RequestDispatcher的forward()方法。不同Web应用程序之间的重定向,特别是要重定向到另外一个Web站点上的资源的情况,都应该使用HttpServletResponse的sendRedirect()方法。 无论是RequestDispatcher的forward()方法,还是HttpServletResponse的sendRedirect()方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中清除。 2018年11月16日
50
本实例有一个JSP页面和两个Servlet文件,主要功能是求一个实数的平方值。在sendForward
本实例有一个JSP页面和两个Servlet文件,主要功能是求一个实数的平方值。在sendForward.jsp页面上用户可以在其表单中输入一个实数,并提交给名为Verify(Verify.java)的Servlet对象。如果用户的输入不符合要求或者输入的实数大于6000或者小于-6000,那么就重新将用户请求定向到sendForward.jsp页面。如果用户的输入符合要求Verify就将用户对sendForward.jsp页面的请求转发到名字为ShowMessage(ShowMessage.java)的Servlet对象,该Servlet文件计算实数的平方。另外需要配置Servlet文件。 2018年11月16日
51
【例9-6】数据输入页面(sendForward.jsp)
contentType="text/html" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>数据输入页面</title> </head> <body> <form action="Verify" method="post"> 请输入一个实数:<input type="text" name="number"> <input Type="submit" value="确定"> </form> </body> </html> 2018年11月16日
52
2018年11月16日
53
【例9-7】输入数据判断的Servlet类(Verify.java) package ch09;
import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Verify extends HttpServlet { public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ String number=request.getParameter("number"); 2018年11月16日
54
double n=Double.parseDouble(number); if(n>6000||n<-6000)
try{ //作用是把字符串转换为Double double n=Double.parseDouble(number); if(n>6000||n<-6000) //重定向到sendForward.jsp response.sendRedirect("sendForward.jsp"); else{ RequestDispatcher dispatcher= request.getRequestDispatcher("ShowMessage"); dispatcher.forward(request,response); //转发到另一个servlet文件 } catch(NumberFormatException e){ response.sendRedirect("sendForward.jsp"); //重定向到sendForward.jsp public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ doPost(request,response); 2018年11月16日
55
【例9-8】求平方运算的Servlet类(ShowMessage.java) package ch09;
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ShowMessage extends HttpServlet { public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ 2018年11月16日
56
response.setContentType("text/html;charset=GB2312");
PrintWriter out=response.getWriter(); String number=request.getParameter("number"); //获取客户提交的信息 double n=Double.parseDouble(number); out.println(number+"的平方:"+(n*n)); } public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ doPost(request,response); 2018年11月16日
57
2018年11月16日
58
第9章 Java Servlet技术 9.1 Servlet基础知识 9.2 JSP与Servlet常见用法
9.4 常见问题及解决方案 2018年11月16日
59
9.3 基于JSP+Servlet留言系统的应用实例
早期的Java Web开发使用Servlet来开发Web应用程序,但是Servlet开发Web应用程序效率低。为了提高Web项目开发效率,Sun公司推出JSP技术,JSP开发Web项目的效率比较高,但是运行速度没有Servlet快。目前,Java Web应用程序是由JSP开发,部署到服务器上,在运行JSP文件时,JSP文件首先转化Servlet文件,然后所有数据处理都是由Servlet完成。 Servlet主要用于MVC设计模式中控制器部分或者框架(Struts等)中控制器部分。有关Servlet作为控制器部分,将在第10章基于MVC实训中介绍。本例并没有严格按照MVC设计模式,其中本例的Servlet文件是对数据的处理并有一部分控制功能。 本例实现留言板功能,页面如图9-9所示。 2018年11月16日
60
2018年11月16日
61
【例9-9】留言板页面(messageBoard.jsp)
contentType="text/html" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>留言板页面</title> </head> <body background="image/f.jpg" > <form action="AddMessageServlet" method="post"> 留 言 者:<input type="text" name="author" size="30"> <br> 留言标题:<input type="text" name="title" size="30"> 留言内容:<textarea name="content" rows="8" cols="30"></textarea> <p> <input type="submit" value="提交"> <input type="reset" value="重置"> <a href="showMessage.jsp">查看留言</a> </form> </body> </html> 2018年11月16日
62
【例9-10】留言板信息处理Servlet文件(AddMessageServlet.java) package ch09;
import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class AddMessageServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } 2018年11月16日
63
String(request.getParameter("author").getBytes("ISO-8859-1"),"UTF-8");
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String author=new String(request.getParameter("author").getBytes("ISO "),"UTF-8"); String title=new String(request.getParameter("title").getBytes("ISO "),"UTF-8"); String content=new String(request.getParameter("content").getBytes("ISO "),"UTF-8"); //获取当前时间并格式化时间为指定格式 SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String today=format.format(new Date()); MessageBean mm=new MessageBean(); mm.setAuthor(author); mm.setTitle(title); mm.setContent(content); mm.setTime(today); 2018年11月16日
64
HttpSession session=request.getSession(); //通过session对象获取应用上下文
ServletContext scx=session.getServletContext(); //获取存储在应用上下文中的集合对象 ArrayList wordlist=(ArrayList)scx.getAttribute("wordlist"); if(wordlist==null) wordlist=new ArrayList(); //将封装了信息的值JavaBean存储到集合对象中 wordlist.add(mm); //将集合对象保存到应用上下文中 scx.setAttribute("wordlist",wordlist); response.sendRedirect("showMessage.jsp"); } 2018年11月16日
65
AddMessageServlet. java中需要一个JavaBean保存messageBoard
AddMessageServlet.java中需要一个JavaBean保存messageBoard.jsp文件提交的数据,该JavaBean代码如【例9-11】。另外AddMessageServlet.java处理数据后由showMessage.jsp文件来显示留言信息,showMessage.jsp代码如【例9-12】。 2018年11月16日
66
【例9-11】用于保存messageBoard.jsp文件中数据的Bean(MessageBean.java) package ch09;
public class MessageBean { private String author; private String title; private String content; private String time; public MessageBean(){ } public String getAuthor() { return author; public void setAuthor(String author) { this.author = author; 2018年11月16日
67
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; public String getContent() { return content; public void setContent(String content) { this.content = content; public String getTime() { return time; public void setTime(String time) { this.time = time; 2018年11月16日
68
【例9-12】显示留言信息页面(showMessage.jsp)
import="ch09.MessageBean"%> import="java.util.ArrayList"%> contentType="text/html" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>显示留言内容</title> </head> <body background="image/f.jpg"> <% ArrayList wordlist=(ArrayList)application.getAttribute("wordlist"); if(wordlist==null||wordlist.size()==0) out.print("没有留言可显示!"); else{ for(int i=wordlist.size()-1;i>=0;i--){ MessageBean mm=(MessageBean)wordlist.get(i); %> 2018年11月16日
69
留 言 者:<%=mm.getAuthor() %>
<p>留言时间:<%=mm.getTime() %></p> <p>留言标题:<%=mm.getTitle() %></p> <p> 留言内容: <textarea rows="8" cols="30" readonly> <%=mm.getContent()%> </textarea> </p> <a href="messageBoard.jsp">我要留言</a> <hr width="90%"> <% } %> </body> </html> 2018年11月16日
70
【例9-13】配置Servlet的配置文件(web.xml) … <servlet>
<servlet-name>AddMessageServlet</servlet-name> <servlet-class>ch09.AddMessageServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/AddMessageServlet</url-pattern> </servlet-mapping> 2018年11月16日
71
2018年11月16日
72
总结与回顾! 2018年11月16日
73
第9章 Java Servlet技术 9.1 Servlet基础知识 9.1.1 什么是Servlet 9.1.2 Servlet生命周期
Servlet与JSP的区别 Servlet在Java Web项目中的作用 Servlet部署 开发一个简单的Servlet 9.2 JSP与Servlet常见用法 通过Servlet获取表单中的数据及其应用实例 重定向与转发及其应用实例 9.3 基于JSP+Servlet留言系统的应用实例 9.4 常见问题及解决方案 2018年11月16日
74
请复习已学知识! 预习后面章节的内容 并完成第10章项目的 功能!
2018年11月16日
Similar presentations