Struts秘籍之起式:第1.5式:将JSP 应用转到Struts

本文详细介绍了如何将一个基于JSP的Web应用转换为使用Struts框架的应用,包括从分离业务逻辑和表现开始,逐步重构现有代码,以及如何整合Struts控制器。同时提供了具体的代码示例,帮助开发者理解整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第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>
      <a 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>
      <a 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>
      <a href="get_input.jsp">perform another calculation</a>      
   </body>
</html>
 
这对这个小应用的前一版本来说是一个明显的改善。

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

下一步,将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的方式。
 

原文链接: http://www.dlog.cn/nicholascoder/diary/8928

转载于:https://my.oschina.net/moroseyu/blog/51449

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值