铁手剑谱

上善若水
数据加载中……
Struts秘籍之起式:第1.5式:将JSP 应用转到Struts

第1.5式. 将JSP 应用转到Struts

问题

你需要将一个已有的基于JSP的web 应用转换为Struts 的应用。

动作分解

在加入新的功能到应用中时,可应用Struts采取重构的方式来进行。随着你对Struts 知识的增加,你可以将现有代码重新架构成使用Struts。如果没有计划对应用进行新的开发,就一次性重构现有的JSP代码。

变化

迁移一个现有JSP应用的困难程度取决于应用的复杂度和架构的稳固性。如果应用使用Model 1 架构,所有的逻辑多包涵在JSP中,这的确是一个不小的挑战。你会发现你需要从头重新设计应用,以便在你开始重构之前分离业务逻辑和表现。

如果你新接触Struts,那么可以在一个新应用的开发中学习Struts而不是等到玩得很熟了才进行开发。Struts 不是在开发流程后端可以随便轻易就可以“开瓶即喝”的可乐。但是,有些项目却在开发过程中途变更项目的架构支撑。如果你处于这种情况,请掌握好你的项目计划,以便Struts 能够首先应用到新的开发中和适合的特征中,而不是在危急的道路之上。一旦你增长了你的Struts 功力,将使得转换现有代码更加容易。

为了使这更具体些,考虑一个有3个页面组成的简单例子。第一个页面是一个主要的欢迎页面,显示到第2个页面的链接。第二个页面显示两个表单输入字段。当用户提交表单时,所添加的值的结果显示在第3个页面上。

首先,Example 1-3 显示了提供输入页面链接的index.jsp页面。

Example 1-3. 链接到一个输入页面

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
   
<head>
      
<title>Simple Calculator</title>
   
</head>
   
<body>
      
<href="get_input.jsp">calculator</a>
   
</body>
</html>

 

Example 1-4 展示了提交输入值的get_input.jsp页面。

Example 1-4. Submitting data

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
   
<head>
      
<title>Add Two Numbers</title>
   
</head>
   
<body>
      
<form action="display_result.jsp">
         Value 1: 
<input name="value1" type="text"/><br/>
         Value 2: 
<input name="value2" type="text"/>
         
<p>
            
<input type="submit"/>
         
</p>
      
</form>
   
</body>
</html>

 

Example 1-4中的页面将表单提交给一个JSP 页面来显示结果。目标页面 (示于Example 1-6) 使用了一个JavaBean 来持有在请求中从表单接收的值。在看目标JSP代码之前,Example 1-5展示了存储数据的JavaBean 的代码。

Example 1-5. Simple JavaBean

 

package com.oreilly.strutsckbk;

public class ValueHolder {
    
private int value1;
    
private int value2;

    
public int getValue1( ) {
        
return value1;
    }


    
public void setValue1(int value1) {
        
this.value1 = value1;
    }


    
public int getValue2( ) {
        
return value2;
    }

   
    
public void setValue2(int value2) {
        
this.value2 = value2;
    }

}

 

display_result.jsp页面,示于Example 1-6, 使用JSP setProperty标签来通过请求值来组装bean。值的输出使用请求时表达式,而和的计算则使用一个scriptlet。最后,该计算出的总和被显示出来。

Example 1-6. Displaying results

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
   
<head>
      
<title>Add Two Numbers</title>
   
</head>
   
<body>
      
<jsp:useBean 
            
id="valueHolder"
            class
="com.oreilly.strutsckbk.ValueHolder">
         
<jsp:setProperty name="valueHolder" property="*"/>
      
</jsp:useBean>
      The sum of 
<%= valueHolder.getValue1( ) %> plus
      
<%= valueHolder.getValue2( ) %> is:<p>
      
<% int sum = valueHolder.getValue1( ) + valueHolder.getValue2( ); %>
      
<%= sum %>.<p>
      
<href="get_input.jsp">perform another calculation</a>      
   
</body>
</html>

 

这个应用演示了一些很不受人欢迎的使用JSP的方式。虽然使用JavaBean 是值得赞扬的,计算却是在JSP中使用scriptlet来执行的。其结果是业务逻辑和表现混合在一起,scriptlets (内嵌的的Java 代码) 可能导致JSP应用的维护问题。

明确的说明转换这个应用到Struts 的策略是简单的。虽然这个例子微不足道,但所采用的策略却可适用于更加复杂的应用。应该尽可能的从JSP中去除内嵌的以scriptlet (<% %>)开始的Java 代码;如果可能还要去请求时表达式(<%= %>)。为了完成这个任务,Example 1-6中,将通过添加一个计算和返回总和的方法将和的计算移到了JavaBean (from Example 1-5) 中:

 

public int getSum(  ) {
   
return value1 + value2;
}

 

现在,修改JSP来使用bean:write标签:

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
   
<head>
      
<title>Add Two Numbers</title>
   
</head>
   
<body>
      
<jsp:useBean 
            
id="valueHolder"
            class
="com.oreilly.strutsckbk.ValueHolder">
         
<jsp:setProperty name="valueHolder" property="*"/>
      
</jsp:useBean>
      The sum of 
<bean:write name="valueHolder" property="value1"/> plus
      
<bean:write name="valueHolder" property="value2"/> is:<p>
      
<bean:write name="valueHolder" property="sum"/>.<p>
      
<href="get_input.jsp">perform another calculation</a>      
   
</body>
</html>

 

这对这个小应用的前一版本来说是一个明显的改善。

1

在你进行进一步的修改之前,最好将应用重新构建并重新部署,看其是否仍然能工作。

下一步,将Struts 控制器整合进来,有更多一些的工作要做。首先,创建一个Struts Action,就象Example 1-7中所示的一样,它负责接收来自于get_input.jsp页面中的表单的值。提交的值将获取为Action整理到一个JavaBean中的请求参数。bean 实例被设置为一个servlet 请求属性。Action然后将请求转发到display_result.jsp页面。

Example 1-7. 添加一个Struts action

 

package com.oreilly.strutsckbk;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public final class ProcessInputAction extends Action {
    
public ActionForward execute(ActionMapping mapping,
                 ActionForm form,
                 HttpServletRequest request,
                 HttpServletResponse response)
            throws Exception 
{
        ValueHolder bean 
= new ValueHolder( );
        bean.setValue1( Integer.parseInt(
            request.getParameter(
"value1")) );
        bean.setValue2( Integer.parseInt(
            request.getParameter(
"value2")) );
        request.setAttribute( 
"valueHolder", bean );
        
return (mapping.findForward("success"));
    }

}

 

在你的struts-config.xml中为Action 创建一个ActionMapping:

 

<!-- Process input data -->
<action    path="/processInput"
           type
="com.oreilly.strutsckbk.ProcessInputAction">
  
<forward name="success" path="/display_results.jsp"/>
</action>

 

为了使用这个Action,需要修改get_input.jsp页面中的表单的目标action属性:

 

<form action="ProcessInput.do">
  Value 1: 
<input name="value1" type="text"/><br/>
  Value 2: 
<input name="value2" type="text"/>
  
<p>
    
<input type="submit"/>
  
</p>
</form>

 

一旦你开发好了一个这样的新特征,从一个已有的JSP页面中连接到新的action 只需要简单的使用特定的ActionServlet mapping (e.g., *.do)。你也可以使用JSP的URL从Struts页面链接到现有的JSP页面。

相关

第6.1式描述了如何为你的所有动作的公共行为创建一个基础action。

第9.1式详细描述了如何声明Struts的例外处理。

第5.6式讨论了集成现有的JavaBean 和Struts action forms的方式。

 

posted on 2005-04-29 10:14 铁手 阅读(2129) 评论(1)  编辑  收藏 所属分类: JavaStruts系列

评论

# Struts 秘籍(CookBook)[TrackBack] 2005-11-12 18:29 阿泠

本系列源改编自O'Reily的Strus Cookbook
[引用提示]阿泠引用了该文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: