• 先说点废话

    s2sh,就是struts2,spring,hibernate;s2作为表现层和控制器,hibernate作为持久层,spring作为业务层(充分应用IOC和AOP)。其实业务还是业务,只是依赖类通过spring来注入和管理,使得代码非常简洁(前提你得非常熟悉,不然就像在下一样即将发疯);spring的应用主要是在管理对象的c创建(IOC)还有数据库事物的管理(AOP),今天熟悉了IOC的使用,写个demo记录一下。

  • 准备事项

    配置ssh的环境,主要是导包和创建配置文件。

    

    struts的配置文件struts.xml,hibernate的配置文件hibernate.cfg.xml,spring的配置文件applicationContext.xml;

    以及修改web.xml。

  • 整合例子

    目录如下,仍然是mvc,model存表对象,service存数据库事物,dao存单个表操作,action是控制器。

    

    web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SpringPractice</display-name>
<welcome-file-list>
<welcome-file>hello</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation </param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>

    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> <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<!-- submit不换行 -->
<constant name="struts.ui.theme" value="simple" />
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!--整合spring-->
<constant name="struts.objectFactory" value="spring" />
<!-- Add packages here -->
<package name="default" namespace="/" extends="struts-default">
<!-- 测试action-->
<!-- class对应applicationContext.xml的id,在applicationContext.xml上配置真是路径 -->
<action name="add" class="add">
<result name="success"></result>
</action>
<action name="delete" class="delete">
<result name="success"></result>
</action>
<action name="testHello" class="Hello">
<result name="success"></result>
</action>
</package> </struts>

    hibernate.xml 其实可以不要了,全部配在了applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">qwert1234</property>
<property name="hibernate.connection.url">jdbc:mysql://3306:MyData?useSSL=true</property>
<property name="hibernate.connection.username">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.characterEncoding">utf-8</property>
<property name="show_sql">true</property>
-->
</session-factory>
</hibernate-configuration>

    applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="username" value="root"></property>
<property name="password" value="qwert1234"></property>
<property name="url" value="jdbc:mysql://localhost:3306/MyData?useSSL=true"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver" ></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> -->
<!-- 注入一个DataSource -->
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">false</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>model/user.hbm.xml</value>
</list>
</property>
</bean>
<bean id="userDaoImpl" class="dao.userDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userService" class="service.UserService" scope="prototype">
<property name="userDaoImpl" ref="userDaoImpl"></property>
</bean>
<!-- 配置action-->
<bean id="add" class="action.addUserAction" scope="prototype">
<property name="userService" ref="userService"></property>
</bean>
<bean id="delete" class="action.deleteAction" scope="prototype">
<property name="userService" ref="userService"></property>
</bean>
<bean id="Hello" class="action.HelloAction" autowire="byName" scope="prototype">
</bean>
</beans>

    service对象里面有一个dao对象,是通过注入使用的;配置控制器的时候,把service注入进去,在此之前先实例化一个service对象;值得注意的是hibernate和spring的整合。

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="username" value="root"></property>
<property name="password" value="qwert1234"></property>
<property name="url" value="jdbc:mysql://localhost:3306/MyData?useSSL=true"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver" ></property>
</bean>

    首先配置dataSource,class可以配jdbc或者是其他的连接池。配完了这几行,hibernate对应的配置可以去掉了。

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> -->
<!-- 注入一个DataSource -->
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">false</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>model/user.hbm.xml</value>
</list>
</property>
</bean>

    然后配置sessionFactory,注入dataSource,里面的key配置了数据库方言和hibernate的其他配置,配完之后可以去掉hibernate配置文件相应的地方了,list里配置了mapping,把映射表也配上了,所以hibernate的配置文件完全没用了。

    <bean id="userDaoImpl" class="dao.userDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

    最后在dao中注入sessionFactory,这样就可以使用getHibernateTemplate这个方法了,少了很多代码。

    userDao.java

package dao;

import java.util.List;

import model.user;

public interface userDao {
public void save(user user);
public void delete(user user);
public void update(user user);
public List<user> select();
}

    userDaoImpl.java

package dao;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import model.user;

public class userDaoImpl extends HibernateDaoSupport implements userDao{

	@Override
public void save(user user) {
// TODO Auto-generated method stub
this.getHibernateTemplate().save(user); } @Override
public void delete(user user) {
// TODO Auto-generated method stub
String hql = "delete from user where username = "+user.getUsername();
this.getHibernateTemplate().bulkUpdate(hql);
} @Override
public void update(user user) {
// TODO Auto-generated method stub
this.getHibernateTemplate().update(user); } @Override
public List<user> select() {
// TODO Auto-generated method stub
String hql = "from user";
List<user> list = (List<model.user>) this.getHibernateTemplate().find(hql);
return list;
} }

    UserService.java

package service;

import java.util.List;

import dao.userDaoImpl;
import model.user; public class UserService {
private userDaoImpl userDaoImpl; public userDaoImpl getUserDaoImpl() {
return userDaoImpl;
}
public void setUserDaoImpl(userDaoImpl userdao) {
this.userDaoImpl = userdao;
}
//服务
public void addService(user u){
userDaoImpl.save(u);
}
public void updateService(user u){
userDaoImpl.update(u);
}
public void deleteService(user u){
userDaoImpl.delete(u);
}
public List<user> selectAllService(){
return userDaoImpl.select();
} }

    控制器

package action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; import model.user;
import service.UserService; public class addUserAction extends ActionSupport implements ModelDriven<user>{
private user u;
private UserService userService;
public UserService getUserService() {
return userService;
} public void setUserService(UserService usService) {
this.userService = usService;
} public user getU() {
return u;
} public void setU(user u) {
this.u = u;
} @Override
public user getModel() {
if(u == null)
// TODO Auto-generated method stub
u = new user();
return u;
}
public String execute(){
this.userService.addService(u);
return SUCCESS;
}
}

  

package action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; import model.user;
import service.UserService; public class deleteAction extends ActionSupport implements ModelDriven<user>{
private user u;
private UserService userService;
public UserService getUserService() {
return userService;
} public void setUserService(UserService usService) {
this.userService = usService;
} public user getU() {
return u;
} public void setU(user u) {
this.u = u;
} @Override
public user getModel() {
if(u == null)
// TODO Auto-generated method stub
u = new user();
return u;
}
public String execute(){
this.userService.deleteService(u);
return SUCCESS;
}
}

    页面代码

<%@ 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">
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加用户</title>
</head>
<body>
<form action="add">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" size="18" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" size="18" name="password"></td>
</tr>
</table>
<s:submit value="提交"></s:submit>
<s:reset value="重置"></s:reset>
</form>
</body>
</html>

  

<%@ 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">
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>删除用户</title>
</head>
<body>
<form action="delete">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" size="18" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" size="18" name="password"></td>
</tr>
</table>
<s:submit value="提交"></s:submit>
<s:reset value="重置"></s:reset>
</form>
</body>
</html>
  • 错误

    首先遇到的异常非常多,我甚至有些怀疑(厌烦)spring框架的加入。

    1.命名注入对象的时候要按照驼峰命名法。

    2.莫名其妙无法打开数据库的链接,重新写配置文件不适用properties之后正常了。

org.springframework.dao.DataAccessResourceFailureException: Cannot open connection; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection 	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAcce
java.lang.NumberFormatException: For input string

    3.struts配置action的时候不能不配置result,跳一堆红字...

    4.在使用映射的时候,没有主键的时候会出错(或者我没找到合适的方式用)。如下错误:

ids for this class must be manually assigned before calling save(): model.user; nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): model.user

    5.仔细写配置文件,超坑。类似如下:

Invalid property 'userService' of bean class [action.addUserAction]: Bean property 'userService' is not writable or has an invalid setter method. Did you mean 'usService'?

    6.tomcat经常添乱,因为启动记录里面的项目关闭了或者删除了。最后我把服务器删了重新添加,受够了启动无限报错。

java.lang.IllegalArgumentException: Document base

    7.仔细写好路径,web.xml的,不然有如下错误。

parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
  • 最后

    仍然很欣慰能运行正常,添加了spring之后设计变得简洁很多(非常仔细地写),如果使用了AOP则可以在不改写原有代码的情况下增加功能。

整合s2sh,实现页面操作数据库的更多相关文章

  1. JavaWeb_(Spring框架)整合Mybatis加入事务操作数据库

    整合Mybatis a)导包: i.Spring:基本包.aop.aspects.jdbc.tx.test: ii.Mybatis:mybatis-3.4.6 iii.整合包:mybatis-spri ...

  2. spring框架整合hibernate框架简单操作数据库

    1.配置文件: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:/ ...

  3. 整合spring boot时操作数据库时报错Caused by: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.B

    原文:https://blog.csdn.net/u__f_o/article/details/82756701 一般出现这种情况,应该是没有扫描到对应的mapper包,即在启动类下配置MapperS ...

  4. Spring MVC基础知识整理➣Spring+SpringMVC+Hibernate整合操作数据库

    概述 Hibernate是一款优秀的ORM框架,能够连接并操作数据库,包括保存和修改数据.Spring MVC是Java的web框架,能够将Hibernate集成进去,完成数据的CRUD.Hibern ...

  5. jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?

    jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...

  6. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

  7. spring-boot-route(七)整合jdbcTemplate操作数据库

    在一部分内容中,我们学习了Restful接口的编写,及接口文档的生成.我们需要将接口数据进行持久化存储,这一部分我们主要学习几种持久化框架将数据进行存储.本部分内容中,我们都将使用mysql为例来做为 ...

  8. Ehcache 整合Spring 使用页面、对象缓存

    Ehcache 整合Spring 使用页面.对象缓存 Ehcache在很多项目中都出现过,用法也比较简单.一 般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布 ...

  9. Ehcache学习总结(3)--Ehcache 整合Spring 使用页面、对象缓存

    Ehcache 整合Spring 使用页面.对象缓存 Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式 ...

随机推荐

  1. C++常见问题: 字符串分割函数 split

    C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速分割这个问题了.列几个常用方法以备不时之需. 方法一: 利用STL自己实现split 函数(常用,简 ...

  2. SQL2005/2008 无法连接错误

    SQL2005/2008 .或者是localhost可以访问,但是127.0.0.1或者IP无法访问 打开[SQL Server 配置管理器](如果是MSSQL2005,在运行中输入SQLServer ...

  3. GL.IssuePluginEvent 发布插件事件

    Description 描述 Send a user-defined event to a native code plugin. 发送一个用户定义的事件到一个本地代码插件. Rendering in ...

  4. 图概PHP生命周期

    一图胜千言~ 这是之前根据网上大牛们的分析和跟着阅读了一点源码而做出来的总结.因为那时候困于对整个过程没有一个全面的认识,所以想自己做个图吧,那样看起来要更加直接了当,说不定还能会有一个更好的认识和更 ...

  5. OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  6. DNS相关知识

    1 DNS解析过程详解 2 DNS原理总结及其解析过程详解 3 DNS原理及其解析过程[精彩剖析] 4 DNS域名解析原理 5 dig挖出DNS的秘密 6 nslookup通往DNS的桥梁 7 DNS ...

  7. 修复Grub引导

    1.运行终端,输入命令: sudo fdisk -l 找到linux所在的盘符,例如/dev/sdaX 2.获取root权限 3.mount mount –bind /proc /mnt/proc m ...

  8. python 利用 setup.py 手动安装django_chartit

    手动安装django_chartit库 1 下载压缩包 2 解压到python安装目录下,文件夹名为django_chartit,并检查文件夹下是否有setup.py文件 3 在cmd中进入djang ...

  9. Autofac手动注入及自动注入示例

    参考:http://www.cnblogs.com/xinchuang/archive/2013/05/07/3065433.html#2911661 一.环境 vs2012.mvc4..Net Fr ...

  10. 手机网页Html代码实现(解决显示页面很小的问题)

    工作需要,要做一个手机自适应的网页效果,终于搞定,先分享并记录! 其实主要就是改掉HTML页面声明: 在网页中加入以下代码,就可以正常显示了: <meta name="viewport ...