• 1 SSH项目的一些部署

    • 1.1 项目目标与版本介绍
    • 1.2 SSH知识分析
  • 2 SSH项目
    • 2.0 项目的前期部署
    • 2.1 创建项目
    • 2.2 前端的一些jsp
    • 2.3 web.xml
    • 2.4 实体类
    • 2.5 hibernate的一些配置
    • 2.6 web层的action
    • 2.7 Struts的一些配置文件
    • 2.8 service层
    • 2.9 dao层
    • 2.10 Spring的一些配置
      • 2.10.1 配置主配置文件
      • 3.10.2 Spring模块配置文件
  • 3 本文相关代码参考

更多SSH开发在框架开发


1 SSH项目的一些部署

1.1 项目目标与版本介绍

目标: 用户单表的添加,查询与删除操作

版本: hibernate-release-5.0.12.Finalspring-framework-4.2.4.RELEASE-diststruts-2.3.24-all

1.2 SSH知识分析

Spring的一些提醒点:

  • 让Spring的配置文件在服务器启动的时候加载,所以需要在web.xml中配置监听器和指定spring配置文件的位置。
  • Spring的配置文件可以弄成多模块开发。即,将代码过多的spring配置文件分成多个小的配置文件,这些小配置文件在总配置文件中引入即可。

Spring整合Struts2的一些提醒点:

  • 不要忘记web.xml中要引入过滤器
  • 整合后要将Struts2中的action交给Spring管理,并且将action配置成多实例的。

Spring整合Hibernate的一些提醒点:

  • Hibernate的SessionFactory交给Spring配置。Hibernate的SessionFactory对象创建在第一次调用的时候创建,会造成第一次访问很慢,而Spring配置文件会在服务器启动时加载,所以将SessionFactory的创建交给Spring以增加速度。
  • Hibernate的数据库配置交给Spring配置。
  • HibernateTemplate的使用需要Spring事务管理的加持。

2 SSH项目

2.0 项目的前期部署

开发工具 :tomcat9.0+jdk8+eclipse+mysql8.0+linux(ubuntu18.04)平台

数据库创建

create database db_sshUser;

导jar包操作:

2.1 创建项目

本文项目所有目录结构如下:

2.2 前端的一些jsp

listAll.jsp, 主页面。

功能:

  • 显示查询的所有用户: 用到struts2的OGNL+值栈
  • 根据id删除用户: 超链接形式向action中传递了一个用户id。
  • 跳转添加页面的超链接 : 超链接到另一个添加jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!--引入struts标签库 -->
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>所有用户</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/user_findAll">查看所有用户</a>
<table><tr><td>名字</td><td>地址</td><td>操作</td></tr><!-- 使用OGNL+struts标签的方式取到值栈中的内容,常用 --><s:iterator value="userList" var="user"><tr><td><s:property value="#user.username"/></td><td><s:property value="#user.useraddress"/></td><td><a href="${pageContext.request.contextPath}/user_delUser?uid=<s:property value="#user.uid"/>">删除该用户</a></td></tr></s:iterator>
</table><a href="${pageContext.request.contextPath}/jsp/addUser.jsp">添加用户</a>
</body>
</html>

addUser.jsp, 添加页面

功能:

  • 提交添加属性表单到action中处理
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加用户</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user_addUser.action" method="post">用户名:<input type="text" name="username" /><br>地 址:<input type="text" name="useraddress" /><br><input type="submit" value="添加"/>
</form>
</body>
</html>

2.3 web.xml

web.xml 中引入 struts2的过滤器配置,让Spring配置文件随服务器一起启动的监听器配置和指定Spring配置文件的路径配置。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" 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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>User</display-name><!-- 指定Spring配置文件的位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:bean1.xml</param-value>   </context-param><!-- 过滤器 --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><!-- 监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list>
</web-app>

2.4 实体类

User,要符合hibernate要求的实体类创建规则

package edu.kmust.user.entity;
/*** 用户实体类* @author zhaoyuqiang**/
public class User {private Integer uid;private String username;private String useraddress;。。。因为代码过长,省略set和get方法,读者自行添加
}

2.5 hibernate的一些配置

User.hbm.xml ,配置实体类与表的映射关系

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="edu.kmust.user.entity"><!--建立类和表的映射关系 --><class name="User" table="tb_users"><!--建立实体类属性与主键的映射关系 --><id name="uid" column="id"><generator class="native"/></id><!--建立实体类其余属性与表字段的映射关系 --><property name="username" /><property name="useraddress" /> </class>
</hibernate-mapping>    

hibernate.cfg.xml ,hibernate的核心映射配置文件,引入上述的映射配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!--配置方言 -->    <property name="hibernate.hbm2ddl.auto">update</property> <!--在SessionFactory创建时自动更新表结构,没有创建,不一样就修改  --> <!-- 加载映射配置 --><mapping resource="edu/kmust/user/entity/User.hbm.xml"/></session-factory>
</hibernate-configuration>

2.6 web层的action

UserAction

功能:

  • 采用模型驱动的方式封装表单数据
  • 采用传统Servlet的方式获取超链接中的参数
  • 添加,删除,查找功能的web层处理
package edu.kmust.user.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import edu.kmust.user.entity.User;
import edu.kmust.user.service.UserService;
/*** 用户表示层* @author zhaoyuqiang**/
public class UserAction extends ActionSupport implements ModelDriven<User>{//注入serviceprivate UserService userService ;public void setUserService(UserService userService) {this.userService = userService;}//封装表单属性private User user = new User(); //定义返回的userListprivate List<User> userList ;public List<User> getUserList() {return userList;}/*** 删除用户* @return*/public String delUser() {HttpServletRequest request = ServletActionContext.getRequest();Integer uid = Integer.valueOf(request.getParameter("uid"));user.setUid(uid);userService.delUser(user);return "del" ;}/*** 用户添加* @return*/public String addUser() {userService.addUser(user);return "add" ;      }/*** 查找所有用户* @return*/public String findAll() {userList = userService.findAll();return "findAll" ;}/*** 实现ModelDriven接口中的方法*/@Overridepublic User getModel() {    return user;}
}

2.7 Struts的一些配置文件

Struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><package name="user" extends="struts-default" namespace="/">    <action name="user_*" class="userAction" method = "{1}">    <result name="add" type="redirectAction">user_findAll</result><result name="findAll">/jsp/listAll.jsp</result><result name="del" type="redirectAction">user_findAll</result></action></package>
</struts>

2.8 service层

UserService

package edu.kmust.user.service;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;
import cn.kmust.user.dao.userDao;
import edu.kmust.user.entity.User;
/*** 用户业务层* @author zhaoyuqiang**/
@Transactional
public class UserService {//service注入daoprivate userDao userDao ;public void setUserDao(userDao userDao) {this.userDao = userDao;}/*** 添加用户业务* @param user*/public void addUser(User user) {userDao.addUser(user);      }/*** 查找所有用户业务*/public List<User> findAll() {List<User> userList = userDao.findAll();return userList ;}/*** 删除用户* @param user*/public void delUser(User user) {userDao.delUser(user);}
}

2.9 dao层

UserDao接口

package cn.kmust.user.dao;
import java.util.List;
import edu.kmust.user.entity.User;
/*** 用户接口* @author zhaoyuqiang**/
public interface userDao {/*** 添加用户* @param user*/public void addUser(User user);/*** 查找所有用户* @return*/public List<User> findAll();/*** 根据id查找用户* @param user* @return*/public User findById(User user); /*** 条件查询_根据用户名查询* @param user* @return*/public List<User> findByCondi(User user);/*** 根据id删除用户* @param user*/public void delUser(User user);
}

UserDaoImpl,UserDao接口的实现类

使用hibernateTemplate

package cn.kmust.user.dao;
import java.util.List;
import org.springframework.orm.hibernate5.HibernateTemplate;
import edu.kmust.user.entity.User;
/*** 用户接口实现类* @author zhaoyuqiang**/
public class UserDaoImpl implements userDao {private HibernateTemplate hibernateTemplate ;public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}/*** 添加用户*/public void addUser(User user) {hibernateTemplate.save(user);}/*** 查找所有用户*/public List<User> findAll() {String hql = "from User" ;return (List<User>) hibernateTemplate.find(hql) ;}/*** 根据id查找用户*/public User findById(User user) {return hibernateTemplate.get(User.class, user.getUid());}/*** 条件查询_根据用户名查询*/public List<User> findByCondi(User user) {String hql = "from User where username=?" ;return (List<User>) hibernateTemplate.find(hql, user.getUsername());}/*** 根据uid删除用户*/public void delUser(User user) {hibernateTemplate.delete(user);}
}

2.10 Spring的一些配置

Spring分模块的思想就是将大的配置文件拆分成几个小的,小的文件在主文件中引入即可,主配置文件就是web.xml中指定的那个文件。一般将每个模块如User的三层架构作为一个子模块。

2.10.1 配置主配置文件

bean1.xml ,Spring的主配置文件。

包含:

  • 引入全约束
  • 配置c3p0与数据库的信息
  • 负责创建hibernate中sessionFactory的创建
  • 负责hibernateTemplate模板的创建
  • 事务管理的配置
  • 引入spring模块配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入一个全面的Spring约束,包含了beans,aop,事务等基本操作 -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 配置c3p0数据库相关 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql:///db_sshUser?useSSL=false"></property><property name="user" value="root"></property><property name="password" value="root"></property></bean>    <!--配置Hibernate中的sessionFactory的创建,该类在Spring中有现成的创建--><bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><!-- hibernate核心配置文件没有数据库了,所以sessionFactory中先注入数据库 --><property name="dataSource" ref="dataSource"></property><!-- 指定使用hibernate核心配置文件--><property name="configLocations" value="classpath:hibernate.cfg.xml"></property></bean>   <!-- 创建hibernate模板对象 --><bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"><property name="sessionFactory" ref="sessionFactory"></property></bean><!-- 事务配置,hibernateTransactionManager,最好注入sessionFactory,也可以注入dataSource --><bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">         <property name="sessionFactory" ref="sessionFactory"></property></bean><tx:annotation-driven transaction-manager="transactionManager" /><!--引入userBean1.xml  --><import resource="classpath:userBean1.xml"/>
</beans>

3.10.2 Spring模块配置文件

userBean1.xml

包含:

  • User相关的 :struts中action的创建,service的创建,dao的创建,以及这三层架构的相互注入
  • dao层需要注入hibernateTemplate
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入一个全面的Spring约束,包含了beans,aop,事务等基本操作 -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!--User三层框架的相互注入  --><bean id="userAction" class="edu.kmust.user.action.UserAction" scope="prototype"><property name="userService" ref="userService"></property></bean><bean id="userService" class="edu.kmust.user.service.UserService"><property name="userDao" ref="userDaoImpl"></property></bean><bean id="userDaoImpl" class="cn.kmust.user.dao.UserDaoImpl"><property name="hibernateTemplate" ref="hibernateTemplate"></property></bean>
</beans>

3 本文相关代码参考

https://download.csdn.net/download/g425680992/10664938

一篇文章上手SSH开发,单表全过程,全代码相关推荐

  1. @select注解_Mybatis基本知识十七:Mybatis注解式开发-单表注解式开发

    上一篇文章:<Mybatis基本知识十六:查询缓存之第三方查询缓存> 若文中有纰漏,请多多指正!!! 1.前言 使用Mybatis进行开发,不仅可以使用mapper配置文件进行开发,也可以 ...

  2. 单表置换密码java代码实现_单表替换密码

    要求: 实现单表替换密码,用键盘接收明文和密钥,屏幕答应替换表和密文,大小写敏感,输入健壮性. 实际问题: 密钥处理应该是这个程序的重点,加密和解密都没有什么要注意的地方.用key[]数组接收keyt ...

  3. 单表置换密码java代码实现_C++实现单置换密码

    单表置换密码的C++代码实现,供大家参考,具体内容如下 本程序使用方法:需要在本程序所在的文件夹创建一个"密码学.txt"文档. 该程序所需要的数据全部由该文档提供,然后运行即可得 ...

  4. 一篇文章上手docker(原理,部署,使用,坑)

    (一)定义与介绍 前言:与虚拟机技术比较: 虚拟机(VM):在docker容器技术出现之前使用的是虚拟机技术,将一台物理机虚拟化为多台机器,可搭载不同的操作系统.但每一个虚拟机系统的消耗较大,都需安装 ...

  5. [计算机视觉] 一篇文章教你学会单应性矩阵Homography(Python/C++)

    0.国外原文链接 Homography examples using OpenCV ( Python / C ++ ) 1.什么是单应性? 考虑图中显示的平面.红点代表两个图像中的相同物理点.在计算机 ...

  6. java摄像头跟随_一篇文章了解如何开发摄像头跟随物体移动功能

    摄像头也是物联网中的一种数据采集设备,内置传感器就可以通过图像.摄像等功能采集收据,对接ThingJS平台的3D场景,需了解摄像头跟随物体移动的动作. 在了解摄像机跟随物体移动之前,我们需要先了解摄像 ...

  7. 如何优雅的在 vue 中使用 非响应式对象_一篇文章上手Vue3中新增的API

    1. 初始化项目 // ① npm i -g @vue/cli // ② vue create my-project // ③ npm install @vue/composition-api -S/ ...

  8. 一篇文章搞懂柏林噪声算法,附代码讲解

    本文目的是以一种通俗简单的方式介绍Ken Perlin的改进版柏林噪声算法,讲解代码采用c#编写,开源免费使用.如果你只是想看完整代码,点击这里. 柏林噪声是一个非常强大算法,经常用于程序生成随机内容 ...

  9. CSS一篇文章搞懂系列6:超全的字体篇与背景设置内容,花里胡哨起来

    一.意义: 常见字体格式设置:加粗.斜体.删除线.下划线 常见的文本格式设置:居中.对其.基线设置 常见的背景格式设置:背景图片 <!--关于字体:图片放大缩小会出现失真,有时也不过灵活,许多图 ...

最新文章

  1. recyclerview 滑动到当前_Android recyclerview的滑动到指定的item
  2. suse linux 文件只可读,SUSE LINUX下文件系统变只读的问题解决
  3. k3 审核流程图_K3操作流程图
  4. .net无刷新验证码
  5. android开机动画修改,Android系统 开机动画修改 + 自动替换脚本
  6. 【SSL】2021-08-18 1286.恶作剧
  7. bi项目中数据仓库的维度表和事实表
  8. C++11常见编译与链接错误解决总结
  9. python获取域名对应的ip_Python实现通过解析域名获取ip地址的方法分析
  10. When executing step “qmake“
  11. 数组的下标为什么从0开始而不是从1开始
  12. Kubernetes如何被应用在华为
  13. 完美解决win10打不开设置,右键个性化显示设置等就出现,该文件没有与之关联的程序来执行该操作。
  14. 获取android设备唯一编号_如何获取Android设备唯一标识码教程
  15. SVM(支持向量机)(一)基本形式推导
  16. Android6.0动态申请SD卡读写的权限
  17. 应用于语义分割问题的深度学习技术综述(语义分割综述)
  18. mysql启动报错,ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid
  19. 用cocos2d-x模拟单摆运动的程序
  20. (固态硬盘)虚拟机安装Win7操作系统

热门文章

  1. Python 学习 --- 基础知识
  2. php+Mysql分页 类和引用详解
  3. 内存访问顺序 - part2: 屏障及Linux kernel中屏障的使用
  4. 串口调试助手之间通信和接受、发送数据
  5. 线性代数之基础解系与通解的求法
  6. 2005年2月24日
  7. 我的世界服务器linux网站,Ubuntu架设Minecraft服务器
  8. echarts 折线图 设置y轴最小刻度_数据可视化—Echarts图表应用
  9. 一个人赶着鸭子去每个村庄卖,每经过一个 村子卖去所赶鸭子的一半又一只。 这样他经过了 七个村子后还剩 两只鸭子,问问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?(递归实现)
  10. 2020-2021年度第1学期课程回顾总结