idea maven sss(Spring+Struts+SpringDataJpa)实现简单登录

Posted Eli Shaw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了idea maven sss(Spring+Struts+SpringDataJpa)实现简单登录相关的知识,希望对你有一定的参考价值。

前言

    最近学习 Java,昨天刚搞完ssh的简单登录实现,今天搞了搞sss(即Spring+Struts+SpringDataJpa),使用 SpringDataJpa 代替 Hibernate 进行持久化操作,但是网上相关(SpringDataJpa)的资料太少了,走了不少弯路,今天写个全面的博客记录一下,方便以后复习,也为需要的朋友提供方便。

    完整代码在此下载:sssDemo

环境

    1.IDEA 2017

    2.Oracle12c

注意事项

    不同环境,不同版本的 oracle 数据库,使用的架包版本与相关配置也需要改变

创建项目



pom.xml 配置

    1.由于 Oracle 授权问题,Maven 不提供 Oracle JDBC Driver,使用方法:在 IDEA 中使用 Oracle JDBC 驱动

    2.pom.xml配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.eli.sss</groupId>
    <artifactId>sssDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 各架包的版本号 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>5.0.3.RELEASE</spring.version>
        <springData.version>2.0.4.RELEASE</springData.version>
        <hibernate.version>5.2.13.Final</hibernate.version>
        <struts2.version>2.5.14</struts2.version>
    </properties>
    
    <dependencies>

        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>$spring.version</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>$spring.version</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>$springData.version</version>
        </dependency>

        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>$hibernate.version</version>
        </dependency>

        <!-- struts2 -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>$struts2.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>$struts2.version</version>
        </dependency>

        <!-- 添加对数据源的支持 -->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>12.2.0.1.0</version>
        </dependency>
    </dependencies>
</project>

创建 Java 目录

配置 applicationContext.xml

    1.创建 db.properties 设置 Oracle 数据库的配置信息

db.database=oracle
db.driverClassName=oracle.jdbc.driver.OracleDriver
db.userName=xxx
db.password=xxx
db.url=jdbc:oracle:thin:@localhost:1521:orcl

    2.设置 applicationContext.xml



    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:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       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/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <!-- 引入数据库配置文件 db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>

    <!-- 使用annotation -->
    <context:annotation-config/>
    <!-- 使用annotation自动注册bean,并检查@Controller, @Service, @Repository注解已被注入 -->
    <context:component-scan base-package="cn.eli.sss.action"/>
    <context:component-scan base-package="cn.eli.sss.service"/>
    <context:component-scan base-package="cn.eli.sss.dao"/>

    <!-- data connection setting -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="$db.driverClassName"></property>
        <property name="jdbcUrl" value="$db.url"></property>
        <property name="user" value="$db.username"></property>
        <property name="password" value="$db.password"></property>
        <!-- 设置数据库连接池的最大连接数 -->
        <property name="maxPoolSize">
            <value>50</value>
        </property>
        <!-- 设置数据库连接池的最小连接数 -->
        <property name="minPoolSize">
            <value>5</value>
        </property>
        <!-- 设置数据库连接池的初始化连接数 -->
        <property name="initialPoolSize">
            <value>5</value>
        </property>
        <!-- 设置数据库连接池的连接最大空闲时间 -->
        <property name="maxIdleTime">
            <value>20</value>
        </property>
        <!-- c3p0缓存Statement的数量数 -->
        <property name="maxStatements">
            <value>50</value>
        </property>
        <!-- 当连接池里面的连接用完的时候,C3P0一下获取新的连接数 -->
        <property name="acquireIncrement">
            <value>20</value>
        </property>

    </bean>

    <!-- springJPA 管理-->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
        </property>
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
        <property name="packagesToScan" value="cn.eli.sss.entity"/>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <!--是否显示 SQL-->
                <prop key="hibernate.show_sql">true</prop>
                <!--如果显示 SQL,输出的 SQL 时候要格式化-->
                <prop key="hibernate.format_sql">true</prop>
                <!--在显示的 SQL 中增加一些 Hibernate 提供的注释说明,依此来解释它生成的 SQL 意思-->
                <!--配置如何根据java模型生成数据库表结构,常用update,validate-->
                <prop key="hibernate.use_sql_comments">true</prop>
                <prop key="hibernate.hbm2ddl.auto">validate</prop>
                <!--关于这个属性可以看:http://blog.csdn.net/dracotianlong/article/details/27834143-->
                <!--ImprovedNamingStrategy 是采用下划线,符合我们一般命名表字段的习惯-->
                <!--所以,命名规则 My_NAME->MyName-->
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
            </props>
        </property>
    </bean>

    <!-- Hibernate对Jpa的实现 -->
    <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    <jpa:repositories base-package="cn.eli.sss.dao" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>

    <!--配置针对JPA的局部事务管理器-->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
</beans>

使用 IDEA 连接 Oracle 数据库


    其中 Name 不用管(任意),Host 是数据库的主机名,SID 、User、Password 可在你要使用的数据库中查看,查看方法如下:

    打开 SQL Developer —— 右键查看的数据库 —— 属性 —— 左边选中要查看的数据库(system-orcl) —— 右面显示的是数据库信息,其中 SID 就是 IDEA 连接时使用的 SID

 

使用 Persisstence 创建数据库映射实体类




    在 IDEA 左下角找到 Persistence




    现在实体类创建完成,如下


编写 Dao 层实体类代码

@Repository
public interface UserDao extends JpaRepository<EliUser, Long> 

    /**
     * 根据用户名密码查询数据
     *
     * @param name
     * @param password
     * @return
     */
    EliUser findByNameAndPassword(String name, String password);

    注:其中方法名 findByNameAndPassword 不是随便起的,spring-data-jpa 提供了 CURD,这条语句就是查询语句,以findBy 开头,Name 是用户实体类(EliUser)中的名称字段 name,And 相当于 SQL 语句中的 and 关键字,Password 是用户实体类(EliUser)中的密码字段 password。具体的 SpringDataJpa 使用方法,可以去百度,有很多资料,在这里就不再重复说明。 

编写 Service 层实体类代码

    为了代码的可拓展性,我们把实现与定义分离;在src/main/java/cn/eli/sss/service下面再建立一个 impl 包,存放接口的实现类;在 service 目录下新建一个 UserService.java 接口类(记住是接口,在选择类型的时候要选择接口), 在 impl 放这个接口的实现类,UserServiceImpl.java

    UserService.java 内容如下:

public interface UserService 

    boolean login(EliUser user);

    UserServiceImpl.java 内容如下:

@Service("userService")
public class UserServiceImpl implements UserService 

    @Resource
    private UserDao userDao;

    public boolean login(EliUser user) 

        EliUser eliUser = this.userDao.findByNameAndPassword(user.getName(), user.getPassword());

        if (eliUser == null)
            return false;
        else
            return true;
    

编写 Action 层代码

    Action 主要是调用业务逻辑,结合 struts.xml 来进行处理页面跳转,我们是希望实现用户登录,在 action 包下建立一个 UserAction.java,代码如下

@Controller("userAction")
@Scope("prototype")
public class UserAction extends ActionSupport 

    @Resource
    private UserService userService;

    private EliUser user;

    public EliUser getUser() 
        return user;
    

    public void setUser(EliUser user) 
        this.user = user;
    

    public String login() 
        if (userService.login(user)) 
            Map session = ActionContext.getContext().getSession();
            session.put("user", user);
            return SUCCESS;
         else 
            return ERROR;
        
    

        现在所有实体类的代码已经完成,整体结构如下:

配置 struts2


    strtus.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"/>
    <!--由spring管理struts的Action实例-->
    <constant name="struts.objectFactory" value="spring" />
    <!--启用通配符-->
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <!--在URL中的Action段中支持斜线-->
    <constant name="struts.enable.SlashesInActionNames" value="true"/>

    <package name="user" namespace="/" extends="struts-default" strict-method-invocation="false">

        <action name="user_*" class="userAction" method="1">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

配置 Web




    web.xml 内容如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- struts2容器控制器 -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- spring容器配置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
    </context-param>

    <!-- spring容器监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
    <!-- 欢迎页面 -->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

编写 JSP 页面

    1.index.jsp (登录页面)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="user_login.action" method="post">
    <input type="text" name="user.name" placeholder="输入用户名"/>
    <br/>
    <input type="password" name="user.password" placeholder="输入密码"/>
    <br/>
    <input type="submit" value="登录">
    <input type="reset" value="重置">
</form>
</body>
</html>

    2.success.jsp(登录成功页面)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
<h1>hello $user.name</h1>
</body>
</html>

    3.error.jsp(登录失败页面)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>somethin error</h1>
</body>
</html>

Tomcat 部署





运行项目,完成。


以上是关于idea maven sss(Spring+Struts+SpringDataJpa)实现简单登录的主要内容,如果未能解决你的问题,请参考以下文章

Java EE 学习:IDEA + maven + spring 搭建 web- 用户管理

intellij idea通过maven创建spring项目

Java EE 学习:IDEA + maven + spring 搭建 web

6.IDEA用maven新建带spring框架的工程

Java EE 学习:IDEA + maven + spring 搭建 web- 配置数据库

手动创建spring项目(maven/IDEA环境)