`

Spring基础:稍显复杂的Spring Hello World

阅读更多
本文参考《Spring 3.x企业应用开发》这本书完成,作为自己学习的一个纪录。

第一步:先新建一个数据库sampledb,然后新建两张表t_user和t_login_log
DROP DATABASE IF EXITST sampledb;
CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8;
CREATE TABLE t_user(
user_id INT AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(30),
credits INT,
password VARCHAR(32),
last_visit DATETIME,
last_ip VARCHAR(23)
) ENGINE=INNODB;
CREATE TABLE t_login_log(
login_log_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
ip VARCHAR(23),
login_datetime DATETIME
) ENGINE=INNODB;
INSERT INTO t_user(user_name,password) VALUES('admin','12345');


因为我很多时候使用Derby开发测试,所以这里也同时记录上Derby的表格DDL
create table t_user(
user_id int not null generated by default as identity (start with 100, increment by 1),
user_name varchar(30),
credits int,
password varchar(32),
last_visit timestamp,
last_ip varchar(23));

create table t_login_log(
login_log_id int not null generated by default as identity (start with 100, increment by 1),
user_id int,
ip varchar(23),
login_datetime timestamp);

insert into t_user(user_name,password) values('admin','12345');


第二步:按照上一篇所写的做一个能用的基于Maven的服务。

第三步:在Maven中添加Spring的依赖
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.1.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.1.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.1.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.1.2.RELEASE</version>
</dependency>


Mysql的Jdbc相关
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.38</version>
</dependency>
<dependency>
     <groupId>org.apache.derby</groupId>
     <artifactId>derbyclient</artifactId>
     <version>10.13.1.1</version>
</dependency>
<dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-dbcp2</artifactId>
     <version>2.1.1</version>
</dependency>


AOP相关
<dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjweaver</artifactId>
     <version>1.8.7</version>
</dependency>


第四步:建立包结构
com.firethewhole.maventest02.domain
com.firethewhole.maventest02.dao
com.firethewhole.maventest02.service
com.firethewhole.maventest02.web

第五步:根据数据库表t_user和t_login_log建立实体对象
public class User {
    private int userId;
    private String userName;
    private int credits;
    private String password;
    private Date lastVisit;
    private String lastIp;
    // 相关的Get Set方法
}

public class LoginLog {
    private int loginLogId;
    private int userId;
    private String ip;
    private Date loginDatetime;
    // 相关的Get Set方法
}


第六步:数据操作层
需要给类加上Repository注解,对于需要注入的类,需要加上Autowired注解,这样Spring启动的时候会自动注入相关的类
@Repository
public class UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    // 具体函数可以查看附件,jdbc封装了普通JDBC操作的细节。
    // DriverManager.getConnectin();conn.CreateStatement();stat.execute();
    public int getMatchCount(String userName, String password) {..}
    public User findUserByName(String userName) {..}
    public void updateLoginInfo(User user) {..}
}

@Repository
public class LoginLogDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public void insertLoginLog(LoginLog loginLog) {..}
}


需要在Spring配置文件中配置IOC相关的信息,在src/main/resources目录中
这里需要一个数据库连接池给jdbcTemplate来用,有cp30和dbcp可以使用,这里使用了Apache的dbcp2
<beans>
    <context:component-scan base-package="com.firethewhole.maventest01.dao" />
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
        destroy-method="close"
        p:driverClassName="com.mysql.jdbc.Driver"
        p:username="root"
        p:password="1234"
        p:url="jdbc:mysql://localhost:3306/sampledb" />
        
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
        p:dataSource-ref="dataSource"/>
</beans>

当然如果使用Derby的话,稍微要改下jdbc配置
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    destroy-method="close"
    p:driverClassName="org.apache.derby.jdbc.ClientDriver"
    p:url="jdbc:derby://localhost:1527/sampledb"/>


第七步:编写Service层,需要给类加上Service注解
@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Autowired
    private LoginLogDao loginLogDao;

    public boolean hasMatchUser(String userName, String password) {..}
    public User findUserByName(String userName) {..}
    public void loginSuccess(User user) {..}
}



第八步:这里需要将service层下面的类加入容器管理。
<beans>
    <context:component-scan base-package="com.firethewhole.maventest01.service" />
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" />
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    <aop:config proxy-target-class="true">
        <aop:pointcut expression="execution(* com.firethewhole.maventest01.service..*(..))" id="serviceMethod"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
    </aop:config>
</beans>


第九步:在web.xml中配置contextConfigLocation,Listener,DispatcherServlet


第十步:需要编写Controller层的代码
@Controller
public class LoginController {
	
	@Autowired
	private UserService userService;
	
	@RequestMapping("/index.html")
	public String login() {
		return "login";
	}
	
	@RequestMapping("/loginCheck.html")
	public ModelAndView loginCheck(HttpServletRequest request, LoginCommand loginCommand) {
		String userName = loginCommand.getUserName();
		String password = loginCommand.getPassword();
		boolean flg = userService.hasMatchUser(userName, password);
		
		ModelAndView result = null;
		if (!flg) {
			result = new ModelAndView("login", "error", "请输入正确的用户名和密码");
		} else {
			User user = userService.findUserByName(userName);
			user.setLastIP(request.getRemoteAddr());
			user.setLastVisit(new Date());
			
			userService.loginSuccess(user);
			
			request.getSession().setAttribute("user", user);
			
			result = new ModelAndView("main");
		}
		
		return result;
	}
}


第十一步:配置试图解析器,在/WEB-INF/maventest02
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    <context:component-scan base-package="com.firethewhole.maventest01.web"/>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:viewClass="org.springframework.web.servlet.view.JstlView"
    p:prefix="/WEB-INF/views/"
    p:suffix=".jsp"/>
</beans>


第十二步:编写JSP来运行。
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登陆</title>
</head>
<body>
<c:if test="${!empty error}">
<font color="red"><c:out value="${ error }"></c:out></font>
</c:if>
<form action="<c:url value="/loginCheck.html"/>" method="post">
用户名:<input type="text" name="userName"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>


main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>宝宝淘论坛</title>
</head>
<body>
亲爱的顾客:${user.userName},您好,您的积分有:${user.credits}
</body>
</html>


这样一个可以运行的Spring程序就建立好了。

在编写过程中我发生了很多错误,现在记录下来:
1:包名写错,明明是com.firethewhole.maventest03.dao,却写成了com.firethewholemaventest03.dao,错误很难找,一直以为自己写的是对的

2:将JSP中的${}写成了!{}

3:Mysql默认的用户名是root,写成了admin

4:tx:attributes写成了tx:attribute,少了一个s

5:当我在使用ApplicationContext的时候,只引用了spring-beans.jar,实际上这个接口在spring-context.jar包里面。
分享到:
评论

相关推荐

    Spring4 HelloWorld

    "Spring4 HelloWorld"是入门Spring框架的基础教程,主要涉及以下几个关键知识点: 1. **Spring框架概述**:Spring是一个开源的Java平台,它提供了一个全面的编程和配置模型,用于现代Java应用。Spring的核心特性...

    helloworld spring mvc

    Spring MVC 是一个强大的Java Web开发框架,用于构建高效、可维护的Web应用程序。"helloworld spring mvc"项目是入门...通过实践这个项目,开发者可以逐步掌握Spring MVC的使用,为后续的复杂Web应用开发打下坚实基础。

    利用Spring输出HelloWorld

    本文将深入探讨如何利用Spring框架输出“HelloWorld”,并介绍相关的基础知识。 首先,Spring是一个开源的Java平台,它为创建复杂的、模块化的、松耦合的Java应用程序提供了强大的支持。它的核心特性包括依赖注入...

    Eclipse下Spring示例HelloWorld程序

    在Eclipse这个强大的Java集成开发环境中,创建一个Spring框架的HelloWorld程序是学习Spring入门的典型步骤。这个程序展示了如何在Eclipse中配置Spring环境,编写简单的Bean定义,并通过Spring的IoC(Inversion of ...

    Spring的AOP示例DEMO HELLOWORLD

    本示例DEMO "Spring的AOP示例DEMO HELLOWORLD" 将引导我们深入理解Spring AOP的核心概念,并通过一个简单的 HelloWorld 示例来展示其实现过程。 首先,面向切面编程(AOP)是一种编程范式,旨在提高代码的可维护性...

    spring5.0_mvc_maven项目_HelloWorld实例

    这个“HelloWorld”实例展示了Spring 5.0 MVC的基础用法,包括如何配置MVC环境、编写Controller以及展示结果。随着对Spring MVC的深入了解,你可以添加更多的功能,如处理POST请求、使用ModelAndView对象传递复杂...

    spring MVC的HelloWorld完整实例

    这个"HelloWorld"实例是初学者学习Spring MVC的入门项目,它展示了如何配置、创建和运行一个基本的Spring MVC应用。下面将详细介绍这个实例中的关键知识点。 1. **Spring MVC架构**: Spring MVC遵循模型-视图-...

    spring cloud 微服务helloworld项目,适合新手

    spring cloud 微服务helloworld项目,适合新手,项目基于spring cloud 微服务技术,使用了eureka注册公司,configserver配置中心,项目需要在本地新建配置中心配置文件

    SpringCloud学习第一天,helloWorld

    在本篇【SpringCloud学习第一天,helloWorld】的教程中,我们将初步接触并了解Spring Cloud这一微服务框架,以及如何创建一个基本的“Hello, World”应用。首先,我们需要理解Spring Cloud的核心概念和作用。 ...

    SpringData-1 概述与HelloWorld

    本节我们将探讨SpringData的概述以及如何通过一个简单的"HelloWorld"示例来入门。 SpringData的核心目标是通过减少样板代码,使数据访问更加简单、高效。它支持多种数据存储技术,包括JPA(Java Persistence API)...

    Spring MVC HelloWorld Maven实例

    **Spring MVC HelloWorld Maven实例** Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。在这个实例中,我们将深入理解如何使用Maven构建一个基本的“Hello, World!”...

    Spring MVC Helloworld实例

    在这个“Spring MVC Helloworld实例”中,我们将会探讨如何利用Spring MVC 3.0.5版本创建一个简单的Hello World应用程序。这个实例包括了所有必要的jar包,使开发者能够快速地开始他们的开发工作。 首先,了解...

    spring boot - hello world

    **Spring Boot Hello World 知识点详解** Spring Boot 是由 Pivotal 团队开发的框架,它旨在...理解并掌握这些概念是深入学习Spring Boot的基础,随着对框架的进一步了解,你将能够构建更复杂、功能丰富的应用程序。

    使用Spring3.0框架开发Hello World例子

    接下来,我们使用Spring的XML配置文件来定义`HelloWorld`类的bean。在`Spring3`压缩包中的`applicationContext.xml`文件可以这样编写: ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns...

    spring3.0 mvc 注解实现helloworld输出

    这只是一个基础入门,Spring MVC的强大之处在于其灵活的配置、丰富的注解以及对其他Spring模块的无缝集成,可以满足复杂Web应用的需求。在实际开发中,你可以进一步学习`@RequestParam`、`@PathVariable`等注解以...

    spring helloworld 例子

    本示例“spring helloworld”将引导初学者入门Spring框架,通过一个简单的实例来理解其核心概念。 首先,我们需要了解Spring的基本架构。Spring是一个开放源代码的Java平台,它提供了全面的编程和配置模型,主要...

    Spring 入门程序HelloWorld

    第一次共享自己的代码,Spring Hello World。代码比较简单,适合初学者,入门使用。高手就不要下载。呵呵。

    springboot-helloworld.rar

    在这个"springboot-helloworld"项目中,可能已经包含了这些基础文件,如pom.xml或build.gradle。 3. **"Hello, World!"示例**:在SpringBoot中,我们通常使用@Controller注解来定义一个控制器,然后通过@...

    spring笔记之helloworld所需要的jar包

    本篇文章将详细讲解在创建一个简单的Spring HelloWorld应用时,需要导入的jar包以及它们在Spring框架中的作用。 首先,我们需要理解Spring的核心组件,即Spring IoC(Inversion of Control)容器。IoC容器是Spring...

Global site tag (gtag.js) - Google Analytics