极简Spring框架搭建Demo

看到自己第一次写的SSM框架搭建,简直惨不忍睹!很想把他给删了,但是我觉得应该把它保留,以提醒自己多么“渺小”,只有不断学习才能强大自我!
这篇博客也是我边看《精通Spring 4.x 企业应用开发实战》边写博客,记录自己搭建框架的历程,加强印象!
一、环境准备:

  1. jdk 1.8
  2. eclipse(没有使用IDEA,有兴趣的朋友可以试一下)
  3. apache-maven-3.3.9
  4. mysql 5.7
  5. spring 4.3.2.RELEASE

    二、新建Maven工程
    目录结构如下:
    这里写图片描述

1.先配置pom.xml文件:
首先是依赖的Spring的jar包

    <!-- 依赖的spring模块类库 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>${aspectj.version}</version>
    </dependency>

这些都是常规配置,可以直接去maven仓库寻找对应的jar包,下载方法啥的网上一大堆,不再赘述。

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

这些jar也是Spring开源的jar,不过第一个是用来连接数据库的,这里直接使用的是Spring薄层封装的jdbc,并没有使用mybatis或者hibernate持久层框架。MVC也是使用的Spring MVC。

<!-- 依赖的数据库驱动类 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <!-- 依赖了的连接池类库 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>${commons-dbcp.version}</version>
        </dependency>

        <!-- 依赖的web类库 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet-api.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>${servlet-jstl.version}</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

以上这些是数据库连接驱动,数据库连接池,web相关的jar与Junit测试的包。

三、Spring配置文件

<!-- 1.扫描类包,将标注Spring注解的类自动转化为bean,同时完成bean注入 -->
    <context:component-scan base-package="com.smart.dao" />
    <context:component-scan base-package="com.smart.service" />

    <!-- 加载配置属性文件 -->
    <context:property-placeholder
        ignore-unresolvable="false" location="classpath:jdbc.properties" />

    <!-- 2.定义一个DBCP实现的数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <!-- 定义jdbc模板bean -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 3.配置事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 通过AOP配置提供事务增强 -->
    <aop:config proxy-target-class="true">
        <aop:pointcut id="serviceMethod"
            expression="(execution(* com.smart.service..*(..))) and (@annotation(org.springframework.transaction.annotation.Transactional))"></aop:pointcut>
        <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"></aop:advisor>
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*"></tx:method>
        </tx:attributes>
    </tx:advice>

每一个配置注解已经说明其作用,唯独不太理解的是AOP事物增强的作用在那里?还要继续努力才是。

四、web.xml 配置

<!-- 1.从类路径下加载Spring配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/smart-context.xml</param-value>
    </context-param>

    <!-- 2.负责启动Spring容器监听器,它将引用1位置配置的上下文参数活的Spring配置文件的地址 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 3.Spring MVC的主控servlet -->
    <servlet>
        <servlet-name>smart</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <!-- spring MVC处理的URL -->
    <servlet-mapping>
        <servlet-name>smart</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

可以看出,web.xml的配置是非常简洁的,对于这次简单的小demo足矣!

五、xxx-servlet.xml 配置

<!-- 1.扫描web包,应用Spring MVC的注解 -->
    <context:component-scan base-package="com.smart.web"></context:component-scan>

    <!-- 2.配置视图解析器,将ModelAndViewj及字符串解析为具体的页面 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

这个也极其简单,先说其路径是存放在WEB-INF下,如果没有在文件中配置其所在位置,默认实在这个位置找名字如xxx-servlet.xml的配置文件。这里指定视图解析的类,与视图拼装的路径。再就是扫描Spring MVC的注解。

六、控制器编写

package com.smart.web;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.smart.domain.User;
import com.smart.service.UserService;

/**
 * @author 作者 louys:
 * @version 创建时间:2017年9月13日 上午8:51:45 类说明
 */
@Controller
public class LoginController {
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/index.html")
    public String loginPage() {
        return "login";
    }

    @RequestMapping(value = "/loginCheck.html")
    public ModelAndView loginCheck(HttpServletRequest req, LoginCommand loginCommand) {
        boolean isValidUser = userService.hasMatchUser(loginCommand.getUserName(), loginCommand.getPassword());
        if (!isValidUser) {
            return new ModelAndView("login", "error", "用户名或者密码错误!");
        } else {
            User user = userService.findUserByUserName(loginCommand.getUserName());
            user.setLastIp(req.getLocalAddr());
            user.setLastVisit(new Date());
            userService.loginSuccess(user);
            req.getSession().setAttribute("user", user);
        }
        return new ModelAndView("main");
    }
}

映射路径配置为/loginCheck.html,会被配置的默认servlet处理器拦截,然后派发下去找到对应的处理器,处理该次请求;请求结果以及视图会放在ModelAndView中,即模型视图里面。再由配置的视图解析器找到对应的jsp页面,jsp页面取出放在model里面的数据,显示出来。

代码已经上传,大家可以参考,不对的地方还望大家给出宝贵意见。菜鸟在这里谢过~

代码路径:https://github.com/ls0111/Test
也可以在CSDN上面下载,地址:(上传审核有点慢,明天上传地址)

猜你喜欢

转载自blog.csdn.net/ls0111/article/details/77986626
今日推荐