轻量级J2EE架构

本文介绍了如何利用Struts作为UI层,Spring作为业务层,Hibernate作为数据持久层来构建轻量级J2EE应用。通过这种架构,可以实现各层之间的松散耦合,提高代码重用率和维护性。Struts负责动作处理和视图呈现,Spring处理业务组件组装,Hibernate则用于数据持久化。同时,文章提到了Struts的配置、ActionForm、Action及ActionServlet的工作原理,以及Hibernate的数据映射和关联操作。
摘要由CSDN通过智能技术生成
 
目录
前言
在java的应用领域,有许多成熟的开源软件,利用它们一样可以打造优越、灵巧的应用框架,本文首先将先介绍所要构建的系统结构和借助的开源产品。然后逐一讲解各开源软件的具体运用。希望本文能给那些正在学习这些 开源软件的同行提供参考。续该文之后笔者将结合这些开源软件,借助实际项目,做更深入的应用讲解。
本文中涉及到的例子、源代码均经过本人调试,且正常运行的,但是不否定这其中有不合理的使用。运行环境: win2000 adivance server + tomcat5.0.25 + mysql-4.0.14-nt
第 1 章 整体框架
笔者在项目中所搭建的架构参考了 “Mark Eagle” 的《Wiring Your Web Application with Open Source Java一文中所阐述的架构思想。
图 1.1. 架构图:引用《Wiring Your Web Application with Open Source Java》一文
从架构图中可以看出系统分为四层:
  • UI层:借助Struts实现
  • 业务层:借助SpringFramework进行业务组件的组装关联。
  • 数据持久层:借助Hibernate实现
  • 域对象层:将所有域对象划分在一个层面
为什么采用这样的四层架构?
  • 通过成熟的开源产品实现各层,同自己编写代码实现,相比之下能缩短开发周期,且架构所用到的开源产品均有 很广泛的用户群,经受过实践的考验,质量和性能更有保障。
  • 层与层之间松散耦合,增加代码重用率。
  • 各层分工明确,这样也利于团队的明确分工。
1.1. UI
UI 是User Interface的缩写,这一层是面向用户的界面,是用户与系统之间交互的媒介。如,用户在界面发送请求, 系统接收请求,进行处理,然后通过界面将结果呈现于用户。这一过程包括了用户动作、数据传递、界面显示。大家熟悉的MVC模式就是将这三者分离,减少三者耦合。
我们在该层借助了Struts来实现:
  • 用ActionForm类封装与用户互动的数据元素。
  • 用Action类实现业务逻辑、动作处理、链接转向。实现MVC中的C
  • 借助Struts标签来完成数据呈现。实现MVC中的V。
关于struts具体的应用请参考相关章节。
1.2.  业务层
在实际的项目开发中,每个领域都会有自己独特的业务逻辑,正因为这样,致使项目中代码高度耦合,原本有可能被重用的代码或功能,因为与具体的业务逻辑绑定在一块而导致很难被重用。因此我们将实现这些具体逻辑的代码抽取出来分为单独的一层, 其目的是希望通过层,来降低它与系统其他部分的耦合度。
现实中世界是变化的,既然该层实现的是现实中具体的业务逻辑,那该层的实现代码不可避免的会发生变更。怎样让该层适应最大的变化,做到最小的改动?通常我们在编码的时候会尽量考虑到同一业务多种实现的兼容和可扩展的能力。因此我们在 该层借助了Spring,通过依赖注入、AOP应用、面向接口编程,来降低业务组件之间的耦合度,增强系统扩展性。
关于Spring的具体使用请参考相关章节。
1.3.  数据持久层
开发中与数据库进行数据交互必不可少,通常我们归为CRUD(添加、读取、修改、删除),这些操作占据了系统开发中大部分的时间, 同时我们还需要考虑与数据库交互的性能问题,如连接池、数据缓存等等。因此该层实现我们借助了Hibernate。
Hibernate 是一个ORM工具,它不仅仅是实现了数据库访问性能优化和与数据库交互的常用操作(CRUD),还将数据表与对象进行了关联,让我们可以脱离数据表,而直接针对对象来与数据库交互,我们不再需要用字符串去描述表中字段,不再需要一个个”+“号去组装Sql语句。这使得编码中可书写性提高。
该层的具体实现,请参看Hibernate相关章节。
1.4.  域对象层
该层应该说是ORM思想的产物,ORM用对象关联数据表,我们将这些对象的集合归为一个专门的层即Domain Layer。 域对象是各层之间数据通信的载体。实际上域对象也是一个完完全全的业务对象,如User对象、Book对象。通过对业 务的对象化,这有利于业务逻辑的重用。
第 2 章 Struts
2.1.  概述
Struts 是用于实现Web项目中UI层的开源产品,是MVC模式的经典实现案例。它属于Apache组织中的开源产品之一, 我们可以从官方网站http://struts.apache.org得到其所有资料及源码。
为什么使用Struts?
  • Struts将业务数据、页面显示、动作处理进行分离,这有利各部分的维护。
  • Struts采用Front Controller模式来实现动作处理,让所有的动作请求都是经过一个统一入口, 然后进行分发。这样方便我们在入口中加入一些全局控制代码的实现,如安全控制、日志管理、国际化 编码等。
  • 通过Struts提供的ActionForm封装web form 中的元素,使重用web表单成为可能。
  • 借助Struts Validator框架帮助完成web层的验证工作,通常情况下我们不用再去为每个web页面写其验证代码,只需通 过配置即可实现。这也减少了我们的开发量,由于验证代码的集中管理,也为维护带来便利。
2.2.  快速入门
1 、下载Struts,将其相关jar包引用到Web项目。
2 、在web项目的web.xml中配置Action影射,将相应请求动作交给Struts提供的ActionServlet类进行统一控制。
例 2.1. web.xml
 <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
               <param-name>config</param-name>
               <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
               <param-name>debug</param-name>
               <param-value>2</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
 </servlet>
 <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
 </servlet-mapping> 
 
                      
在web.xml中定义了所有带.do后缀的文件请求都会触发ActionServlet类。在url-pattern节点可以灵活定义 适合自身的映射表达式,如,对某个目录下请求的映射:/myDirectory/*.do
在配置org.apache.struts.action.ActionServlet类时设置一些参数其含义如下:
  • config:制定Struts配置文件路径,默认为/WEB-INF/struts-config.xml
  • debug:设定日志记录级别。
3 、在web.xm配置所需要用到的的Struts标签文件
例 2.2. web.xml
 <taglib>
    <taglib-uri>struts-bean.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>struts-html.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>struts-logic.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>struts-template.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-template.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>struts-tiles.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>c.tld</taglib-uri>
    <taglib-location>/WEB-INF/c.tld</taglib-location>
 </taglib>
 <taglib>
    <taglib-uri>Validate.tld</taglib-uri>
    <taglib-location>/WEB-INF/Validate.tld</taglib-location>
 </taglib>
 
                      
4 、建立ActionForm、Action。
例 2.3. struts-config.xml
<struts-config>
       
        <form-beans>
               <form-bean name="helloWorldForm" type ="struts.test.HelloWorldForm">
                       <form-property name="name" type="java.lang.String" />
               </form-bean>
        </form-beans>
 
        <action-mappings>
               <action path="/helloWorld" name="helloWorldForm" type="struts.test.HelloWorldAction"
               scope="request" input="/HelloWorld.jsp" validate="false" />
   </action-mappings> 
  
</struts-config>
 
                      
例 2.4. HelloWorldForm.java
public class HelloWorldForm extends ActionForm
{
        private String name = null;
              
        public String getName()
        {
               return this.name;
        }
        public void setName(String name)
        {
               this.name = name;
        }
}                     
                      
例 2.5. HelloWorldAction.java
public class HelloWorldAction extends Action
{
 
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                       HttpServletResponse response) throws Exception
        {
               HelloWorldForm loginForm = (HelloWorldForm)form;
               String name = loginForm.getName();
               request.setAttribute("HelloWorldForm",loginForm);
               return mapping.getInputForward();
        }
 
}
                      
5 、视图呈现
例 2.6. HelloWorld.jsp
<%@page language="java" contentType = "text/html;charset=GBK"%>
<%@ taglib uri="struts-html.tld" prefix="html" %>
<%@ taglib uri="struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="struts-bean.tld" prefix="bean" %>
<table border="1">
        <tr>
               <html:form action="helloWorld.do" method="post">
               <td>
                       <table>
                               <tr>
                                      <td> 用户名:</td>
                                      <td><html:text property="name" /></td>
                               </tr>
                               <tr colspan="2">
                                      <td><html:submit property="show" value=" 提交" /></td>
                               </tr>
                       </table>
               </td>
               </html:form>
        </tr>
</table>
<bean:write name="name" />
 
                      
6 、演示效果
图 2.1. 访问Helloworld.jsp
本章演示了一个简单的示例,在文本框输入内容,提交后显示其内容。功能虽然很简单但是涉及到了struts应用的大部分知识:
  • 在web.xml中配置Action影射规则,如,*.do文件的请求触发Action。
  • ActionFrom中的属性对应到表单域中表单元素,如,jsp页面名为name的Text,对应到ActionForm中name属性。
  • 继承Action类后即可实现具体的控制器,如,HelloAction类接受到请求后将ActionForm对象存放到request 范围,然后转发给配置的链接地址。
  • 借助struts提供的标签进行视图呈现。如,bean:write 标签访问ActionForm对象的属性值。
2.3. ActionForm
ActionFrom 是用来传输表单数据的对象,通过配置文件可以关联到对应的Action,实现在UI层与业务层之间的数据传输。 实现机制如下:
  • Struts提供了一个org.apache.struts.action.ActionForm类,里面实现了将请求表单中的元素赋值给其具体的 实现类属性。因此自定义ActionForm类时,只需继承该类即可。在自定义ActionForm类时请保证其属性名称与所对应 表单名称一致。
  • 当触发Action时,通过配置文件匹配到对应的ActionFrom实例,以参数形式传入。
ActionForm 的实现虽然简单,但是随着界面的增加,ActionForm类也会增加,造成代码膨胀。在Struts1.1以上版本提供了 ActionForm的另一个实现类,org.apache.struts.action.DynaActionForm,该类充当所有ActionForm的代理类,只需在 配置ActionFrom时指定用该类实现即可:
例 2.7. struts-config.xml
<form-beans>
               <form-bean name="helloWorldForm" type ="org.apache.struts.action.DynaActionForm">
                       <form-property name="name" type="java.lang.String" />
               </form-bean>
</form-beans>
 
                      
在访问helloWorldForm实例时如下:
例 2.8. HelloAction.java
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                       HttpServletResponse response) throws Exception
{
        DynaActionForm dynaForm = (DynaActionForm)form;
        String name =(String)dynaForm.get("name");
        return null;
}
                      
2.4. Action
Action 充当了控制器的角色,每个请求都会触发到Action类,我们在这里处理逻辑业务,分发数据,链接转向。 其实现机制:
  • 在web.xml配置影射规则,符合其影射条件的请求都会交给org.apache.struts.action.ActionServlet类处理, 在该类中将会实现org.apache.struts.action.Action类中的相应方法。在自定义Action类时只需继承该类, 即可让自定义的Action得到触发。
  • execute()方法中 ActionMapping、ActionForm实例通过读取配置文件获得。
2.5.  客户端验证
在UI中对用户提交的数据作验证是必不可少的,Struts也提供了相应的实现。下面将演示一个登录界面的校验:
1 、在配置文件中申明校验实现类,Struts中校验工作通过org.apache.struts.validator.ValidatorPlugIn类实现。
例 2.9. struts-config.xml
 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
 </plug-in>
 
                      
在实例化ValidatorPlugIn类时会装载validator-rules.xml、validation.xml文件,这些文件中包含了验证规则 和要被验证的具体表单信息。
2 、完善校验规则文件。在validator-rules.xml中定义了常用的客户端验证规则,如,不为空,只允许 数字等。特殊的实现需要在此扩充。
3 、定义要被验证的表单信息。
例 2.10. validation.xml
<form-validation>
        <formset>
               <form name="loginForm">               (1)
                       <field property="name" page="0" depends="required">   (2)
                               <arg0 key="register.username"/>       (3)
                       </field>
        </form>    
 </formset>
</form-validation>
                      
(1)
定义要被验证的ActionForm名称。
(2)
定义要被验证的具体属性,及规则。depends="required"指明将调用validator-rules.xml中的required规则。
(3)
从资源文件中匹配具体的验证信息。
4 、建立存放验证提示信息的资源文件。如当用户名为空时显示提示信息“必须填写用户名”
例 2.11. ApplicationResources_zh_CN.properties
 register.username=/u7528/u6237/u540d
                      
5 、在界面设置触发条件,如onsubmit时响应验证动作。
例 2.12. Login.jsp
<%@page language="java" contentType = "text/html;charset=GBK"%>
<%@ taglib uri="struts-html.tld" prefix="html" %>
<table border="1">
        <tr>
               <html:form action="login.do" method="post" οnsubmit="return validateCheckLoginForm(this);">
               <html:hidden property="loginType" value="0"/>
               <td>
                       <table>
                               <tr>
                                      <td> 用户名:</td>
                                      <td><html:text property="name" /></td>
                               </tr>
                               <tr>
                                      <td> 密码:</td>
                                      <td><html:password property="password" /></td>
                               </tr>
                               <tr colspan="2">
                                      <td><html:submit property="login" value=" 登录" /></td>
                               </tr>
                       </table>
               </td>
               </html:form>
        </tr>
         <html:javascript formName="checkLoginForm"   dynamicJavascript="true"    staticJavascript="true"/>
</table>
 
                      
当用户名为空时点击登录,将出现如下提示:
图 2.2. 演示效果
第 3 章 springFramework
3.1.  概述
对spring的描述莫过于作者本人之言
 
Developing software applications is hard enough even with good tools and technologies. Implementing applications using platforms which promise everything but turn out to be heavy-weight, hard to control and not very efficient during the development cycle makes it even harder. Spring provides a light-weight solution for building enterprise-ready applications, while still supporting the possibility of using declarative transaction management, remote access to your logic using RMI or webservices, mailing facilities and various options in persisting your data to a database. Spring provides an MVC framework, transparent ways of integrating AOP into your software and a well-structured exception hierarchy including automatic mapping from proprietary exception hierarchies. 即使拥有良好的工具和优秀技术,应用软件开发也是困难重重。如果使用了超重量级,难于控制,不能有效控制开 发周期的平台 那么就让应用开发变得更为困难。Spring为已建立的企业级应用提供了一个轻量级的解决方案,这个方案包括声明 性事务管理, 通过RMI或webservices远程访问业务逻辑,mail支持工具以及对于数据和数据库之间持久层的各种配置的支持。 Spring还提供了 一个MVC应用框架,可以通过集成AOP透明的嵌入你的软件和一个优秀的异常处理体系,这个异常体系可以自动 从属性异常体系 进行映射。
 
 
--springFramework reference
springFramework 是种非侵入式轻量级框架,允许自由选择和组装各部分功能,还提供和其他软件集成的接口,如与Hibernate、Struts 的集成(后面的章节中会提到)。它提供的功能有Spring IOC、spring AOP、Spring ORM、Spring DAO、Spring MVC.笔者在项目 中用到的主要是IOC和AOP功能,ORM用hibernate取代,MVC用Struts取代。本文讲述springFramework在web环境下的使用。
3.2.  为什么使用Spring
1 、利用延时注入思想组装代码,提高系统扩展性,灵活性,实现插件式编程。
2 、利用AOP思想,集中处理业务逻辑,减少重复代码,构建优雅的解决方案。
3 、利用其对Hibernate的SessionFactory、事务管理的封装,更简洁的应用Hibernate。
3.3.  快速入门
要使用Spring非常简单,来体验下:
例 3.1. MyClass.java
public interface MyClass
{
        public void execute();
}
                      
例 3.2. MyClassImpl.java
public class MyClassImpl implements MyClass
{
        public void execute()
        {
               ...
        }
}
                      
通过Spring注入MyClassImpl的实例,需在配置文件中做如下配置:
例 3.3. SpringConfig.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-lazy-init="false" default-dependency-check="none" default-autowire="no">
        <bean id="myClass" class="MyClassImpl" />
</beans>
 
                      
这样在代码中就可以通过Spring体验到什么叫延时装载了
例 3.4. 
        ApplicationContext ac = new FileSystemXmlApplicationContext("SpringConfig.xml"); (1)
        MyClass cls = (MyClass)ac.getBean("myClass");                                       (2)    
        cls.execute();                                                                                              
 
                              
(1)
载入Spring配置文档,上例中SpringConfig.xml放置在工作路径根目录中。这种引用方式其配制文件只能相对于工作路径 的引用。
(2)
实例化配置的对象,以配置文件的bean节点ID值作为实例引用的关键字。
上面的例子中得到了实现类的实例,但是代码中并没有硬编码具体实现类,而是将这种依赖转移到配置文件中。
3.4.  搭建Web应用环境
2 、在Web.xml中配置spring的启动方式。
springFramework 提供两种形式的web context,基于Listener接口的实现和基于Servlet接口的实现。
例 3.5. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>Test</display-name>
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring_bean.xml</param-value>
</context-param>
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--
<servlet>
        <servlet-name>context</servlet-name>
        <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
</servlet>
-->
<servlet>
        <servlet-name>Init</servlet-name>
        <servlet-class>com.m5.Initializtion</servlet-class>
        <load-on-startup>3</load-on-startup>
</servlet>
</web-app>
                      
tomcat 启动时会装载/WEB-INF/spring_bean.xml文件,如果不指定contextConfigLocation参数,默认装载/WEB-INF/applicationContext.xml文件。然后在tomcat启动时初始化一个自定义servlet, 在这里实现springFramework的装载。
例 3.6. Initializtion.java
public class Initializtion extends HttpServlet
{
        public void init(ServletConfig config) throws ServletException
        {
               WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext
               (config.getServletContext());
               super.init(config);   
               InitSpring.Init((AbstractApplicationContext)wac);     (1)
        }
}
                      
(1)
InitSpring 是一个符合单例模式的类。
例 3.7. InitS
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值