一篇文章上手SSH开发,单表全过程,全代码
- 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.Final
,spring-framework-4.2.4.RELEASE-dist
,struts-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开发,单表全过程,全代码相关推荐
- @select注解_Mybatis基本知识十七:Mybatis注解式开发-单表注解式开发
上一篇文章:<Mybatis基本知识十六:查询缓存之第三方查询缓存> 若文中有纰漏,请多多指正!!! 1.前言 使用Mybatis进行开发,不仅可以使用mapper配置文件进行开发,也可以 ...
- 单表置换密码java代码实现_单表替换密码
要求: 实现单表替换密码,用键盘接收明文和密钥,屏幕答应替换表和密文,大小写敏感,输入健壮性. 实际问题: 密钥处理应该是这个程序的重点,加密和解密都没有什么要注意的地方.用key[]数组接收keyt ...
- 单表置换密码java代码实现_C++实现单置换密码
单表置换密码的C++代码实现,供大家参考,具体内容如下 本程序使用方法:需要在本程序所在的文件夹创建一个"密码学.txt"文档. 该程序所需要的数据全部由该文档提供,然后运行即可得 ...
- 一篇文章上手docker(原理,部署,使用,坑)
(一)定义与介绍 前言:与虚拟机技术比较: 虚拟机(VM):在docker容器技术出现之前使用的是虚拟机技术,将一台物理机虚拟化为多台机器,可搭载不同的操作系统.但每一个虚拟机系统的消耗较大,都需安装 ...
- [计算机视觉] 一篇文章教你学会单应性矩阵Homography(Python/C++)
0.国外原文链接 Homography examples using OpenCV ( Python / C ++ ) 1.什么是单应性? 考虑图中显示的平面.红点代表两个图像中的相同物理点.在计算机 ...
- java摄像头跟随_一篇文章了解如何开发摄像头跟随物体移动功能
摄像头也是物联网中的一种数据采集设备,内置传感器就可以通过图像.摄像等功能采集收据,对接ThingJS平台的3D场景,需了解摄像头跟随物体移动的动作. 在了解摄像机跟随物体移动之前,我们需要先了解摄像 ...
- 如何优雅的在 vue 中使用 非响应式对象_一篇文章上手Vue3中新增的API
1. 初始化项目 // ① npm i -g @vue/cli // ② vue create my-project // ③ npm install @vue/composition-api -S/ ...
- 一篇文章搞懂柏林噪声算法,附代码讲解
本文目的是以一种通俗简单的方式介绍Ken Perlin的改进版柏林噪声算法,讲解代码采用c#编写,开源免费使用.如果你只是想看完整代码,点击这里. 柏林噪声是一个非常强大算法,经常用于程序生成随机内容 ...
- CSS一篇文章搞懂系列6:超全的字体篇与背景设置内容,花里胡哨起来
一.意义: 常见字体格式设置:加粗.斜体.删除线.下划线 常见的文本格式设置:居中.对其.基线设置 常见的背景格式设置:背景图片 <!--关于字体:图片放大缩小会出现失真,有时也不过灵活,许多图 ...
最新文章
- recyclerview 滑动到当前_Android recyclerview的滑动到指定的item
- suse linux 文件只可读,SUSE LINUX下文件系统变只读的问题解决
- k3 审核流程图_K3操作流程图
- .net无刷新验证码
- android开机动画修改,Android系统 开机动画修改 + 自动替换脚本
- 【SSL】2021-08-18 1286.恶作剧
- bi项目中数据仓库的维度表和事实表
- C++11常见编译与链接错误解决总结
- python获取域名对应的ip_Python实现通过解析域名获取ip地址的方法分析
- When executing step “qmake“
- 数组的下标为什么从0开始而不是从1开始
- Kubernetes如何被应用在华为
- 完美解决win10打不开设置,右键个性化显示设置等就出现,该文件没有与之关联的程序来执行该操作。
- 获取android设备唯一编号_如何获取Android设备唯一标识码教程
- SVM(支持向量机)(一)基本形式推导
- Android6.0动态申请SD卡读写的权限
- 应用于语义分割问题的深度学习技术综述(语义分割综述)
- mysql启动报错,ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid
- 用cocos2d-x模拟单摆运动的程序
- (固态硬盘)虚拟机安装Win7操作系统
热门文章
- Python 学习 --- 基础知识
- php+Mysql分页 类和引用详解
- 内存访问顺序 - part2: 屏障及Linux kernel中屏障的使用
- 串口调试助手之间通信和接受、发送数据
- 线性代数之基础解系与通解的求法
- 2005年2月24日
- 我的世界服务器linux网站,Ubuntu架设Minecraft服务器
- echarts 折线图 设置y轴最小刻度_数据可视化—Echarts图表应用
- 一个人赶着鸭子去每个村庄卖,每经过一个 村子卖去所赶鸭子的一半又一只。 这样他经过了 七个村子后还剩 两只鸭子,问问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?(递归实现)
- 2020-2021年度第1学期课程回顾总结