搭建SSH时的思考和遇到的几个问题的解决方法_JSP编程

SSH流行很久了,一直看到官方文档和网上都在讲如何整合SSH,讨论各种整合的优缺点。今天我比较闲,也用我的一些想法来试着整合这三个最流行的框架。

本次所用版本为:Struts 1.3.9   Spring 2.5   Hiberante 3.2
开发工具和环境为:Eclipse 3.3+MyEclipse 6.0+JBoss 4.2+Tomcat

用SSH时,我们的架构自然就会分成三层,即表现层,逻辑层和持久层,按照Martin Flower的指导思想,耦合越少越好,下层为上层提供服务,这也是Rod开发Spring的指导思想之一,所以我首先想到的就是如何减少到最低的耦合。
根据Spring 2.0官方文档中推荐的做法,Spring与Struts1.x集成,有采用代理类的方式,也有用ActionSupport的方式,但是我认为这两种方式无疑都有很强的侵入性和依赖性,这与Spring的思想有些矛盾。
我采用AutowiringRequestProcessor来做,这个类会自动为你装载你所需要的Service,根据其Java Doc的提示,其默认是byType匹配的,当然你也可以用byName的方式,我认为以Type的方式就OK了。来看看两个配置文件吧,先来看看Struts的配置文件struts-config.xml:

 1  <? xml version="1.0" encoding="UTF-8" ?> 
 2  <! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd" > 
 3  
 4  < struts-config > 
 5      < form-beans > 
 6          < form-bean  name ="loginForm"  type ="com.***.ssh.view.login.LoginForm"   /> 
 7      </ form-beans > 
 8  
 9      < global-exceptions  /> 
10      < global-forwards  /> 
11      < action-mappings > 
12          < action  name ="loginForm"  path ="/login"  scope ="request" 
13             type ="com.***.ssh.view.login.LoginAction"  validate ="false"   /> 
14      </ action-mappings > 
15     
16      < controller
17          processorClass ="org.springframework.web.struts.AutowiringRequestProcessor"   /> 
18  
19      < message-resources  parameter ="ApplicationResources"   /> 
20  </ struts-config > 
21  
22  
这个文件中可以发现,跟没有与Spring集成时就一点不一样,多了一行:
 <controller  processorClass="org.springframework.web.struts.AutowiringRequestProcessor" />

再来看看Spring的配置文件applicationContext.xml:

 1  <? xml version="1.0" encoding="UTF-8" ?> 
 2  <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" > 
 3  
 4  < beans > 
 5  
 6      < bean  id ="SSHSessionFactory" 
 7         class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" > 
 8          < property  name ="configLocation" > 
 9              < value > classpath:hibernate.cfg.xml </ value > 
10          </ property > 
11      </ bean > 
12     
13      < bean  name ="LoginService" 
14         class ="com.***.ssh.biz.login.LoginService"  singleton ="false" > 
15          < property  name ="dao" > 
16              < ref  bean ="UsersDao"   /> 
17          </ property > 
18      </ bean > 
19  
20      < bean  id ="UsersDao"  class ="com.***.ssh.persistence.UserDao" > 
21          < property  name ="sessionFactory" > 
22              < ref  bean ="SSHSessionFactory"   /> 
23          </ property > 
24      </ bean > 
25  </ beans > 
26  
这里面也没有多余的内容,不会出现代理方式时,多份XML同时配置的问题,减少了维护量。
同时,你会发现,我并没有把Hibernate的具体配置放在这里面,而是用Hibernate自身的配置来管理。

这样的话,我们三层之间的依赖性会降到较低,两头可以任意换到其中的某一层。

顺便要说的是,常见的书籍上面发现往往不会有如此深入的探讨,难道是怕初学者看不懂吗?
另外,对于一个架构来说,要解决的问题决不是指这些,通常我们可以采用RUP的4+1视图的方法去考虑架构的方方面面。我们也可以从以下一些方面来各个击破:安全性,数据输入输出的校验与转换,国际化,LOG,异常处理,异构系统整合,后台运行程序等等。如果是多个数据库,我们还需要更多的考虑事务控制。

我想我后面会去完善这个整合,并实现一个Demo,作为小的简单的项目快速开发的基础。

整合时遇到过如下问题:
问题1:启动时出现 “严重: Error listenerStart ”
这个问题,网上有很多解决办法:
有一种最简单的解决办法是把用Listener初始化Spring改为用Servlet初始化Spring,但这样的方法不太好,一是没有找到根源,二是可能会带来新的问题。
比较好的一种解决办法是,加上Log4J的相关配置,然后再启动时,就会出现各类详细信息,这样可根据具体信息再来解决,一般可能是DataSource配置,或环境配置有问题。
参考网址:http://hi.baidu.com/xht314/blog/item/808ecf13c1dd1820dd5401af.html

问题2:遇到“Required extension qdox not found”这样的提示
网上也有解答,我用的方法是直接把commons-attributes-compiler.jar这个包去掉。当然如果你要用到这个包的话,可以参考下面这个地址:
http://hi.baidu.com/sky_lei/blog/item/77ee17085543b232e8248824.html

问题3:Struts包与Spring包冲突的问题
我遇到包有冲突,换成Struts需要的优先就OK了,现在的JAR档越来越麻烦了,很多项目的JAR档都被开发人员搞得乱七八糟,看来Maven是个好东西,至少思想是好的,可能下一步需要研究一下。

时间: 2024-12-24 20:38:53

搭建SSH时的思考和遇到的几个问题的解决方法_JSP编程的相关文章

JSP中内建exception对象时出现500错误的解决方法_JSP编程

本文实例讲述了JSP中内建exception对象时出现500错误的解决方法.分享给大家供大家参考,具体如下: 尝试使用JSP的内建exception对象,写了下面三个文件.思路很简单,文件index若提交字串为空,则get抛出异常,交由error.jsp处理.但实际却不能正常运行,会出现IE的500错误页面.环境为Tomcat 5.5,IE6.0. 在sun的论坛上有人贴出了原因,是IE的某个设置.Tomcat5.0以后的版本error page在处理时会返回error code 500.而IE

IE浏览器在post提交时中文乱码的解决方法_JSP编程

现在遇到的问题是在页面和服务器端都配置了字符编码uft-8,但是在提交时火狐,chrome都没有问题,ie8确出现了中文乱码,采用的解决方法是在网页端转码,在服务器端再转回来,实例: 客户端: 复制代码 代码如下: userName = encodeURI(userName); post提交后 服务器端: 复制代码 代码如下: response.serContentType("text/html;charset=utf-8"); String keyword= request.getP

JSP MySQL插入数据时出现中文乱码问题的解决方法_JSP编程

当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12','Sales',2000,'是个好员工!'); 出现乱码时,可以使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集. 从上图中可以看到 MySQL 有六处使用了字符集,分别为:client .connection.database.results

访问JSP文件或者Servlet文件时提示下载的解决方法_JSP编程

如下图所示:同样的程序有的浏览器出错,有的浏览器不出错.错误的原因是设置MIME类型的代码有误. 如果是JSP文件,查看文件头: 复制代码 代码如下: <%@ page contentType="text/html;charset=gb2312"%> 如果是Servlet文件,查看: 复制代码 代码如下: response.setContentType("text/html;charset=gb2312");

frameset布局时frame中src路径的页面没有加载的解决方法_JSP编程

解决方法:将页面的body节点去掉,错误代码如下 复制代码 代码如下: <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+":/

Win7远程操作时提示“远程桌面服务当前正忙”两种解决方法

  Win7远程操作时提示"远程桌面服务当前正忙"两种解决方法           Win7系统远程桌面操作能够实现远程操控电脑,通过远程连接来进行一些控制,可是有些用户在进行远程连接的时候,输入账号密码无法进入,重新进入就会提示"由于远程桌面服务当前正忙,因此无法完成您尝试执行的任务",遇到这个问题该如何解决呢?下面小编给大家两种解决方法. 解决方法一 看一下你电脑任务管理器此项任务是否还在,如果在的话关掉就行了,很多时候是电脑没有反应过来造成的. 解决办法二 原

Win8系统打开图片提示“在禁用UAC时,此应用程序无法激活”的几种解决方法

  现如今许多用户习惯把图片储存在win8系统电脑中,浏览时直接打开即可,但是Win8系统打开图片提示"在禁用UAC时,此应用程序无法激活",正常来说,图片都是可以正常打开的,遇到此问题该怎么办呢?下面小编分享Win8系统打开图片提示"在禁用UAC时,此应用程序无法激活"的几种解决方法. 故障原因: 官方说出现这个问题只要 开启UAC 功能就可以了. 解决办法: 方法一 1.进入系统"运行"然后我们输入"Regedit"就可以

c++-编译时出现这样的错误,求大神指点解决方法

问题描述 编译时出现这样的错误,求大神指点解决方法 程序如下:#includeusing namespace std;class zrf_Ratio;zrf_Ratio operator+(const zrf_Ratio& r1 const zrf_Ratio& r2);zrf_Ratio operator-(const zrf_Ratio& const zrf_Ratio&);zrf_Ratio operator*(const zrf_Ratio& const z

Ubuntu安装telent服务器时出现:apt-get:Package has no installation的原因及解决方法_Linux

当我在终端敲下这条命令的时候,系统就提示telnetd:apt-get:Package has no installation sudo apt-get install xinetd telnetd 刚开始我以为是没有这个包,后来查了一下资料发现,有这个软件,于是百度了一下才知道解决以上问题需要如下操作: # apt-get update # apt-get upgrade # apt-get install <packagename> 这样就可以正常使用apt-get了. 接下来就按照以前转