用Struts开发基于MVC的Web应用

8是wo的错

8是wo的错

2016-02-19 13:10

下面是个用Struts开发基于MVC的Web应用教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!
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://m.tulaoshi.com/bianchengyuyan/)(本文来源于图老师网站,更多请访问http://m.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://m.tulaoshi.com/bianchengyuyan/)(本文来源于图老师网站,更多请访问http://m.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://m.tulaoshi.com/bianchengyuyan/)(本文来源于图老师网站,更多请访问http://m.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所覆盖的。
展开更多 50%)
分享

猜你喜欢

用Struts开发基于MVC的Web应用

编程语言 网络编程
用Struts开发基于MVC的Web应用

基于MVC模式的Struts框架研究与应用

编程语言 网络编程
基于MVC模式的Struts框架研究与应用

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

基于MVC设计模式的WEB应用框架研究

编程语言 网络编程
基于MVC设计模式的WEB应用框架研究

基于Struts技术的Web应用设计与实现

编程语言 网络编程
基于Struts技术的Web应用设计与实现

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

了解MVC架构对于用Struts构建的强大的Web应用程序

编程语言 网络编程
了解MVC架构对于用Struts构建的强大的Web应用程序

通过Struts应用MVC设计模型

编程语言 网络编程
通过Struts应用MVC设计模型

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

jquery 学习笔记一

jquery 学习笔记一

Java入门(4) 第一个Java程序

Java入门(4) 第一个Java程序
下拉加载更多内容 ↓