《Java Web 应用程序设计立体化教程》第6章MVC模式下的Servlet技术_第1页
《Java Web 应用程序设计立体化教程》第6章MVC模式下的Servlet技术_第2页
《Java Web 应用程序设计立体化教程》第6章MVC模式下的Servlet技术_第3页
《Java Web 应用程序设计立体化教程》第6章MVC模式下的Servlet技术_第4页
《Java Web 应用程序设计立体化教程》第6章MVC模式下的Servlet技术_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

6MVC模式下的Servlet技术学习目标了解Servlet的工作原理、生命周期和方法。掌握如何创建Servlet类并部署运行Servlet。理解MVC设计思想、MVC中Servlet的作用。掌握MVC+DAO设计模式的方法及其组成类。学会MVC+DAO设计模式开发Web项目。6.1Servlet简述Servlet是JavaServlet的简称,称为用Java编写的服务器端程序,具有独立于平台和协议的特性。在JavaWeb开发设计中应用Servlet技术,作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层,动态地扩展服务器的能力。6.1.1什么是Servlet

狭义的Servlet是指javax.servlet.Servlet包中定义的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。Servlet运行于支持Java的应用服务器中,可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。最早支持Servlet标准的就是JavaSoft的JavaWebServer。6.1.2Servlet的工作原理Servlet通过创建一个框架来扩展服务器的能力,以提供在Web上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给Servlet,并让Servlet建立起服务器返回给客户机的响应。当启动Web服务器或客户机第一次请求服务时,可以自动装入Servlet。装入后,Servlet继续运行直到其它客户机发出请求。Servlet的工作过程Servlet看起来像是Java程序,一个Servlet可以说就是Java编程语言中的一个类,可以导入特定的属于JavaServletAPI的包,可动态地从网络加载,Servlet对Server就如同Applet对Client一样。6.1.3Servlet的生命周期Servlet生命周期是一个Servlet从创建直到毁灭的整个过程,可以被定义为一个Servlet如何被加载、初始化,以及它怎样接收请求、响应请求,直至结束提供服务的过程。在Servlet接口中定义了5个方法,其中有3个方法代表了Servlet的生命周期。init()方法:Servlet实例一旦被创建出来,便调用init()方法进行初始化,init()方法被设计成只调用一次,相当于一次性初始化。6.1.3Servlet的生命周期service()方法:是执行实际任务的主要方法。Web服务器调用service()方法来处理来自客户端的请求,并把格式化的响应写回给客户端。destroy()方法:只会被调用一次,在Servlet生命周期结束时被调用。当web服务器认为此Servlet没有存在的必要、类重新加载、服务器关闭、长时间未被访问,则可以从内存中销毁。在调用destroy()方法之后,servlet对象被标记为垃圾回收。Servlet生命周期图6.1.4JavaServletAPIJavaServlet开发工具(JSDK)提供了多个软件包,在编写Servlet时需要用到这些软件包。在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的通用接口和类。在javax.servlet.http包中定义了采用HTTP通信协议的HttpServlet类。Servlet框架核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。

当Web容器接收到某个Servlet请求时,Servlet把请求封装成HttpServletRequest对象,然后把对象传给Servlet的对应的服务方法。HttpServlet类中的服务方法doGet():调用服务器的资源,并将其作为响应返回给客户端。doGet()调用在URL里显示正在传送给Servlet的数据。doPost():它用于把客户端的数据传给服务端,使用它可以以隐藏方式给服务器端发送数据,Post适合发送大量数据。doHead():它用于处理客户端的Head调用,并且返回一个response。当客户端只需响应的Header时,就发出一个Header请求。doPut():调用和doPost()相似,并且它允许客户端把真正的文件存放在服务器上,而不仅仅是传送数据。doDelete():它允许客户端删除服务器端的文件或者Web页面。6.1.5创建一个Servlet(1)继承HttpServlet抽象类。(2)覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法。

(3)获取HTTP请求信息,通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串。(4)生成HTTP响应结果,通过HttpServletResponse对象生成响应结果,它有一个getWriter()方法,该方法返回一个PrintWriter对象。例题:在MyEclipse创建一个Servlet1.在Myeclipse中创建一个WebProject,名称为TestServlet例题:在MyEclipse创建一个Servlet2.在TestServlet中File->New->Servlet,创建Servlet,名称为MyServlet例题:在MyEclipse创建一个Servlet3.在MyServlet已经生成了部分代码,覆盖doGet和doPost方法。public

voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsIOException,ServletException{ StringclientName=request.getParameter("clientName");

if(clientName!=null) clientName=newString(clientName.getBytes("ISO-8859-1"),

"GB2312");

else

clientName="MyServlet";

PrintWriterout; Stringtitle="HelloServlet"; response.setContentType("text/html;charset=GB2312");

out=response.getWriter();out.println("<!DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.01Transitional//EN\">"); out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>"); out.print("</HEAD><BODY>"); out.print("MyServlet的doGet方法的输出:"); out.println("<h1><p>"+clientName+":您好</h1>"); out.print("</BODY></HTML>"); out.close(); }例题:在MyEclipse创建一个Servlet3.在MyServlet已经生成了部分代码,覆盖doGet和doPost方法。public

voiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException{ response.setContentType("text/html"); PrintWriterout=response.getWriter(); out.println("<!DOCTYPEHTMLPUBLIC\"-//W3C//DTDHTML4.01Transitional//EN\">"); out.println("<HTML>"); out.println("<HEAD><TITLE>AServlet</TITLE></HEAD>"); out.println("<BODY>"); out.print("MyServlet的doPost方法的输出:"); out.println("</BODY>"); out.println("</HTML>"); out.flush(); out.close(); }例题:在MyEclipse创建一个ServletServlet程序编写完成后,需要对其进行编译。编译后得到的Servlet字节码文件存放Tomcat安装根目录\webapps\<Web应用的根URL目录>\WEN-INF\classes\目录中。例题:在MyEclipse创建一个Servlet4.在web.xml中部署Servlet<servlet><description>ThisisthedescriptionofmyJ2EEcomponent</description><display-name>ThisisthedisplaynameofmyJ2EEcomponent</display-name><servlet-name>MyServlet</servlet-name><servlet-class>com.test.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/servlet/MyServlet</url-pattern></servlet-mapping> <Servlet>元素:包含两个子元素,<Servlet-name>和<Servlet-class>,它们分别用以设置Servlet的注册名和指定Servlet的包名。<Servlet-mapping>元素:用于配置Servlet的URL映射。<Servlet-mapping>元素包含两个子元素:<Servlet-name>和<url-pattern>,它们分别对应Servlet的注册名和客户端访问该Servlet访问路径的URL。<url-pattern>子元素必须以表示Web应用程序根目录的正斜杠(/)开始,而不能是整个Web应用的根目录。路径名可以是多级目录的形式,也可以是单级目录的形式,同一个Servlet也可以配置多个URL映射。例题:在MyEclipse创建一个Servlet启动JavaWeb服务器(如Tomcat),在浏览器的地址栏中输入:http://localhost:8080/TestServlet/servlet/MyServlet其中/servlet/MyServlet为<url-pattern>声明的URL地址6.1.6Servlet的优缺点(1)高效持久(2)高可移植性(3)可扩展(4)功能强大(5)安全(6)高集成性Servlet也有其缺点,其中最大缺点是,不能有效地分离页面的逻辑部分和页面的输出部分,导致Servlet代码比较混乱,使得用Servlet开发网站变得很困难。优点缺点6.2MVC设计模式MVC是模型(Model)-视图(View)-控制器(Controller)的缩写,即把一个应用的输入、处理、输出流程按照模型、视图、控制器的方式进行分离的代码组织方式,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。6.2.1MVC设计思想MVC充分发挥了Servlet的技术特点,有助于将应用程序分割成若干个逻辑模块,JSP页面擅长数据显示,适合做显示层,避免在JSP中大量使用Java代码来处理数据;Servlet擅长数据处理,应避免在其中有大量的HTML标记输出,系统的流程控制和业务逻辑的调用工作由servlet来进行;业务逻辑部分装在JavaBean中,这种构架在开发上将会极大的降低页面、控制和业务逻辑的关联性,提高系统的灵活性和扩展性。6.2.2MVC中Servlet的作用MVC模式设计具体实现时,把Servlet用作应用程序的控制器,所有的请求都被发送给Servlet,它接受请求并根据请求信息将它们分发给适当的Web页面响应。Servlet还根据需求生成JavaBeans的实例并输出。Web页面可以通过直接调用方法或使用<jsp:useBean>标签得到JavaBeans中的数据。这种设计模式很好地实现了数据层与表示层的分离,使开发工作更加容易和迅速。请求与响应相关接口主要是HttpServletRequest和HttpServletResponse接口。1.HttpServletRequest接口(1)StringgetParameter(Stringname),获取单值表单元素的值如获取单个输入框的值:Stringuser=request.getParameter("user");(2)String[]getParameterValues(Stringname),获取多值表单元素的值如获取一组复选框的值:String[]str=request.getParameterValues("us");(3)EnumerationgetParameterNames()(字符串对象的Enumeration类型),获取所有的请求信息(4)客户端发送请求时,同时发送Cookie,可以通过HttpServletRequest对象获取(5)可以通过参数HttpServletRequest对象获取Session信息HttpSessionsession=request.getSession(true);2.向客户发回数据(1)从控制层向视图层传值,通常使用request对象,向request中存储信息。使用其方法:request.setAttribute(“参数名”,对象);(2)页面跳转,通过接口RequestDispatcher可以完成重定向。RequestDispatcherrd=request.getRequestDispatcher("abc.jsp");rd.forward(request,response);(3)使用response对象的sendRedirect()也可以完成重定向response.sendRedirect("error.jsp");注意:使用该方法时,当前文件和要转向的文件不属于同一次请求,不能共享request,如果需要通过request对象传递信息,不能使用sendRedirect()方法。6.2.3MVC设计模式的实现

例题6-2,以MVC设计模式创建用户登录系统模块。运行过程详见课本启动Tomcat服务器,在浏览器中测试程序,如果输入正确的用户名zhangsan和密码123456,验证后登录成功,跳转success.jsp页面;如果输入错误的用户名lisi和密码654321,则登录失败,留在login.jsp页面,并有非法登录的提示。6.2.4MVC设计模式的扩展性MVC模式具有极其良好的可扩展性。它可以轻松实现以下功能:(1)实现一个模型的多个视图。(2)采用多个控制器。(3)当模型改变时,所有视图将自动刷新。(4)所有的控制器将相互独立工作。6.3MVC+DAO设计模式DAO(DataAccessObject)是数据访问对象,采用DAO设计模式,开发人员可以把数据访问控制和业务逻辑分开。DAO设计模式是对关系数据库访问操作的抽象与封装,将对数据库操作的关系数据库语言抽象封装成接口,这样程序员就可以以面向对象的方式进行使用。6.3.1DAO设计模式的功能DAO的主要功能是数据操作,在JavaWeb标准开发架构中属于数据层的操作。DAO为软件的上层模块提供了数据访问的接口。业务逻辑开发人员可以将所有需要用到的数据处理方法存放在DAO接口类中,在需要对数据处理时调用接口中相应的方法,而无需了解数据处理方法在底层是如何实现的,对接口类中方法的实现封装在DAO实现类中。MVC+DAO设计模式如图6.3.2DAO设计模式的组成(1)VO类:封装数据库表,一个VO类代表一张数据库中的表,一个VO类对象代表表中的一条记录;(2)DAO接口:封装业务逻辑层需要用到的业务处理,定义所需要的具体操作方法;(3)DAOImpl类:对应DAO接口的实现类,完成数据访问真实主题的业务逻辑处理;

(4)DAOFactory类:用来实例化所操作的对象,根据业务的需求选择DAO实现类;(5)DBConnection类:专门用于连接数据库的操作类。6.3.3MVC+DAO设计模式的开发实例设计一个图书管理系统,实现用户登录后的图书信息依据不同条件的精确查询和模糊查询。1.在SQLServer2008数据库管理系统中创建数据库bookstore,增加user_info表和book_info表2.设计两个VO类VO类与bookstore中的两个表一一对应,命名规则:vo.XXX,以数据库中的字段项对应的类的属性和属性的setter、getter方法构成。packagevo;public

classUser{

privateStringusername;

privateStringpassword;

publicUser(){

}

publicUser(Stringusername,Stringpassword){

super();

this.username=username;

this.password=password; }……packagevo;public

classBook{

privateStringtitle;

privateStringcategory;

privateStringisbn;

privateStringwriter;

privateStringpublisher;

private

double

price;……3.设计用户登录和图书查询DAO接口可以定义一系列的原子性操作,如图书的增删查改等操作的接口。命名规则:dao.IXXXDAOpackagedao;importvo.User;public

interfaceIUserDAO{

public

booleanfindLogin(Useruser)throwsException;}packagedao;importjava.util.List;importvo.Book;public

interfaceIQueryBookDAO{

publicList<Book>findAllBooks()throwsException;

publicList<Book>findBooksByName(Stringtitle)throwsException;

publicBookfindBookByISBN(Stringisbn)throwsException;}4.设计DAO接口的实现类完成访问数据库的操作,但是不负责数据库的打开和关闭。命名规则:dao.impl.xxxDAOImplpublic

classUserDaoImplimplementsIUserDAO{

privateJDBCUtiljdbcUtil=null;

publicUserDaoImpl()throwsException{ jdbcUtil=newJDBCUtil(); }

public

booleanfindLogin(Useruser)throwsException{ Stringsql="select*fromuser_infowhereusername=?andpassword=?"; String[]param={user.getUsername(),user.getUserpass()}; ResultSetres=null;

try{

res=jdbcUtil.executeQuery(sql,param);

if(res.next()){return

true;

}return

false; }catch(Exceptione){throw

e; }finally{try{

if(res!=null){

res.close();}}catch(Exceptione){

throw

e;}}}

public

voidcloseConnection()throwsException{

jdbcUtil.close();

}}4.设计DAO接口的实现类public

classQueryBookImplimplementsIQueryBookDAO{

privateJDBCUtiljdbcUtil=null;

publicQueryBookImpl()throwsException{

jdbcUtil=newJDBCUtil();

}

publicList<Book>findAllBooks()throwsException{

returnfindBooksByName("");}

publicList<Book>findBooksByName(Stringtitle)throwsException{ Stringsql="select*frombook_infowheretitlelike'%"+title+"%'"; List<Book>books=newArrayList<Book>();

ResultSetres=null;

try{ res=jdbcUtil.executeQuery(sql,

null);

while(res.next()){

books.add(new

Book(res.getString("title"),res.getString("category"),res.getString("isbn"),res.getString("writer"),res.getString("publisher"),res.getDouble("price")));}……5.设计Factory类获得一个DAO类的实例对象。命名规则:factory.DAOFactorypackagefactory;importdao.*;importdao.impl.*;public

classDAOFactory{

public

staticIUserDAOgetIUserDAOInstance()throwsException{

return

newUserDaoImpl(); }

public

staticIQueryBookDAOgetIQueryBookDAOInstance()throwsException{

return

newQueryBookImpl(); }}6.设计负责打开连接数据库和关闭数据库操作的类public

classJDBCUtil{

private

staticStringDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";

private

staticStringUrl="jdbc:sqlserver://localhost:1433;databaseName=bookstore";

private

staticStringuser="sa";

private

staticStringpassword="123456";

privateConnectioncon=null; PreparedStatementpstmt=null; ResultSetres=null;

publicJDBCUtil()throwsException{ Class.forName(Driver);

con=DriverManager.getConnection(Url,user,password); }

publicConnectiongetConnection(){

return

con;

}……7.设计用户登录界面login.jsp代码<body

><form

action="servlet/LoginServlet"

method="post">

<div

style="height:200px;width:50%;margin:0auto;border:1pxsolid;">

<h3

style="float:left;position:absolute;margin-left:130px">图书系统用户登录</h3>

<table

style="margin-top:57px;margin-left:130px">

<tr

style="height:33%"><td

><img

alt=""

src="img/user.png"

>

用户名:</td>

<td><input

type="text"

name="username"

></td></tr>

<tr

style="height:33%">

<td><img

alt=""

src="img/key.gif"

style="width:16px">

码:</td>

<td><input

type="password"

name="password"></td></tr>

<tr

style="height:33%">

<td

colspan="2"

style="text-align:right;"><input

type="submit"

value="登录"></td>

</tr></table></div>

</form></body>点击登录后,交由LoginServlet处理的代码public

classLoginServletextendsHttpServlet{

public

voiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException{ Useruser=newUser(request.getParameter("username"),request.getParameter("password"));

booleanislogin=false; HttpSessionsession=request.getSession();

try{

if(DAOFactory.getIUserDAOInstance().findLogin(user)){ islogin=true; session.setAttribute("user",user); session.setAttribute("islogin",islogin); request.getRequestDispatcher("QueryBookServlet").forward(request,response); }else{ response.sendRedirect("/MVCDAO/login_failure.jsp");} }catch(Exceptione){e.printStackTrace();} }}8.在web.xml设置Servlet<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>servlet.LoginServlet</servlet-class></servlet><servlet><servlet-name>QueryBookServlet</servlet-name><servlet-class>servlet.QueryBookServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/servlet/LoginServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>QueryBookServlet</servlet-name><url-pattern>/servlet/QueryBookServlet</url-pattern></servlet-mapping>9.设计用户登录后的主界面main.jsp代码 <formaction="servlet/QueryBookServlet"method="post">

<inputtype="text"name="queryname"

placeholder="请输入你要查询的书名或者isbn号"style="width:40%">

<inputtype="submit"value="查询“</form> <tableborder="1"bordercolor="#000ff0"cellspacing="0"width="800"><%ArrayList<Book>arrayList=null; Objectbooklist=session.getAttribute("booklist");Objectquerybooklist=session.getAttribute("que

温馨提示

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

评论

0/150

提交评论