SSH2快速整合(最新)

引述
SSH,是最简单的Struts2+Spring3+Hibernate3 数据库使用的是[MySQL。分别列出整合需要的jar 包.

** struts2.5**:

asm-5.1.jar
asm-commons-5.1.jar
asm-tree-5.1.jar
commons-fileupload-1.3.2.jar
commons-io-2.4.jar
commons-lang-2.4.jar
commons-lang3-3.4.jar
commons-logging-1.1.3.jar
freemarker-2.3.23.jar
javassist-3.20.0-GA.jar
json-lib-2.3-jdk15.jar
list.txt
log4j-api-2.7.jar
log4j-core-2.3.jar
ognl-3.1.12.jar
slf4j-api-1.7.12.jar
struts2-convention-plugin-2.5.10.1.jar
struts2-core-2.5.10.1.jar
struts2-json-plugin-2.5.10.1.jar
struts2-spring-plugin-2.5.10.1.jar


Hibernate5:

antlr-2.7.7.jar
cdi-api-1.1.jar
classmate-1.3.0.jar
dom4j-1.6.1.jar
el-api-2.2.jar
geronimo-jta_1.1_spec-1.1.1.jar
hibernate-commons-annotations-5.0.1.Final.jar
hibernate-core-5.2.2.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-2.0.0.Final.jar
javassist-3.20.0-GA.jar
javax.inject-1.jar
jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
jboss-logging-3.3.0.Final.jar
jsr250-api-1.0.jar
list.txt
mysql-connector-java-5.1.7-bin.jar


spring 4.3.8

aopalliance.jar
aspectjweaver.jar
commons-logging-1.1.1.jar
list.txt
spring-aop-4.3.8.RELEASE.jar
spring-aspects-4.3.8.RELEASE.jar
spring-beans-4.3.8.RELEASE.jar
spring-context-4.3.8.RELEASE.jar
spring-context-support-4.3.8.RELEASE.jar
spring-core-4.3.8.RELEASE.jar
spring-expression-4.3.8.RELEASE.jar
spring-instrument-4.3.8.RELEASE.jar
spring-instrument-tomcat-4.3.8.RELEASE.jar
spring-jdbc-4.3.8.RELEASE.jar
spring-jms-4.3.8.RELEASE.jar
spring-messaging-4.3.8.RELEASE.jar
spring-orm-4.3.8.RELEASE.jar
spring-oxm-4.3.8.RELEASE.jar
spring-test-4.3.8.RELEASE.jar
spring-tx-4.3.8.RELEASE.jar
spring-web-4.3.8.RELEASE.jar
spring-webmvc-4.3.8.RELEASE.jar
spring-webmvc-portlet-4.3.8.RELEASE.jar
spring-websocket-4.3.8.RELEASE.jar


配置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>SSH2</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>
    <!-- struts2 全局过滤器 -->
     <filter>
        <filter-name>action2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>action2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- spring framework 配置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:ApplicationContext.xml</param-value>
    </context-param>
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

配置struts2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 配置为开发模式 -->  
    <constant name="struts.devMode" value="false" />  
    <!-- 把扩展名配置为action -->  
    <constant name="struts.action.extension" value="action" />  
    <!-- 把主题配置为simple -->  
    <constant name="struts.ui.theme" value="simple" />  
    <constant name="struts.i18n.encoding" value="GBK" />
    <package name="struts2" extends="struts-default" namespace="/">
        <action name="dgw" class="registerAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts> 

配置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: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-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- jdbc 数据配置 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="jdbc:mysql://localhost:3306/wsy_student?useUnicode=true&amp;characterEncoding=utf-8" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
    </bean>
    
    <!-- Action 配置  交给spring来管理-->
    <bean id="registerAction" class="action.registerAction" scope="prototype">
    <property name="indexService" ref="indexService"></property>
    </bean>
    <!-- DAO类 -->
       <bean id="myDao" class="ssh.daoimpl.UserDaoimpl" scope="prototype">
        <property name="sessionFactory" ref="mysessionFactory"></property>  
        </bean>
        <!-- Services类 -->
        <bean id="indexService" class="ssh.serviceimpl.IndexServiceImpl" scope="prototype">
        <property name="dao" ref="myDao"></property>  
        </bean>
    <!-- 会话工厂 -->
    <bean id="mysessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <!-- 注入连接池,包含了数据库用户名,密码等等信息 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 配置Hibernate的其他的属性 -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.connection.autocommit">false</prop>
                <!-- <prop key="current_session_context_class">thread</prop> -->
                <!-- 开机自动生成表 -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list>
            <!-- 路径错了容易出现 erros create 。。。。。 -->
                <value>ssh/entity/User.hbm.xml</value>
            </list>
        </property>    
    </bean>
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="mysessionFactory"></property>
    </bean>
    <!-- 开启注解事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>


采用最新的SSH配置需要配置log,避免输出警告

  • log4j.properties
<?xml version="1.0" encoding="UTF-8"?>
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
  • log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="warn">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>


在环境搭建完成以后编写测试文件

package test;

import org.hibernate.SessionFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class testdemo {
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        SessionFactory bean = (SessionFactory) context.getBean("mysessionFactory");
        System.out.println(bean);
    }
}


进行项目分层

  • 实体User
// default package
// Generated 2017-6-3 22:03:50 by Hibernate Tools 5.2.3.Final
package ssh.entity;
import java.util.Date;

/**
 * User generated by hbm2java
 */
public class User implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String password;
    private Integer qqnumber;
    private String username;
    private Date time;

    public User() {
    }

    public User(String password, Integer qqnumber, String username, Date time) {
        this.password = password;
        this.qqnumber = qqnumber;
        this.username = username;
        this.time = time;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", password=" + password + ", qqnumber="
                + qqnumber + ", username=" + username + ", time=" + time + "]";
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getQqnumber() {
        return this.qqnumber;
    }

    public void setQqnumber(Integer qqnumber) {
        this.qqnumber = qqnumber;
    }

    public String getUsername() {
        return this.username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getTime() {
        return this.time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

}

  • 实体映射
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generated 2017-6-3 22:03:50 by Hibernate Tools 5.2.3.Final --><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-access="property"
    default-cascade="none" default-lazy="true">
    <!-- 如果是hibernate tools 自动生成的hbm 容易出现 exception is org.hibernate.MappingException: -->
    <class catalog="wsy_student" dynamic-insert="false"
        dynamic-update="false" mutable="true" name="ssh.entity.User"
        optimistic-lock="version" polymorphism="implicit"
        select-before-update="false" table="user">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property generated="never" lazy="false" name="password"
            optimistic-lock="true" type="string" unique="false">
            <column name="password" />
        </property>
        <property generated="never" lazy="false" name="qqnumber"
            optimistic-lock="true" type="java.lang.Integer" unique="false">
            <column name="qqnumber" />
        </property>
        <property generated="never" lazy="false" name="username"
            optimistic-lock="true" type="string" unique="false">
            <column name="username" />
        </property>
        <property generated="never" lazy="false" name="time"
            optimistic-lock="true" type="date" unique="false">
            <column length="10" name="time" />
        </property>
    </class>
</hibernate-mapping>

  • DAO层实现类
package ssh.daoimpl;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

import ssh.dao.UserDao;
import ssh.entity.User;

//创建IndexDaoImpl(实现类)实现IndexDao接口
@Transactional
public class UserDaoimpl implements UserDao {

    // 在SSH的设计理念:要使用某个实例,那么就定义声明一个对象,然后
    // 给它添加set方法(用于spring注入进来)
    // 实现不要关注这个实例来自于那里,以及怎么创建,或者它是谁
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @SuppressWarnings("deprecation")
    @Override
    public List<User> getAllUser() {
        // sessionFactory这个实例可以自己按常规的hibernate传统写法创建
        // 也可以交给spring去托管
        /*
         * onfiguration cfg = new Configuration().configure(); sessionFactory =
         * cfg.buildSessionFactory();
         */
        // 获取session
        Session session = sessionFactory.getCurrentSession();
        // 后面当使用JPA的时候,EntityManager 类似于 Session
        List<User> list = session.createQuery("from User").list();
        for (User user : list) {
            System.out.println(user.toString());
        }
        
        return list;
    }

}

  • Sevices实现类
package ssh.serviceimpl;

import java.util.List;

import ssh.dao.UserDao;
import ssh.entity.User;
import ssh.service.IndexService;

//创建IndexServiceImpl(实现类)实现IndexService接口
public class IndexServiceImpl implements IndexService {

    // dao实例使用注入方式
    private UserDao dao;

    // 用于注入使用
    public void setDao(UserDao dao) {
        this.dao = dao;
    }
    // 本类应该编写业务逻辑的代码,
    // 但本例没有业务逻辑,就不用写。
    // 访问数据库的代码,不会出现在service这一层
    // 交给dao来操作数据库

    @Override
    public List<User> getAllUser() {
        // 进行其它的业务逻辑操作,比如增加多一个选项,是否过期
        // 本例不需要
        // ....
        List<User> list = dao.getAllUser();
        return list;
    }

}

  • Action 实现类 这里采用的spring来管理的action的实例,主要可以进行aop加强操作
package action;

import java.util.List;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import ssh.entity.User;
import ssh.service.IndexService;

public class registerAction extends ActionSupport{
    //声明service,但不给它创建具体的实现类的实例,
    private IndexService indexService;
     //添加set()方法
    public void setIndexService(IndexService indexService) {
        this.indexService = indexService;
    }

    /**
     * //编写execute()方法
     */
    private static final long serialVersionUID = 1L;

    @Override
    public String execute() throws Exception {
        List<User> list = indexService.getAllUser();
        ActionContext context = ActionContext.getContext();
        context.put("userlist", list);
        return ActionSupport.SUCCESS;
    }
    
    

}
  • jsp显示层
<%@ page language="Java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s"  uri="/struts-tags"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>??</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
    <s:iterator begin="0" step="1" var="log" value="userlist">
        <table>
            <tbody>
                <tr>
                    <td>
                    <s:property value="#log.username"/>
                    </td>
                </tr>
            </tbody>
        </table>
    </s:iterator>
</body>
</html>

SSH的搭建到此结束了,在开发中,不能采用spring提供的jdbc的支持,应采用数据库连接池,并且继承 spring 提供相应的 Dao 模版

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,961评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,444评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,009评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,082评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,101评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,271评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,738评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,395评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,539评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,434评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,481评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,160评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,749评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,816评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,038评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,548评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,140评论 2 341

推荐阅读更多精彩内容