- 浏览: 214813 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (397)
- j2se (28)
- nio (3)
- 易错点 (3)
- 面试ssh (9)
- ssh整合 (11)
- jbpm+spring (2)
- js (15)
- 高级技术 (59)
- swing (3)
- 数据库 (16)
- hibernate (18)
- spring (19)
- 开发网站知识点 (9)
- jbpm (4)
- json (5)
- 设计模式 (22)
- 自定义标签 (1)
- j2ee (9)
- lucene (3)
- cahce (11)
- maven (5)
- html5 (1)
- 多数据源 (10)
- 页面聊天 (9)
- 富客户端 (1)
- android (13)
- aop+拦截器+jms (13)
- 框架整合 (1)
- 非阻塞io (24)
- 暂时不看 (13)
- webservice (3)
- oracle (3)
- 算法 (4)
- 协程 (2)
- netty (1)
- 爬虫 (0)
- 高级基础 (1)
- JVM调优总结 (12)
- 知识点技巧 (1)
- REST (0)
- 基础 io (2)
- dubbo (8)
- 线程 (1)
- spring源码 (2)
- git (1)
- office (2)
最新评论
-
sjzcmlt:
,写的挺好的啊
一个完整的负载均衡的例子 . -
他大姨妈:
网上大部分例子都是直接通过IdleStateHandler来实 ...
Netty的超时机制 心跳机制
s2sh整合(详细版)
创建项目s2sh 添加Hibernate 3.2默认就可以,不要忘记将jar包加入到/WebRoot/WEB-INF/lib接着next 实际上这里的hibernate.cfg.xml不起作用,因为该配置文件的内容由后面的...
创建项目s2sh
添加Hibernate 3.2
默认就可以,不要忘记将jar包加入到/WebRoot/WEB-INF/lib
接着next
实际上这里的hibernate.cfg.xml不起作用,因为该配置文件的内容由后面的spring配置文件进行管理,我们可以在创建之后将其删除
默认next
我们根本不用hibernate.cfg.xml,所以这里根本不需要进行数据库配置,当然默认也无所谓。
继续next
sessionFactory我们在之后也会直接使用spring为我们提供的,所以这里不需要创建。
finish
添加Spring2.0
不要忘记选中这5个库包:
Spring 2.0 AOP Libraries
Spring 2.0 Core Libraries
Spring 2.0 Persistence Core Libraries
Spring 2.0 Persistence JDBC Libraries
Spring 2.0 Web Libraries
也不要忘记将jar包加入到/WebRoot/WEB-INF/lib。
next
这里我们不需要Enable AOP 所以不需要选中
不要忘记将配置文件applicationContext.xml指定在/WEB-INF目录下,不然服务器启动时无法加载
next
这里的sessionFactory我们也不需要,之后会手动配置。
finish
添加Struts2
由于MyEclipse并没有加入Struts2的支持,所以我们需要手动导入相关jar包。
需要的相关jar包如下:
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar
xwork-2.0.4.jar
struts2-spring-plugin-2.0.11.jar
struts.xml
在src下加入struts的配置文件struts.xml
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE strutsPUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation"value="false" />
<constant name="struts.devMode"value="false" />
<include file="example.xml"/>
<package name="default"namespace="/" extends="struts-default">
<default-action-ref name="index"/>
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
</struts>
<?xmlversion="1.0" encoding="UTF-8" ?>
<!DOCTYPEstruts PUBLIC
"-//Apache Software Foundation//DTDStruts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="s2sh"extends="struts-default">
</package>
</struts>
web.xml
<?xml version="1.0"encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring的监听器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app><?xml version="1.0"encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring的监听器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
到目前为止我们的整合工作已经完成。我们可以将该工程打包,以备下次直接使用。
这里有一个问题,就是如果采用myeclipse加载hibernate和spring的lib包形式发布项目的时候会出现异常,我们可以手动去掉一个asm-2.2.3jar即可。
测试
sql
(1)使用mysql,记得将mysql-jdbc的jar包导入到工程中
创建s2sh数据库,并创建表person
CREATE TABLE `person` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
--Table "person" DDL
CREATETABLE `person` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2)创建com.s2sh.bean包,创建person表对应的Entity Bean及其映射文件
Person.java
package com.s2sh.bean;
publicclass person {
private Integer id;
private String name;
privateintage;
public Integer getId() {
returnid;
}
publicvoid setId(Integer id) {
this.id = id;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
}
packagetest.s2sh.bean;
publicclass Person {
private Integer id;
private String name;
private int age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person.hbm.xml
<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.s2sh.bean.Person" table="person">
<id name="id"type="java.lang.Integer" column="id">
<generator class="increment"></generator>
</id>
<property name="name"type="string" column="name"
length="20"></property>
<property name="age"type="java.lang.Integer" column="age"></property>
</class>
</hibernate-mapping>
sessionFactory创建方式 <?xml version="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<classname="test.s2sh.bean.Person" table="person">
<id name="id"type="java.lang.Integer" column="id">
<generatorclass="increment"></generator>
</id>
<property name="name"type="string" column="name"
length="20"></property>
<property name="age"type="java.lang.Integer" column="age"></property>
</class>
</hibernate-mapping>
(3)在spring配置文件applicationContext.xml配置hibernate的连接数据库信息及sessionFactory创建方式
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- apache.dbcp连接池的配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"value="com.mysql.jdbc.Driver"></property>
<property name="url"
value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
<property name="username"value="root"></property>
<property name="password"value="1234"></property>
<!-- 最大活动连接数 -->
<property name="maxActive"value="100"></property>
<!-- 最大可空闲连接数 -->
<property name="maxIdle"value="30"></property>
<!-- 最大可等待连接数 -->
<property name="maxWait"value="500"></property>
<!-- 默认的提交方式(如果不需要事务可以设置成true,在实际应用中一般设置为false,默认为false) -->
<property name="defaultAutoCommit"value="true"></property>
</bean>
<!-- 这里直接使用spring对hibernate3支持的sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"ref="dataSource"></property>
<!-- hibernate方言等相关配置 -->
<property name="hibernateProperties">
<props>
<prop key="connection.useUnicode">true</prop>
<prop key="connection.characterEncoding">utf-8</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<!-- hbm.xml的映射文件 -->
<property name="mappingResources">
<list>
<value>test/s2sh/bean/Person.hbm.xml</value>
</list>
</property>
</bean>
</beans>
<?xmlversion="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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!--apache.dbcp连接池的配置 -->
<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<property name="driverClassName"value="com.mysql.jdbc.Driver"></property>
<property name="url"value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
<property name="username"value="root"></property>
<property name="password"value=""></property>
<!-- 最大活动连接数-->
<property name="maxActive"value="100"></property>
<!-- 最大可空闲连接数-->
<property name="maxIdle"value="30"></property>
<!-- 最大可等待连接数-->
<property name="maxWait"value="500"></property>
<!-- 默认的提交方式(如果不需要事务可以设置成true,在实际应用中一般设置为false,默认为false) -->
<property name="defaultAutoCommit"value="true"></property>
</bean>
<!--这里直接使用spring对hibernate3支持的sessionFactory -->
<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"ref="dataSource"></property>
<!-- hibernate方言等相关配置 -->
<propertyname="hibernateProperties">
<props>
<propkey="connection.useUnicode">true</prop>
<propkey="connection.characterEncoding">utf-8</prop>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<propkey="hibernate.show_sql">true</prop>
</props>
</property>
<!-- hbm.xml的映射文件 -->
<propertyname="mappingResources">
<list>
<value>test/s2sh/bean/Person.hbm.xml</value>
</list>
</property>
</bean>
</beans>
乱码问题解决方案
1、
<property name="hibernateProperties">
<props>
<prop key="connection.useUnicode">true</prop>
<prop key="connection.characterEncoding">utf-8</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<propertyname="hibernateProperties">
<props>
<propkey="connection.useUnicode">true</prop>
<propkey="connection.characterEncoding">utf-8</prop>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<propkey="hibernate.show_sql">true</prop>
</props>
</property>
2、
<property name="url" value="jdbc:mysql://localhost:3306/s2sh?
useUnicode=true&characterEncoding=UTF-8"></property><propertyname="url"value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
(4)下面我们开始写DAO层,首先创建com.s2sh.dao包放置Dao类的接口,创建com.s2sh.dao.impl包放置Dao类的实现。
PersonDAO.java
package com.s2sh.dao;
import java.util.List;
import com.s2sh.bean.Person;
publicinterface PersonDAO {
void savePerson(Person p);
void removePerson(Person p);
Person findPersonById(Integer id);
List<Person> findAllPerson();
void updatePerson(Person p);
}
packagetest.s2sh.dao;
importjava.util.List;
importtest.s2sh.bean.Person;
publicinterface PersonDAO {
void savePerson(Person p);
void removePerson(Person p);
Person findPersonById(Integer id);
List<Person> findAllPersons();
void updatePerson(Person p);
}
由于使用了spring,所以DAO的实现类可以继承HibernateDaoSupport进行实现
PersonDAOImpl.java
package com.s2sh.dao.impl;
import java.util.List;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.s2sh.bean.Person;
import com.s2sh.dao.PersonDAO;
publicclass PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {
public List<Person> findAllPerson() {
String sql = " fromperson p order by p.id desc";
return (List<Person>)this.getHibernateTemplate().find(sql);
}
public Person findPersonById(Integer id) {
Person p = (Person) this.getHibernateTemplate().get(Person.class, id);
return p;
}
publicvoid removePerson(Person p) {
this.getHibernateTemplate().delete(p);
}
publicvoid savePerson(Person p) {
this.getHibernateTemplate().save(p);
}
publicvoid updatePerson(Person p) {
this.getHibernateTemplate().update(p);
}
}
(5)下面开始进行service层的设计,这里的service层仅是简单调用DAO层的的方法。
同样是创建接口包(com.s2sh.service),实现包和接口类(com.s2sh.service.impl),实现类
PersonService.java
package com.s2sh.service;
import java.util.List;
import com.s2sh.bean.Person;
publicinterface PersonService {
List<Person> findAll();
void save(Person p);
void delete(Person p);
Person findById(Integer id);
void update(Person p);
}
packagetest.s2sh.service;
importjava.util.List;
importtest.s2sh.bean.Person;
publicinterface PersonService {
List<Person> findAll();
void save(Person p);
void delete(Person p);
Person findById(Integer id);
void update(Person p);
}
这里需要使用spring的ioc将DAO诸如到service中,所以要在service实现类中加入DAO作为属性。
PersonServiceImpl.java
package com.s2sh.service.impl;
import java.util.List;
import com.s2sh.bean.Person;
import com.s2sh.dao.PersonDAO;
import com.s2sh.service.PersonService;
publicclass PersonServiceImpl implements PersonService {
private PersonDAO personDao;
publicvoid delete(Person p) {
personDao.removePerson(p);
}
public List<Person> findAll() {
returnpersonDao.findAllPerson();
}
public Person findById(Integer id) {
returnpersonDao.findPersonById(id);
}
publicvoid save(Person p) {
personDao.savePerson(p);
}
publicvoid update(Person p) {
personDao.updatePerson(p);
}
public PersonDAO getPersonDao() {
returnpersonDao;
}
publicvoid setPersonDao(PersonDAO personDao) {
this.personDao = personDao;
}
}
(6)接下来开始对action层进行设置,实际项目中的action可能会有很多,所以需要对action进行分包,这里针对Person进行操作,创建com.s2sh.action.person.
这里先做保存操作
savePersonAction.java
package com.s2sh.action.person;
import com.opensymphony.xwork2.ActionSupport;
import com.s2sh.bean.Person;
import com.s2sh.service.PersonService;
publicclass savePersonAction extends ActionSupport {
private Person p;
private PersonService personService;
public Person getP() {
returnp;
}
publicvoid setP(Person p) {
this.p = p;
}
public PersonService getPersonService() {
returnpersonService;
}
publicvoid setPersonService(PersonService personService) {
this.personService =personService;
}
public String execute() throws Exception{
personService.save(p);
returnSUCCESS;
}
publicvoid validate(){
if(p.getName()==null || "".equals(p.getName())){
this.addFieldError("p.name", "name is notnull!");
}
}
}
save.jsp
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%
String path =request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Save Person</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<s:form action="savePerson">
<s:textfield name="p.name" label="name"></s:textfield>
<s:textfield name="p.age" label="age"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
<%@page language="java" import="java.util.*"pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Save Person</title>
</head>
<body>
<s:formaction="savePerson">
<s:textfieldname="p.name" label="name"></s:textfield>
<s:textfieldname="p.age" label="age"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
操作成功页面
saveSuccess.jsp
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<title>Save OK</title>
</head>
<body>
保存成功!<br>
</body>
</html>
<%@page language="java" import="java.util.*"pageEncoding="utf-8"%>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Save OK</title>
</head>
<body>
保存成功<br>
</body>
</html>
配置struts.xml
<action name="savePerson"class="savePersonAction">
<result>saveSuccess.jsp</result>
<result name="input">save.jsp</result>
</action>
<actionname="savePerson" class="savePersonAction">
<result name="success"type="redirect">/save-success.jsp</result>
<resultname="input">/save.jsp</result>
</action>
由于现在的action的创建已经由spring所接管,所以这里class里面使用的是别名,该别名与applicationContext.xml中的id对应.
配置applicationContext的ioc
<bean id="personDAO" class="com.s2sh.dao.impl.PersonDAOImpl"
scope="singleton">
<!-- 由于该类是继承于HibernateDaoSupport,所以需要将sessionFactory注入 -->
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="personService" class="com.s2sh.service.impl.PersonServiceImpl">
<property name="personDao"ref="personDAO"></property>
</bean>
<bean id="savePersonAction" class="com.s2sh.action.person.savePersonAction"
scope="prototype">
<property name="personService"ref="personService"></property>
</bean>
<beanid="personDAO" class="test.s2sh.dao.impl.PersonDAOImpl"scope="singleton">
<!-- 由于该类是继承于HibernateDaoSupport,所以需要将sessionFactory注入 -->
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<beanid="personService" class="test.s2sh.service.impl.PersonServiceImpl">
<property name="personDAO"ref="personDAO"></property>
</bean>
<beanid="savePersonAction"class="test.s2sh.action.person.SavePersonAction"scope="prototype">
<property name="service"ref="personService"></property>
</bean>
这里说明一下spring中的单例与设计模式中的单例不同,设计模式的单例是在jvm中只产生一个实例,而spring中的单例
是针对每个ioc容器来言,如果存在两个ioc容器,那么每个ioc容器都会生成唯一的类实例
将sessionFactory注入Dao中,这里的Dao来说是无状态的,可以设置为单例singleton。这里的action是使用spring创建的。
struts2与struts1的action有所不同,因为struts2中的action中可能存在属性,这里是Person,所以struts2的action可能是有状态的。
如果是有状态的我们就需要将scope设置成原型模式,即每次请求都新建一个action。
不然可能会出现如果表单提交的第一次出错,之后就再也提交不过去了,值就是应为使用默认的singleton,
当第一次的时候就将FieldError中加入了错误,每次都是这个action,始终带着这个错误,所以就提交不过去了。
到目前为止这个整合已经完成了。
创建项目s2sh
添加Hibernate 3.2
默认就可以,不要忘记将jar包加入到/WebRoot/WEB-INF/lib
接着next
实际上这里的hibernate.cfg.xml不起作用,因为该配置文件的内容由后面的spring配置文件进行管理,我们可以在创建之后将其删除
默认next
我们根本不用hibernate.cfg.xml,所以这里根本不需要进行数据库配置,当然默认也无所谓。
继续next
sessionFactory我们在之后也会直接使用spring为我们提供的,所以这里不需要创建。
finish
添加Spring2.0
不要忘记选中这5个库包:
Spring 2.0 AOP Libraries
Spring 2.0 Core Libraries
Spring 2.0 Persistence Core Libraries
Spring 2.0 Persistence JDBC Libraries
Spring 2.0 Web Libraries
也不要忘记将jar包加入到/WebRoot/WEB-INF/lib。
next
这里我们不需要Enable AOP 所以不需要选中
不要忘记将配置文件applicationContext.xml指定在/WEB-INF目录下,不然服务器启动时无法加载
next
这里的sessionFactory我们也不需要,之后会手动配置。
finish
添加Struts2
由于MyEclipse并没有加入Struts2的支持,所以我们需要手动导入相关jar包。
需要的相关jar包如下:
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar
xwork-2.0.4.jar
struts2-spring-plugin-2.0.11.jar
struts.xml
在src下加入struts的配置文件struts.xml
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE strutsPUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation"value="false" />
<constant name="struts.devMode"value="false" />
<include file="example.xml"/>
<package name="default"namespace="/" extends="struts-default">
<default-action-ref name="index"/>
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
</struts>
<?xmlversion="1.0" encoding="UTF-8" ?>
<!DOCTYPEstruts PUBLIC
"-//Apache Software Foundation//DTDStruts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="s2sh"extends="struts-default">
</package>
</struts>
web.xml
<?xml version="1.0"encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring的监听器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app><?xml version="1.0"encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring的监听器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
到目前为止我们的整合工作已经完成。我们可以将该工程打包,以备下次直接使用。
这里有一个问题,就是如果采用myeclipse加载hibernate和spring的lib包形式发布项目的时候会出现异常,我们可以手动去掉一个asm-2.2.3jar即可。
测试
sql
(1)使用mysql,记得将mysql-jdbc的jar包导入到工程中
创建s2sh数据库,并创建表person
CREATE TABLE `person` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
--Table "person" DDL
CREATETABLE `person` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2)创建com.s2sh.bean包,创建person表对应的Entity Bean及其映射文件
Person.java
package com.s2sh.bean;
publicclass person {
private Integer id;
private String name;
privateintage;
public Integer getId() {
returnid;
}
publicvoid setId(Integer id) {
this.id = id;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
}
packagetest.s2sh.bean;
publicclass Person {
private Integer id;
private String name;
private int age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person.hbm.xml
<?xml version="1.0"encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.s2sh.bean.Person" table="person">
<id name="id"type="java.lang.Integer" column="id">
<generator class="increment"></generator>
</id>
<property name="name"type="string" column="name"
length="20"></property>
<property name="age"type="java.lang.Integer" column="age"></property>
</class>
</hibernate-mapping>
sessionFactory创建方式 <?xml version="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<classname="test.s2sh.bean.Person" table="person">
<id name="id"type="java.lang.Integer" column="id">
<generatorclass="increment"></generator>
</id>
<property name="name"type="string" column="name"
length="20"></property>
<property name="age"type="java.lang.Integer" column="age"></property>
</class>
</hibernate-mapping>
(3)在spring配置文件applicationContext.xml配置hibernate的连接数据库信息及sessionFactory创建方式
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- apache.dbcp连接池的配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"value="com.mysql.jdbc.Driver"></property>
<property name="url"
value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
<property name="username"value="root"></property>
<property name="password"value="1234"></property>
<!-- 最大活动连接数 -->
<property name="maxActive"value="100"></property>
<!-- 最大可空闲连接数 -->
<property name="maxIdle"value="30"></property>
<!-- 最大可等待连接数 -->
<property name="maxWait"value="500"></property>
<!-- 默认的提交方式(如果不需要事务可以设置成true,在实际应用中一般设置为false,默认为false) -->
<property name="defaultAutoCommit"value="true"></property>
</bean>
<!-- 这里直接使用spring对hibernate3支持的sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"ref="dataSource"></property>
<!-- hibernate方言等相关配置 -->
<property name="hibernateProperties">
<props>
<prop key="connection.useUnicode">true</prop>
<prop key="connection.characterEncoding">utf-8</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<!-- hbm.xml的映射文件 -->
<property name="mappingResources">
<list>
<value>test/s2sh/bean/Person.hbm.xml</value>
</list>
</property>
</bean>
</beans>
<?xmlversion="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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!--apache.dbcp连接池的配置 -->
<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<property name="driverClassName"value="com.mysql.jdbc.Driver"></property>
<property name="url"value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
<property name="username"value="root"></property>
<property name="password"value=""></property>
<!-- 最大活动连接数-->
<property name="maxActive"value="100"></property>
<!-- 最大可空闲连接数-->
<property name="maxIdle"value="30"></property>
<!-- 最大可等待连接数-->
<property name="maxWait"value="500"></property>
<!-- 默认的提交方式(如果不需要事务可以设置成true,在实际应用中一般设置为false,默认为false) -->
<property name="defaultAutoCommit"value="true"></property>
</bean>
<!--这里直接使用spring对hibernate3支持的sessionFactory -->
<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"ref="dataSource"></property>
<!-- hibernate方言等相关配置 -->
<propertyname="hibernateProperties">
<props>
<propkey="connection.useUnicode">true</prop>
<propkey="connection.characterEncoding">utf-8</prop>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<propkey="hibernate.show_sql">true</prop>
</props>
</property>
<!-- hbm.xml的映射文件 -->
<propertyname="mappingResources">
<list>
<value>test/s2sh/bean/Person.hbm.xml</value>
</list>
</property>
</bean>
</beans>
乱码问题解决方案
1、
<property name="hibernateProperties">
<props>
<prop key="connection.useUnicode">true</prop>
<prop key="connection.characterEncoding">utf-8</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<propertyname="hibernateProperties">
<props>
<propkey="connection.useUnicode">true</prop>
<propkey="connection.characterEncoding">utf-8</prop>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<propkey="hibernate.show_sql">true</prop>
</props>
</property>
2、
<property name="url" value="jdbc:mysql://localhost:3306/s2sh?
useUnicode=true&characterEncoding=UTF-8"></property><propertyname="url"value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
(4)下面我们开始写DAO层,首先创建com.s2sh.dao包放置Dao类的接口,创建com.s2sh.dao.impl包放置Dao类的实现。
PersonDAO.java
package com.s2sh.dao;
import java.util.List;
import com.s2sh.bean.Person;
publicinterface PersonDAO {
void savePerson(Person p);
void removePerson(Person p);
Person findPersonById(Integer id);
List<Person> findAllPerson();
void updatePerson(Person p);
}
packagetest.s2sh.dao;
importjava.util.List;
importtest.s2sh.bean.Person;
publicinterface PersonDAO {
void savePerson(Person p);
void removePerson(Person p);
Person findPersonById(Integer id);
List<Person> findAllPersons();
void updatePerson(Person p);
}
由于使用了spring,所以DAO的实现类可以继承HibernateDaoSupport进行实现
PersonDAOImpl.java
package com.s2sh.dao.impl;
import java.util.List;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.s2sh.bean.Person;
import com.s2sh.dao.PersonDAO;
publicclass PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {
public List<Person> findAllPerson() {
String sql = " fromperson p order by p.id desc";
return (List<Person>)this.getHibernateTemplate().find(sql);
}
public Person findPersonById(Integer id) {
Person p = (Person) this.getHibernateTemplate().get(Person.class, id);
return p;
}
publicvoid removePerson(Person p) {
this.getHibernateTemplate().delete(p);
}
publicvoid savePerson(Person p) {
this.getHibernateTemplate().save(p);
}
publicvoid updatePerson(Person p) {
this.getHibernateTemplate().update(p);
}
}
(5)下面开始进行service层的设计,这里的service层仅是简单调用DAO层的的方法。
同样是创建接口包(com.s2sh.service),实现包和接口类(com.s2sh.service.impl),实现类
PersonService.java
package com.s2sh.service;
import java.util.List;
import com.s2sh.bean.Person;
publicinterface PersonService {
List<Person> findAll();
void save(Person p);
void delete(Person p);
Person findById(Integer id);
void update(Person p);
}
packagetest.s2sh.service;
importjava.util.List;
importtest.s2sh.bean.Person;
publicinterface PersonService {
List<Person> findAll();
void save(Person p);
void delete(Person p);
Person findById(Integer id);
void update(Person p);
}
这里需要使用spring的ioc将DAO诸如到service中,所以要在service实现类中加入DAO作为属性。
PersonServiceImpl.java
package com.s2sh.service.impl;
import java.util.List;
import com.s2sh.bean.Person;
import com.s2sh.dao.PersonDAO;
import com.s2sh.service.PersonService;
publicclass PersonServiceImpl implements PersonService {
private PersonDAO personDao;
publicvoid delete(Person p) {
personDao.removePerson(p);
}
public List<Person> findAll() {
returnpersonDao.findAllPerson();
}
public Person findById(Integer id) {
returnpersonDao.findPersonById(id);
}
publicvoid save(Person p) {
personDao.savePerson(p);
}
publicvoid update(Person p) {
personDao.updatePerson(p);
}
public PersonDAO getPersonDao() {
returnpersonDao;
}
publicvoid setPersonDao(PersonDAO personDao) {
this.personDao = personDao;
}
}
(6)接下来开始对action层进行设置,实际项目中的action可能会有很多,所以需要对action进行分包,这里针对Person进行操作,创建com.s2sh.action.person.
这里先做保存操作
savePersonAction.java
package com.s2sh.action.person;
import com.opensymphony.xwork2.ActionSupport;
import com.s2sh.bean.Person;
import com.s2sh.service.PersonService;
publicclass savePersonAction extends ActionSupport {
private Person p;
private PersonService personService;
public Person getP() {
returnp;
}
publicvoid setP(Person p) {
this.p = p;
}
public PersonService getPersonService() {
returnpersonService;
}
publicvoid setPersonService(PersonService personService) {
this.personService =personService;
}
public String execute() throws Exception{
personService.save(p);
returnSUCCESS;
}
publicvoid validate(){
if(p.getName()==null || "".equals(p.getName())){
this.addFieldError("p.name", "name is notnull!");
}
}
}
save.jsp
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%
String path =request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s"uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Save Person</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<s:form action="savePerson">
<s:textfield name="p.name" label="name"></s:textfield>
<s:textfield name="p.age" label="age"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
<%@page language="java" import="java.util.*"pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Save Person</title>
</head>
<body>
<s:formaction="savePerson">
<s:textfieldname="p.name" label="name"></s:textfield>
<s:textfieldname="p.age" label="age"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
操作成功页面
saveSuccess.jsp
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<title>Save OK</title>
</head>
<body>
保存成功!<br>
</body>
</html>
<%@page language="java" import="java.util.*"pageEncoding="utf-8"%>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Save OK</title>
</head>
<body>
保存成功<br>
</body>
</html>
配置struts.xml
<action name="savePerson"class="savePersonAction">
<result>saveSuccess.jsp</result>
<result name="input">save.jsp</result>
</action>
<actionname="savePerson" class="savePersonAction">
<result name="success"type="redirect">/save-success.jsp</result>
<resultname="input">/save.jsp</result>
</action>
由于现在的action的创建已经由spring所接管,所以这里class里面使用的是别名,该别名与applicationContext.xml中的id对应.
配置applicationContext的ioc
<bean id="personDAO" class="com.s2sh.dao.impl.PersonDAOImpl"
scope="singleton">
<!-- 由于该类是继承于HibernateDaoSupport,所以需要将sessionFactory注入 -->
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="personService" class="com.s2sh.service.impl.PersonServiceImpl">
<property name="personDao"ref="personDAO"></property>
</bean>
<bean id="savePersonAction" class="com.s2sh.action.person.savePersonAction"
scope="prototype">
<property name="personService"ref="personService"></property>
</bean>
<beanid="personDAO" class="test.s2sh.dao.impl.PersonDAOImpl"scope="singleton">
<!-- 由于该类是继承于HibernateDaoSupport,所以需要将sessionFactory注入 -->
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<beanid="personService" class="test.s2sh.service.impl.PersonServiceImpl">
<property name="personDAO"ref="personDAO"></property>
</bean>
<beanid="savePersonAction"class="test.s2sh.action.person.SavePersonAction"scope="prototype">
<property name="service"ref="personService"></property>
</bean>
这里说明一下spring中的单例与设计模式中的单例不同,设计模式的单例是在jvm中只产生一个实例,而spring中的单例
是针对每个ioc容器来言,如果存在两个ioc容器,那么每个ioc容器都会生成唯一的类实例
将sessionFactory注入Dao中,这里的Dao来说是无状态的,可以设置为单例singleton。这里的action是使用spring创建的。
struts2与struts1的action有所不同,因为struts2中的action中可能存在属性,这里是Person,所以struts2的action可能是有状态的。
如果是有状态的我们就需要将scope设置成原型模式,即每次请求都新建一个action。
不然可能会出现如果表单提交的第一次出错,之后就再也提交不过去了,值就是应为使用默认的singleton,
当第一次的时候就将FieldError中加入了错误,每次都是这个action,始终带着这个错误,所以就提交不过去了。
到目前为止这个整合已经完成了。
相关推荐
S2SH整合指的是Struts2、Spring和Hibernate这三个开源框架的集成应用,它们分别是MVC(Model-View-Controller)架构中的控制层、业务层和数据持久层的优秀解决方案。在Java Web开发中,S2SH整合能提供一个强大、灵活...
**S2sh整合所需jar包大全** 在Java Web开发领域,Struts 2、Spring 和 Hibernate(简称S2SH)是一种常见的集成框架,用于构建高效、可维护的企业级应用程序。这个压缩包“s2sh整合所需jar包大全”提供了一整套支持...
本压缩包"**s2sh整合详细jar**"显然是一份包含了这三个框架核心组件的集合,旨在帮助初学者快速搭建SSH整合环境。以下是对每个框架及其整合细节的详细解释: 1. **Struts2**:Struts2是一个基于MVC设计模式的Java ...
本文将详细介绍S2SH整合的过程以及其核心组件。 **1. Struts2框架** Struts2是Apache软件基金会的一个开源项目,它是基于MVC设计模式的Web应用框架。它的主要特点是提供了丰富的拦截器和插件机制,使得开发者可以...
**S2SH整合详解** S2SH,全称为Spring、Struts、Hibernate的组合,是经典的Java Web开发框架。这个框架结合了Spring的依赖注入、事务管理,Struts的MVC设计模式,以及Hibernate的对象关系映射(ORM)工具,为开发者...
【标题】"s2sh整合完全包"指的是一个包含了所有必要组件的压缩文件,用于支持基于Struts2、Spring和Hibernate(简称s2sh)的Web应用开发。这个包简化了开发过程,因为它包含了这三个框架的库文件,使得开发者无需...
在S2SH整合中,Hibernate 3.5.6版本作为ORM(对象关系映射)工具,允许开发者通过对象模型来操作数据库,而无需编写SQL。它支持懒加载、缓存策略和复杂查询,使得数据库操作更加便捷。 **整合过程** S2SH的整合...
这三者结合,被称为S2SH整合,能够构建出高效、灵活且可维护的Java Web应用程序。 **Struts2框架**: Struts2是Struts1的升级版,它引入了拦截器(Interceptor)的概念,增强了动作(Action)与结果(Result)的...
基于Annotation的s2sh整合配置实现分页功能基于Annotation的s2sh整合配置实现分页功能基于Annotation的s2sh整合配置实现分页功能基于Annotation的s2sh整合配置实现分页功能基于Annotation的s2sh整合配置实现分页功能
【S2SH整合完美教程】 在Java Web开发中,Struts2、Spring和Hibernate的整合是常见的技术栈,被广泛用于构建MVC架构的应用程序。S2SH整合旨在实现业务逻辑与控制层、持久化层的高效协同,提高代码的可维护性和可...
这个“完整的S2SH框架整合,带jar包”资源包含了这些框架的核心库,以及可能的一个实例项目,旨在帮助开发者快速搭建和理解S2SH的应用。 1. **Struts**:Struts 是一个基于MVC设计模式的Web应用框架,主要用于控制...
s2sh整合 所需其他jar包 打包下载 spring-dao.jar mysql-connector-java-5.1.6-bin.jar commons-dbcp.jar cglib-nodep.jar
这个压缩包提供了实现增删改查功能的源代码,以及完整的S2SH整合包,使得开发者可以直接运行项目,无需从零开始配置环境。 **Struts2** 是一个基于MVC设计模式的Action驱动框架,它负责处理用户的请求,并通过...
标题 "s2sh整合所有的jar包" 指的是将Struts、Spring和Hibernate这三种技术集成所需的Java档案(JAR)文件集合在一起,便于在项目开发中快速引用和使用。这种整合通常被称为SSH框架,它是Java Web开发中的一个流行...
**S2SH整合模版详解** S2SH整合模版是指基于Struts2、Spring和Hibernate这三个开源框架的集成模板,常用于构建企业级Java Web应用程序。这三大框架分别是Struts2负责MVC(Model-View-Controller)架构的实现,...
需要数据库是mysql 数据库名是s2sh_demo 建表语句CREATE TABLE `user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NULL DEFAULT NULL, `password` VARCHAR(50) NULL DEFAULT NULL, ...
【标题】:“s2sh框架整合类包” 在IT领域,"s2sh"是一个流行的Web应用程序开发框架,由Spring、Struts和Hibernate三个组件整合而成。这个框架因其高效、灵活和可扩展性而被广泛应用。Spring提供了依赖注入和AOP...
下面将详细阐述S2SH整合的核心概念和技术要点。 1. **Struts框架**:Struts是MVC(Model-View-Controller)架构模式的一个实现,主要负责处理HTTP请求,管理视图和模型之间的交互。在本系统中,Struts作为前端控制...
在**S2SH整合**过程中,通常会将Struts2的动作类(Action)作为Spring的Bean,这样可以通过Spring的依赖注入来获取Hibernate的SessionFactory,从而进行数据库操作。同时,Struts2的拦截器可以与Spring的事务管理...
下面将详细讲解这个"S2SH整合_注册_登录"项目中的关键知识点。 首先,Struts2作为控制器层,负责处理HTTP请求,并将这些请求转发给相应的业务逻辑处理。在注册和登录功能中,Struts2配置文件(struts.xml)定义了...