用Struts开发基于MVC的Web应用(下)

  集成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>元素,这些定义了应用的功能流转控制。应用参考他们的名字(成功或者失败),然后控制被交到相关资源。

  实例学习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。

  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

  应用运行的显示结果如下:


The login page


The welcome page


The error page

  
小结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值