原文来自公众号【C you again】,若需下载完整源码,请在公众号后台回复“ssh”。

本期文章详细讲解了SSH(Spring+SpringMVC+Hibernate)框架的搭建过程,语言简洁、通俗易懂,适合初级程序员阅读。在开始教程之前,先来了解SSH框架的基本概念:

在文章《手把手教你搭建SSM框架(Eclipse版)》中已经对Spring、SpringMVC做了详细介绍,这里只对Hibernate做介绍。

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将Pojo与数据库表建立映射关系,是一个全自动的ORM框架。

Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用面向对象编程思想来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。

看完以上概念,我们就正式开始今天的教程了。制作不易,多多转发分享哦!!

1、前期准备

  • 安装配置JDK1.8
  • 安装配置Tomcat9.0
  • 安装配置MySql5.7
  • 开发工具Eclipse

2、新建动态Web项目

在开发工具中:

File-->New-->Project-->Dynamic Web Project

输入项目名称(本教程项目名:sshDemo),最后点击Finish即可。

3、补充、完善项目目录

为使得项目符合MVC开发规范,我们需要在src下新建controller、service、entity几个包和resources目录。完成后目录结构如下图:

4、导入所需Jar包

本期教程用最原始的方法手动导入项目所需Jar包。手动导入会存在Jar包版本冲突等很多问题,建议直接下载使用。在公众号【C you again】后台回复“Jar”自行下载,若不能正常下载,请在后台私信。

将下载好的Jar包复制到WebContent-->WEB-INF-->lib文件夹下,然后选中所有Jar包-->鼠标右击-->Build Path-->Add to Build Path。

5、添加相关配置文件

完成以上基本步骤后,接下来就是SSH整合的关键步骤了。

首先在项目的WebContent-->WEB-INF下的web.xml文件中加入以下配置,如果没有web.xml文件就需要自己新建一个。

  1. xml version="1.0" encoding="UTF-8"?>
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  6. id="WebApp_ID" version="2.5">
  7. test.jsp
  8. contextConfigLocation
  9. classpath*:application.xml
  10. org.springframework.web.context.ContextLoaderListener
  11. CharacterEncodingFilter
  12. org.springframework.web.filter.CharacterEncodingFilter
  13. encoding
  14. utf-8
  15. CharacterEncodingFilter
  16. /*
  17. springMvc
  18. org.springframework.web.servlet.DispatcherServlet
  19. contextConfigLocation
  20. classpath*:springmvc.xml
  21. 1
  22. springMvc
  23. /

完成web.xml的配置后,在前面建好的resources文件夹下新建application.xml,具体解释看文件内部。

  1. xml version="1.0" encoding="UTF-8"?>
  2. xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  9. base-package="com.cya"/>
  10. id="propertyConfigurer"
  11. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  12. name="locations">
  13. classpath*:dbconfig.properties
  14. id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
  15. destroy-method="close">
  16. name="url" value="${jdbc.url}" />
  17. name="username" value="${jdbc.username}" />
  18. name="password" value="${jdbc.password}" />
  19. name="driverClassName" value="${jdbc.driver}" />
  20. name="maxActive" value="10" />
  21. name="minIdle" value="5" />
  22. id="sqlSessionFactory"
  23. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  24. name="dataSource" ref="dataSource">
  25. name="hibernateProperties">
  26. key="hibernate.dialect">${hibernate.dialect}
  27. key="hibernate.show_sql">${hibernate.show_sql}
  28. key="hibernate.format_sql">${hibernate.format_sql}
  29. key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}
  30. name="configLocations">
  31. classpath*:hibernate.cfg.xml
  32. id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  33. name="sessionFactory" ref="sqlSessionFactory">
  34. id="transactionManager"
  35. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  36. name="dataSource" ref="dataSource"/>
  37. transaction-manager="transactionManager"/>

接着在resources文件夹下新建springmvc.xml,代码如下:

  1. xml version="1.0" encoding="UTF-8"?>
  2. xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. base-package="com.cya.controller" />
  13. />
  14. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  15. name="prefix" value="/WEB-INF/"/>
  16. name="suffix" value=".jsp">
  17. id="multipartResolver"
  18. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  19. name="defaultEncoding" value="utf-8"/>
  20. name="maxUploadSize" value="10485760000"/>
  21. name="maxInMemorySize" value="40960"/>

同上面的步骤,继续在resources文件夹下新建hibernate.cfg.xml、dbconfig.properties、log4j.properties三个文件。

hibernate.cfg.xml文件:

  1. xml version="1.0" encoding="UTF-8"?>
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

dbconfig.properties文件:

  1. #database connection config
  2. jdbc.driver = com.mysql.jdbc.Driver
  3. jdbc.url = jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false
  4. jdbc.username = root
  5. jdbc.password = root
  6. #hibernate config
  7. hibernate.dialect = org.hibernate.dialect.MySQLDialect
  8. hibernate.show_sql = true
  9. hibernate.format_sql = true
  10. hibernate.hbm2ddl.auto = update

log4j.properties文件:

  1. # Set root logger level to error
  2. log4j.rootLogger=INFO, Console, File
  3. ###### Console appender definition #######
  4. # All outputs currently set to be a ConsoleAppender.
  5. log4j.appender.Console=org.apache.log4j.ConsoleAppender
  6. log4j.appender.Console.layout=org.apache.log4j.PatternLayout
  7. log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{3}] %m%n
  8. #log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c] %m%n
  9. ###### File appender definition #######
  10. log4j.appender.File=org.apache.log4j.DailyRollingFileAppender
  11. log4j.appender.File.File=spring.log
  12. log4j.appender.File.Append=false
  13. log4j.appender.File.layout=org.apache.log4j.PatternLayout
  14. log4j.appender.File.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c] %m%n

至此,所有的整合步骤已经完成了,最后的目录结构如下所示,接下来就是设计测试用例了。

6、测试项目能否正常运行

完成上述步骤后,接下来就测试下整合是否成功吧!

在src-->com.cya.entity下创建Person.java实体类

  1. package com.cya.entity;
  2. public class Person {
  3. private int id;
  4. private String name;
  5. private int age;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. public void setAge(int age) {
  22. this.age = age;
  23. }
  24. }

在resources下新建mapping目录,用来保存所有的数据库映射文件。mapping目录下创建映射文件:Person.hbm.xml,具体配置如下:

  1. xml version="1.0" encoding="utf-8"?>
  2. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. name="com.cya.entity.Person" table="t_person">
  5. name="id" type="java.lang.Integer" column="p_id" >
  6. class="increment">
  7. name="name" type="java.lang.String" column="p_name">
  8. name="age" type="java.lang.Integer" column="p_age">

修改hibernate.cfg.xml,添加配置:

  1. xml version="1.0" encoding="UTF-8"?>
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. resource="mapping/Person.hbm.xml"/>

修改完成后启动web项目,待项目启动成功以后刷新test数据库,我们发现已经创建好了名为t_person的数据表。

在WebContent文件夹下新建test.jsp。

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. charset="utf-8">
  4. </span><span class="pln">测试SSH整合</span><span class="tag">
  5. href="addPerson">添加并查看Person信息

在src-->com.cya.service下创建IPersonService.java接口。

  1. package com.cya.service;
  2. import java.util.List;
  3. import com.cya.entity.Person;
  4. public interface IPersonService {
  5. public boolean addPerson(Person person);
  6. public List<Person> getPerson(String sql);
  7. }

在src下新建com.cya.service.impl包,并创建PersonServiceImpl.java类实现IPersonService.java接口中的getPerson()和addPerson()两个方法。

  1. package com.cya.service.impl;
  2. import java.util.List;
  3. import javax.annotation.Resource;
  4. import org.springframework.orm.hibernate3.HibernateTemplate;
  5. import org.springframework.stereotype.Service;
  6. import com.cya.entity.Person;
  7. import com.cya.service.IPersonService;
  8. @Service
  9. public class PersonServiceImpl implements IPersonService{
  10. @Resource(name="hibernateTemplate")
  11. private HibernateTemplate hibernateTemplate;
  12. @Override
  13. public boolean addPerson(Person person) {
  14. // TODO Auto-generated method stub
  15. boolean result=true;
  16. try {
  17. hibernateTemplate.save(person);
  18. } catch (Exception e) {
  19. // TODO: handle exception
  20. result=false;
  21. }
  22. return result;
  23. }
  24. @Override
  25. public List<Person> getPerson(String sql) {
  26. // TODO Auto-generated method stub
  27. return (List<Person>) hibernateTemplate.find(sql);
  28. }
  29. }

在src-->com.cya.controller包下新建class,这里取名为Test.java,去调用PersonServiceImpl.java中的方法。

  1. package com.cya.controller;
  2. import java.util.List;
  3. import javax.annotation.Resource;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import com.cya.entity.Person;
  9. import com.cya.service.IPersonService;
  10. @Controller
  11. @ResponseBody
  12. public class Test {
  13. @Resource
  14. private IPersonService personServiceImpl;
  15. @RequestMapping("addPerson")
  16. public List<Person> getPerson() {
  17. Person person=new Person();
  18. person.setAge(15);
  19. person.setName("test");
  20. boolean status=personServiceImpl.addPerson(person);
  21. if(status)return personServiceImpl.getPerson("from com.cya.entity.Person");
  22. else return null;
  23. }
  24. }

最后检查代码,启动服务,在浏览器地址栏输入:http://localhost:8080/sshDemo/test.jsp查看效果。

7、下载相关

下载项目所需Jar包请在公众号【C you again】回复“Jar”。

下载完整项目源码请在公众号【C you again】回复“ssh”。

本期分享就到这里,因本人技术有限,文章难免会出现一些错误,欢迎指正。创作不易,大家多多转发点赞,感谢。

精彩推荐

《手把手教你搭建SSM框架(Eclipse版)》

标签:

手把手教你搭建SSH框架(Eclipse版)的更多相关文章

  1. JVM系列(三):JVM创建过程解析

    上两篇中梳理了整个java启动过程中,jvm大致是如何运行的。即厘清了我们认为的jvm的启动过程。但那里面仅为一些大致的东西,比如参数解析,验证,dll加载等等。把最核心的loadJavaVM()交给了一个dll或者so库。也就是真正的jvm我们并没有接触到,我们仅看了一个包装者或者是上层应用的实现......

  2. Java中的深浅拷贝问题,你清楚吗?

    一、前言拷贝这个词想必大家都很熟悉,在工作中经常需要拷贝一份文件作为副本。拷贝的好处也很明显,相较于新建来说,可以节省很大的工作量。在Java中,同样存在拷贝这个概念,拷贝的意义也是可以节省创建对象的开销。Object类中有一个方法clone(),具体方法如下:protected native Ob......

  3. 全面解析java final关键字

    根据上下文环境,Java 的关键字 final 的含义有些微的不同,但通常它指的是“这是不能被改变的”。防止改变有两个原因:设计或效率。因为这两个原因相差很远,所以有可能误用关键字 final。以下几节讨论了可能使用 final 的三个地方:数据、方法和类。1)final 数据对于编译时常量这种情况......

  4. synchronized详解

    synchronized是Java多线程中元老级的锁,也是面试的高频考点,让我们来详细了解synchronized吧。在Java中,synchronized锁可能是我们最早接触的锁了,在 JDK1.5之前synchronized是一个重量级锁,相对于juc包中的Lock,synchronized显得......

  5. Java8 Stream

    简单认识Java stream Java8出了一个stream流式编程,在开发中或多或少用到接触过。怎么说呢!举个例子把,一起我们在遍历一个集合的时候,我们是从外部去遍历的,然后才能拿到结果,这样来效率就会变得相对低一点。而这个时候我们去内部去遍历集合的时候,直接从内部拿数据。减少资源消耗,提升效率......

  6. java自定义注解验证手机格式的实现示例

    1、@Valid与@Validated的区别1.1 基本区别@Valid:Hibernate validation校验机制@Validated:Spring Validator校验机制,这个也是最常用的@Validation只是对@Valid进行了二次封装,在使用上并没有太大区别,但在分组、注解位置......

  7. Java并发编程实战(5)- 线程生命周期

    在这篇文章中,我们来聊一下线程的生命周期。在这篇文章中,我们来聊一下线程的生命周期。目录概述操作系统中的线程生命周期Java中的线程生命周期Java线程状态转换运行状态和阻塞状态之间的转换运行状态和无时限等待状态的切换运行状态和有时限等待状态的切换初始化状态和运行状态的切换运行状态和终止状态的切换手......

  8. java中gc算法实例用法

    在我们对gc中的算法有基本概念理解后,要把算法的理念实现还需要依托实际垃圾收集器的使用。因为光靠一些简单的原理不足以支撑整个程序的运行,在回收机制上有专门的收集器。下面我们就垃圾收集器的概念、使用注意事项、收集器图解进行介绍,然后带来两种常见的垃圾收集器供大家参考。1.概念垃圾收集器时之前列举的垃圾......

  9. Java集合框架分析(List)——LinkedList类详解

    LinkedList类中的方法与实现原理目录一.数据结构二.类标题三.字段四.构造函数五.方法分析5.1 共有方法 public boolean add(Object o)public boolean addAll(Collection c)public boolean contains(Objec......

  10. java Wrapper类基本用法详解

    在封装中有一种特殊的类,能够把基本的数据类型进行转换来方便实际的使用。我们在之前提到的一些数据类型,最明显的特征是所有字母为小写状态,那么经过Wrapper的包装后,首字母就变成了大写。下面我们就这种特殊的封装类Wrapper的概念、转换图解、模式以及实例带来分享。1.概念wrapper类是在Jav......

随机推荐

  1. 深入理解Js中的this

    深入理解Js中的thisJavaScript作用域为静态作用域static scope,但是在Js中的this却是一个例外,this的指向问题就类似于动态作用域,其并不关心函数和作用域是如何声明以及在何处声明的,只关心它们从何处调用,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能......

  2. PostgreSQL之INDEX 索引详解

    之前总结了PostgreSQL的序列相关知识,今天总结下索引。我们都知道,数据库索引最主要的作用是可以提高检索数据的速度,但是索引也不是越多越好。因为索引会增加数据库的存储空间,查询数据是要花较多的时间。1、创建索引SQL语句如下:CREATE INDEX idx_commodityON commo......

  3. nodejs事件和事件循环详解

    目录简介nodejs中的事件循环phase详解timerspending callbacksidle, preparepoll轮询checkclose callbackssetTimeout 和 setImmediate的区别两者的共同点unref 和 refprocess.nextTickproc......

  4. ES6在工作中会用到的核心知识点讲解

    一、var, let, const谈到ES6,估计大家首先肯定会想到var,let,const咱就先谈谈这三者的区别var a = 3;{var a = 4;}console.log(a);//4let b = 5;{let b = 6;}console.log(b);//5const c = 7;......

  5. C# Aspose.Words 删除word中的图片操作

    今天介绍下 Aspose.Words 对 word 中的图片进行删除string tempFile = Application.StartupPath + "\\resource\\templete\\项目建议书模板.doc";Document doc = new Documen......

  6. VUE 3.0 初体验之路

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14394057.html在2020年9月中旬,vue.js发布了3.0正式版,在不久的将来,VUE3.0 也终将成为大前端的必然趋势,环境搭建node 版本要求: Node.js8.9 ......

  7. Android如何实现动态滚动波形图(心电图)功能

    一、前言最近涉及的某个医疗相关的业务,传感器数据传递上来需要实现示波器的效果,心电图的效果,目前交付效果还算理想,于是封装了一下,方便自己以后使用,也给大家分享一下二、效果图图一是心电图效果,图二是一个滚动的波形图三、功能实现(一)绘制背景网格为了让他看上去像示波器上的数据,我们先绘制一层网格背景,......

  8. opencv python 对指针仪表读数识别的两种方式

    我尝试了两种方式用opencv 对指针仪表进行读数识别,1. 先模板匹配,然后边缘检测 + 霍夫直线2. 按轮廓大小过滤,然后边缘检测 + 霍夫直线两种方式对光线都非常敏感其中第一种的应用范围更广,背景复杂一点也能识别到个人比较喜欢这种方式第二种的限制多一点,对背景、光线条件要求比较高对于固定位置,......

  9. Android自定义相机聚焦和显示框

    本文实例为大家分享了Android自定义相机聚焦和显示框的具体代码,供大家参考,具体内容如下先看使用效果,白色圆框,放大后缩写并变淡隐藏下面是代码public class CameraFocusView extends AppCompatImageView {String TAG = getClas......

  10. Java中ArrayList集合的常用方法大全

    ArrayList集合的创建非泛型创建ArrayList集合对象,可以添加任意Object子类元素至集合//非泛型创建的ArrayList集合对象可以保存任何类型的值ArrayList list = new ArrayList();list.add("str");//存入Stri......