2008年的SSH入门门槛——插入一个用户要配多少东西

发布时间:2026/6/17 17:15:23

2008年的SSH入门门槛——插入一个用户要配多少东西 2008年的SSH入门门槛——插入一个用户要配多少东西Struts 1.1 Spring 2.0 Hibernate 3。这是2008年Java Web开发的标准三件套。那时候写一个插入用户功能不是今天的三行代码是在五层配置文件里找到了正确的标签、配对了正确的依赖链。这篇文章是一个当年的SSH学习项目逐步拆解插入一条用户记录到底经历了多少层。文章目录2008年的SSH入门门槛——插入一个用户要配多少东西一、背景2008年的SSH三件套二、Struts 1——前端的请求入口三、Spring 2——IOC容器把三层串起来四、Struts与Spring的桥接——DelegatingRequestProcessor五、Hibernate 3——对象到Oracle表的映射六、DAO实现——HibernateDaoSupport七、完整调用链——从JSP到Oracle的五层传递八、SSH时代的三座大山九、结语一、背景2008年的SSH三件套2008年做Java Web开口就是SSH——Struts做MVCSpring做容器Hibernate做ORM。不是选其中一个是三个都要用少一个就不叫企业级。当时的入门门槛不是理解概念是把这三个东西配通。因为它们不是一个爹生的——Struts是Apache的Spring是SpringSource的Hibernate是JBoss的。三个不同组织开发的框架要在一个项目里合作全靠XML配置把它们的接触点手工接上。一个最简单的插入用户功能经历的层数是今天Spring Boot的十倍。二、Struts 1——前端的请求入口!-- struts-config.xml --form-beansform-beannameuserformtypecom.myssh.form.UserForm//form-beansaction-mappingsactionpath/usertypecom.myssh.action.UserActionparameterstatusforwardnamesuccesspath/success.jsp/forwardnamefailpath/fail.jsp//action/action-mappings前端JSP用html:form action/user.do?statusinsert提交表单。Struts 1的ActionServlet拦截*.do读到path/user根据parameterstatus的insert值找到UserAction里的insert()方法。!-- test.jsp -- html:form action/user.do?statusinsert 用户名html:text propertyusername/ 密码html:password propertypassword/ html:submit提交/html:submit /html:formStruts 1 的 ActionForm 要把表单字段一个一个人肉声明publicclassUserFormextendsActionForm{privateStringusername;privateStringpassword;// getter/setter... 每个字段都要写}今天一个RequestParam或ModelAttribute的事那时要写一个完整的ActionForm类。三、Spring 2——IOC容器把三层串起来!-- applicationContext.xml --!-- 数据源 --beaniddataSourceclassorg.apache.commons.dbcp.BasicDataSourcepropertynamedriverClassNamevalueoracle.jdbc.driver.OracleDriver/propertynameurlvaluejdbc:oracle:thin:127.0.0.1:1521:orcl/propertynameusernamevalueYFSI/propertynamepasswordvalueYFSI//bean!-- Hibernate Session工厂 --beanidsessionFactoryclassorg.springframework.orm.hibernate3.LocalSessionFactoryBeanpropertynamedataSourcerefdataSource/propertynamemappingResourceslistvaluecom/myssh/po/User.hbm.xml/value/list/property/bean!-- DAO --beanidiuserdaoclasscom.myssh.dao.impl.UserDaoImplpropertynamesessionFactoryrefsessionFactory//bean!-- Service --beanidiuserserviceclasscom.myssh.service.impl.UserServiceImplpropertynameiuserdaorefiuserdao//bean!-- ActionStruts与Spring的接触点 --beanname/userclasscom.myssh.action.UserActionpropertynameiuserservicerefiuserservice//bean依赖注入链UserAction → UserServiceImpl → UserDaoImpl → SessionFactory → DataSource。每个节点都是XML里一个bean标签。注意Action的bean name是/user——它必须和struts-config.xml里的path/user对得上。这是Struts和Spring之间唯一的连接点配错了Struts找不到Action。四、Struts与Spring的桥接——DelegatingRequestProcessor!-- struts-config.xml --controllerset-propertypropertyprocessorClassvalueorg.springframework.web.struts.DelegatingRequestProcessor//controller这一行是整个SSH集成的关键。Struts 1默认用RequestProcessor创建Action实例。DelegatingRequestProcessor把它劫持了——创建Action时不自己new而是去Spring容器里按path名称查找bean。所以Action的bean name必须和struts-config里的path一致——这就是SSH时代Struts认path、Spring认beanName的设计约定。不对上就是一串NullPointerException。五、Hibernate 3——对象到Oracle表的映射!-- User.hbm.xml --hibernate-mappingclassnamecom.myssh.po.Usertableuser1schemaYFSIidnameidcolumnidtypeintegergeneratorclassincrement//idpropertynameusernamecolumnusernametypestring/propertynamepasswordcolumnpasswordtypestring//class/hibernate-mappingPOJO只有三个字段——id、username、password。但每个字段都要在XML里显式声明类型、列名、映射关系。今天EntityColumn的事那时候是一份独立的XML文件。六、DAO实现——HibernateDaoSupportpublicclassUserDaoImplextendsHibernateDaoSupportimplementsIUserDao{publicbooleaninsert(Useruser){try{this.getHibernateTemplate().save(user);returntrue;}catch(Exceptione){returnfalse;}}}HibernateDaoSupport是Spring对Hibernate的封装——通过getHibernateTemplate()拿到模板对象调save()、update()、delete()。这个模式的好处是不用手动开Session、不用管事务、不用close连接。Spring帮你管了。但代价也很明显——你要继承HibernateDaoSupport破坏了自己DAO的继承体系。如果你的DAO还需要继承别的基类就没法做了。七、完整调用链——从JSP到Oracle的五层传递test.jsp │ POST /user.do?statusinsert ▼ ActionServlet (*.do路由) │ ▼ DelegatingRequestProcessor从Spring容器取Action │ ▼ UserAction.insert() │ 从ActionForm取出username/password │ 构造User PO │ 调 iuserservice.insert(user) ▼ UserServiceImpl.insert() │ 调 iuserdao.insert(user) ▼ UserDaoImpl.insert() │ 调 getHibernateTemplate().save(user) ▼ Hibernate → INSERT INTO YFSI.user1 VALUES(1, admin, 123456) │ ▼ 返回 success.jsp 或 fail.jsp从点击提交到执行SQL穿过六层。每一步都靠XML配置把接口和实现串起来。今天的Spring Boot让你感觉写一个功能只要三行代码——不是功能真的简化了是这六层的XML配置全被Spring Boot自动配置替代了。八、SSH时代的三座大山山当年的痛苦今天的解法web.xml配置手动配Servlet/Taglib/ContextLoaderSpring Boot自动注册Struts-Spring桥接DelegatingRequestProcessor配错就404Spring MVC原生集成Hibernate映射每张表一个hbm.xmlJPA注解 Entity依赖注入每个bean一个propertyAutowired自动装配事务管理HibernateTransactionManager手配Transactional一个注解一个插入用户的Demo配置文件的篇幅是业务代码的三倍。这不是过度设计——是这三个框架设计之初就是独立的合在一起全靠XML粘合剂。理解了这套粘合剂就知道后来的Spring Boot消灭了什么。九、结语2008年的SSH学习成本不在Java本身——在配通三套框架的接触点。Struts认pathSpring认beanNameHibernate认mappingResource三者之间的对应关系全靠人脑记住。这套SSH三件套统治了Java Web开发整整五年直到2013年Spring Boot出现一键消灭了这堆XML。现在回头看这个只有插入用户的项目代码不到100行配置超过200行。它不是复杂——是那个年代的技术选型就是这样的。理解了它就理解了Spring Boot为什么能一统天下。

相关新闻