[原创]structs在J2EE中的应用及其实际例子_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2828 | 回复: 0   主题: [原创]structs在J2EE中的应用及其实际例子        下一篇 
    本主题由 koei 于 2014-5-2 16:25:33 移动
luqunfang
注册用户
等级:少校
经验:1219
发帖:74
精华:0
注册:2012-6-25
状态:离线
发送短消息息给luqunfang 加好友    发送短消息息给luqunfang 发消息
发表于: IP:您无权察看 2012-7-2 9:16:41 | [全部帖] [楼主帖] 楼主

1 J2EE简介

J2EE是一个开放的、基于标准的平台,可以开发、部署和管理N层结构的、面向Web的、以服务器为中心的企业级应用,它是利用Java 2 平台来简化与多级企业解决方案的开发、部署和管理相关的诸多复杂问题的应用体系结构。

J2EE平台采用一个多层次分布式的应用模式。这意味着应用逻辑根据功能被划分成组件,组成J2EE应用的不同应用组件安装在不同的服务器上,这种划分是根据应用组件属于多层次J2EE环境中的哪一个层次来决定的。如图1所示,J2EE应用可以由三或四个层次组成,J2EE多层次应用一般被认为是三层应用,因为它们是被分布在三个不同的地点:客户端机器、J2EE服务器和数据库或后端的传统系统服务器。三层架构应用是对标准的客户端/服务器应用架构的一种扩展, 即在客户端应用和后台存储之间增加一个多线程应用服务器。

北京联动北方科技有限公司

J2EE体系包括JSP、Servlet、EJB、WEB SERVICE等多项技术。这些技术的出现给电子商务时代的WEB应用开发提供了一个非常有竞争力的选择。怎样把这些技术组合起来,形成一个适应项目需要的稳定架构是项目开发过程中一个非常重要的步骤。

一个成功的软件需要有一个成功的架构,但软件架构的建立是一个复杂而又持续改进的过程,软件开发者们不可能对每个不同的项目做不同的架构,而总是尽量重用以前的架构,或开发出尽量通用的架构方案,Struts就是流行的基于J2EE的架构方案之一,其他常用的基于J2EE的架构方案还有Turbine、RealMothods等。本文主要探讨Struts框架技术的应用。

2 J2EE应用程序架构的发展

在J2EE应用程序架构的发展路程中,主要经历了两个大的阶段:

2.1 Model 1

在JSP页面中结合业务逻辑、服务器端处理程序和HTML,在JSP页面中同时实现显示、业务逻辑和流程控制,从而快速的完成Web应用开发。这种模型的不足之处:1)不利于应用扩展和更新。2)业务逻辑和表示逻辑混合在JSP页面中没有进行抽象和分离,不利于应用系统业务的重用和改动。

2、2 Model 2

表示的是基于MVC模式的框架。根据Model 2,servlet 处理数据存取和导航流, JSP处理表现。Model 2 使Java 工程师和HTML设计者分别工作于它们所擅长和负责的部分。Model 2应用的一部分发生改变并不强求其他部分也跟着发生改变。HTML 开发人员可以改变程序的外观和感觉,并不需要改变后端servlet的工作方式。把应用逻辑、处理过程和显示逻辑分成不同的组件实现。弥补了Model1的不足。

3 Struts框架技术

Struts 框架就是基于Model 2 的架构,也就是基于MVC模式的框架技术。它是一个免费的开源的WEB层的应用框架,具有很高的可配置性,和有一个不断增长的特性列表。一个前��控制组件,一系列动作类,动作映射,处理XML的实用工具类,服务器端java bean 的自动填充,支持验证的WEB 表单,国际化支持,生成HTML,实现表现逻辑和模板组成了struts的灵魂。图2显示了Struts组件是如何一起工作的。

北京联动北方科技有限公司

Struts 的ActionServlet 控制导航流。其他Struts 类,比如Action, 用来访问业务逻辑类。当 ActionServlet 从容器接收到一个请求,它使用URI (或者路径“path”) 来决定哪个Action 将用来处理请求。一个 Action可以校验输入,并且访问业务层以从数据库或其他数据服务中检索信息。

为校验输入或者使用输入来更新数据库, Action 需要知道什么被提交上来。并不是强制每个Action 从请求中抓取这些值,而是由 ActionServlet 将输入绑定到JavaBean中。输入 bean是Struts ActionForm c类的子类。ActionServlet 通过查找请求的路径可以决定使用哪个ActionForm,Action 也是通过同样的方法选取的。每个Action都必须以HTTP 响应进行应答。 通常, Struts Action 并不自行加工响应信息,而是将请求转发到其他资源,比如JSP 页面。

Struts 提供一个ActionForward 类,用来将一个页面的路径存储为逻辑名称。当完成业务逻辑后,Action 选择并向Servlet返回一个ActionForward。Servlet 然后使用存储在ActionForward 对象中的路径来调用页面完成响应。

Struts 将这些细节都绑定在一个ActionMapping 对象中。每个ActionMapping 相对于一个特定的路径。当某个路径被请求时,Servlet 就查询ActionMapping 对象。ActionMapping对象告诉servlet哪个Actions、 ActionForms 和 ActionForwards 将被使用。

所有这些细节,关于Action, ActionForm, ActionForward, ActionMapping,以及其他一些东西,都在struts-config.xml 文件中定义。 ActionServlet 在启动时读取这个配置文件,并创建一个配置对象数据库。在运行时,Struts 应用根据的是文件创建的配置对象,而不是文件本身。

4 基于Struts框架的应用设计实例

本文以“面向铸造行业的网络化制造ASP平台开发”项目中的软件租用模块为例,来说明如何设计基于Struts框架的Web应用。在该模块中,用户合法登陆网站后,可以根据需要选择所要租用的软件类型及软件中的功能模块,确认信息提交服务器后,用户将收到系统给予的登陆密码,用户即可登陆网站,在线使用租用软件,实行业务托管。

根据项目需求分析,确定该系统必须具备的性能有:1)良好的交互性:工作内容中有相当大的部分是人机交流,这就要求系统的交互性要强。2)较好的可扩展性:工作的内容和形式具有多变性,要求系统具有良好的可扩展性。3)良好的可维护性:系统投入使用后,主要是由管理员承担系统维护的工作,维护人员不定期变动,这就要求系统的可维护性强。4)具有较好的跨平台性:用户可能使用各种不同的操作系统,而且为了适应今后可能的变化,系统应具有较好的跨平台性。基于以上四点,在开发软件租用模块时,采用J2EE编程环境,并相应采用了专为J2EE定制的Struts框架。

做基于Struts框架的项目开发,关键是要有一个好的整体模型,计划好系统中包括哪几个模块,每个模块各需要什么样的FormBean、JavaBean,各种处理结果都通过哪些JSP页面来展现,同时配置好struts-config.xml文件。本系统的设计模型如图3所示。

北京联动北方科技有限公司

ActionServlet接受所有的HTTP请求,然后根据配置文件的内容,决定将请求映射到哪一个Action对象,本系统中有两个Action对象,分别对应着登陆远程软件(LogonAction)和系统反馈密码(MailAction)。

LogonAction首先会验证用户是否已经登录,如果没有登录则重定向到登录页面(Logon.jsp),验证通过后根据请求参数决定下一步的处理,如果用户还没有选择租用软件,则转到软件介绍租用界面(Query.jsp),选择需要租用的软件或软件的某些模块,提交信息后,MailAction使服务器向用户提交密码,用户接收到密码后,登陆运行软件。

如果用户登陆软件成功,则通过配置文件struts-config.xml中的ActionForward,通过GetInfo对象把该用户租用的软件信息读取道FormBean中,然后调用JSP页面显示Bean里的数据。如果是保存数据信息,则调SaveInfo对象将FormBean里保持的信息存入数据库;如果是修改信息,则调ModifyInfo对象将FormBean里保持的修改后的信息存入数据库;如果是删除数据信息,则调用DeleteInfo对象将FormBean里保持的信息从数据库中删除。

经过这样设计的系统,用户界面和数据处理已经完全分离,再加上在JSP页面中使用了自定义标记,使页面中没有了Java的脚本代码,这样Web界面的设计和后端程序的编写就有了清晰的界线,便于开发团队的分工,并且维护起来也很方便。

Structs 的一个实际应用的例子

这个例子是通过用Struts的FormFile来写入到MySQL中。用户通过选一个图片,然后按submit就可以存入数据库中。

1.首先需要建立一个表: 

create table test
( name varchar(20),
pic blob );


在MySQL的test库中

<%@ page language=java%>
<%@ taglib uri=
http://jakarta.apache.org/struts/tags-bean
prefix=bean%>
<%@ taglib uri=
http://jakarta.apache.org/struts/tags-html
prefix=html%>
<html>
<head>
<title>JSP for multiForm form</title>
</head>
<body>
<html:form action=/multi
enctype=multipart/form-data>


一定要用enctype=“multipart/form-data“
不然就提交之后就会有抛出异常

file : <html:file property=file/>
<html:errors property=file/></br>
name : <html:text property=name/>
<html:errors property=name/></br>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>


2. 相对应的ActionForm:

//Created by MyEclipse Struts
// XSL source (default):
platform:/plugin/com.genuitec.eclipse.
cross.easystruts.eclipse_3.8.1
/xslt/JavaClass.xsl
package saoo.struts.form;
import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;
/**
* MyEclipse Struts
* Creation date: 08-24-2004
*
* XDoclet definition:
* @struts:form name=multiForm
*/
public class MultiForm extends ActionForm
{
      // ----------------
      Instance Variables
      /** file property */
      private FormFile file;
      /** name property */
      private String name;
      // -----------------
      Methods
      /**
      * Returns the file.
      * @return FormFile
      */
      public FormFile getFile()
      {
            return file;
      }
      /**
      * Set the file.
      * @param file The file to set
      */
      public void setFile(FormFile file)
      {
            this.file = file;
      }
      /**
      * Returns the name.
      * @return String
      */
      public String getName()
      {
            return name;
      }
      /**
      * Set the name.
      * @param name The name to set
      */
      public void setName(String name)
      {
            this.name = name;
      }
}


3. 对就的Action:

//Created by MyEclipse Struts
// XSL source (default):
platform:/plugin/com.genuitec.eclipse.
cross.easystruts.eclipse_3.8.1
/xslt/JavaClass.xsl
package saoo.struts.action;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
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;
import org.apache.struts.upload.FormFile;
import saoo.struts.form.MultiForm;
/**
* MyEclipse Struts
* Creation date: 08-24-2004
*
* XDoclet definition:
* @struts:action path=/multi
name=multiForm input=/form/multi.jsp
scope=request
*/
public class MultiAction extends Action
{
      // ---------------
      Instance Variables
      // ---------------
      Methods
      /**
      * Method execute
      * @param mapping
      * @param form
      * @param request
      * @param response
      * @return ActionForward
      */
      public ActionForward execute(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      {
            MultiForm multiForm = (MultiForm)
            form;
            FormFile file = multiForm.getFile();
            String name = multiForm.getName();
            try {
                  Class.forName
                  (org.gjt.mm.mysql.Driver);
                  String url=jdbc:mysql:
                  ///test;
                  Connection con=DriverManager.getConnection
                  (url,root,password);
                  String sql=insert into pic values (?,?);
                  PreparedStatement ps
                  =con.prepareStatement(sql);
                  ps.setString(1, name);
                  //加入图片到数据库
                  ps.setBinaryStream
                  (2,file.getInputStream(),
                  file.getFileSize());
                  ps.executeUpdate();
                  ps.close();
                  con.close();
            } catch (SQLException se)
            {
                  se.printStackTrace();
                  return mapping.findForward(error);
            } catch (ClassNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                  return mapping.findForward(error);
            } catch (FileNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                  return mapping.findForward(error);
            } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                  return mapping.findForward(error);
            }
            return mapping.findForward(success);
      }
}


该贴由koei转至本版2014-5-2 16:25:33



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论