问题?三大框架整合原理及详解
提示:myeclipse环境、工程环境、tomcat环境的jdk保持一致(在这里我所使用的而是jdk1.6版本)
在这里我们调成1.6,并点击确定。
cmd:java -version :查看jdk的版本
1.新建一个工程,把工程的编码为utf-8
2.首先是三大框架所需要的jar包,把jar包放入到工程中的lib下(下载链接:点击下载jar包链接)
注意:MyEclisp可以把jar包放在lib下的文件夹下,但是eclipse就不可以,只能把jar包放在根目录下
3.整体结构图:
4.建立三个folder:
src 存放源代码
config 存放配置文件
hibernate 存放hibernate的配置文件
spring 存放spring的配置文件(在这里可以写固定不变的配置信息和需要变化的配置信息)
struts 存放struts的配置文件(这些里面的配置文件要引入到struts.xml中)
struts.xml(这个必须要在根目录下)
test 存放单元测试
5、在src下建立包
在实体类bean中写(这里写的 cn.itcast.s2sh.domain)持久化类和映射文件及hibernate配置文件
持久化类:
package cn.itcast.s2sh.domain;
import java.io.Serializable;
public class Person implements Serializable{
private Long pid;
private String pname;
private String psex;
public Person(){}
public Person(String pname){
this.pname = pname;
}
public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPsex() {
return psex;
}
public void setPsex(String psex) {
this.psex = psex;
}
}
hibernate.cfg.xml配置文件
root
root
jdbc:mysql://localhost:3306/ssh1
com.mysql.jdbc.Driver
org.hibernate.dialect.MySQLInnoDBDialect
update
true
如果不写的话,可能会出现这个错误及解决办法:点击打开链接
6、编写dao层和service层
dao接口层和实现层
package cn.itcast.s2sh.dao;
import java.io.Serializable;
import cn.itcast.s2sh.domain.Person;
public interface PersonDao {
public void savePerson(Person person);
public Person personById(Serializable id);
}
package cn.itcast.s2sh.dao.Impl;
import java.io.Serializable;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.itcast.s2sh.dao.PersonDao;
import cn.itcast.s2sh.domain.Person;
public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao {
public void savePerson(Person person) {
this.getHibernateTemplate().save(person);
}
public Person personById(Serializable id) {
return (Person)this.getHibernateTemplate().load(Person.class, id);
//this.getHibernateTemplate().get(Person.class, id);
//这也可以实现,不过上面是采用懒加载的方式,减小内存压力
}
}
package cn.itcast.s2sh.service;
import java.io.Serializable;
import cn.itcast.s2sh.domain.Person;
public interface PersonService {
public void savePerson(Person person);
public Person personById(Serializable id);
}
package cn.itcast.s2sh.service.Impl;
import java.io.Serializable;
import cn.itcast.s2sh.dao.PersonDao;
import cn.itcast.s2sh.domain.Person;
import cn.itcast.s2sh.service.PersonService;
public class PersonServiceImpl implements PersonService {
private PersonDao personDao;
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
public void savePerson(Person person) {
// TODO Auto-generated method stub
this.personDao.savePerson(person);
}
public Person personById(Serializable id) {
// TODO Auto-generated method stub
return this.personDao.personById(id);
}
}
applocation-db.xml
classpath:hibernate/hibernate.cfg.xml
(2)、测试sessionfactory
工具类读取applicationContext.xml配置文件:
package cn.itcast.s2sh.util;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringInit {
public static ApplicationContext applicationContext;
static{
applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
}
}
package cn.itcast.s2sh.test;
import org.junit.Test;
import cn.itcast.s2sh.util.SpringInit;
public class SessionFactory extends SpringInit{
@Test
public void testBuildSessionfactory(){
applicationContext.getBean("sessionFactory");
}
}
(3)、在application-person.xml中注入dao和service
(4)、测试
package cn.itcast.s2sh.test;
import org.junit.Test;
import cn.itcast.s2sh.action.PersonAction;
import cn.itcast.s2sh.domain.Person;
import cn.itcast.s2sh.service.PersonService;
import cn.itcast.s2sh.util.SpringInit;
public class PersonTest extends SpringInit {
@Test
public void personDaoTest(){
PersonService personService = (PersonService)applicationContext.getBean("personService");
Person person = new Person();
person.setPname("李大鹏");
person.setPsex("男");
personService.savePerson(person);
} }
package cn.itcast.s2sh.action;
import java.io.Serializable;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import cn.itcast.s2sh.domain.Person;
import cn.itcast.s2sh.service.PersonService;
/**
* @author ActionSupport
* 这个就是struts走的方法包
*
*/
public class PersonAction extends ActionSupport {
private PersonService personService;
public PersonService getPersonService() {
return personService;
}
public void setPersonService(PersonService personService) {
this.personService = personService;
}
public String savePerson(){
Person person = new Person();
person.setPname("李大鹏3");
person.setPsex("男");
this.personService.savePerson(person);
return SUCCESS;
//StrutsSpringObjectFactory
}
public String showPersonById(){
Person person = this.personService.personById(1L);
//ActionContext.getContext().getValueStack().push(person);
ActionContext.getContext().put("person", person);
ServletActionContext.getRequest().setAttribute("person", person);
return "index";
}
}
scope为"prototype"保证了action的多实例
这个多例很重要,在多用户并发的时候起着很重要的作业,bean默认情况下产生的是单例
写struts.xml配置文件
index.jsp
index1.jsp
加入struts2的过滤器
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:spring/applicationContext.xml
OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
OpenSessionInViewFilter
*.action
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
index.jsp
spring监听器:
如果是吧applicationContext.xml文件放在WEB-INF下,就不用管
解释:
其中的OpenSessionInViewFilter,这个要重点讲一下,这个是为了处理懒加载的问题,在前面dao层中得到数据是load方法,这样的话它就会在get属性的时候,才发出sql语句,而得到属性的时候,已经是response到jsp的时候,那个session已经关闭了。我们就需要opensessionInViewFiter来推迟session的关闭时间.而且这个必须加载struts的上面也就是放在中间:
原因如下:
OpenSessionInView模式的运行方向: OpenSessionInView在第一个位置,struts2的过滤器在第二个位置
不加出现的错误:
优缺点:OpensessinInview虽然解决了懒加载的问题,但是却造成了session关闭时间推迟了,导致内存中的缓存数据长时间停留。
11、请求
index1.jsp
<%@ taglib uri="/struts-tags" prefix="s" %>
This is my JSP page.
${requestScope.person.pname }
最后三大框架搭建成功。案例下载链接