版权声明:本文为博主原创文章,未经博主允许不得转载。Q425680992 https://blog.csdn.net/g425680992/article/details/82690803
更多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>{
//注入service
private UserService userService ;
public void setUserService(UserService userService) {
this.userService = userService;
}
//封装表单属性
private User user = new User();
//定义返回的userList
private 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接口中的方法
*/
@Override
public 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注入dao
private 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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://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>