用Struts开发基于MVC的Web应用

2016-02-19 13:10 3 1 收藏

下面是个用Struts开发基于MVC的Web应用教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

【 tulaoshi.com - 编程语言 】

MVC介绍
  
  MVC模式是一种非常理想化的设计模式,应用MVC模式完成两个以上项目的人都有同样的体会,他们已经对以前的工作方法进行了彻底的改造。工作模式的改变要付出痛苦的代价,但现在你有现成的技术架构可以采用,避免在项目中自己开发、摸索。它就是开源Apache Struts framework,它提供了实现MVC设计模式最好的实现工具。
  
     在本文中,我们将简单了解、体会一下模型-视图-控制器(MVC)设计模式,非凡地,我们来看看如何用Struts架构来完美地实现MVC模式。我们先从理论上简单地描述MVC模式,然后用我们一个简单的例子来实现我们自己的MVC架构。在对MVC模式有了了解后,我们用Struts来看这个新技术是如何帮助我们迅速、简单地创建基于MVC的Web应用。
  
  模型-视图-控制器(Model-View-Controller)模式
  
  MVC模式最早是在Smalltalk(一种面向对象的语言)这种程序语言设计中被提出来的。我们暂时先忽略它的历史,集中注重力在关注它怎样被应用在Web应用开发中。
  
  当Java的Servlets技术最开始出现的时候,程序员们马上意识到这是一项极其有用的技术。与同时代的CGI Web开发技术相比,Servlets更快,更灵活,更可靠,更强大。然而,开发基于Servlets技术的Web应用有一个巨大的缺陷--需要使用例如out.println之类的语句来输出浏览器识别的Html。频繁使用这个方法是个错误的倾向,开发极其浪费时间(程序员需要经常退出所有应用程序进行重新编译)。并且这也使修改Web页面的工作也变得很困难,因为Web的表现和逻辑在一堆令人惧怕的代码中掺乎在一起。
  
  于是作为解决方法的JavaServer Pages(jsp)出现了,它们将Servlets变成它们运行的结果。应用JSP技术,我们将业务逻辑用一系列夹杂在HTML中的<%>标识来表达。以开发JSP为核心的应用尽管比以Servlet为核心的应用有进步,但看起来仍然是杂乱无章的,仍然需要用额外的代码来控制应用页面的流转。在布满格式化代码的JSP页面上,没有地方来增加这样额外的控制代码。显然需要寻找别的出路。
  
  不久人们熟悉到同时应用JSP和Servlets两种技术开发Web应用是一种不错的选择。究竟,Servlets擅优点理业务逻辑的编程,处理请求,控制功能页面的流转,而JSP则是格式化请求处理结果,通过浏览器获得用户输入。这种工作机制后来变成了人们长说的Model2(用JSP或Servlets中单独的一种实现web应用被称做Model 1).
  
  Model 2不是一项革命性的新模式,其实它是来自于Smalltalk语言研发过程中出现的MVC模式。大多数情况下,Java程序员趋向于可完全互换地使用这两个名词。
  什么是MVC模式?
  
  此前我们已对MVC在开发基于Java技术Web应用中的使用历史有了初步的了解,现在让我们来看看这种模式的细节。本节中,我们来准确地了解一下Models、Views、Controllers的确切含义,它们实现的任务,以及如何利用它们实现一个简单的MVC框架。我们先来看看Model、View、Controller是如何交互工作的。
  
  图SM01
  用Struts开发基于MVC的Web应用
  Figure 1 : Model 2/MVC架构
  
  如上图所示,用户通过提交requests与Controller组件(通常表现为Servlets)交互。接着Controller组件实例化Model组件(通常表现为JavaBeans或者类似技术),并且根据应用的逻辑操纵它们。一旦Model被创建,Controller决定下一个为用户显示的View(经常表现为JSP),同时View与Model交互操作,获得并为用户显示相关数据。在它被提交到Controller重新开始此操作之前,View可以修改Model的状态。
  
  为了更全面得理解组件之间的交互,我们来看一个应用这种框架实现的简单例子。这是一个完成提交、记录用户登陆信息的简单应用。
  
  View
  
  本例的View由两个简单的JSP页面组成。请参考代码 (login.jsp、welcome.jsp)。
  
  1>login.jsp只是简单地提供了用户输入姓名和口令的操作界面。输入完成后,登陆页提交输入到controller Servlet(代码如后Controller部分说明),告诉它需要调用"登陆操作(login action)"(操作参数通过form来传递);
  
  2>welcome.jsp页面利用用户前页提供的用户姓名显示一个欢迎信息。这里只是简单地调用了session中的JavaBean(从userBean的tag标识可以看到)。这个Bean是被Controller置于session中,我们接下来可以看到。
  
  Controller
  
  样例中的controller由一个Servlet构成,代码参见(Controller.class)。实现了我们应用中的Controller。
  
  这是个简单的controller,仅仅根据一个request参数(action)决定调用哪一个action。本例中,页面将login action作为参数传递进来,所以LoginAction被调用。该action实现了一个标准接口(Action),定义了将Request和Response对象作为参数的execute方法。这个action类返回被调用的下一页的路径,于是用户重定向到此页面。
  
  LoginAction类从request中获得username参数,创建一个新的model对象(UserBean),并将其传至Session,并返回"/welcome.jsp"标识流转的下一页面是welcome.jsp.
  
  Model.
  
  我们示例中的model也很简单,仅由一个JavaBean构成。代码参考UserBean.class。
  
  Action的扩展应用
  
  如你所示,这是一个很简单的Model 2应用,但它可以被在更大程度扩展。比如,我们可以动态配置映射request参数的action,我们也可以具体化controler的流转控制(比如action可以通过一个配置治理器(configuration manager)来动态获得需要返回的页面,而不是象现在这样写死在程序里)。
  
  然而,事实上有一个现成的框架提供所有这些控制、MVC组装相关的可配置项,甚至更多。
  
  这个现成的框架就是Struts。

更多的请看:http://www.QQread.com/windows/2003/index.html

Struts介绍
  
  Struts项目作为一个设想是Craig McClanahan2000年提出的,目标是为利用Java技术开发基于MVC模式的Web应用提供一个标准模式。Struts 1.0在2001年中期被最终发布,现在成为Apache Foundation的Jakarta项目的一部分。StrUCts应用范围极广,可以用在不同的项目,不同的行业(我所见到的从电信到电子商务都有应用实例)。
  
  Struts是一个高度可配置、高度扩展性的MVC框架,我们几乎可以用它开发任何能想到的用Java技术的Web应用。MVC模式的每一部分在Structs中都有相关对应部分。
  
  Struts的安装
  
  可以在http://apache.get-software.com/jakarta/struts/binaries/jakarta-struts-1.1.zip下载获得Struts的最新版本(目前是1.1)。下载后解压zip文件。发布包中包含了所有开发Struts应用所需的类库。发布包的Webapps目录下有一个空白的Struts Web应用(struts-blank.war),它已经包含了一个Web应用的骨架,非常有用,在这个基础上建立自己的应用显然对初学者能很快得到成就感。
  
  自己的代码放在WEB-INF/classes 目录下,根据自己的需要修改配置文件WEB-INF/struts-config.XML,做到这步,Struts的配置就完成了。现在就拥有了一个完全有效的Struts应用了。
  让我们来看看Struts提供的组件
  
  View层
  
  大多数Struts应用的view层是由JSP组成的。为了使view的开发更加轻易,Struts提供了一整套JSP自定义的tag库。这些tag库使我们能很轻易地提供完全国际化的用户界面,这些界面通常是与Struts应用中的Model组件交互。
  
  通常Web应用的动态前端都是基于HTML表单的,这些应用的用户需要应用的可靠性得到保证,这样就需要表单校验。假如用标准的JSP,记录表单的内容和从一个JavaBean获得表单内容简单乏味而且轻易出错。Structs应用FormBean使表单处理和校验变得轻易。FormBean与Struts的tag库结合,使带form的View开发变得轻易而自然。
  
  下面是一个Struts的JSP页面样例。
  
  <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
  
  <html:html>
  <head></head>
  
  <body bgcolor="white">
  
  <html:errors/>
  <html:form action="/Logon">
  <table border="0" width="100%">
  <tr>
  <td>
  Username:
  </td>
  <td>
  <html:text property="username"/>
  </td>
  </tr>
  <tr>
  <td>
  PassWord:
  </td>
  <td>
  <html:password property="password"/>
  </td>
  </tr>
  <tr>
  <td>
  <html:submit/>
  </td>
  <td>
   
  </td>
  </tr>
  </table>
  
  </html:form>
  </body>
  </html:html>
  从以上JSP样例可以看出,这与标准的HTML 表单不同。页面中没有杂乱无章的JSP<%>代码,然而它却能完成更多的功能。此JSP引入了Struts的HTML tag 库,它增加了能够完成收集提供了校验、错误处理、model交互功能的表单。注重<html:errors> tag,它可以显示model或者controller已经注册的错误。<html:form> tag则创建了一个基于ActionForm对象的HTML表单。上例中表单的action被置于 /login,我们用这个值到配置文件(示例如后)中去找对应的ActionForm。这种映射关系由表单对象的名字和它被存储的范围(session,页面,应用等等)组成。对象的属性用<html:text> 、<html:password> tag来表示,构成表单。值得炫耀的好处是,ActionForm被提交时可以自动拾获对应的表单数据,无须我们操心。
  
  从前面我们提到的ActionForm的用处来看,它似乎应该被视为应用的Model,然而事实上他们应当被当作应用中controller的一部分。ActionForm bean中显示了model的属性,但它们不包含任何持续性逻辑或者业务逻辑。ActionForm只是用来在Model、View之间传递Model信息。
  
  因为ActionForm属于controller中的一部分,我们将在后面controller的部分来具体了解它。
  
  Model层
  
  Struts应用中的model层可以应用任何基于Java的技术实现,比如EJB,Hibernate,或者JDO。通常,model是作为包含数据和业务逻辑的简单JavaBean出现的。如前所述ActionForm对象不是真正model层的体现,同时Model层应当独立于HTML的表单对象。假如可能的话,model对象的开发应当是与使用的开发技术和开发环境(Struts或者其他)无关的,这样我们就可以在不同的环境和应用中很轻易地重用它们。
  
  为了演示,我们开发了一个简单的基于JavaBean的model层对象,它不包含持续性逻辑。这个对象与我们的ActionForm对象映射,未来使用model层对象时,我们只需用更复杂的逻辑来代替它。
  
  Controller层
  
  Struts内置一个实现了controller主要功能的Servlet,它提供将需要调用的URL与一个action对象对应起来的功能。这个Servlet被称作ActionServlet,完成下列功能:
  
  1>根据用户要求决定需要的action;
  
  2>为View提供View需要的数据;
  
  3>决定要显示的下一个View。
  
  ActionServlet(强调:该Servlet已由Struts实现,是Struts架构的核心所在,开发者无须关心)的重头工作是调用一系列简单的Action类。Struts开发人员的工作主要是提供这些actions来实现应用的逻辑。创建action必须实现action接口。此接口包含以下方法:
  
  public ActionForward execute(ActionMapping mapping,
  ActionForm form,HttpServletRequest request,HttpServletResponse response)
  throws Exception;
  如上所示,该方法将ActionForm作为它的一个参数。上面提到的ActionServlet保证了正确的form传递给这个方法。在View层我们说过,ActionForms在Model层和View之间传递数据。
  
  ActionForms是一个非常简单的对象;以下代码显示了我们将在一个简单的HTML表单中用到的ActionForms:
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import org.apache.struts.action.ActionForm;
  import org.apache.struts.action.ActionMapping;
  
  public class Login extends ActionForm {
  
   protected String username;
   protected String password;
  
   public void setUsername(String username) {
  this.username = username;
   }
  
   public String getUsername() {
  return username;
   }
  
   public void setPassword(String password) {
  this.password=password;
   }
  
   public String getPassword() {
  return password;
   }
  
  }
  Action还包含一个ActionMapping对象。它被ActionServlet自动处理,体现应用的配置。具体配置可以从一个XML文件获得,通常就是struts-config.xml文件,下面将会提到。
  
  action运行方法将标准的request 、response作为参数,应用可以利用这些调用参数。action类处理完毕后,将ActionMapping所映射的要调用的下一个页面作为参数返回给ControllerServlet(Struts内置)。

更多的请看:http://www.qqread.com/windows/2003/index.html

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)集成Struts组件
  
  我们来看Struts是如何将这三层的组件组合在一起构成完整的应用。Struts应用用struts-config.xml来完成配置。这个配置文件包含了应用的所有可配置信息,包括:
  
  1>要用到的controller
  
  2>ActionForms和他们对应的HTML forms
  
  3>Actions
  
  4>ActionMappings,它控制应用的整个功能流转
  
  struts-config.xml的重要配置元素都包含在<struts-config>标识下。
  
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  <!DOCTYPE struts-config PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
  "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
  <struts-config>
  配置ActionForm对象:
  
  <form-beans>
  <form-bean
  name="LogonForm"
  type="com.samjdalton.struts.LogonForm"/>
  </form-beans>
  以上配置声明一个"LogonForm"的表单,接着说明需要用com.samjdalton.struts.LogonForm class来完成该表单设置。
  
  下一步,我们声明ActionMappings。
  
  <action-mappings>
  
  <action
  path="/Login"
  forward="/login.jsp"/>
  <action
  path="/Welcome"
  forward="/welcome.jsp"/>
  
  <action
  path="/ProcessLogin"
  type="com.samjdalton.struts.LoginAction"
  name="LogonForm"
  scope="request"
  validate="true"
  input="/Login.do">
  <forward
  name="success"
  path="/Welcome.do"/>
  <forward
  name="failure"
  path="/Logon.do"/>
  </action>
  </action-mappings>
  这段配置声明了我们应用中的三个action。前两个(/Login 、/Welcome)很简单,他们的前向都是JSP页面。第三个复杂一些,它在一个表单提交时被调用,它创建一个利用LogonForm 元素构建的ActionForm,然后调用LoginAction类来处理信息。我们可以看到两个<forward>元素,这些定义了应用的功能流转控制。应用参考他们的名字(成功或者失败),然后控制被交到相关资源。

更多的请看:http://www.qqread.com/windows/2003/index.html

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)实例学习Struts
  
  简单看过了Struts的组成及组装,现在来实现一个简单的应用,它实现与本文开头例子中相同的功能,即用户登陆并显示欢迎信息。
  
  应用中的view由2个简单JSP构成,第一个为登陆页,如下:
  
  <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
  
  <html:html>
  <head></head>
  
  <body bgcolor="white">
  
  <html:errors/>
  
  <html:form action="/ProcessLogin">
  <table border="0" width="100%">
  <tr>
  <td>
  Username:
  </td>
  <td>
  <html:text property="username"/>
  </td>
  </tr>
  <tr>
  <td>
  Password:
  </td>
  <td>
  <html:password property="password"/>
  </td>
  </tr>
  <tr>
  <td>
  <html:submit/>
  </td>
  <td>
   
  </td>
  </tr>
  </table>
  
  </html:form>
  </body>
  </html:html>
  这个与不用Struts的例子中的页面非常类似,不同之处仅仅是用Struts <html> tags定义了表单和调用的Action是配置中定义的"/ProcessLogin"。表单提交后相应的ActionForm将被创建,同时相应的action被调用处理该输入。我们还可以看到<html:errors> tag被用到,这个是为了自动显示表单中定义的校验错误信息(下面将提到)。
  
  第二个JSP如下:
  
  <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
  <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
  
  <html:html>
  
  <h1>Welcome <bean:write name="loginForm" property="username" /></h1>
  
  </html:html>
  本页简单地显示了一个命名为"loginForm"的ActionForm bean的一个属性(username).
  
  接着是controller层。controller层由ActionForm、Action两个类实现。ActionForm类很简单,主要是对应model(本例中是一个简单的JavaBean对象)。
  
  package com.samjdalton.struts;
  
  import org.apache.struts.action.ActionForm;
  
  public class LoginForm extends ActionForm {
   private LoginBean bean;
  
   public LoginForm() {
  this.bean=new LoginBean();
   }
   public LoginForm(LoginBean bean) {
  this.bean = bean;
   }
  
   public void setUsername(String username) {
  bean.setUsername(username);
   }
  
   public String getUsername() {
  return bean.getUsername();
   }
  
   public void setPassword(String password) {
  bean.setPassword(password);
   }
  
   public String getPassword() {
  return bean.getPassword();
   }
  }
  Action类用上面的ActionForm从view获得信息,并且修改model状态。
  
  Action类代码如下:
  
  package com.samjdalton.struts;
  
  import org.apache.struts.action.Action;
  import org.apache.struts.action.ActionForward;
  import org.apache.struts.action.ActionMapping;
  import org.apache.struts.action.ActionForm;
  
  public class LoginAction extends Action {
   public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm,  javax.servlet.http.HttpServletRequest httpServletRequest,  javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
  
  // check the username
   LoginForm form = (LoginForm) actionForm;
   if (form.getUsername().equalsIgnoreCase("sam") &&    form.getPassword().equals("password")) {
   // we are in
  return actionMapping.findForward("success");
   } else {
   // not allowed
  return actionMapping.findForward("failure");
   }
  }
  public ActionErrors validate(ActionMapping actionMapping
  HttpServletRequest httpServletRequest) {
   ActionErrors errors = new ActionErrors();
  
   if ( getUsername() == null getUsername().length() < 1 ) {
  errors.add("name",new ActionError("error.name.required"));
   }
  
   if ( getPassword() == null getPassword().length() < 1 ) {
  errors.add("pw",new ActionError("error.pw.required"));
   }
   return errors;
  }
  可以看到,action检查用户在username、password是否输入了"sam"、"password"。假如输入正确,action指明要调用的下一个view。

更多的请看:http://www.qqread.com/windows/2003/index.html

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
  action类还包含一个方法:validate。本例中,validate方法检查username 和password的输入,假如输入有误,返回错误信息。这些错误信息包含在一个资源文件(为了支持国际化)中,该文件信息在配置文件中被配置。
  
  应用的model是一个不包含持续逻辑的标准JavaBean对象,如下所示:
  
  package com.samjdalton.struts;
  
  public class LoginBean {
   private String username;
   private String password;
  
  public void setUsername(String username) {
   this.username=username;
  }
  
  public String getUsername() {
   return username;
  }
  
  public void setPassword(String password) {
   this.password = password;
  }
  
  public String getPassword() {
   return password;
  }
  }
  应用的struts-config.xml配置文件:
  
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  <!DOCTYPE struts-config PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
  "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
   <struts-config>
  <form-beans>
   <form-bean name="loginForm" type="com.samjdalton.struts.LoginForm"/>
  </form-beans>
  
  <action-mappings>
  
   <action path="/Login" forward="/login.jsp"/>
  <action path="/Welcome" forward="/welcome.jsp" name="loginForm" scope="request"/>
  
  <action path="/ProcessLogin" type="com.samjdalton.struts.LoginAction"
  name="loginForm" scope="request" validate="true" input="/Login.do">
  <forward name="success" path="/Welcome.do"/>
  <forward name="failure" path="/Login.do"/>
   </action>
   </action-mappings>
   <message-resources parameter="ApplicationResources" null="false" />
   </struts-config>
  大多数文件与上例所示相同,仅有的区别是<message-resources> tag。此tag答应我们具体化应用代码中的string类型,好处是轻易国际化。上例中,资源包含在名字为"ApplicationResources.properties"的文件中,它必须存在于应用的classpath(万无一失的方法是将它配置到你的WEB-INF/classes路径下)。
  
  配置成功后,IE中输入如下URL(Tomcat):
  
  http://localhost:8080/<war-file-name>/Login.do
  
  应用运行的显示结果如下:
  
  用Struts开发基于MVC的Web应用
  The login page
  
  用Struts开发基于MVC的Web应用
  The welcome page
  
  用Struts开发基于MVC的Web应用
  The error page
  
  小结
  

  本文中,我们先介绍了MVC模式,用两种技术完成可一个MVC模式的简单实现,包括Struts,这项可以开发更灵活、扩展性更强的基于MVC模式的Web应用。显然这已经远远超出了Struts所覆盖的。

来源:http://www.tulaoshi.com/n/20160219/1603160.html

延伸阅读
Struts 和 Tiles 辅助基于组件的开发(1) 将视图组合在一起以便于构造 Web 应用程序 “模型-视图-控制器(Model-View-Controller,MVC)”框架对于生成有组织的模块化应用程序(这些应用程序能够清楚地划分逻辑、样式和数据),是一种经证实的和方便的方法。在 Java 世界中,Struts 是最闻名的也是最常被谈及的 MVC 的开放...
Struts 和 Tiles 辅助基于组件的开发(5) Struts 和 Tiles 更复杂的使用 篇幅所限,不答应我再深入讨论 Struts 和 Tiles 包其它一些实用的方面,但我真的想简要地谈一下,这样您可以对 Struts 和 Tiles 可以做些什么有所了解。假如有足够的需求,可能这些内容会是将来文章的主题。 您会在本文的两个示例中注重到,我编码了名...
摘要: 这篇文章将讨论怎样组合几个闻名的框架去做到松耦合的目的,怎样建立你的构架,怎样让你的各个应用层保持一致。富于挑战的是:组合这些框架使得每一层都以一种松耦合的方式彼此沟通,而与底层的技术无关。这篇文章将使用3种流行的开源框架来讨论组合框架的策略 其实,就算用Java建造一个不是很烦琐的web应用...
Struts是一个Web Framework。那么什么是Framework? !-- frame contents -- !-- /frame contents -- Framework概念并不是很新了,伴随着软件开发的发展,在多层的软件开发项目中,可重用、易扩展的,而且是经过良好测试的软件组件,越来越为人们所青睐。这意味着人们可以将充裕的时间用来分析、构建业务逻辑的应用上,而非...
标签: Web开发
在过去,由于为了获得新数据而不得不重新加载web页面(或者加载其他页面)导致web应用程序发展被限制。虽然有其他方法可用(不加载其他页面),但是这些技术都没有被很好地支持而且有bug成灾的趋向。在过去的几个月里,一个过去并不被广泛支持的技术已经被越来越多的web冲浪者(web surfers??是指浏览器还是浏览者?)所接受,它给了开发者更...

经验教程

126

收藏

100
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部