项目功能描述:一个表单提交用户名和密码注册提交到数据库中或者保存在文本文档中。由于是第一个spring项目,所以只是写一下自己怎么简单搭建环境和配置
用到的框架:struts2 、spring、hibernate
一、ssh基本环境搭建
1、导入包分析:
需要导入的包:(版本可不一样)
(1)通用包(7个):
commons-dbcp2-2.1.jar
commons-logging-1.1.3.jar
commons-pool2-2.3.jar
commons-collections4-4.0.jar
aopalliance-1.0-20100517.210215-13.jar
mysql-connector-java-5.1.33-bin.jar
aspectjweaver-1.6.9.jar
(2)struts包(13+1):
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
log4j-api-2.2.jar
log4j-core-2.2.jar
ognl-3.0.6.jar
struts2-core-2.3.24.jar
xwork-core-2.3.24.jar
struts2-spring-plugin-2.3.24.jar //这个包是struts2和spring整合的插件包
(3)spring包(10个)
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
spring-aop-4.1.6.RELEASE.jar
spring-web-4.1.6.RELEASE.jar
spring-orm-4.1.6.RELEASE.jar
spring-tx-4.1.6.RELEASE.jar
spring-jdbc-4.1.6.RELEASE.jar
spring-aspects-4.1.6.RELEASE.jar
(4)hibernate包(10个)
antlr-2.7.7.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.5.Final.jar
hibernate-core-4.3.10.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.1.3.GA.jar
jboss-logging-annotations-1.2.0.Beta1.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar
2、为项目配置jar包:
右击项目-->属性-->java BulidPath-->Librarys-->add Librarys-->User library-->userLibrarys-->new 根据分类导入各个包--> 勾上全部finish
再配置Deployment Assembly 这表示在部署项目的目录下 /web-inf 会出现这些jar包 这里在eclipse中点击这个目录是看不到的,部署的目录指的是 workspace目录下的 .metedate目录下
3、增加配置文件
这里都是在download的框架中的示例项目中的配置文件中复制过来的,先把一些配置删除,只留下空白配置文件有的
(1)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Album</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
(2)struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="all" namespace="/" extends="struts-default">
</package>
</struts>
(3)applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
(4)hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/album</property>
<property name="connection.username">jack</property>
<property name="connection.password">12345678</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
二、spring-IoC的初体验及其xml方式配置实现spring IoC
这里关于struts和hibernate的实体配置以及HibernateUtils 类实现获取session对象在之前的博客中都有写,所以这里重点学习spring IoC
这里先不着急去明白IoC是什么,先把案例按照书上做出来,再去理解IoC
1.实体类及其注解配置
(1)user.java
package net.xinqushi.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private int id;
private String userName;
private String userPwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
(2)在hibernate.cfg.xml中添加实体类的配置
<mapping class="net.xinqushi.model.User"/>
2.建立DAO层和Service层接口
这里是面向接口编程,接口层只关心功能,不关心具体的实现。
优点:使用接口编程,易于程序拓展,降低程序耦合性。
(1)DAO层:
注册用户都是添加用户信息(到数据库,到文本文档),在接口中定义添加方法
user.java (interface)
package net.xinqushi.dao;
import net.xinqushi.model.User;
public interface UserDAO {
public void addUser(User user);
}
UserDAOFileImpl .java
package net.xinqushi.dao.impl;
import java.io.FileWriter;
import java.io.IOException;
import net.xinqushi.dao.UserDAO;
import net.xinqushi.model.User;
public class UserDAOFileImpl implements UserDAO {
@Override
public void addUser(User user) {
// TODO Auto-generated method stub
try {
FileWriter fw=new FileWriter("F:\\JAVA\\ssh用户相册管理项目整合jar包\\userinfo.txt", true);
fw.write(user.getUserName()+" : "+user.getUserPwd());
fw.write("\r\n");
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
UserDAOMySqlImpl.java
package net.xinqushi.dao.impl;
import org.hibernate.Session;
import net.xinqushi.common.HibernateUtils;
import net.xinqushi.dao.UserDAO;
import net.xinqushi.model.User;
public class UserDAOMySqlImpl implements UserDAO {
@Override
public void addUser(User user) {
// TODO Auto-generated method stub
Session session=HibernateUtils.openSession();
session.beginTransaction();
session.merge(user);
session.getTransaction().commit();
session.close();
}
(2)service层
service层的作用:调用dao层的方法,为action提供服务。
在service层中定义UserService接口
UserService.java (interface)
package net.xinqushi.service;
import net.xinqushi.model.User;
public interface UserService {
public void add(User user);
}
实现UserSercive 接口中方法实现类:UserServiceImpl.java
package net.xinqushi.service.impl;
import net.xinqushi.dao.UserDAO;
import net.xinqushi.model.User;
import net.xinqushi.service.UserService;
public class UserServiceImpl implements UserService {
private UserDAO dao;//在spring的配置中初始化dao层的实现
//通过setter方式注入dao
public UserDAO getDao() {
return dao;
}
public void setDao(UserDAO dao) {
this.dao = dao;
}
@Override
public void add(User user) {
// TODO Auto-generated method stub
dao.addUser(user);
}
}
(3)action中的代码
package net.xinqushi.action;
import com.opensymphony.xwork2.ActionSupport;
import net.xinqushi.model.User;
import net.xinqushi.service.UserService;
public class UserAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private User user;
UserService service;//在spring的配置中初始化为不同的服务层实现
public UserService getService() {
return service;
}
public void setService(UserService service) {
this.service = service;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//添加用户的方法
public String add()
{
service.add(user);
return "main";
}
}
现在可以看到UserAction中要用到service,而实现service的类中用到dao,这些变量都没有初始化,程序也不知道要初始化哪个方法(是实现存放在数据库中,还是保存在文本文档中)。现在就要利用spring框架根据xml文件中的配置 装配注入(初始化) 这两个变量,也要在配置文件中指定到底是实现保存到数据库中还是写到文本文档中。
3.applicationContext.xml文件中的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mydao"
class="net.xinqushi.dao.impl.UserDAOMySqlImpl" >
</bean>
<bean id="service" class="net.xinqushi.service.impl.UserServiceImpl"
>
<property name="dao" ref="mydao"></property>
</bean>
</beans>
这里的配置可以看到是beans标签下一个个配置bean标签,在服务器启动的时候会自动生成类的对象给service初始化。可以这样看这个配置:UserAction要调 定义的UserService service,在action中并没有初始化。这里<bean id="service" class="net.xinqushi.service.impl.UserServiceImpl"> 就是将Action中定义的service进行了初始化。
在初始化service时,UserServiceImpl里定义了一个UserDAO dao ,这里也没有进行初始化,所以<property name="dao" ref="mydao"></property> 这就是配置了初始化的dao,这里ref="mydao" 是
<bean name="mydao" class="net.xinqushi.dao.impl.UserDAOMySqlImpl"></bean>生成的保存在MySql数据库中类生成的对象 进行的初始化。
当我们想要实现把用户信息存放在文本文档时,这里就只需要去改一下id为mydao中的class属性所指向的类。
4.再看IoC
IoC = inverse of control = 控制反转
不在类中不初始化service dao变量,等着spring中配置 初始化 数据,是一种被动初始化,初始化控制权的反转
这里之所以能注入到service和dao变量中,是因为在action中有service的setter方法,而在service中的变量dao也有setter方法,这里是依赖于spring注入的。这种概念叫依赖注入 DI
DI= dependency injection
这样再看这两个概念就不觉得陌生。当然在spring IoC中的配置里还有很多细节的东西,bean标签中的很多属性也可以使程序更具有分层和保护的思想;同时实现Spring IOC也可以在类中注解配置,都会在后面的博客中慢慢写出。
附:注册页面代码:
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册页面</title>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/TableStyle.css">
</head>
<body>
<form action="${pageContext.request.contextPath}/user/add" method="post">
<table class="bordered">
<tr><td>用户名:</td><td><input type="text" name="user.userName"/></td></tr>
<tr><td>密码:</td><td><input type="password" name="user.userPwd"/></td></tr>
<tr><td colspan="2"><input type="submit" value="注册"/></td></tr>
</table>
</form>
</body>
</html>
初学者,如有不当,还望指出。