三大框架整合原理及详解

问题?三大框架整合原理及详解

提示:myeclipse环境、工程环境、tomcat环境的jdk保持一致(在这里我所使用的而是jdk1.6版本)

三大框架整合原理及详解_第1张图片

在这里我们调成1.6,并点击确定。

cmd:java -version  :查看jdk的版本

1.新建一个工程,把工程的编码为utf-8

2.首先是三大框架所需要的jar包,把jar包放入到工程中的lib下(下载链接:点击下载jar包链接)

注意:MyEclisp可以把jar包放在lib下的文件夹下,但是eclipse就不可以,只能把jar包放在根目录下

3.整体结构图:

              三大框架整合原理及详解_第2张图片

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;
	}
	
}

映射文件:




	
	
		
		
			
			
		
		
		
		
		
		
	

在这里采用的是有持久化类和映射文件来产生数据库表。前提得把数据库建立起来(要求是编码格式为:)

        三大框架整合原理及详解_第3张图片

hibernate.cfg.xml配置文件




	

	
	root
	
	root
	
	jdbc:mysql://localhost:3306/ssh1


	
		com.mysql.jdbc.Driver
	
	
		
	
	
		org.hibernate.dialect.MySQLInnoDBDialect
	
	
	update
	
	true
	



其中;
com.mysql.jdbc.Driver

如果不写的话,可能会出现这个错误及解决办法:点击打开链接


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);
		//这也可以实现,不过上面是采用懒加载的方式,减小内存压力
	}

}

service接口层和实现层

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);
	}

}


7、写spring的配置文件
     (1)、写sessionFactory


   

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");
	}
}

结果出现这个就意味着,你的seesionfactory成功了,并且查看数据库,可以看见生成数据库表了:

三大框架整合原理及详解_第4张图片


     (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);
	} }


结果出现如下,说明dao层到service层没问题:

三大框架整合原理及详解_第5张图片

8、写action层

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";
	}
}


9、写spring的配置文件
     把action注入到spring容器中application-perosn.xml


		
	
		
			
		
	
		
	
		
			
		
	
		
	
		
			
		
	

    scope为"prototype"保证了action的多实例

这个多例很重要,在多用户并发的时候起着很重要的作业,bean默认情况下产生的是单例


写struts.xml配置文件




	
   
   
   		
   			index.jsp
   			index1.jsp
   		
   
	


10、在web.xml
      加入spring的监听器

      加入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下,就不用管名字了,因为默认会在该目录下找到。如果不是就需要默认起这个名字,然后并给它路径。

解释:

三大框架整合原理及详解_第6张图片



其中的OpenSessionInViewFilter,这个要重点讲一下,这个是为了处理懒加载的问题,在前面dao层中得到数据是load方法,这样的话它就会在get属性的时候,才发出sql语句,而得到属性的时候,已经是response到jsp的时候,那个session已经关闭了。我们就需要opensessionInViewFiter来推迟session的关闭时间.而且这个必须加载struts的上面也就是放在中间:


原因如下:

OpenSessionInView模式的运行方向:  OpenSessionInView在第一个位置,struts2的过滤器在第二个位置

三大框架整合原理及详解_第7张图片





不加出现的错误:

三大框架整合原理及详解_第8张图片


优缺点:OpensessinInview虽然解决了懒加载的问题,但是却造成了session关闭时间推迟了,导致内存中的缓存数据长时间停留。


11、请求

index1.jsp

  
  <%@ taglib uri="/struts-tags" prefix="s" %>
    This is my JSP page. 
${requestScope.person.pname }

测试:

三大框架整合原理及详解_第9张图片

最后三大框架搭建成功。案例下载链接


             



你可能感兴趣的:(--------《三大框架》)