JavaWeb应用商品的管理.ppt
项目四网上商城商品的管理,3.任务实施(1)任务1 商品添加(2)任务2 MVC模式实现网上商城商品信息的管理,2.相关知识(1)Servlet的基本概念(2)Servlet的建立、配置、调用方法(3)MVC开发模式的建立方法,1.项目引入,课程目标,了解Servlet技术原理,了解Servlet的生命周期、结构;掌握开发Servlet的常用类、接口及其方法;掌握编写、配置和调用Servlet的方法;掌握Servlet的典型应用。,能力目标,能编写Servlet类;能在web.xml中配置servlet;能使用MVC模式进行项目开发,项目引入,网上商城商品后台管理是商城管理的一项重要工作,可以浏览已加入的所有商品信息,并能随时添加新的商品,对现有商品信息进行修改,对不需要的商品进行删除,同时能查看商品的详细信息等等。本项目主要是利用JSPServlet+JavaBean(MVC)模式进行项目开发,通过学习,可以掌握MVC设计思想。,任务4.1 使用Servlet添加商品信息,本任务主要是了解JSP中如何访问Servlet,在Servlet中如何访问JSP,在表单中如何向Servlet提交信息,Servlet如何接收请求的信息。应用Servlet技术,添加某一商品的信息到数据库中。,4.1.1 任务相关知识点,(1)Servlet的基本概念和生命周期;(2)Servlet的基本结构;(3)Servlet的配置方法;(4)Servlet的使用方法;。,4.1.1 相关知识Servlet的基本概念,2023/11/7,7,Servlet是Java Web服务器端可用于执行的应用程序,由支持JSP/Servlet的服务器的Servlet引擎负责管理运行。当客户请求一个Servlet时,引擎会将class文件载入内存,如果有多个客户同时访问一个Servlet,则会启用多线程,比CGI启用多进程方式的效率要高很多。Servlet是使用Java Servlet API编写的Java程序。Servlet要符合相应规范和接口才能在Servlet容器中运行。,4.1.1 相关知识Servlet的基本概念,2023/11/7,8,Servlet也可以直接用来编写处理客户端请求的代码。但是编写困难:页面展现的部分会与程序代码混合,不易维护与分工在Servlet中可以控制输出HTML代码,则所有的HTML代码必须一行一行输出。参见示例:SimpleServlet.java因此,在Servlet的基础上推出了jsp技术,但我们为什么还要讨论Servlet呢?理由还是为了让前台的页面表示与后台的业务逻辑处理分的更清,以便更方便地对代码进行维护,更具体的讨论在后面进行。,Servlet开发步骤:编写继承HttpServlet的Servlet类;在Servlet类中重写doGet、doPost方法,并在方法中编写相应的程序代码;在web.xml中进行配置servlet、servlet-mapping;运行。Servlet本身也是一个java类,所以必须存放在WEB-INF/classes之下(在此位置的程序无法直接访问,需映射地址)。另外注意:servlet中用到的包为扩展包,所以在使用时需要指定classpath:%Tomcat%commonlibservlet.jar;,2023/11/7,9,4.1.1 相关知识Servlet的开发和部署,一个简单Servlet实例,文件 SimpleServlet.javapackage cn.wxgyxy.lx.servlet;import java.io.*;/HttpServlet属于包下;ServletException属于javax.servlet包下import javax.servlet.*;/HttpServletRequest、HttpServletResponse存放在包下import javax.servlet.http.*;public class SimpleServlet extends HttpServlet/表示处理get请求public void doGet(HttpServletRequest req,HttpServletResponse resp)throws IOException,ServletException PrintWriter out=resp.getWriter();out.println();out.println();out.println(THE FIRST SERVLET);out.println();out.println();out.println(Hello World!);out.println();out.println();out.close();public void doPost(HttpServletRequest req,HttpServletResponse resp)throws IOException,ServletExceptionthis.doGet(reqt,resp);,2023/11/7,10,一个简单Servlet实例,要访问Servlet程序就必须有一个地址,只能通过WEB映射解决。配置文件 web.xml。/在web.xml文件内部起作用的名字 simple/Servlet程序所在的包.类名称.SimpleServlet/Servlet映射地址/在web.xml文件内部起作用的名字,此名字与上面的一致 simple/具体的映射路径,前面必须有一个/demo 注意:只要是web.xml文件修改,则必须重新启动服务器。访问地址:http:/localhost:8080/demoservlet/demo(假设项目名为demoservlet),2023/11/7,11,4.1.1 相关知识Servlet的基本结构,2023/11/7,12,Servlet的基本结构为:通常一个Servlet会扩展HttpServlet,并根据是由GET或POST方法发送而覆盖doGet方法或doPost方法。如果希望Servlet方法对GET或POST方法请求采取相同的动作,只要简单的用doGet调用doPost方法。doGet或doPost方法都有两个参数分别是HttpServletRequest和HttpServletRespose对象。HttpServletRequest对象的方法可以得到输入信息。HttpServletRespose允许输出信息。Servlet需要导入package,即导入java.io.*、javax.servlet.*、javax.servlet.http.*等。,4.1.1 相关知识Servlet的基本结构,2023/11/7,13,init方法该方法是HttpServlet类中的方法,可以被重写。以下是该方法的描述:public void init(ServletConfig config)throws ServletExceptionServlet第一次加载时,服务器初始化一个Servlet,即创建一个Servlet对象。这个对象调用init完成初始化工作。该方法在执行时,Servlet引擎会把一个ServletConfig类型的对象传递给init()方法,这个对象就被保存在Servlet对象中,直到Servlet对象被消灭。,service方法该方法是HttpServlet类中的方法,可以在Servlet中直接继承或重写该方法。以下是该方法的描述:public void service(HttpServletRequest request,HttpServletRespose response)throws ServletException,IOException当Servlet创建成功和初始化之后,Servlet就调用service方法来处理用户的请求并返回响应。其中第一个参数对象是HttpServletRequest类型对象,该对象封装了用户的请求信息,此对象调用相应的方法可以获取封装信息;另一个参数对象是HttpServletResponse对象,该对象用来响应用户的请求。,2023/11/7,14,4.1.1 相关知识Servlet的基本结构,4.1.1 相关知识Servlet的基本结构,doGet、doPost和doXxx方法HttpServlet类除了init,service,destroy方法外,还有两个很重要的方法doGet和doPost方法,用来处理客户的请求并作出响应。当服务器引擎第一次收到Servlet请求时候,会使用init方法初始化一个Servlet,以后每当服务器再接受到一个Servlet请求时候,就会产生一个新的线程,并在这个线程中调用service方法检查Http请求类型(GET、POST),同时根据用户的请求方式,对应的调用doGet或doPost方法。因此,在Servlet类中,不必重写service方法来响应客户,直接继承service方法即可。但可以重写doGet和doPost方法来响应请求,这样可以增加响应的灵活性,并降低服务器的负担。,2023/11/7,15,4.1.1 相关知识Servlet生命周期,2023/11/7,16,一个Servlet是包中Httpservlet类的子类。Servlet的生命周期主要有三个过程组成:首先,当创建Servlet请求时候,Web应用服务器能动态的装载和实例化Servlet。即服务器会创建Servlet的一个实例,并调用Servlet的init()方法初始化。(初始化1次)一旦初始化了Servlet,Servlet就能随时等候处理请求。通常是调用service方法。Service方法会根据HTTP请求的类型调用doGet或doPost方法。(调用多次)当Web服务器关门或Servlet长时间不用时,调用destory方法,Servlet会释放它使用的任何资源。(销毁1次)注意:init方法只被调用一次,即在Servlet第一次被请求加载时调用该方法。当有客户请求同一Servelt时,Web服务器会启动一个新的线程,在该线程中,Servlet调用service方法响应客户的请求,也就是说,每个客户的每次请求都会调用service方法。,4.1.1 相关知识Servlet生命周期,2023/11/7,17,生命周期全过程:加载实例化初始化处理请求退出服务,查看示例:LifeCycleServlet.java,并注意当多个用户访问时的运行结果。,4.1.1 相关知识Servlet使用,2023/11/7,18,调用Servlet1.在浏览器地址栏中直接调用Servlet(演示)在浏览器地址栏中直接输入url地址:http:/127.0.0.1:8080/ch4/helpHello2.在页面的form中调用Servlet 3.页面超级链接调用Servlet访问Servlet4.使用标签请求转发到Servlet,2023/11/7,19,4.1.2 任务实施,goodsAdd.html商品添加,Success.jsp成功页面,添加成功,数据库(goods表),GoodsBean.java表示goods表,ConnDB.java得到连接,界面(Veiw),模型(Model),操作数据库,添加请求,GoodsAddServlet.java处理添加,GoodsAddCl.jsp处理添加,4.1.2 任务实施,完成以下任务:1.goodsAdd.html设计,该页面用表单提交某一商品的所有信息给GoodsAddServlet。2.设计GoodsAddServlet.java,该Servlet首先接收表单提交上来的信息,并将信息加入到数据库中,成功添加后,跳转到Success.jsp。在成功页面给出提示信息:“查看此商品”,点击查看则跳转到GoodsAddServlet,从数据库中获得此商品信息,之后在GoodsShow.jsp中显示。本项目中涉及从表单到访问Servlet,从Servlet跳转到JSP页面,从JSP页面到Servlet的各种情况下Servlet的应用。,2023/11/7,20,任务小结,Servlet具有生命周期,加载实例化初始化处理请求退出服务调用Servlet;Servlet要符合相应规范和接口才能在Servlet容器中运行;在创建Servlet后要使用必须在web.xml中进行布署才可使用。调用Servlet有多种形式:在浏览器地址栏中直接调用Servlet(演示)在页面的form中调用Servlet页面超级链接调用Servlet使用标签请求转发到Servlet,2023/11/7,21,课后习题,思考题(1)Servlet的生命周期是什么?(2)Servlet的基本结构是怎样的?(3)doGet、doPost方法分别在什么情况下执行?(4)如何布署Servlet?(5)如何调用Servlet?,任务4.2 商品信息管理,在项目3中,尽管通过JavaBean技术已基本实现业务处理和表示层的分离,但还有一些JSP程序并没有实现页面显示功能,而是起到逻辑控制的作用,没有实现表示层和业务处理层的完全分开,这对具有团队协作开发的大型项目来说效率较低。本任务引入控制器control的概念,利用JSPServletJavaBean模式(MVC),实现电子商城中商品信息的浏览、修改、删除等操作管理,初步掌握MVC编程思想。,4.2.1 任务相关知识点,(1)doGet、doPost方法功能的实现;(2)HttpServletRequest、HttpServletResponse对象的使用;(3)利用RequestDispatcher对象实现页面跳转。,4.2.1 相关知识Servlet API,2023/11/7,25,Servlet API是一组Java类与接口,它定义了Web客户端和Web Servlet之间的标准接口。Servlet常用类与接口的层次关系:,4.2.1 相关知识Servlet常用接口,2023/11/7,26,HttpServletRequest:Servlet引擎使用ServletRequest来向Servlet提供有关客户请求的信息。从ServletRequest接口派生的接口,如HttpServletRequest接口,能够提供进一步的与协议相关的数据。所以HttpServletRequest接口类型的对象常用方法为:public Object getAttribute(String name);返回请求中指定属性的值,如果该属性不存在,就返回一个空值。public void setAttribute(String name,Object object);在请求中添加一个属性,该属性可以被其他可以访问这个请求对象的对象使用。public HttpSession getSession(boolean create);返回当前HTTP会话,如果不存在,则创建一个新的会话,create参数为true。public String getParameter(String name);返回该属性的属性值public String getParameterValues(String name);返回该属性的所有参数值的一个String数组public RequestDispatcher getRequestDispatcher();返回一个RequestDispatcher 对象doGet、doPost方法中的一个参数就是HttpServletRequest类型的。具体示例:UserManaSys_mvc项目中的LoginClServlet.java,4.2.1 相关知识Servlet常用接口,2023/11/7,27,HttpServletResponse:Servlet引擎使用ServletResponse向客户端传送经过MIME编码的数据。发送文本数据时,使用getWriter方法返回PrintWriter对象;发送二进制数据时,使用getOutputStream方法返回ServletOutputStream对象 HttpServletResponse接口类型对象常用方法:public ServletOutputStream getOutputStream()throws IOException;返回一个记录二进制的响应数据的输出流。如果这个响应对象已经调用getWriter,将会抛出IllegalStateException。public PrintWriter getWriter throws IOException;返回一个PrintWriter对象用来记录格式化的响应实体。如果要反映使用的字符编码,必须修改响应的MIME类型。在调用该方法之前,必须设定响应的content类型。public void setContentType(String type);设定响应的content类型,这个类型可能会在一些情况(例如当服务器发现有必要的情况下对MIME的字符设置)下被隐式地修改。为了保证能成功设定响应头的content类型,在响应被提交到输出流之前必须调用该方法。public void sendRedirect(String url);将用户重新定向到一个JSP页面或另一个Servlet。具体示例:UserManaSys_mvc项目中的LoginClServlet.java,4.2.1 相关知识Servlet常用接口,2023/11/7,28,RequestDispatcher接口RequestDispatcher接口定义一个对象,从客户端接收请求,然后将它转发给服务器的可用资源(例如Servlet、CGI、HTML文件、JSP文件)。RequestDispacher接口中定义的方法为:public void forward(ServletRequest request,ServletResponse response)throws ServletException,IOException;forward方法用来从这个Servlet向其它服务器资源传递请求。当一个Servlet对响应作了初步的处理,并要求其它的对象对此做出响应时,可以使用该方法。应用举例:RequestDispatcher_test.javapublic void include(ServletRequest request,ServletResponse response)throws ServletException,IOException 用来包括发送给其他服务器资源的响应的内容。,4.2.1 相关知识Servlet常用接口,2023/11/7,29,RequestDispatcher接口有三种方法可以得到RequestDispatcher对象。javax.servlet.ServletRequest的getRequestDispatcher(String path)方法,其中path可以是相对路径。javax.servlet.ServletContext的getRequestDispatcher(String path)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。使用javax.servlet.ServletContext的getNamedDispatcher(String name)得到名为name的一个Web资源,包括Servlet和JSP页面。这个资源的名字在Web应用部署描述文件web.xml中指定。具体请看下面的示例,RequestDispatcher接口举例,web.xml:FirstServletSecondServlet,2023/11/7,30,RequestDispatcher接口,FirstServlet/firstservlet/SecondServlet/secondservlet/,2023/11/7,31,RequestDispatcher接口举例,其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为ServletOne和ServletTwo。可以在浏览器中通过类似于下面的链接访问:http:/localhost:8080/servletdemo/firstservlet/使用1中方法,例如在firstservlet可以写入下面的代码:RequestDispatcher rd=request.getRequestDispatcher(secondservlet);rd.forward(request,response);此时控制权将转向到第二个Servlet了。使用2中的方法,可以从ServletContext中得到RequestDispatcher RequestDispatcher rd=getServletContext().getRequestDispatcher(“/secondservlet”);rd.forward(request,response);使用3中的方法,从上面的web.xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:RequestDispatcher rd=getServletContext().getNamedDispatcher(SecondServlet);rd.forward(request,response);在转发的过程中,可以将request、session对象设置的属性传递到下一个访问资源,具体的实现方法,我们将通过接下来的任务来逐步了解。,2023/11/7,32,2023/11/7,33,4.2.2 任务实施,GoodsShowCl.jsp处理控制,Index.jsp商品浏览,ShopDetail.jsp显示细节,显示细节,数据库(goods表),Model2模式(MVC),GoodsBeanCljava(业务逻辑),GoodsBean.java表示goods表,ConnDB.java得到连接,界面(Veiw),模型(Model),操作数据库,调用,删除修改请求,详情显示请求,GoodsServletCl.java处理控制,刷新商品浏览,4.2.2 任务实施,完成以下任务:1.完成 index.jsp页面设计,实现所有商品的列表显示,并能通过超链接方式能直接对每个商品进行修改、删除操作。2.完成GoodsBeanCLjava中修改、删除处理的代码设计。3.完成GoodsServletCl.java控制器的设计,能根据请求的不同分别处理删除、修改操作和将操作后的所有商品信息返回给浏览页面重新显示。在任务的设置过程中要注意如何在页面转发的过程中进行数据的传递。具体代码实现参见项目:goodsmanager,2023/11/7,34,任务小结,在Servlet中,request、response对象是在Servlet对象的doGet或doPost方法中获得的,我们可以像JSP中一样的使用它们。可以设置请求对象的属性,获得在上一资源提交的信息或设置的属性。实现页面转发过程中信息的传递。通过Servlet中获得的请求对象,可以获得Session对象,从而可以设置session对象的属性,并在转发的下一个资源中取得session的属性,同样可以传递信息。在Servlet中,利用请求对象的getRequestDispatcher()方法,可以获得一个RequestDispatcher对象,该对象可以实现页面的转发,相当于JSP中的服务器跳转。,2023/11/7,35,课后习题,思考题(1)Servlet对象是在服务器端还是在客户端?(2)是否一定要重写Service方法?重写了Servlet的doPost和doGet方法如何被调用?(3)Servlet对象如何获取用户的会话对象?(4)Servlet如何与Servlet或者JSP进行通信?(5)如何编写、编译、调试和配置Servlet?,