`

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包里面。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics