SSH

S2SH框架下搭建影视网demo

Posted by 夜空 on March 11, 2019

目的

以项目为驱动,学习Struts2+Spring+Hibernate的基本知识点。

项目介绍

影视网demo网站,前端布局boostrap+js,后端Struts2+Spring,持久化层Hibernate、
数据库mysql+redis;

实现功能:用户登录注册、我喜欢、搜索、分页、layui列表;

主要知识点:

- 拦截器,比如用户在未登录状态下点击“喜欢”,将会被拦截请求,通过判断来进一步后续操作;
- Spring的自动装配和注解,Spring的高效原因之一就是首次加载项目时就配置好所需的基本环境,
比如Action类和组件;
- 使用getHibernateTemplate()实现对数据库对操作;

需要说明的是,“我喜欢”这个功能是用redis和mysql联合实现,原因是对于用户每次添加喜欢对影片,如果对每个用户都建立一张‘我喜欢’的表,或者建立一张所有用户‘我喜欢’的表,其效率将会大打折扣,而采用redis,每个用户只是一个key。

项目效果

我喜欢

search

项目代码

看不到效果点这里

S2SH的整合说明

对于S2SH的整合,其关键就是spring和struts、spring和hibernate的整合。
对于hibernate来说,其所需要完成的只是加载所有bean映射,以及一些琐碎的属性设置,
而数据库的连接交给spring;
对于Struts来说,它将所需要的action类交给spring加载,根据spring配置的id进行查找以便完成
动作流程;
基本上剩下的工作都将交给spring,它的职责包括:数据库的连接、事务和session的创建和配置
(以便dao类获取使用),action类的映射以及action、service和dao包内的各大组件的注解和自动装配;

主要的配置文件

包括bean.xml、struts.xml、hibernate.xml和web.xml;

代码点这里

比较重要的知识点

Struts返回json,需要在action里配置有gettter方法的变量,在Struts.xml中要如此配置
<package name="movie" extends="json-default">
<action name="mListAction-findAll" class="mListAction" method="findAll" >
			<result name="success" type="json">  
                <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->  
                <param name="root">jsonResult</param>  
                    <!-- 指定是否序列化值为空的属性 -->  
                <param name="excludeNullProperties">true</param>  
            </result> 
		</action>
</package>

关于拦截器

所谓的拦截器,其实就是做这个action之前将其拦截下来,做身份验证之类,再根据其合法与否进行
下一步动作;
public class loginStatusInterceptor extends AbstractInterceptor{

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map session=invocation.getInvocationContext().getSession();
        if (session.get("username")==null) {
			return Action.LOGIN;
		}else {
			//表示执行成功,继续下一个拦截器或action
			return invocation.invoke();
		}
	}

}

在Struts中调用拦截器

<!-- 拦截器 -->
<interceptors>
	<interceptor name="loginStatus" 
	class="com.jackpon.interceptor.loginStatusInterceptor"></interceptor>
	<!-- 拦截栈 -->
	<interceptor-stack name="iloginStatus">
		<!-- defaultStack一定要写,不然无法传参数 -->
		<interceptor-ref name="defaultStack" />
		<interceptor-ref name="loginStatus" />
	</interceptor-stack>
</interceptors>
<action name="like-add" class="likeAction" method="add">
	<result>/WEB-APP/like-success.jsp</result>
	<!-- 调用拦截器 -->
	<interceptor-ref name="iloginStatus"></interceptor-ref>
	<result name="login">/WEB-APP/like-error.jsp</result>
</action> 

IoC

要实现自动装配,dao类就要获取到spring生成的session,要做到这一步,dao类只需要继承
类SuperDao,当然要添加组件注解才能被spring扫描,代码如下
@Component
public class SuperDAO extends HibernateDaoSupport {
	
	@Resource(name="sessionFactory")
	public void setSuperSessionFactory(SessionFactory sessionFactory) {
		super.setSessionFactory(sessionFactory);
	}
}

接下来,你只需要在dao类添加'@Component(name)'注解,在service和action里为需要的变量
添加'@Autowired'。
完成这一系列的操作,其目的就是为了实现IoC(控制反转)或者叫做DI(依赖注入),什么是控制反转?
简单来说就是:
在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例。
但在spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IoC);
创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),
依赖注入和控制反转是同一个概念。