SSH整合

SSH简介

Struts(表示层)+Spring(业务层)+Hibernate(持久层)
Struts: Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)
Hibernate: Hibernate是一个持久层框架,它只负责与关系数据库的操作。
Spring: Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。
① Web分层架构中业务层为什么都选择Spring? Service层需要处理业务逻辑和交叉业务逻辑,处理事务,日志,安全等,而这些与Spring的IoC,AOP等不谋而合。
② Web分层架构中,对于各层技术的采用应该遵循一个怎样的标准?
1、选择发展成熟的技术:
A、经过了项目实践证实可行性良好
B、文档完善 C、技术一直处于可持续发展更新
2、Web应用中对于技术的选择有赖于开发人员的技术掌握情况

SSH的优势体现在四个方面:

一、分离了Java代码和HIML代码,降低了对开发人员要求的复合度。
二、是系统的层与层之间的工作相是对独立的,代码耦合度低。
三、即使脱离了Spring 环境的AOP机制,也不会妨碍AOP实现业务的功能。
四、与SSH配合使用的Hibemate等夸平台技术开源性极强促使了SSH框架的飞速发展。
SSH的技术优势使得采用SSH框架技术开发的系统具备了很强的可拓展性、可移植性。同时,采用开源的SSH框架能够大大简化系统开发的复杂度,缩短系统开发时间。

导入所需要的pom依赖 pom.xml


  4.0.0
  com.wangshaoyang
  Ssh
  war
  0.0.1-SNAPSHOT
  Ssh Maven Webapp
  http://maven.apache.org
  
		5.2.12.Final
		5.1.44
		5.0.1.RELEASE
		2.5.13
		1.7.7
		2.9.1
		3.2.0
		4.12
		4.0.0
		1.2
		1.1.2
		8.0.47
	
  
   
		
			org.hibernate
			hibernate-core
			${hibernate.version}
		
		
			org.hibernate
			hibernate-c3p0
			${hibernate.version}
		
		
			org.hibernate
			hibernate-ehcache
			${hibernate.version}
		
		
			mysql
			mysql-connector-java
			${mysql.version}
		
		
		
			org.springframework
			spring-context
			${spring.version}
		
		
			org.springframework
			spring-orm
			${spring.version}
		
		
			org.springframework
			spring-web
			${spring.version}
		
		
			org.springframework
			spring-aspects
			${spring.version}
		
		
		
			org.apache.struts
			struts2-core
			${struts2.version}
		
		
			org.apache.struts
			struts2-spring-plugin
			${struts2.version}
		
		
		
		
		
			org.slf4j
			slf4j-api
			${slf4j.version}
		
		
			org.slf4j
			jcl-over-slf4j
			${slf4j.version}
			runtime
		

		
		
			org.apache.logging.log4j
			log4j-slf4j-impl
			${log4j2.version}
		

		
		
			org.apache.logging.log4j
			log4j-api
			${log4j2.version}
		
		
			org.apache.logging.log4j
			log4j-core
			${log4j2.version}
		

		
		
			org.apache.logging.log4j
			log4j-web
			${log4j2.version}
			runtime
		
		
		
			com.lmax
			disruptor
			${disruptor.version}
		
		
    
		
		
			junit
			junit
			${junit.version}
			test
		

		
		
			javax.servlet
			javax.servlet-api
			${javax.servlet.version}
			provided
		

		
		
			jstl
			jstl
			${jstl.version}
		
		
			taglibs
			standard
			${standard.version}
		

		
		
			org.apache.tomcat
			tomcat-jsp-api
			${tomcat-jsp-api.version}
		
  
  
    Ssh
    
			
				org.apache.maven.plugins
				maven-compiler-plugin
				3.7.0
				
					1.8
					1.8
					UTF-8
				
			
		
  

spring-hibernate.xml




	
	
	
	
	

	
	
		
		
		
		

		
		
		
		
		
		
		
		

		
		

		
		

		
		

		
		

		
		

		
		
	

	
	
		
		
			
		
		
		
			
				org.hibernate.dialect.MySQLDialect
				
				true
				true
			
		
		
		
			
				com/wangshaoyang/book/entity/Book.hbm.xml
			
		
	

	
	
	
	
	
	

	
	
		
	

	
	
		
			
			
			

			
			

			
			

			
			
			
			

			
		
	

	
	
		
		
		
		
		
		
	
	

	
	
		
	
	
	
	
		
	
	
	

spring-book.xml





	
		
	

	
		
		

spring-context.xml






log4j2.xml





	
		
		/root/workspace/lucenedemo/logs
		/root/workspace/lucenedemo/logs/error
		/root/workspace/lucenedemo/logs/warn
		%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n
	

	
		
		
			
			
			
			
			
		

		
		
		
			
		
		
		
			
			
			
			
				
				
				
				
				
				
			
		

		
			
			
			
				
				
			
			
			
		

		
			
			
			
				
				
				
			
		

	

	
	
		
		
		

		
		
		
		
		
		

		
		
			
			
			
			
		
	

struts-base.xml




	
	
	
	
	

	
		regex:.*
	

struts-sy.xml




	
	
		
		
	

struts.xml




	
	

连接数据库 db.properties

db.username=root
db.password=123
db.driverClass=com.mysql.jdbc.Driver
db.jdbcUrl=jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
db.initialPoolSize=10
db.maxPoolSize=20
db.minPoolSize=5
db.maxIdleTime=60
db.acquireIncrement=5
db.maxStatements=0
db.idleConnectionTestPeriod=60
db.acquireRetryAttempts=30
db.breakAfterAcquireFailure=true
db.testConnectionOnCheckout=false

一定要记得配置 web.xml


  Archetype Created Web Application
  
   
	
		contextConfigLocation
		classpath:spring-context.xml
	
	
		
			org.springframework.web.context.ContextLoaderListener
		
	
	
	
		struts2
		
			org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
		
	
	
		struts2
		*.action
	

	
	
		encodingFilter
		
			org.springframework.web.filter.CharacterEncodingFilter
		
		true
		
			encoding
			UTF-8
		
	
	
		encodingFilter
		/*
	


基础模块(base) 把工具类导入进去 PageBean

package com.wangshaoyang.base.util;

/**
 * 分页工具类
 *
 */
public class PageBean {

	private int page = 1;// 页码

	private int rows = 10;// 页大小

	private int total = 0;// 总记录数

	private boolean pagination = true;// 是否分页

	public PageBean() {
		super();
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return pagination;
	}

	public void setPagination(boolean pagination) {
		this.pagination = pagination;
	}

	/**
	 * 获得起始记录的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page - 1) * this.rows;
	}
	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
	}
}

StringUtils

package com.wangshaoyang.base.util;

public class StringUtils {
	// 私有的构造方法,保护此类不能在外部实例化
	private StringUtils() {
	}

	/**
	 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isBlank(String s) {
		boolean b = false;
		if (null == s || s.trim().equals("")) {
			b = true;
		}
		return b;
	}
	
	/**
	 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNotBlank(String s) {
		return !isBlank(s);
	}
}

BaseEntity

package com.wangshaoyang.base.entity;

import java.io.Serializable;

public class BaseEntity implements Serializable {
	private static final long serialVersionUID = -2505396936918145327L;	

}

BaseBiz

package com.wangshaoyang.base.biz;
public interface BaseBiz {

}

BaseDao

package com.wangshaoyang.base.dao;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.wangshaoyang.base.util.PageBean;

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

public class BaseDao extends HibernateDaoSupport implements Serializable{

	private static final long serialVersionUID = 5427369434249665701L;
	
	public void setParam(Query query,Map map) {
		if(map == null || map.size() < 1) {
			return;
		}
		Object value = null;
		for(Map.Entry entry:map.entrySet()) {
			value = entry.getValue();
			if(value instanceof Collection) {
				query.setParameterList(entry.getKey(), (Collection) value);
			}else if(value instanceof Object[]) {
				query.setParameterList(entry.getKey(), (Object[]) value);
			}else {
				query.setParameter(entry.getKey(), value);
			}
		}
	}
	
	public String getCountHql(String hql) {
		int index = hql.toUpperCase().indexOf("FROM");
		return "select count(*) "+hql.substring(index);
	}
	
	/**
	 * 
	 * @param hql	已经拼装好的
	 * @param map
	 * @param pageBean
	 * @return
	 */
	public List executeQuery(Session session, String hql,Map map,PageBean pageBean) {
		if(pageBean !=null && pageBean.isPagination()) {
			String countHql = getCountHql(hql);
			Query countQuery = session.createQuery(countHql);
			this.setParam(countQuery, map);
			pageBean.setTotal(countQuery.getSingleResult().toString());
			
			Query query = session.createQuery(hql);
			this.setParam(query, map);
			query.setFirstResult(pageBean.getStartIndex());
			query.setMaxResults(pageBean.getRows());
			List list = query.list();
			
			return list;
		}else {
			Query query = session.createQuery(hql);
			this.setParam(query, map);
			List list = query.list();
			
			return list;
		}		
	}
}

BaseAction

package com.wangshaoyang.base.web;

import java.io.Serializable;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

public class BaseAction implements ServletRequestAware, ServletResponseAware,Serializable{
	private static final long serialVersionUID = -7110462505161900879L;
	/**
	 * 为了传值使用
	 */
	protected HttpServletResponse response;
	protected HttpServletRequest request;
	protected HttpSession session;
	protected ServletContext application;
	
	/**
	 * 为了配置跳转页面所用
	 */
	protected final static String SUCCESS = "success";
	protected final static String FAIL = "fail";
	protected final static String LIST = "list";
	protected final static String ADD = "add";
	protected final static String EDIT = "edit";
	protected final static String DETAIL = "detail";
	
	/**
	 * 具体传值字段	后端向jsp页面传值所用字段
	 */
	protected Object result;
	protected Object msg;
	protected int code;

	public Object getResult() {
		return result;
	}

	public Object getMsg() {
		return msg;
	}

	public int getCode() {
		return code;
	}

	@Override
	public void setServletResponse(HttpServletResponse arg0) {
		this.response = arg0;
		
	}

	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		this.request = arg0;
		this.session = arg0.getSession();
		this.application = arg0.getServletContext();
	}
}

测试模块(book) 实体类Book

package com.wangshaoyang.book.entity;

import com.wangshaoyang.base.entity.BaseEntity;

public class Book extends BaseEntity{
	private static final long serialVersionUID = -5880666920322037903L;
	private Integer bid;
	private String bname;
	private Float price;

	public Integer getBid() {
		return bid;
	}

	public void setBid(Integer bid) {
		this.bid = bid;
	}

	public String getBname() {
		return bname;
	}

	public void setBname(String bname) {
		this.bname = bname;
	}

	public Float getPrice() {
		return price;
	}

	public void setPrice(Float price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
	}

}

Book.hbm.xml




	
		
			
		
		
		
		
	

BookDao

package com.wangshaoyang.book.dao;


import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate5.HibernateCallback;

import com.wangshaoyang.base.dao.BaseDao;
import com.wangshaoyang.book.entity.Book;

public class BookDao extends BaseDao{
	private static final long serialVersionUID = 6568276808205680120L;
	public int add(Book book) {
		return (int)this.getHibernateTemplate().save(book);
	}
	
	public List list(){
		return this.getHibernateTemplate().execute(new HibernateCallback>() {

			@Override
			public List doInHibernate(Session session) throws HibernateException {
				return session.createQuery("from Book").list();
			}
		});
	}
}

接口BookBiz

package com.wangshaoyang.book.biz;

import java.util.List;

import com.wangshaoyang.book.entity.Book;

public interface BookBiz {
	public int add(Book book);
	public List list();
}

实现BookBiz接口 BookBizimpl

package com.wangshaoyang.book.biz.impl;

import java.util.List;

import com.wangshaoyang.book.biz.BookBiz;
import com.wangshaoyang.book.dao.BookDao;
import com.wangshaoyang.book.entity.Book;

public class BookBizimpl implements BookBiz {
	private BookDao bookDao;

	public BookDao getBookDao() {
		return bookDao;
	}

	public void setBookDao(BookDao bookDao) {
		this.bookDao = bookDao;
	}

	@Override
	public int add(Book book) {
		// TODO Auto-generated method stub
		return bookDao.add(book);
	}

	@Override
	public List list() {
		// TODO Auto-generated method stub
		return bookDao.list();
	}
}

BookAction

package com.wangshaoyang.book.web;

import java.util.List;

import com.wangshaoyang.base.web.BaseAction;
import com.wangshaoyang.book.biz.BookBiz;
import com.wangshaoyang.book.entity.Book;
import com.opensymphony.xwork2.ModelDriven;

public class BookAction extends BaseAction implements ModelDriven{
	//book实现了modeldriven接口,那么意味着封装了jsp传递了参数
	private Book book=new Book();
	
	private BookBiz bookBiz;

	public BookBiz getBookBiz() {
		return bookBiz;
	}

	public void setBookBiz(BookBiz bookBiz) {
		this.bookBiz = bookBiz;
	}

	
	public String add() {
		this.bookBiz.add(book);
		return null;
	}
	
	public String list() {
		List list = this.bookBiz.list();
		for (Book book : list) {
			System.out.println(book);
		}
		return null;
	}
	
	@Override
	public Book getModel() {
		// TODO Auto-generated method stub
		return book;
	}
}

你可能感兴趣的:(Spring)