通向架构师的道路(第二十一天)万能框架spring(三)之SSH

2015-01-15  来源:本站原创  分类:【23】、架构师  人气:6 

一、前言

我们有了Spring+JdbcTemplate和Spring+iBatis并结合maven的基础,搭建一个SSX这样的框架现在就和玩一样的简单了,今天我们将搭建一个使用Struts1.3,Srping3, Hibernate3的SSH1的开发框架,大家跟着我一步步走,会发觉在程序跑通后自己再动手搭建一遍这个框架,只需要30分钟。

二、SSH框架

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

仔细看这个框架,稍微有点不一样了。

1) Spring3是通过一个hibernate template来和hibernate的dao层结合起来并且管理起hibernate的相关事务的。因此我们自己写了一个BaseHibernateDaoSupport来用spring统一管理hibernate的事务。

2) Hibernate和Spring的结合非常方便,我们只需要写一个hibernate.xml就可以了,datasource.xml中把原先的iBatis的相关配置全部去掉它,什么都不需要加事务还是维持原有的配置不变即可,对于我们来说需要改动的是dao层,还有把service层稍微做些小调整(一两句话的调整,非常简单),可能是我看到过的最简单的一种SSX的结合方式,远比iBatis和spring的结合要easy多了。

3) Hibernate3开始可以使用jpa或者还是传统的hbm.xml文件这样的描述方式,在此我们坚持使用JPA的Annotation方式来声明我们的model而不是使用*.hbm.xml这样的方式。

注意:所有的包(package name)都要从原来的org.sky.ssi变成org.sky.ssh喽?

三、搭建SSH框架

3.1建立工程

我们还是使用maven来建立我们的工程,我们工程的名字叫myssh。

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

建完后照着翻外篇《第十九天》中的“四、如何让Maven构建的工程在eclipse里跑起来”对工程进行设置。

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

3.2 maven库设置

嘿嘿嘿嘿,不需要任何设置,直接把beta工程中的pom.xml文件拷贝入myssh工程中就可以用了,里面相关的spring,struts, hibernate的包我都已经事先配合了。

如果你是个图完美的的,你可以把pom.xml文件中的iBatis相关的jar给去除。

3.3 开始配置Hibernate与spring结合

打开/src/main/resources/spring/datasource下的datasource.xml,把所有的关于iBatis的设置全部去除,把org.sky.ssi这样的包名全部改成org.sky.ssh。

我们在myssh工程中需要增加一个工具类,一个xml和几个用到的hibernate的model的映射,下面来看。

src/main/resources/spring/hibernate/hibernate.xml文件

我们在src/main/resources/spring目录下增加一个目录叫hibernate,在这个hibernate目录下我们创建一个hibernate.xml文件。

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

其内容如下:


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/beans

http://www.springframework.org/dtd/spring-beans.dtd

">

<bean id="hibernateSessionFactory"

class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="packagesToScan" value="org.sky.ssh.dao.impl.*.*" />

<property name="dataSource">

<ref bean="dataSource" />

</property>

<property name="annotatedClasses">

<list>

<value>org.sky.ssh.model.TLogin</value>

<value>org.sky.ssh.model.TStudent</value>

</list>

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>

<prop key="hibernate.show_sql">true</prop>

<prop key="hibernate.generate_statistics">true</prop>

<prop key="hibernate.connection.release_mode">auto</prop>

<prop key="hibernate.autoReconnect">true</prop>

<prop key="hibernate.hbm2ddl.auto">update</prop>

<prop key="hibernate.connection.autocommit">true</prop>

</props>

</property>

</bean>

</beans>

<property name="packagesToScan"value="org.sky.ssh.dao.impl.*.*" />

这句就是代表所有的hibernate的sessionFactory自动被注入到我们的myssh工程的dao层中去,即在dao层中我们只要通过BaseHibernateDaoSupport.getSession()就可以进行相关的hibernate的数据库操作了.

我们还注意到了在src/main/resources/spring/hibernate/hibernate.xml文件中有这样的hibernate的model的映射:


<property name="annotatedClasses">

<list>

<value>org.sky.ssh.model.TLogin</value>

<value>org.sky.ssh.model.TStudent</value>

</list>

</property>

这就是基于annotation的jpa的hibernate的model层的写法,这边的几个<value>括起来的东西就是一个个java的.class,这些java文件都是基于jpa的annotation写法。

当然,如果表结构简单,你可以直接手写这些java类,但是如果一个表结构很复杂,几十个字段主键还有组合主键这样的形式存在,那么手写这个jpa就会变得有点困难。

一般我们在开发项目时都是通过先建表,再建类的,对吧?

因此在这里我们其实是可以借助相关的工具通过数据库表来生成我们的hibernate的这些model类的。

利用eclipse从表逆向生成java的jpa(hibernate)类

准备工做

1. 必须要有eclipse3.7及升级后的database, jpa feature,如:eclipse wtp版

2. 建立数据源

根据下面操作,请切换到j2ee视图,然后先打开datasource explorer窗口

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

下一步

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

点右上面这个黑白色(黑白配,男生女生配,啊我呸!)的圆形pie一样的这个按钮

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

填入自定义的oracledriver名

点JARList这个tab(需要加载一个oracle的driver,即ojdbc6.jar)

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

可以去oracleclient端安装的路径的jdbc\lib中找到该JAR,注意上图中两个红圈处标出的路径与jar名

点OK返回下面这个对话框

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

填入servername, username, password等信息,你懂的(别忘了勾上save password

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

选TestConnection

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

点OK,NEXT, FINISH完成

看,这边一下子把所有的schema都列出来了,但是我们知道oracle的schema就是username,因此我们用bookstore(这个只是示例,这边因该用你连接数据库的username)的schema只需要显示bookstore的相关数据库object就够我们用了。

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

看,右键点击你的connection选Properties然后在下面的对话框中选DefaultSchema Filter

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

在上面的对话框中把Disablefilter放开,然后在Startswith the characters填入你的oracle用户名(schema名),必须大写

点OK

返回后右键点connection选Refresh,看,是不是只列出来就是你要的东西了(相当于pl/sql里从all objects切换成my objects

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

这个东西还可以在没有安装oracle客户端的情况下,拿ECLIPSE来当oracle的客户端用。

建立JPA(Hibernate)工程

在hibernate3里我们把hibernate的annoation方式称为全注解即JPA,因此我们不需要使用hibernate3以前的那种xml文件的配置的方式。

新建JPA工程

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

这边我们使用的工程名为myssh_model

工程名起名规范,比如说你的工程叫MyProject,那么你的HIBERNATE是ForMyProject工程的,因此你的hibernate即JPA工程就应该叫MyProject_model

根据上图勾选后NEXT,NEXT到下面这一步(千万不要手快然后直接去点那个FINISH按钮啊,我们还没完呢)

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

根据上图勾选

点FINISH

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

在弹出框时选Yes

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

生成的JPA工程

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

右键单击工程,在JPATools里选GenerateEntities from Tables,这个你懂的。。。

下面,灵的东西要来了。。。

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

点一下Connection下的这个有“黄色铰链”的按钮(connection),这时下方的下拉列表会显示你当前的jpa工程使用的dbconnection中的Table,看到米有?

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

注意,把这个Updateclass list in persistence.xml去掉,因为我们用的是纯annotation,不希望再用xml配置方式了,要不然生成出来的工程会出错的,点Next

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

如果表与表之间有foreignkey的关系,它都能帮你识别出来

Next

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

保持所有的CLASS的主键为none,我们在后面为每个表分别指定主键的形势,因为有些主键是用的是sequence,有的主键是要通过界面手输进来的,不是sequence,有的主键甚至是复合主键。

别忘了把package填上,注意package的命名规范(规则)养成良好习惯

点NEXT

下面为每个CLASS指定主键的生成方式。

对于T_LOGIN表来说我们的PK让它保持为默认。

对于T_STUDENT表来说,我们的主键是用一个oracle的 sequence来生成的,这个oracle的sequence命为:

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

因此当你为一个jpa指定了sequence的PK时,在做插入动作时,该表的PK会自动从在这一步指定的sequence中去读取nextval值,相当于执行了一步:select SEQ_STUDENT_NO.nextval from dual;这样的操作.

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

把每个JPA的主键指定完毕后可以点Finish了

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

Look,快来看上帝哦,JPA类被自动生成了,但编译有问题,因为我们没有给工程指定lib包,jpa工程需要用到以下lib包

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

我已经同时上传到我的博客的资源上了。

于是,在工程下建一个文件夹叫lib,把这些jar全放lib目录里然后加入classpath

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

编译通过后,我们就可以把这些java拷入我们需要用到hibernate工程的project里了,拷进去后别忘了改一处地方:

以下是我原有工程中有一个jpa,因此我在spring/hibernate/hibernate.xml文件中需要把一个jpa纳入spring的管理,但现在我拷进去一堆jpa都要纳入spring管理,怎么办?就是把这个文件打开,找到

<property name=”annotatedClasses”>处

然后看到<List><value>了吗?自己把一个个JPA加进去吧,然后就可以去爽了。


<property name="annotatedClasses">

<list>

<value>org.sky.ssh.model.TLogin</value>

<value>org.sky.ssh.model.TStudent</value>

</list>

</property>

org.sky.ssh.dao.BaseHibernateDaoSupport.java文件


package org.sky.ssh.dao;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class BaseHibernateDaoSupport extends HibernateDaoSupport {

@Resource(name = "hibernateSessionFactory")

public void setSF(SessionFactory sessionFactory) {

super.setSessionFactory(sessionFactory);

}

}

四、SSH框架的使用

我们现在可以开始使用我们的SSH框架了。

4.1修改DAO层代码

org.sky.ssh.dao.LoginDAO


package org.sky.ssh.dao;

public interface LoginDAO {

public long validLogin(String loginId, String loginPwd) throws Exception;

}

org.sky.ssh.dao.impl.LoginDAOImpl


package org.sky.ssh.dao.impl;

import org.sky.ssh.dao.BaseHibernateDaoSupport;

import org.sky.ssh.dao.LoginDAO;

import org.springframework.stereotype.Repository;

import org.hibernate.Query;

@Repository

public class LoginDAOImpl extends BaseHibernateDaoSupport implements LoginDAO {

public long validLogin(String loginId, String loginPwd) throws Exception {

Long count = new Long(0);

String sql = "select count(tl.loginId) from TLogin as tl where tl.loginId=:loginId and tl.loginPwd=:loginPwd ";

Query query = super.getSession().createQuery(sql);

query.setString("loginId", loginId);

query.setString("loginPwd", loginPwd);

count = (Long) query.list().get(0);

return count;

}

}

org.sky.ssh.dao.StudentDAO


package org.sky.ssh.dao;

import org.sky.ssh.model.TStudent;

import org.sky.ssh.dbo.StudentDBO;

import org.sky.ssh.student.form.*;

import java.util.*;

public interface StudentDAO {

public List<TStudent> getAllStudent() throws Exception;

public void addStudent(String studentName) throws Exception;

public void delStudent(TStudent std) throws Exception;

}

org.sky.ssh.dao.impl.StudentDAOImpl


package org.sky.ssh.dao.impl;

import java.util.ArrayList;

import java.util.List;

import org.hibernate.Query;

import org.sky.ssh.dao.BaseHibernateDaoSupport;

import org.sky.ssh.dao.StudentDAO;

import org.sky.ssh.model.TStudent;

import org.springframework.stereotype.Repository;

@Repository

public class StudentDAOImpl extends BaseHibernateDaoSupport implements StudentDAO {

public List<TStudent> getAllStudent() throws Exception {

List<TStudent> stdList = new ArrayList<TStudent>();

String sql = "from TStudent as s";

Query query = super.getSession().createQuery(sql);

stdList = query.list();

return stdList;

}

public void addStudent(String studentName) throws Exception {

TStudent std = new TStudent();

std.setStudentName(studentName);

this.getHibernateTemplate().save(std);

}

public void delStudent(TStudent std) throws Exception {

this.getHibernateTemplate().delete(std);

}

}

对Service层的接口作相应的调整,把原来在iBatis中使用Map传值的地方改一下即可,对吧?

Hibernate的DAO是我看到过的最简单的DAO写法,连脑子都不需要多动。

4.2 启动我们的框架

确保我们的StudentServiceImpl类中有如下语句:


public void delStudent(String[] stdNo) throws Exception {

for (String s : stdNo) {

TStudent std = new TStudent();

std.setStudentNo(Long.parseLong(s));

studentDAO.delStudent(std);

throw new Exception("force system to throw a exception");

}

}

在eclipse中启动tomcat

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

在IE中输入:http://localhost:8080/myssh/,页面自动跑到登录界面

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

输入alpha/aaaaaa登录成功后我们增加两个用户:test2与test3

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

在主界面上勾选test2与test3点删除按钮。

页面出错

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

看数据库层面

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

数据记录还在,说明我们的springservice层与hibernatedao层已经结合成功。

在StudentServiceImpl类中将:throw new Exception("force system to throw a exception");这句注释掉.

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

重新启动tomcat后登录并勾选test2与test3,然后点删除按钮.

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

删除成功。

查看数据库层记录

通向架构师的道路(第二十一天)万能框架spring(三)之SSH

数据删除也成功了,结束今天的教程。

五、附录

Hibernate的dialect大全


DB2


org.hibernate.dialect.DB2Dialect


DB2 AS/400


org.hibernate.dialect.DB2400Dialect


DB2 OS390


org.hibernate.dialect.DB2390Dialect


PostgreSQL


org.hibernate.dialect.PostgreSQLDialect


MySQL


org.hibernate.dialect.MySQLDialect


MySQL with InnoDB


org.hibernate.dialect.MySQLInnoDBDialect


MySQL with MyISAM


org.hibernate.dialect.MySQLMyISAMDialect


Oracle (any version)


org.hibernate.dialect.OracleDialect


Oracle 9i/10g


org.hibernate.dialect.Oracle9Dialect


Sybase


org.hibernate.dialect.SybaseDialect


Sybase Anywhere


org.hibernate.dialect.SybaseAnywhereDialect


Microsoft SQL Server


org.hibernate.dialect.SQLServerDialect


SAP DB


org.hibernate.dialect.SAPDBDialect


Informix


org.hibernate.dialect.InformixDialect


HypersonicSQL


org.hibernate.dialect.HSQLDialect


Ingres


org.hibernate.dialect.IngresDialect


Progress


org.hibernate.dialect.ProgressDialect


Mckoi SQL


org.hibernate.dialect.MckoiDialect


Interbase


org.hibernate.dialect.InterbaseDialect


Pointbase


org.hibernate.dialect.PointbaseDialect


FrontBase


org.hibernate.dialect.FrontbaseDialect


Firebird


org.hibernate.dialect.FirebirdDialect

相关文章
  • 通向架构师的道路(第二十一天)万能框架spring(三)之SSH 2015-01-15

    一.前言 我们有了Spring+JdbcTemplate和Spring+iBatis并结合maven的基础,搭建一个SSX这样的框架现在就和玩一样的简单了,今天我们将搭建一个使用Struts1.3,Srping3, Hibernate3的SSH1的开发框架,大家跟着我一步步走,会发觉在程序跑通后自己再动手搭建一遍这个框架,只需要30分钟. 二.SSH框架 仔细看这个框架,稍微有点不一样了. 1) Spring3是通过一个hibernate template来和hibernate的dao层结合起来

  • 通向架构师的道路(第十八天)万能框架Spring(一)(转) 2013-03-14

    一.前言 前一阵列刚换了个新的工作环境,然后自己的baby也刚出生,一直没有时间去做工作以后的其它事了,担搁了一段日子. 今天儿子满一周了,我内人她家帮着照顾着,总算我可以喘口气休息一下,因此决定将这个系列的博文继续下去,同时也将此篇献给我刚出生一周的儿子和幸苦了10个月的爱人. 二.基本概念 Spring,作为一个流行框架它给我们在日常工程中的框架搭建提供了太多的便利了,它就像一个骨架一样,你可以在上面自己去塑出肌肤与血肉并赋于它灵魂. 从今天开始我们将要连续几天基于Spring的基础上来讲软

  • 通向架构师的道路(第十八天)万能框架Spring(一) 2015-01-15

    一.前言 前一阵列刚换了个新的工作环境,然后自己的baby也刚出生,一直没有时间去做工作以后的其它事了,担搁了一段日子. 今天儿子满一周了,我内人她家帮着照顾着,总算我可以喘口气休息一下,因此决定将这个系列的博文继续下去,同时也将此篇献给我刚出生一周的儿子和幸苦了10个月的爱人. 二.基本概念 Spring,作为一个流行框架它给我们在日常工程中的框架搭建提供了太多的便利了,它就像一个骨架一样,你可以在上面自己去塑出肌肤与血肉并赋于它灵魂. 从今天开始我们将要连续几天基于Spring的基础上来讲软

  • 通向架构师的道路(第二十天)万能框架spring(二)maven结合spring与ibatis 2015-01-15

    一.前言 上次讲了Struts结合Spring并使用Spring的JdbcTemplate来搭建工程框架后我们面临着jar库无法管理,工程发布不方便,jar包在工程内太占空间,jar包冲突,管理,甚至漏包都问题.于是我们在讲"万能框架spring(二)"前,传授了一篇番外篇,即讲利用maven来管理我们的jar库. 从今天开始我们将结合"万能框架spring(一)"与番外篇maven来更进一步丰富我们的ssx框架,那么今天讲的是使用iBatis3结合SS来构建我们的

  • 通向架构师的道路(第二十二天)万能框架spring(四)使用struts2 2015-01-15

    一.前言 SSH有了,现在我们要把我们的struts层从原来的1.3替换成struts2.x,引入了struts2.0后我们会发觉我们的代码和框架的变化还是不小的 二.Struts2的好处 1)在struts2的方法里,一切变量是线程安全的,而原有的struts1不是的; 2)在struts2中如果你声明了如下这样的代码: privater String studentName=""; public void setStudentName(String studentName){ th

  • 通向架构师的道路(第二十七天)IBM网格计算与企业批处理任务架构 2015-01-16

    一.批处理 我们在一些项目中如:银行.保险.零商业门店系统中的对帐.结帐.核算.日结等操作中经常会碰到一些"批处理"作业. 这些批处理经常会涉及到一些大数据处理,同时处理一批增.删.改.查等SQL,往往涉及到好几张表,这边取点数据那边写点数据,运行一些存储过程等. 批处理往往耗时.耗资源,往往还会用到多线程去设计程序代码,有时处理不好还会碰到内存泄漏.溢出.不够.CPU占用高达99%,服务器被严重堵塞等现象. 笔者曾经经历过一个批处理的3次优化,该批处理笔者按照数据库连接池的原理实现了

  • 通向架构师的道路(第二十三天)maven与ant的奇妙整合 2015-01-15

    一.前言 我们在<万能框架spring>前四天中都用到了maven,接下去要讲述在SSX这样的架构下我们的"单元测试"是怎么进行的,但是在此之前我们再来深入入解一下maven,因为我们的单元测试需要用到的是junit+ant+junitreport这样的组合.而......由于我们已经使用了maven,那么我们如何可以延续经典的junit+ant这样的单元测试的组合呢?其答案就是把maven和ant再进行组合一下. 二.用Maven任务在Ant中使用Maven依赖 Mave

  • 通向架构师的道路(第二十六天)漫谈架构与设计文档的写作技巧 2015-01-16

    前言: 这篇是一篇番外篇,没有太多代码与逻辑,完全是一种"软"技巧,但是它对于你如何成为一名合构的架构设计人员很重要. 在此要澄清一点,架构师本身也是"程序员",不是光动嘴皮子的家伙们,如果你不是一名程序虽出身那你根本谈不上也不可能成为一名架构师. 那么架构师还有哪些是作为一名程序员来说不具备的呢? 其中有一项能力就叫做"文档写作能力". 一.Soft Skill与Hard Skill 作为一名架构师除了是一名资深的程序员外,它还必须具有相应的S

  • 通向架构师的道路(第十九天)使用maven构建Spring工程 (转) 2013-03-16

    一.前言 上次大家拿了我上传的工程后,有些人自己通过spring3,struts1.3,hibernate3的download的包自行去装配jar包 到工程的WEB-INF\lib目录下.有些是通过我上传的alpha_lib包把里面的jar文件一股脑的copy到了工程的WEB-INF\lib目 录下去. 有时经常还会发生少包了,ClassNotFound这样的错误,或者是一些因为缺包还引起的各种莫名奇妙的错误,呵呵,是不是够折腾的啊? 尝过苦头了,才知道幸苦!那么我们有没有一种更好的方式,比如说

  • 通向架构师的道路(第一天)之Apache整合Tomcat 2015-01-13

    一.先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: ü Web Server ü App Server ü DB Server 三大部分组成,其中: ² Web Server 置于企业防火墙外,这个防火墙,大家可以认为是一个CISCO路由器,然后在CISCO路由器上开放了两个端口为:80和443. 80端口:用于正常的http访问 443端口:用于https访问,即如果你在ie里打入https://xxx.xxx.xx这样的地址,默认 走的是443这个端口. We

  • 通向架构师的道路(第二天)之apache tomcat https应用 2015-01-13

    一.总结前一天的学习 在前一天的学习中我们知道.了解并掌握了Web Server结合App Server是怎么样的一种架构,并且亲手通过Apache的Http Server与Tomcat6进行了整合的实验. 这样的架构的好处在于: ü 减轻App Server端的压力,用Web Server来分压,即Web Server只负责处理静态HTML内容,而App Server专职负责处理Java请求,这对系统的performance是一个极大的提升. ü 安全,Web Server端没有任何Java源

  • 通向架构师的道路(第三天)之apache性能调优 2015-01-13

    一.总结前一天的学习 在前两天的学习中我们知道.了解并掌握了Web Server结合App Server实现单向Https的这样的一个架构.这个架构是一个非常基础的J2ee工程上线布署时的一种架构.在前两天的教程中,还讲述了Http服务器.App Server的最基本安全配置(包括单向https的实现), 它只是避免了用户可以通过浏览器侵入我们的Web访问器或者能够通过Web浏览器来查询我们的Web目录结构及其目录内的文件与相关内容,这种入侵我们把它称为: Directory traversal

  • 通向架构师的道路(第四天)之Tomcat性能调优-让小猫飞奔 2015-01-13

    一.总结前一天的学习 从"第三天"的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü 吞吐量 ü Responsetime ü Cpuload ü MemoryUsage 我们也在第三天的学习中对Apache做过了一定的优化,使其最优化上述4大核心指标的读数,那么我们的Apache调优了,我们的Tomcat也作些相应的调整,当完成今的课程后,到时你的"小猫"到时真的会"飞"起来的,所以请用心看完,这篇文章一方面用来向那位曾写过&

  • 通向架构师的道路(第五天)之tomcat集群-群猫乱舞 2015-01-13

    一.为何要集群 单台App Server再强劲,也有其瓶劲,先来看一下下面这个真实的场景. 当时这个工程是这样的,tomcat这一段被称为web zone,里面用spring+ws,还装了一个jboss的规则引擎Guvnor5.x,全部是ws没有service layer也没有dao layer. 然后App Zone这边是weblogic,传输用的是spring rmi,然后App Zone这块全部是service layer, dao layer和数据库打交道. 用户这边用的是.net,以w

  • 通向架构师的道路(第八天)之weblogic与apache的整合与调优 2015-01-13

    一.BEAWeblogic的历史 BEA WebLogic是用于开发.集成.部署和管理大型分布式Web应用. 网络应用和数据库应 用的Java应用服务器.将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的 开发.集成.部署和管理之中. BEA WebLogic Server拥有处理关键Web应用系统问题所需的性能 .可扩展性和高可用性. 与BEA WebLogic Commerce ServerTM配合使用, BEA WebLogicServer可为部署适应性个性

  • 通向架构师的道路(第十九天)使用maven构建Spring工程 2015-01-15

    一.前言 上次大家拿了我上传的工程后,有些人自己通过spring3,struts1.3,hibernate3的download的包自行去装配jar包到工程的WEB-INF\lib目录下.有些是通过我上传的alpha_lib包把里面的jar文件一股脑的copy到了工程的WEB-INF\lib目录下去. 有时经常还会发生少包了,ClassNotFound这样的错误,或者是一些因为缺包还引起的各种莫名奇妙的错误,呵呵,是不是够折腾的啊? 尝过苦头了,才知道幸苦!那么我们有没有一种更好的方式,比如说:

  • 通向架构师的道路(第二十五天)SSH的单元测试与dbunit的整合 2015-01-15

    一.前言 在二十三天中我们介绍了使用maven来下载工程的依赖库文件,用ant来进行war包的建立.今天我们在这个基础上将使用junit+dbunit来进行带有单元测试报告的框架的架构. 目标: 每次打包之前自动进行单元测试并生成单元测试报告 生成要布署的打包文件即war包 单元测试的代码不能够被打在正式的要布署的war包内,单元测试仅用于unit test用 使用模拟数据对dao层进行测试,使得dao方法的测试结果可被预料 二.Junit+Ant生成的单元测试报告 上面是一份junit生成的测

  • 通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计 2015-01-13

    一.权限系统 这一天将讲述一个基本的基于数据库的权限管理系统的设计,在这一天的课程的最后将讲述"左右值无限分类实现算法"如何来优化"系统菜单"的结构而告终.今天的内容和前几天的基础框架是一样的它们都属于基础知识,在这些基础知识上还可以扩展出无数的变种与进化设计. 二.先来看客户的一个需求 2.1 用户实际需求 1. 所有的用户.角色可动态配置 2. 所有的系统菜单的权限要求具体到"增,删,改.查.打印.导出"这样的小权限的设计 3. 所有的权限基

  • 通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分 2015-01-13

    一.什么是ThreadLocal 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. ThreadLocal很容易让人望文生义,想当然地认为是一个"本地线程".其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些. 当使用ThreadLocal维护

  • 通向架构师的道路(第九天)之weblogic的集群与配置 2015-01-14

    一.Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tomcat做node即tomcat1, tomcat2,使用Apache HttpServer做请求派发. 现在看看WebLogic的集群吧,其实也差不多. 区别在于: ² Tomcat的集群的实现为两个物理上不同的tomcat,分别就是两个node,没有总控端,没有任何控制台可言(只有通过比较简陋的http://localhost:8080/manager/html,或者是http://localhos