极简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上面下载,地址:(上传审核有点慢,明天上传地址)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值