SSH框架的简单搭建登录

徘徊边缘 提交于 2019-11-26 14:18:31

一、SSH架构

1.Struts 2 + Spring + Hibernate

2.以Spring作为核心框架,数据持久化使用Hibernate完成,表现层使用Struts 2

3.Spring提供对象管理、面向切面编程等实用功能

4.通过Spring提供的服务简化编码、降低开发难度、提高开发效率

二、需要导入依赖jar

SSH整合体验最不好的就是添加jar包,由于三个框架所依赖的jar包非常多,其中有一些jar包可能冲突,我们应该将冲突的jar包,保留高级版本的,删掉低级版本的。

其中struts2-spring-plugin-xxx.jar 架包 是struts2和spring 整合的jar一定要记得加。

三.配置web.xml和src目录下创建一个config文件夹,在config文件夹添加springDao.xml,spring.xml,hibernate.cfg.xml,struts.xml,ehcache.xml等。

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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>SSH</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开启Hibernate的OpenSessionView模式 -->
    <filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>
          org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>
    <!-- 开启编码过滤器 -->
    <filter>
        <description>字符集过滤器</description>
        <filter-name>encodingFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
        <description>字符集编码</description>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 防止spring内存溢出监听器 -->
    <listener>
        <listener-class>
            org.springframework.web.util.IntrospectorCleanupListener
        </listener-class>
    </listener>
    <!-- Struts2的配置 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>struts-default.xml,struts-plugin.xml,config/struts.xml</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
    <!-- Spring的配置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:config/spring.xml,classpath:config/springDao.xml</param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <!-- 配置session超时时间,单位分钟 -->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
</web-app>

springDao.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:context="http://www.springframework.org/schema/context"
    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/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
       
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ssh" />
            <property name="user" value="root" />
            <property name="password" value="100" />
            <!-- 队列中的最小连接数 -->
            <property name="minPoolSize" value="15"></property>
            <!-- 队列中的最大连接数 -->
            <property name="maxPoolSize" value="25"></property>
            <!-- 当连接耗尽时创建的连接数 -->
            <property name="acquireIncrement" value="15"></property>
            <!-- 等待时间 -->
            <property name="checkoutTimeout" value="10000"></property>
            <!-- 初始化连接数 -->
            <property name="initialPoolSize" value="20"></property>
            <!-- 最大空闲时间,超出时间连接将被丢弃 -->
            <property name="maxIdleTime" value="20"></property>
            <!-- 每隔60秒检测空闲连接 -->
            <property name="idleConnectionTestPeriod" value="60000"></property>
        </bean>
        
        <!-- session工厂由spring来管理 -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
            <!-- 加载数据源对象,spring的配置方式 --> 
            <property name="dataSource"  ref="dataSource"/>
            <!-- 读取hibernate配置信息,hibernate配置方式 -->
            <property name="configLocation" value="classpath:config/hibernate.cfg.xml" />
            <!-- 自动加载映射文件 *表示匹配该文件下的所有映射文件 -->
            <property name="mappingLocations"
                     value="classpath:com/znsd/ssh/entities/mapper/*.hbm.xml" >
            </property>
        </bean>
        
        <!-- 配置事务 -->
        <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>
    
        <!-- 事务的通知方式 -->
        <tx:advice id="txAdvice" transaction-manager="txManager">
            <tx:attributes>
                <tx:method name="find*" propagation="REQUIRED" read-only="true" />
                <tx:method name="search*" propagation="REQUIRED" read-only="true" />
                <tx:method name="query*" propagation="REQUIRED" read-only="true" />
    
                <tx:method name="add*" propagation="REQUIRED" />
                <tx:method name="submit*" propagation="REQUIRED" />
                <tx:method name="save*" propagation="REQUIRED" />
                <tx:method name="insert*" propagation="REQUIRED" />
    
                <tx:method name="del*" propagation="REQUIRED" />
                <tx:method name="remove*" propagation="REQUIRED" />
    
                <tx:method name="update*" propagation="REQUIRED" />
                <tx:method name="modify*" propagation="REQUIRED" />
    
                <tx:method name="*" propagation="REQUIRED" read-only="true" />
            </tx:attributes>
        </tx:advice>
    
        <!-- AOP切面拦截事务,事务一定是加在业务层 -->
        <aop:config>
            <aop:pointcut id="serviceMethod"
                expression="execution(* com.znsd.ssh.service.impl.*.*(..))" />
            <aop:advisor advice-ref="txAdvice"
                pointcut-ref="serviceMethod" />
        </aop:config>
   
</beans>

一般项目中使用连接池进行数据库连接,这里我们选用c3p0连接池。首先添加c3p0的连接池信息。 首先需要导入c3p0连接池对应的驱动包。 当然也可以选用其他连接池信息,只需要修改对应的驱动类和参数即可。 连接池信息有两种配置方案: 在springDao文件中配置。 在hibernate.cfg.xml文件配置   ----     我是用的springDao.xml配置的。

 

spring.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"
    default-autowire="byType"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    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-4.2.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
    
    <!-- 使用spring注解方式 --> 
    
    <!-- 指定要扫描的某个文件夹中的Bean -->
    <context:component-scan base-package="com.znsd.ssh">
        <!-- 只检索指定的规则 只不过要在context:component-scan下加上 use-default-filters="false"-->
        <!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
        <!-- 排除指定的规则 -->
        <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
    </context:component-scan>
</beans>

hibernate.cfg.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!-- 数据库方言 -->
            <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
            <!-- 在控制台输出sql语句 -->
            <property name="show_sql">true</property>
            <!-- 格式化sql语句 -->
            <property name="format_sql">true</property>
            <!-- 数据库生成策略 -->
            <property name="hibernate.hbm2ddl.auto">update</property>
        </session-factory>
    </hibernate-configuration>

struts.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.i18n.encoding" value="UTF-8"/>
    <!-- 开启OGNL的静态访问 -->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
    <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开--> 
    <constant name="struts.configuration.xml.reload" value="true" /> 
    <!-- 开发模式下使用,这样可以打印出更详细的错误信息 --> 
    <constant name="struts.devMode" value="true" />  
    
    <!-- 登录 -->
    <package name="default" namespace="/" extends="struts-default">
        <action name="*">
            <result name="success">/WEB-INF/veiws/{1}.jsp</result>
        </action>
        
        <action name="loginPost" class="loginAction" method="loginpost">
            <result name="success">/WEB-INF/veiws/welcome.jsp</result>
            <result name="input">/WEB-INF/veiws/login.jsp</result>
        </action>
        
        <action name="registerPost" class="registerPost" method="registerpost">
            <result name="success">/WEB-INF/veiws/welcome.jsp</result>
            <result name="input" type="dispatcher">register.action</result>
        </action>
        
        <action name="welcome" class="indexAction" method="index"></action>
    </package>
</struts>

ehcache.xml配置

<ehcache>
    <cache name="sampleCache1"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />
    <cache name="sampleCache2"
        maxElementsInMemory="1000"
        eternal="true"
        timeToIdleSeconds="0"
        timeToLiveSeconds="0"
        overflowToDisk="false"
        /> 
</ehcache>

四,下面是代码实现的功能。

 创建一个实体类和一个属性映射xml

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.znsd.ssh.entities.UserInfo" table="user">
             <id name="userId" column="userId">
                 <generator class="native"></generator>
             </id>
             <property name="userName" column="userName"></property>
             <property name="password" column="password"></property>
        </class>
    </hibernate-mapping>

实体类

package com.znsd.ssh.entities;

import java.io.Serializable;

import org.springframework.stereotype.Component;

@Component
public class UserInfo implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Integer userId;
    private String userName;
    private String password;
    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    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;
    }
    @Override
    public String toString() {
        return "UserInfo [userId=" + userId + ", userName=" + userName + ", password=" + password + "]";
    }
}

Action

package com.znsd.ssh.action;

 

import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;
import com.znsd.ssh.entities.UserInfo;
import com.znsd.ssh.service.UserService;

@Controller
public class LoginAction extends ActionSupport{
/**
* 
*/
private static final long serialVersionUID = 1L;
@Autowired
@Qualifier("userService")
private UserService userService;

//登录
public String loginpost(){
for (UserInfo userInfo : list) {
  System.out.println(userInfo.getClass().getName());
}
System.out.println(user);
if(userService.login(user)) {
  return SUCCESS;
}else {
  return INPUT;
}

}
}

 

 

javaBean

BaseDao接口和实现类BaseDaoImpl如下:

package com.znsd.ssh.dao;

import java.io.Serializable;
import java.util.List;

public interface BaseDao <T>{
    //实现添加的方法
    Serializable save(T entity);
    
    //实现删除的方法
    void delete(T entity);
    
    //根据id来删除的方法
    void delete(Class<T> clazz,Serializable id);
    
    //实现更新的方法
    void update(T entity);
    
    //根据id来获取对象
    T get(Class<T> clazz, Serializable id);
    
    //实现查询所有数据的方法
    List<T> findAll(Class<T> clazz);
    
    //实现根据条件查询的方法
    List<T> findAll(Class<T> clazz,String where,Object[] paras);
}
package com.znsd.ssh.dao;

import java.io.Serializable;
import java.util.List;

public interface BaseDao <T>{
    //实现添加的方法
    Serializable save(T entity);
    
    //实现删除的方法
    void delete(T entity);
    
    //根据id来删除的方法
    void delete(Class<T> clazz,Serializable id);
    
    //实现更新的方法
    void update(T entity);
    
    //根据id来获取对象
    T get(Class<T> clazz, Serializable id);
    
    //实现查询所有数据的方法
    List<T> findAll(Class<T> clazz);
    
    //实现根据条件查询的方法
    List<T> findAll(Class<T> clazz,String where,Object[] paras);
}

UserDao接口和实现类UserDaoImpl如下:

package com.znsd.ssh.dao;

import java.util.List;


import com.znsd.ssh.entities.UserInfo;

public interface UserDao extends BaseDao<UserInfo>{
    public boolean login(UserInfo user);
}
package com.znsd.ssh.dao;

import java.util.List;


import com.znsd.ssh.entities.UserInfo;

public interface UserDao extends BaseDao<UserInfo>{
    public boolean login(UserInfo user);
}

UserService接口和实现类UserServiceImpl

package com.znsd.ssh.service;

import java.util.List;

import com.znsd.ssh.entities.UserInfo;

public interface UserService {
    public boolean login(UserInfo user);
}
package com.znsd.ssh.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.znsd.ssh.dao.UserDao;
import com.znsd.ssh.entities.UserInfo;
import com.znsd.ssh.service.UserService;

@Service("userService")
public class UserServiceImpl implements UserService{
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
    
    @Override
    public boolean login(UserInfo user) {
        return userDao.login(user);
    }  
}

jsp页面

测试:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <% response.sendRedirect("login.action"); %>
</body>
</html>

下面WebContent\WEB-INF\veiws所有的jsp

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
    <form action="loginPost.action" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="user.userName"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="user.password"></td>
            </tr>
            <tr>
                <td><input type="submit" value="提交"></td>
                <td><input type="reset" value="重置"></td>
            </tr>
        </table>
    </form>
    <a href="register.action">没有账号?立即注册</a>
</body>
</html>

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
    <h1>欢迎来到SSH!</h1>
</body>
</html>

这样一个简单的ssh框架就搭建好了,只做了一个简单的登录功能能!

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!