使用SSH框架,完成“用户管理”模块的信息列表展示功能。
1、Struts配置
SSH的所有jar包下载链接: https://pan.baidu.com/s/1c1Rtenu 密码: 4ft6
引入Struts 必须的jar包,放到WEB-INF/lib目录下。如下图所示:
修改WEB-INF下的web.xml文件,增加struts2的配置
<!-- 定义核心控制器 -->
<filter>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<!-- 目的:直接访问页面时,可以解析struts2标签 -->
<filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
添加struts配置文件,新建Struts.xml,并在文件中启动动态方法访问,并且定义包,具体内容如下:
<struts>
<!-- 设置Struts2常量 -->
<!-- 启用动态方法访问 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- 定义包 -->
<package namespace="/" name="default" extends="struts-default">
</package>
</struts>
2、Hibernate配置
引入Hibernate的jar包,放大WEB-INF/lib目录下。
创建Hibernate配置文件,在src下新建TdemoDept.hbm.xml作为hibernate连接数据库的配置文件。具体实现内容如下:
<hibernate-mapping>
<class name="com.demo.database.data.TDemoUser" table="t_demo_user">
<id name="userId" type="java.lang.Integer">
<column name="user_id"></column>
<!-- ID生成策略 采用数据库本地的自动增长 -->
<generator class="native"></generator>
</id>
<property name="userName" type="java.lang.String">
<column name="user_name"></column>
</property>
<property name="userPassword" type="java.lang.String">
<column name="user_password"></column>
</property>
<property name="userGender" type="java.lang.String">
<column name="user_gender"></column>
</property>
<property name="userRole" type="java.lang.String">
<column name="user_role"></column>
</property>
<property name="userEmail" type="java.lang.String">
<column name="user_email"></column>
</property>
<property name="userTelphone" type="java.lang.String">
<column name="user_telphone"></column>
</property>
<property name="userBirthday" type="java.sql.Date">
<column name="user_birthday"></column>
</property>
<property name="isdel" type="java.lang.String">
<column name="isdel"></column>
</property>
<property name="opertime" type="java.sql.Timestamp">
<column name="opertime"></column>
</property>
</class>
</hibernate-mapping>
3、Spring配置
引入Spring的jar包,放大WEB-INF/lib目录下。
修改web.xml文件,对Spring进行配置,内容如下:
<!-- 上下文参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
接着我们在src下创建applicationContext.xml文件,并给这个文件加上Spring的标头:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
4、整合SSH
Spring和Sturts的整合其实就是吧Struts的Action类交给Spring来管理。配置web.xml,在文件中创建上下文加载监听器,具体实现内容如下:
<!-- 创建上下文加载监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Spring对Hibernate的整合,主要是对Hibernate中的session进行管理,包括Session的创建、提交、关闭整个生命周期。我们在applicationContext.xml中配置如下内容:
<!-- web项目中,接入Hibernate框架 -->
<!-- 定义数据源Bean -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<!-- 驱动 在新建数据库,-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/demo"></property>
<property name="username" value="root"></property>
<property name="password" value="123"></property>
</bean>
<!-- 定义会话工厂Bean -->
<!-- 查询 新建类,超类 - localsess 查询-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 设置映射文件路径 -->
<!-- <property name="mappingLocations" value="classpath:com/demo/database/idao/*.hbm.xml"></property> s-->
<!-- 设置Hibernate相关属性 -->
<property name="hibernateProperties">
<props>
<!-- SQL方言,http://blog.csdn.net/tfy1332/article/details/20608489 -->
<!-- 超类查询MySQLDialect确定 内容 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<!-- 设置数据库操作时 ,控制台打印SQL -->
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingLocations" value="classpath:com/demo/database/idao/*.hbm.xml"></property>
</bean>
<!-- 定义数据库访问公共Bean -->
<bean id="idaoService" class="com.demo.database.idao.impl.DaoServiceImpl">
<!-- 注入会话工厂Bean -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 定义业务Bean -->
<bean id="iuserService" class="com.demo.services.impl.UserServiceImpl">
<!-- 注入数据访问公共Bean -->
<property name="idaoService" ref="idaoService"></property>
</bean>
到这里为止SSH框架搭建完成,我们可以启动Tomcat服务器看是否成功启动服务。
控制台反应结果表示我们的SSH框架已经搭建成功,服务器已经成功开启。
5、方法声明和例表展现数据库用户信息。
在实现具体的功能之前,我们首先创建数据库访问公共接口类,该类中声明我们需要实现的全部功能的方法。实现内容如下:
public interface IDaoService {
/* 查询数据 */
public List<? extends Object> query(String hql) throws Exception;
/*保存数据*/
public void save(Object object) throws Exception;
/*修改数据*/
public void update(Object object) throws Exception;
/*删除数据*/
public void delete(Object...objects) throws Exception;
}
接着我们需要创建数据库访问公共具体实现类,并在后面的实验步骤中,对实验 要求实现的功能进行逐个实现。
同时我们还需要创建用户管理的业务接口类,在类中同样声明我们需要实现的全部功能的方法,后面会在业务接口类的具体实现类中逐个实现。具体内容如下:
public interface IUserService {
/*查询所有用户数据*/
public List<TDemoUser> query() throws Exception;
/*添加用户信息*/
public void add(TDemoUser user) throws Exception;
/*删除用户信息*/
public void delete(int...ids) throws Exception;
/*修改用户信息*/
public void update(int...ids) throws Exception;
}
在数据库访问公共具体实现类DaoServiceImpl中获取会话Session并创建查询数据的对象等。具体的实现如下:
public List<? extends Object> query(String hql) throws Exception {
// 获得会话Session
Session session = getSession();
// 创建查询数据的对象
Query query = session.createQuery(hql);
// 查询返回数据集合
List<? extends Object> list = query.list();
// 关闭session
session.close();
return list;
}
接着在用户管理的业务具体实现类UserServiceImpl中,通过数据访问公共接口,查询用户数据。具体内容如下:
public List<TDemoUser> query() throws Exception {
//通过数据访问公共接口,查询用户数据
List<TDemoUser> list = (List<TDemoUser>)
idaoService.query("from TDemoUser "
+ "where isdel=0 order by opertime desc"); //from TDemoUser HQL语句
return list;
}
最后在用户管理的业务控制器类UserAction中指明业务逻辑,具体内容如下
public String list() {
try {
//查询获得所有用户数据
List<TDemoUser> list = iuserService.query();
//数据添加Dao请求范围,数据转发给下一个视图页面
ActionContext.getContext().getContextMap().put("list", list);
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
}
return ERROR;
}
此时查看navicat中数据库用户信息如下图所示:
我们通过利用刚才实现的功能,通过页面来访问数据库信息。点击“用户管理”便可出现数据库中的用户信息。
6、“用户管理/添加”功能实现
在数据库访问公共具体实现类DaoServiceImpl中实现sava()方法,实现对象与Session的绑定等。具体的实现如下:
public void save(Object object) throws Exception {Session session = getSession();// 开启事务Transaction tx = session.beginTransaction();// 对象与Session绑定session.save(object);// 提交事务tx.commit();// 关闭sessionsession.close();}接着在用户管理的业务具体实现类UserServiceImpl中,实现add()方法,封装通用字段的数据,并访问数据库,保存新用户数据。具体内容如下:
public void add(TDemoUser user) throws Exception { //封装通用字段的数据 user.setIsdel("0"); user.setOpertime(new Timestamp(System.currentTimeMillis())); //访问数据库,保存新用户数据 idaoService.save(user); }
最后在用户管理的业务控制器类UserAction中指明业务逻辑,通过业务接口,添加新用户。具体内容如下:
public String add() { //通过业务接口,添加新用户 try { iuserService.add(user); return list(); } catch (Exception e) { e.printStackTrace(); } return ERROR; }
此时点击“用户管理”页面的“添加”按键。
在出现的“添加用户信息”页面中,输入新用户的信息,具体内容如下:
点击确定之后,页面返回“用户管理”,可以在用户列表中看到我们刚添加的用户,具体信息如下:
同时,我们回到navicat可视化工具,查看数据库的数据存储情况,可以看到数据库中也相应的添加了新建用户的相关信息。具体情况如下:
7、“用户管理/删除”功能实现
在数据库访问公共具体实现类DaoServiceImpl中实现delete()方法,对Id数据进行便利,循环绑定要删除的对象,选择对象之后进行数据的逻辑删除。具体的实现如下:
public void delete(Object... objects) throws Exception { Session session = getSession(); Transaction tx = session.beginTransaction(); // 遍历id数组,循环绑定要删除的对象 for (Object object : objects) { session.update(object); // 虚拟删除、逻辑删除 } tx.commit(); session.close(); }
接着在用户管理的业务具体实现类UserServiceImpl中,实现delete()方法,遍历数组,查询获得用户的集合,通过修改isdel属性来实现逻辑删除,确保数据库一定的安全性等。具体内容如下:
public void delete(int... ids) throws Exception { //定义查询所有选中用户的HQL语句 String hql = "from TDemoUser where userId in("; //遍历数组 for(int i=0; i<ids.length; i++) { hql += ids[i]; if(i<ids.length-1) { hql += ","; } } hql += ")"; //查询获得用户的集合 List<TDemoUser> list = (List<TDemoUser>) idaoService.query(hql); //遍历集合,修改isdel(是否删除)属性 for(TDemoUser user: list) { user.setIsdel("1"); } //获得用户的数组 Object[] objects = list.toArray(); //访问数据库删除用户 idaoService.delete(objects); }
最后在用户管理的业务控制器类UserAction中指明业务逻辑。具体内容如下:
public String delete() { try { iuserService.delete(ids); return list(); } catch (Exception e) { e.printStackTrace(); } return ERROR; }
此时,我们再回到才优备内部系统的“用户管理”页面中,选中我们刚才新建的用户,点击“删除”按钮。
确认删除之后,页面自动刷新,再次出现的“用户管理”页面中,没有了我们刚才新建的用户信息。
此时,我们再回到navicate可视化工具页面查看数据库中信息的存储情况,可以看到的是,新建用户的信息仍然存在,只是isdel属性被设置为了1,实现了用户数据的逻辑删除。具体情况如下:
8、“用户管理/修改”功能实现
再WEB-INF/admin/user路径下创建userupdate.jsp文件,具体实现内容和useradd.jsp文件类似不同的是相应路径。具体内容如下:
修改userlist.jsp文件如下:<div id="content"> <form id="form1" name="form1" method="get" action="user!update.action"> </form> </div>
function update() { //获得选中记录的数量 var count = $("input[name=ids]:checked").size(); //判断是否选中一行记录,修改操作只能选中一行记录 if (count != 1) { alert("请选中一条要修改的记录!"); return; } //获得表单对象 var form = $("#form2").get(0); //设置提交路径 form.action = "admin/user/userupdate.jsp"; //提交表单 form.submit(); }
修改用户管理的业务控制器UserAction类内容如下:
public String update() { try { iuserService.delete(ids); iuserService.add(user); return list(); } catch (Exception e) { e.printStackTrace(); } return SUCCESS; }
回到“用户管理”页面,选择要进行修改的用户信息,点击确定。
在出现的“修改用户信息”页面中,输入最新的用户信息,具体内容如下:
点击确定保存更改信息,并再次返回用户例表。可以看到修改成功。
查看navicat页面,也可看到相应的修改内容已经得到了保存。