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包里面。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值