目录
Web 框架之 SSH 框架的简单搭建的简单整理(基于Eclipse)
一、简单介绍
二、相关环境
三、注意事项
四、SSH 架包的下载和整理
Spring 下载和整理
Struts 下载和整理
Hibernate 下载和整理
其他包说明
五、Eclipse 实现 SSH 框架步骤
六、关键代码
七、代码工程
Web 开发的一些知识整理,方便后期遇到类似的问题,能够及时查阅使用。
本节介绍,Web 开发 中 SSH 框架的简单搭建的简单整理,如果有不足之处,欢迎指出,或者你有更好的方法,欢迎留言。
SSH框架集,是现在大多数软件设计过程中都会使用的一种框架集。
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。
Struts 简单介绍
1、什么是 struts:
Struts是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
2、struts2 框架的运行结构:
解析:客户端发送请求(HttpServletRequest)到服务器,服务器接收到请求就先进入web.xml配置文件看看有没有配置过滤器,发现有struts2的过滤器,然后就找到struts.xml配置文件,struts.xml配置文件里有定义一个action,然后就去找到类名叫IndexAction这个类(此action类必须是继承ActionSupport接口),并且实现了execute()方法,返回一个字符串为"success"给struts.xml配置文件,struts.xml配置文件的action会默认调用IndexAction类的execute()方法,result接收到了返回的字符串,然后查找结果字符串对应的(Result),result就会调用你指定的jsp页面将结果呈现,最后响应回给客户端。
Spring 简单介绍
1、什么是Spring?
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
2、spring的流程图:
解析:上图是在struts结构图的基础上加入了spring流程图,在web.xml配置文件中加入了spring的监听器,在struts.xml配置文件中添加“<constant name="struts.objectFactory" value="spring" />”是告知Struts2运行时使用Spring来创建对象,spring在其中主要做的就是注入实例,将所有需要类的实例都由spring理。
Hibernate 简单介绍
1、什么是 Hibernate?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
2、Hibernate的核心构成和执行流程图:
3、为什么使用Hibernate?
1). 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2)、Hibernate是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作,将软件开发人员从大量相同的数据持久层相关编程工作中解放出来,使开发更对象化了。
3)、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。
4)、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。
1、Windows 10
2、Eclipse Version: Oxygen.3a Release (4.7.3a) Build id: -1200
3、MySQL 8.0 + MySQL Workbench 8.0 CE
4、Tomcat 8.5
5、Java version 1.8.0_181
1、好似 SSH 框架中,Spring ,Struts,Hibernate 之间版本有些关系,至于什么关系不是清楚,如果版本不对,可能会报错不知名的错误,请注意,或许也么没有(好似遇到过,所以这么说一下哈)
2、至于跟不跟 Eclipse 版本有没有关系,不是清楚,或许也么没有(好似遇到过,所以这么说一下哈)
1、在浏览器上输入下载地址,获取 spring 的下载地址
下载地址:JFroghttps://repo.spring.io/ui/native/release/org/springframework/spring/
2、可以根据需要选择对应版本,建议选择对应的 release 标记的版本下载
3、根据需要下载,这里下载 spring -x.x.x.RELEASE-dist.zip
4、解压下载的压缩包
5、从 libs 整理出需要的核心 jar 包
1、百度搜索 Struts
2、点击进入,即可找到下载
官网下载地址:Welcome to the Apache Struts project
3、在下载界面即可看到各个版本,选择下载即可
(注意:可以下载对应版本的 struts-x.x.xx-min-lib.zip 里面只有需要的 jar 库)
4、 可以下载对应版本的 struts-x.x.xx-min-lib.zip 里面只有需要的 jar 库
5、解压 struts-x.x.xx-min-lib.zip ,得到需要的 Struts jar 库
1、百度搜索 Hibernate
2、选择 Hibernate ORM
3、选择对应版本下载
4、点击对应的下载即可
5、解压下载的压缩包
6、从 lib 整理出需要的核心 jar 包
1、MySQL Connector/J 选择安装 MySQL 接近的版本下载即可:
MySQL :: Download MySQL Connector/J (Archived Versions)
2、 根据需要你可以添加其他的,这里简单如下
1、打开 Eclipse ,进入工作空间,右键新建一个 Dynamic Web Project
2、添加些简单的网页资源,实现登录,然后显示 Index 界面
3、把上面整理好的 SSH 相关包,全部添加到 lib 中,并且 右键 Add to Build Path
4、创建一些 package 管理脚本
5、然后创建对应脚本
6、在 web.xml 中添加 SSH 相关配置
7、打开 Mysql ,创建 数据库 与 Domain 相关的table,和简单创建一个用户数据,用来简单登录测试
8、在 src 创建 applicationContext.xml ,配置 数据库相关,以及 Web 、Service、Dao 相关
9、在 src 下创建 struts.xml,添加web 跳转等相关事件
10、添加一个 login.jsp 文件,并拷贝login.html到jsp中,然后稍微修改和添加相关事件等
10、运行在 Tomcat 上
11、服务器运行起来后,在 login.jsp 进行简单用户登录测试
12、到此 SSH 框架简单整理基本完成
1、web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>MySSH</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 让spring随着web项目的启动而启动 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 读取配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 扩大session范围 -->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 让struts启动 -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
2、applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 开启那个包下的注解 开启包的时候,会开启包下所有子包 --> <context:component-scan base-package="com.xan.*"></context:component-scan> <!-- 配置 Hibernate 到 spring 中 --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="jdbcUrl" value="jdbc:mysql:///mysshspring"></property> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="user" value="root"></property> <property name="password" value="root123"></property> </bean> <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <!-- <prop key="hibernate.current_session_context_class">thread</prop> --> </props> </property> <!-- 配置orm元数据,会自动扫描该包下的所有配置文件 --> <property name="mappingDirectoryLocations" value="classpath:com/xan/domain"></property> </bean> <!-- 事务的核心管理器 依赖与连接池 --> <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置事务通知 --> <tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- 织入 --> <aop:config> <!-- 配置切入点 --> <aop:pointcut expression="execution(* com.xan.service.*.*(..))" id="pointcut"/> <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> </aop:config> <!-- 配置 Action --> <bean name="userAction" class="com.xan.web.UserAction" scope="prototype"> <property name="userService" ref="userService"></property> </bean> <!-- 配置 UserService--> <bean name="userService" class="com.xan.service.UserService" > <property name="userDao" ref="userDao"></property> </bean> <!-- 配置 UserDao --> <bean name="userDao" class="com.xan.dao.UserDao" > <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
3、struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 让spring帮我们创建action -->
<constant name="struts.objectFactory" value="spring"></constant>
<package name="MySSH" namespace="/" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="UserAction_*" class="com.xan.web.UserAction" method="{1}">
<result name="login">/login.jsp</result>
<result name="toIndex">/index.html</result>
</action>
</package>
</struts>
4、User
package com.xan.domain; public class User { private String id; private String username; private String password; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
5、User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.xan.domain"> <class name="User" table="user"> <id name="id" column="id"> <generator class="uuid"></generator> </id> <property name="username" column="username"></property> <property name="password" column="password"></property> </class> </hibernate-mapping>
6、UserDao
package com.xan.dao; import org.hibernate.Session; import org.hibernate.query.NativeQuery; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.xan.domain.User; public class UserDao extends HibernateDaoSupport{ public User findUser(User user) { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); // sql String sql = "select * from user where username = ? and password = ?"; NativeQuery sqlQuery = session.createSQLQuery(sql); sqlQuery.addEntity(User.class); sqlQuery.setParameter(1, user.getUsername()); sqlQuery.setParameter(2, user.getPassword()); User u = (User) sqlQuery.uniqueResult(); return u; } }
7、UserService
package com.xan.service; import com.xan.dao.UserDao; import com.xan.domain.User; public class UserService { private UserDao userDao ; public UserService() { System.out.println("UserService"); } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public boolean findUser(User user) { User u =null; u = userDao.findUser(user); return u!=null?true:false; } }
8、UserAction
package com.xan.web; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.xan.domain.User; import com.xan.service.UserService; public class UserAction extends ActionSupport implements ModelDriven<User>{ User user = new User(); private UserService userService ; // 配置 spring 管理,需要 get;set 属性 public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public String login() throws Exception { System.out.println(user.getUsername()+" "+user.getPassword()); boolean isSuccess = userService.findUser(user); if(isSuccess) { return "toIndex"; }else { ActionContext.getContext().put("error", "用户名或者密码错误"); return "login"; } } @Override public User getModel() { // TODO Auto-generated method stub return user; } }
9、login.css
/*閲嶇疆榛樿鐨勫杈硅窛鍜屽唴杈硅窛*/
*{
margin:0;
padding:0;
}
/*甯哥敤鏍囩鐨勬牱寮忛噸缃�*/
i{
font-style: normal;
}
a{
text-decoration: none;
}
input{
outline: none;
border:none;
}
/*璁惧畾html鍜宐ody鐨勫搴︿负100%*/
html,body{
width:100%;
background-color: #efefef;
font: 14px/150% tahoma,arial,Microsoft YaHei,Hiragino Sans GB,"\u5b8b\u4f53",sans-serif;
-webkit-font-smoothing: antialiased;
color: #666;
}
/*澶撮儴*/
.logo{
width: 160px;
height:50px;
background: url(../img/icon.png) no-repeat;
position: absolute;
top:20px;
left:20px;
}
.desc{
font-size: 18px;
line-height: 34px;
border-left: 1px solid #ccc;
position: absolute;
left: 200px;
top:28px;
padding-left: 20px;
font-weight:bold;
}
header{
width:100%;
height: 110px;
box-shadow: 10px 10px 10px rgba(111,111,111,.5);
position: relative;
}
.sec{
width: 1000px;
margin: 0px auto;
background-color: white;
}
/*娉ㄥ唽淇℃伅*/
/*鎬讳綋甯冨眬*/
form{
width: 400px;
margin: auto;
padding-top: 100px;
padding-bottom: 100px;
margin-top: 30px;
margin-bottom: 30px;
}
.register-box{
border: 1px solid #ddd;
margin-bottom: 32px;
}
.register-box label{
height: 52px;
line-height: 52px;
padding-left: 20px;
display: inline-block;
}
.register-box input{
width: 190px;
height: 19px;
padding-bottom: 11px;
padding-left: 20px;
padding-top: 16px;
font-size: 14px;
color: #666;
font-family: "Microsoft YaHei","Hiragino Sans GB";
}
.register-box .tips{
position: absolute;
margin-top: 5px;
font-size: 14px;
color: #ccc;
}
/*鐢ㄦ埛鍚�*/
.register-box .username_label{
word-spacing: 10px;
}
/*瀵嗙爜锛岀‘璁ゅ瘑鐮侊紝*/
.register-box .other_label{
word-spacing: 2px;
}
/*鎵嬫満鍙�*/
.register-box span{
display: inline-block;
width: 77px;
height: 52px;
border-right: 1px solid #ddd;
}
.register-box .phone{
padding-left: 18px;
}
/*楠岃瘉鐮�*/
#code{
display: inline-block;
width: 100px;
height: 46px;
vertical-align: middle;
background-color: black;
font-size: 25px;
color: #fff;
text-align: center;
line-height: 46px;
}
/*鍗忚*/
.arguement{
margin-bottom: 58px;
}
.arguement input{
vertical-align: middle;
}
.arguement a{
color: #38f;
text-decoration: none;
font-size: 12px;
}
/*鎻愪氦鎸夐挳*/
.submit_btn button{
width: 100%;
height: 54px;
color: #fff;
background: #3A71D0;
border: 0;
font-size: 16px;
font-family: "Microsoft YaHei","Hiragino Sans GB";
}
10、login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="css/login.css" />
</head>
<body>
<section class="sec">
<form action="${pageContext.request.contextPath }/UserAction_login" method="post">
<div class="register-box">
<label for="username" class="username_label">
用 户 名
<input maxlength="20" name="username" type="text"
placeholder="您的用户名和登录名" />
</label>
<div class="tips">
</div>
</div>
<div class="register-box">
<label for="username" class="other_label">
密 码
<input maxlength="20" type="password" name="password"
placeholder="建议至少使用两种字符组合" />
</label>
<div class="tips" style="color:red">
<s:property value="#error"/>
</div>
</div>
<div class="submit_btn">
<button type="submit" id="submit_btn">
立 即 登录
</button>
</div>
</form>
</section>
<script src="js/index.js" type="text/javascript" charset="utf-8"></script>
</body>
11、index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Index 界面</h1>
</body>
</html>
工程下载:Web框架之SSH框架的简单搭建的整理(基于Eclipse,搭建演示完整工程,jar、代码、html)-Web开发文档类资源-CSDN下载